Form change de place avec changement de resolution [Résolu]

Signaler
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007
-
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
-
Bonsoir,

J'ai creer une form avec un boutton et dans la propriete de boutton j'ai mis sa
*var Rect: TRect;
begin
 FormStyle := fsStayOnTop;                             
 Left:=Screen.Width-ClientWidth;                       
 SystemParametersInfo(SPI_GETWORKAREA, 0, @Rect, 0);  
 Top := Screen.Height - (Screen.Height - Rect.Bottom)-100;
 ClientHeight := 100;     *

J'ai mis sa pour que quand je lance mon projet et j'appyer sur le boutton sa me colle ma form en bas a cote de la barre de tache..
Apres avoir lance ma form, je mis la resoulution 800 par 600 pixels....
Puis quand je remet la resoulution normal... sa me decale la form un peu vers le centre...

Ma question c'est, est ce que c'est possible que quand je chenge de resolution la barre prend sa place normal, c'est a dire bien colle au coin de l'ecran...
Ou il y a une autre methode plus simple...

Merci d'avance, A bientot.

21 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Perso je suis pas sûr de comprendre "ne change pas de place".


Vala le code ci dessus avec les déclarations qui vont bien. (Ne pas oublier d'affecter le OnCreate dans les évènements).


Il s'arrange pour que la form reste dans le coin inférieur gauche, tout en restant entièrement visible.

==================================


unit Unit1;


interface


uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs;


type

  TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

  private

  procedure AdaptPos(Sender: TObject);

  procedure WMDisplayChange(var Message: TMessage); message WM_DisplayChange;


    { Déclarations privées }

  public

    { Déclarations publiques }

  end;


var

  Form1: TForm1;


implementation


{$R *.dfm}


procedure TForm1.AdaptPos(Sender: TObject);

begin

  Left := Screen.Monitors[0].Width - Width;

  Top  := Screen.Monitors[0].Height - Height;

end;


procedure  TForm1.WMDisplayChange(var Message: TMessage);

begin

  inherited;      

    AdaptPos(Self);

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

  AdaptPos(Sender);

end;


end.
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
Rt15, j'étais en contacte par MP avec Cocowz ... il devait m'envoyer son adresse EMail pour renvoyé la source complète
mais il ne la toujours pas fait.

par contre ta méthode est presque la bonne ... je dis presque parce que sur un système à deux écrans selon sur le quel est placé la forme elle risque de disparaitre avec ton code !

je poste donc le code ici et si toute fois tu n'y arrives pas tu me donnes ton Mail pour t'envoyé le source complet :

type
  TForm1 = class (TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Déclarations privées }
    procedure WMDisplayChange(var Message:TMessage);  message WM_DISPLAYCHANGE;
    Procedure ReplaceWindow;
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReplaceWindow;
end;

procedure TForm1.ReplaceWindow;
begin
  With Screen.Monitors[Monitor.MonitorNum] Do Begin
    Self.Left : = Left + (Width - Self.Width);
    Self.Top  := Top + (Height - Self.Height);
  End ;
end;

procedure TForm1.WMDisplayChange(var Message: TMessage);
begin
  Inherited;
  ReplaceWindow;
end;

end.

 
@+
Cirec

<hr size ="2" />
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
34
begin
  Left := Screen.WorkAera.Rigth - Width;
  Top  := Screen.WorkAera.Bottom - Height;
end;





Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour.
Quand je met sa, il me dit que workAera n'est pas declare.
Comment on peut la declarer ?
Merci
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
remplace le par Screen.DesktopHeight et Screen.DesktopWidth

Mais si le programme est executé sur un système à deux écrans ça peut poser problème
dans ce cas on utilise :
Screen.Monitors[0].Width
et
Screen.Monitors[0].Height

Screen.MonitorCount  détermine le nombre de moniteurs présents dans le système

 
@+
Cirec

Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour Cirec,
J'ai teste les deux methodes que tu ma donné et quand je change de resolution et puis je la remet au resolution normal la form se decale comme meme ?
Sinon j'aimera bien de faire pour que sa marche pour les deux ecran...
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
34
au temps pour moi :

procedure TForm1.FormCreate(Sender: TObject);
begin
  Position := poDesigned;
  Left := Monitor.WorkareaRect.Right - Width;
  Top  := Monitor.WorkareaRect.Bottom - Height;
end;

Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
Attention :




WorkareaRect  n'est pas disponible dans toutes les versions de Delphi

Alors que Monitor.Width et Monitor.Height   oui


ensuite il serait peut être utile de détecter le changement de résolution du moniteur
avec (WM_DISPLAYCHANGE) et de réagir en fonction
 
@+
Cirec

Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Et comment on fait pour faire avec *WM_DISPLAYCHANG* ?
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
pour intercepter le message : WM_DISPLAYCHANGE
il faut proceder comme ceci

type
  TForm1 = class (TForm)
   .....
  private
    procedure WMDisplayChange(var Message:TMessage);  message WM_DISPLAYCHANGE;
   .....
  end;

  ........
procedure  TForm1.WMDisplayChange(var Message: TMessage);
begin
  inherited;      
  // ici tu fais appel à ta procedure qui ajuste la position de la fenêtre
end;
 
@+
Cirec

<hr size ="2" />
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Et c'est la quelle procedure qu'il faut utiliser (mieux) ?
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
euh ... je ne comprend pas bien ta question

la première étant la déclaration de la procédure qui est faite dans la section Private de ta Form

et la seconde son implémentation

il te faut les deux

 
@+
Cirec

Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Non, est fait je voulais demander pour sa
* // ici tu fais appel à ta procedure qui ajuste la position de la fenêtre*
Quelle procedure utiliser ? (mieux)
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Salut,


Je connaissais pas le mot clé Message... C'est vraiment honteusement pratique le Delphi.

Merci.


Pour ce qui est de la procédure... Bin c'est celle qui replace la Form,
autant factoriser. (Bon ça se dicute car on va se bouffer un appel pour
deux ligne...)


Quelque chose comme ça ?


procedure TForm1.FormCreate(Sender: TObject);
begin
 
AdaptPos(Sender);


end;




procedure TForm1.AdaptPos(Sender: TObject);
begin
  Left :=
Screen.Monitors[0].Width

- Width;
  Top  :=
Screen.Monitors[0].Height

- Height;
end;


procedure  TForm1.WMDisplayChange(var Message: TMessage);

begin

  inherited;      

 

 
AdaptPos(Self);



end;





Avec les déclarations qui vont bien.
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonjour.
J'arrive pas a lancer le projet...
Est ce que c'est possible de creer un projet pour moi et me l'envoyer car moi j'arrive pas...

Merci d'avance
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Persone ne peut m'aider ???
Messages postés
3819
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
2 novembre 2020
34
C'est quoi ton problème

qu'est ce que tu n'arrives pas à faire

 
@+
Cirec

Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Bonsoir,
Je n'arrive pas a faire pour que la form ne change pas de place....
Pourriez vous me la faire et me l'envoyer car j'ai du mal a comprendre et j'arrive pas..
Merci
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

Voila,
Merci 1000 fois a vous deux....

Merci encore....
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Pourquoi ne pas simplement utiliser les propriétés ScreenSnap et SnapBuffer de TForm ?


(Présentes sous Delphi 7, mais pas sûre qu'elles y soient sur le 6).