IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants VCL Delphi Discussion :

Sidebar


Sujet :

Composants VCL Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Sidebar
    Bonjour

    voilà, je developpe une ptite sidebar en delphi.
    Niveau redimensionnement de la zone de travail du bureau, aucun soucis.

    Mon probleme se situe au niveau du redimensionnement/maj des fenetres déjà ouvertes/maximisées.

    Voilà mon code de test (delphi2005, winXP pro SP2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    unit Unit1;
     
    interface
     
    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls;
     
    const
     dockHeight = 120;
     
    type
     TForm1 = class(TForm)
       ButtonDock: TButton;
       ButtonUnDock: TButton;
       procedure ButtonUnDockClick(Sender: TObject);
       procedure ButtonDockClick(Sender: TObject);
     private
       { Déclarations privées }
       isDocked: boolean;
     public
       { Déclarations publiques }
     end;
     
    var
     Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.ButtonDockClick(Sender: TObject);
    var
     rect: TRect;
    begin
     If SystemParametersInfo(SPI_GETWORKAREA, 0, @rect, 0)
     then begin
       rect.Top := rect.Top + dockHeight;
       isDocked := true;
       if SystemParametersInfo(SPI_SETWORKAREA, 0, @rect, SPIF_SENDCHANGE)
       then begin
         SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
         SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
         ButtonDock.Enabled := false;
       end
       else begin
         isDocked := false;
         showmessage(string(GetLastError()));
       end
     end
    end;
     
    procedure TForm1.ButtonUnDockClick(Sender: TObject);
    var
     rect: TRect;
    begin
     if(isDocked) then begin
       If SystemParametersInfo(SPI_GETWORKAREA, 0, @rect, 0)
       then begin
         rect.Top := rect.Top - dockHeight;
         if SystemParametersInfo(SPI_SETWORKAREA, 0, @rect, SPIF_SENDCHANGE)
         then begin
           isDocked := false;
           ButtonDock.Enabled := true;
           SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
           SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
         end
         else begin
           showmessage(string(GetLastError()));
         end
       end
     end
    end;
     
     
    end.
    un bouton pour docker, un autre pour dédocker ...
    reste la maj des fenetres deja ouvertes à mettre à jour (je me repete je sais lol)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); 
           SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
    mais aucun effet

    j'ai fouillé sur le forum et a priori j'ai po trouvé mon bonheur ...

    merci pour vos commentaires / votre aide

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    salut

    tu veut faire quoi exactement un refresh de toute les fenetres deja ouvertes ?

    @+ Phil

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    en gros oui

    ce que je veux faire exactement, c'est au démarrage de la barre, là l'espace du bureau est reduit (avec SPI_SETWORKAREA) et donc je dois mettre à jour les fenetres déjà ouvertes pour qu'elles prennent en compte la nouvelle taille de la zone de travail: fenetres maximisées avant ouverture de la barre remaximisées avec la nouvelle taille, etc

    j'ai utilisé plusieurs techniques pour tenter ça (enumeration des process, etc) mais rien de bien concluant/propre (fenetre qui s'active en pagaille, certaines qui ne reagissent pas,...)

    en fait le seul truc qui marche très bien pour l'instant c'est la maj du placement des icones lol

    j'espere avoir été plus clair dans mes explications

    ++, GreG

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    salut

    as tu essayer de faire un une fonction callback ?
    genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Fonction EnumWindowsProc(HWND : Thandle; Param : Integer) : Boolean;
    begin
       if(IsWindowVisible(hwnd)) Then
      begin
        GetWindowRect(hwnd,@rcw);
        atop = rcw.top;
        if  atop > dockHeight then 
          atop :=  dockHeight;
     
        abottom = rcw.bottom;
        ....
        SetWindowPos(hwnd,HWND_BOTTOM,rcw.left,atop, rcw.right,abottom, SWP_SHOWWINDOW);
     end; 
    end;
    ...
     
    procedure TForm1.ButtonDockClick(Sender: TObject);
    ...
    begin
      ...
         EnumWindows(@EnumWindowsProc,LongInt(Self));
      ...
    end;
    @+ Phil

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    lut

    ouep, j'ai deja essayé mais c'est pas super concluant (certaines fenetres ne reagissent pas)
    je pensais qu'une API bien cachée ferait le travail

    je crois que je vais pas trop avoir le choix et me contenter d'une soluce alternative 'fait maison' ... sniff lol

    j'vous tiens au courant et posterai ma 'soluce' dès que ca marche

    ++
    GreG

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 446
    Points : 5 867
    Points
    5 867
    Par défaut
    salut

    essai la commande
    MoveWindow si le setpos ne fonctionne pas

    @+ Phil

  7. #7
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Tout celà peut ce faire automatiquement par Windows, mais dans ce cas il faut que celà soit une barre d'outils ( -> redimensionnement de l'espace de travail, comme la barre des taches ).
    Il existe un composant Delphi qui permet de le faire :
    http://www.torry.net/quicksearchd.php?String=TAppBar&Title=Yes

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par smyley
    Tout celà peut ce faire automatiquement par Windows, mais dans ce cas il faut que celà soit une barre d'outils ( -> redimensionnement de l'espace de travail, comme la barre des taches ).
    Il existe un composant Delphi qui permet de le faire :
    http://www.torry.net/quicksearchd.php?String=TAppBar&Title=Yes
    ok merci je vais voir avec ça

    j'vous tiens au courant sous peu

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bon, y'a une fonction qui fait parfaitement ce que je voudrais faire dans la demo (position > edge > top)
    il me reste à explorer le code pour trouver comment ça marche ... je suis po couché ^^
    si quelqu'un le trouve avant moi, je suis preneur ...

    ++ GreG

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bon bah ça marche nickel avec ton lien smyley
    merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Sidebar style XP
    Par AlexandreP dans le forum Windows Forms
    Réponses: 4
    Dernier message: 27/12/2007, 10h23
  2. [XHTML] IE6 n'affiche pas correctement sidebar blog
    Par jfrsm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 04/05/2007, 00h25
  3. Favoris et SideBar
    Par Marnor dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/11/2006, 15h05
  4. cacher : menubars+sidebars+scrollbars
    Par java_fun dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2006, 16h49
  5. Sidebar comme OutLook
    Par eponette dans le forum Composants VCL
    Réponses: 2
    Dernier message: 29/12/2005, 18h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo