Form change de place avec changement de resolution

Résolu
cocowz
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007
- 30 janv. 2007 à 20:39
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
- 6 févr. 2007 à 14:24
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

cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
5 févr. 2007 à 13:01
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.
3
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
5 févr. 2007 à 15:10
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" />
3
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
37
31 janv. 2007 à 08:10
begin
  Left := Screen.WorkAera.Rigth - Width;
  Top  := Screen.WorkAera.Bottom - Height;
end;





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

31 janv. 2007 à 13:25
Bonjour.
Quand je met sa, il me dit que workAera n'est pas declare.
Comment on peut la declarer ?
Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
31 janv. 2007 à 14:29
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

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

31 janv. 2007 à 15:55
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...
0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
37
31 janv. 2007 à 16:54
au temps pour moi :

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

0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
31 janv. 2007 à 17:35
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

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

31 janv. 2007 à 18:45
Et comment on fait pour faire avec *WM_DISPLAYCHANG* ?
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
1 févr. 2007 à 14:30
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" />
0
cocowz
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

1 févr. 2007 à 17:32
Et c'est la quelle procedure qu'il faut utiliser (mieux) ?
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
1 févr. 2007 à 18:07
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

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

1 févr. 2007 à 19:43
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)
0
cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
2 févr. 2007 à 10:49
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.
0
cocowz
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

2 févr. 2007 à 19:36
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
0
cocowz
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

3 févr. 2007 à 14:52
Persone ne peut m'aider ???
0
Cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
3 févr. 2007 à 17:38
C'est quoi ton problème

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

 
@+
Cirec

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

3 févr. 2007 à 22:28
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
0
cocowz
Messages postés
89
Date d'inscription
lundi 28 novembre 2005
Statut
Membre
Dernière intervention
25 février 2007

5 févr. 2007 à 19:42
Voila,
Merci 1000 fois a vous deux....

Merci encore....
0
cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
6 févr. 2007 à 13:16
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).
0