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

cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 30 janv. 2007 à 20:39 - Dernière réponse : Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention
- 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.
Afficher la suite 

22 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 5 févr. 2007 à 13:01
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 5 févr. 2007 à 15:10
+3
Utile
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" />
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Cirec
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 31 janv. 2007 à 08:10
0
Utile
begin
  Left := Screen.WorkAera.Rigth - Width;
  Top  := Screen.WorkAera.Bottom - Height;
end;





Commenter la réponse de f0xi
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 31 janv. 2007 à 13:25
0
Utile
Bonjour.
Quand je met sa, il me dit que workAera n'est pas declare.
Comment on peut la declarer ?
Merci
Commenter la réponse de cocowz
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 31 janv. 2007 à 14:29
0
Utile
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

Commenter la réponse de Cirec
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 31 janv. 2007 à 15:55
0
Utile
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...
Commenter la réponse de cocowz
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 31 janv. 2007 à 16:54
0
Utile
au temps pour moi :

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

Commenter la réponse de f0xi
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 31 janv. 2007 à 17:35
0
Utile
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

Commenter la réponse de Cirec
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 31 janv. 2007 à 18:45
0
Utile
Et comment on fait pour faire avec *WM_DISPLAYCHANG* ?
Commenter la réponse de cocowz
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 1 févr. 2007 à 14:30
0
Utile
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" />
Commenter la réponse de Cirec
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 1 févr. 2007 à 17:32
0
Utile
Et c'est la quelle procedure qu'il faut utiliser (mieux) ?
Commenter la réponse de cocowz
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 1 févr. 2007 à 18:07
0
Utile
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

Commenter la réponse de Cirec
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 1 févr. 2007 à 19:43
0
Utile
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)
Commenter la réponse de cocowz
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 2 févr. 2007 à 10:49
0
Utile
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.
Commenter la réponse de cs_rt15
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 2 févr. 2007 à 19:36
0
Utile
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
Commenter la réponse de cocowz
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 3 févr. 2007 à 14:52
0
Utile
Persone ne peut m'aider ???
Commenter la réponse de cocowz
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 3 févr. 2007 à 17:38
0
Utile
C'est quoi ton problème

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

 
@+
Cirec

Commenter la réponse de Cirec
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 3 févr. 2007 à 22:28
0
Utile
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
Commenter la réponse de cocowz
cocowz 89 Messages postés lundi 28 novembre 2005Date d'inscription 25 février 2007 Dernière intervention - 5 févr. 2007 à 19:42
0
Utile
Voila,
Merci 1000 fois a vous deux....

Merci encore....
Commenter la réponse de cocowz
Cirec 4217 Messages postés vendredi 23 juillet 2004Date d'inscription 3 avril 2018 Dernière intervention - 6 févr. 2007 à 01:40
0
Utile
Le projet à un peut évolué à la demande de Cocows (par MP)
et donc je me dis ... peut être que ça interresse encore d'autres personnes

{
                 Démonstration de repositionnement automatique
                 de la forme principale.

                 Auteur Cirec pour Cocows sur [www.Delphifr.com]

                 Propose un ancrage de la fenêtre dans l'un des quatre coins
                 de l'écran au choix

                 Fonctionne également sur un système à deux écrans :
                 La forme se replace automatiquement dans le "nouveau moniteur"

                 Quand Ancrer la fenêtre est coché la forme permet un déplacement
                 pour un changement d'écran mais si le déplacement s'effectu à
                 l'intérieur du même moniteur elle se replacera automatiquement
                 dans le coin préalablement sélectionné
}

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tfrm_Main = class (TForm)
    GroupBox1: TGroupBox;
    rbt_BottomRight: TRadioButton;
    rbt_BottomLeft: TRadioButton;
    rbt_TopRight: TRadioButton;
    rbt_TopLeft: TRadioButton;
    ckb_Anker: TCheckBox;
    //procedure FormCreate(Sender: TObject);
    procedure ckb_AnkerClick(Sender: TObject);
    Procedure ReplaceWindow(Sender: TObject);
  private
    { Déclarations privées }
    procedure WMDisplayChange(var Message:TMessage);  message WM_DISPLAYCHANGE;
    Procedure OnFormMoved(Var Msg: TWMSysCommand); Message WM_SysCommand;
  public
    { Déclarations publiques }
  end;

var
  frm_Main: Tfrm_Main;

implementation
{$R *.dfm}

  { Vu la nouvelle déclaration de ReplaceWindow (ajout de (Sender: TObject)  )
    l'appel se fait maintenant directement dans l'inspecteur d'objets

procedure Tfrm_Main.FormCreate(Sender: TObject);
begin
  // Self représentant frm_Main  sont Tag étant à zéro
  // la fenêtre est initialisée en bas à gauche
  ReplaceWindow (Self);
end;}

procedure Tfrm_Main.ReplaceWindow(Sender: TObject);
{ tous les composants ont une propriété nommée Tag
  Comme elle n'est pas utilisée on va s'en servir pour stocker la position de la Forme

   Les Tags des 4 TRadioButton sont déclarés comme suit
     0 : = Bottom Right
     1 := Bottom Left
     2 := Top Right
     3 := Top Left

   et les évenements OnClick sont redirigés vers ReplaceWindow dans l'inspecteur d'objets}
begin
 { on mémorise la position dans le Tag de la Forme (pour les appels avec Self)
   Sender est donc soit frm_Main ou un des TRadioButton}
  Tag : = (Sender as TComponent).Tag;
  With Screen.Monitors[Monitor.MonitorNum] Do Begin
    Case Tag of {et on change la position}
      0 : Begin  // Bottom Right
            Self.Left : = Left + (Width - Self.Width);
            Self.Top  := Top + (Height - Self.Height);
      End ;
      1 : Begin  // Bottom Left
            Self.Left : = Left;
            Self.Top  := Top + (Height - Self.Height);
      End ;
      2 : Begin   // Top Right
            Self.Left : = Left + (Width - Self.Width);
            Self.Top  := Top;
      End ;
      3 : Begin  // Top Left
            Self.Left : = Left;
            Self.Top  := Top;
      End ;
    End;
  End;
end;

  { ici je ne passe pas l'inspecteur d'objet parce qu'il faudait dans ce cas aussi
    mémoriser la position dans cbk_Anker.Tag alors qu'il l'est déjà dans fmr_Main.Tag}
procedure Tfrm_Main.ckb_AnkerClick(Sender: TObject);
begin
  ReplaceWindow(Self);
end;

  { réagit aux changements de résolutions}
procedure Tfrm_Main.WMDisplayChange(var Message: TMessage);
begin
  { Appel de la méthode héritée}
  Inherited;
  { et replacement de la fenêtre}
  ReplaceWindow(Self);
end;

  { réagit après déplacement de la forme}
procedure Tfrm_Main.OnFormMoved(var Msg: TWMSysCommand);
begin
  { Appel de la méthode héritée}
  Inherited;
  { Si ancrer la fenêtre est coché ... }
  If ckb_Anker.Checked Then ReplaceWindow(Self);
end;

end.

//***********************************************************
              Le DFM
//***********************************************************

object frm_Main: Tfrm_Main
  Left = 0
  Top = 0
  Caption = 'D'#233'mo :Ancrer une fen'#234'tre '
  ClientHeight = 184
  ClientWidth = 301
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesigned
  OnCreate = ReplaceWindow
  PixelsPerInch = 96
  TextHeight = 13
  object GroupBox1: TGroupBox
    Left = 2
    Top = 0
    Width = 297
    Height = 153
    Caption = 'Window Position'
    TabOrder = 0
    object rbt_BottomRight: TRadioButton
      Left = 163
      Top = 73
      Width = 85
      Height = 17
      Caption = 'Bas Droite'
      Checked = True
      TabOrder = 0
      TabStop = True
      OnClick = ReplaceWindow
    end
    object rbt_BottomLeft: TRadioButton
      Tag = 1
      Left = 16
      Top = 73
      Width = 85
      Height = 17
      Caption = 'Bas Gauche'
      TabOrder = 1
      OnClick = ReplaceWindow
    end
    object rbt_TopRight: TRadioButton
      Tag = 2
      Left = 163
      Top = 24
      Width = 85
      Height = 17
      Caption = 'Haut Droite'
      TabOrder = 2
      OnClick = ReplaceWindow
    end
    object rbt_TopLeft: TRadioButton
      Tag = 3
      Left = 16
      Top = 24
      Width = 85
      Height = 17
      Caption = 'Haut Gauche'
      TabOrder = 3
      OnClick = ReplaceWindow
    end
  end
  object ckb_Anker: TCheckBox
    Left = 163
    Top = 159
    Width = 118
    Height = 17
    Caption = 'Ancrer la fen'#234'tre'
    TabOrder = 1
    OnClick = ckb_AnkerClick
  end
end

 
@+
Cirec

Commenter la réponse de Cirec

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Form change de place avec changement de resolution - page 2