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

Lazarus Pascal Discussion :

[Linux] Un même PopupMenu pour X composants avec des Items différents


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut [Linux] Un même PopupMenu pour X composants avec des Items différents
    Bonjour,
    Pour simplifier, à l'exécution du programme je crée un scrollBox puis sur celui-là une série de Panels (avec le nom de fichier)
    J'ai un même Popup pour l'ensemble de ces composants.
    Au déclenchement du popup le nombre d'items visibles doit être en fonction des caractéristiques du Panel.caption (ex. fichier TXT, PDF...) ou de la zone neutre du ScrollBox.
    Après plusieurs recherches sur internet j'ai une solution qui semble (voir ci-dessous) bien fonctionner sous Windows.
    Je cherche donc l'équivalent pour Linux Ubuntu (je débute dans cet environnement).
    D'avance merci.

    *) Solution Windows

    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
    private   
            Control_Bloc:TWinControl;  // Pour récupérer le composant sous la souris
             // Pour Popup utilise la position de la souris pour récupérer le Composant Bloc pointé
            // utilisé pour neutraliser un item avant l'affichage du popup  
     
    // **************************************************
    procedure TForm1.PopupMenu_Onglet_WindowsPopup(Sender: TObject);
    // Popup Windows
    Var Panel_Compo : Tcomponent;
      begin
         {$IFDEF Windows}
          Recupere_Control_Bloc_Solution_Souris(Sender,Panel_Compo);
         {$ENDIF}
      end;
    // ************************************************** 
    procedure TForm1.Recupere_Control_Bloc_Solution_Souris(Sender: TObject;Var Panel_Compo : Tcomponent);
    // Récupère Control_Bloc : Tcomponent
    Var
      ACursorPos: TPoint;
      AHandle: HWND;
    begin
       {$IFDEF Windows}
      // ----------- Solution fonctionne en Windows ------------------
     // Récupérer les coordonnées du coin supérieur du popup :
      if GetCursorPos(ACursorPos) then  // Récupérer les coordonnées
        begin
         AHandle := WindowFromPoint(ACursorPos); // Chercher un Handle
         if AHandle <> 0 then
           begin
           Control_Bloc:=FindControl(AHandle ); // Chercher le composant sous la souris
              if Control_Bloc<>nil then
              begin  // Composant trouvé : neutraliser Item
                  If Copy(Control_Bloc.Name,1,9)<>'ScrollBox' Then MenuItem_Modifier_Nom_Fichier1.Enabled:=True
                 Else MenuItem_Modifier_Nom_Fichier1.Enabled:=False;
                 .........................................................
              End;
         end;
    end;
       {$ENDIF}
      end;
    // **************************************************

  2. #2
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir

    Je ne visualise pas très bien le comportement que tu souhaites avoir. Pourquoi ne pas utiliser simplement les évènements OnMouse..., OnMouseDown par exemple des contrôles ?

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    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 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut


    le sender ne suffit pas pour savoir ou se trouve la souris ?
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut Suite
    Bonjour,
    Suite à vos réponses je joins un petit exemple pour illustrer et prouver mes propos.
    J'ai simplifié au maximum. Mon PopupMenu unique change de menu au-dessus des 3 labels et du ScrollBox.
    J'ai adapté une astuce, glanée sur internet, qui permet de récupérer le composant sous la souris en Windows mais pas en Linux.
    Aimez-moi à trouver un équivalent pour Ubuntu.
    D'avance merci
    Fichiers attachés Fichiers attachés

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    La propriété PopupComponent du PopupMenu ne suffit pas ?

  6. #6
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonjour

    Utilises la propriété Tag des TPanel puis assigne OnMouseDown a chaque panel et du scrollbox. et n'assignes pas le popup au scrollbox

    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
    procedure TForm1.Panel3MouseDown(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : Integer);
    var
      ACursorPos: TPoint;
    begin
      if button = mbright then
      begin
        if (Sender is TPanel) then
        begin
          Case (Sender as TPanel).Tag of
            1 :
              begin
                MenuItem1.Enabled:=False;
                MenuItem2.Enabled:=False;
                MenuItem3.Enabled:=True;
                MenuItem4.Enabled:=True;
              end;
            2 :
              begin
                MenuItem1.Enabled:=True;
                MenuItem2.Enabled:=True;
                MenuItem3.Enabled:=False;
                MenuItem4.Enabled:=False;
              end;
            3 :
              begin
                MenuItem1.Enabled:=True;
                MenuItem2.Enabled:=False;
                MenuItem3.Enabled:=False;
                MenuItem4.Enabled:=true;
              end;
            4 :
              begin
                MenuItem1.Enabled:=True;
                MenuItem2.Enabled:=False;
                MenuItem3.Enabled:=True;
                MenuItem4.Enabled:=False;
              end;
          end;
        end
        else
        begin
          MenuItem1.Enabled:=True;
          MenuItem2.Enabled:=False;
          MenuItem3.Enabled:=True;
          MenuItem4.Enabled:=False;
        end;
        GetCursorPos(ACursorPos);
        PopupMenu1.PopUp(ACursorPos.x, ACursorPos.y);
      end;
    end;
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut
    Bonjour,
    Grand merci à Andnotor votre solution est très simple et fonctionne parfaitement en Delphi et Lazarus (Windows et Linux).
    Je connaissais pas PopupComponent.
    Exemple pour reprendre mon dernier exemple :

    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
    // **************************************************
    procedure TForm1.PopupMenu1Popup(Sender: TObject);
      Var 
        Compo : Tcomponent;
        CompoPanel :TPanel;
        CompoScrollBox : TScrollBox;
      begin
        Compo:=popupMenu1.popupComponent;
        If Compo is TPanel Then
          Begin
            CompoPanel:=TPanel(Compo);
            If CompoPanel <> Nil Then
              Begin
                Panel4.Caption:=CompoPanel.caption;
                If CompoPanel.caption='Panel1' Then
                  Begin
                    MenuItem1.Enabled:=False;
                    MenuItem2.Enabled:=False;
                    MenuItem3.Enabled:=True;
                    MenuItem4.Enabled:=True;
                    Exit;
                  end
                Else
                If CompoPanel.caption='Panel2' Then
                  Begin
                    MenuItem1.Enabled:=True;
                    MenuItem2.Enabled:=True;
                    MenuItem3.Enabled:=False;
                    MenuItem4.Enabled:=False;
                    Exit;
                  end
                Else
                If CompoPanel.caption='Panel3' Then
                  Begin
                    MenuItem1.Enabled:=True;
                    MenuItem2.Enabled:=False;
                    MenuItem3.Enabled:=False;
                    MenuItem4.Enabled:=true;
                  end;
                //Exit;
              end  // De If CompoPanel <> Nil Then
            Else ;
          End  // De  If Compo is TPanel
        else
        If Compo is TScrollBox Then
          begin
            CompoScrollBox:=TScrollBox(Compo);
            If CompoScrollBox <> Nil Then
              Begin
                Panel4.Caption:=CompoScrollBox.Name;
                If CompoScrollBox.Name='ScrollBox1' Then
                  Begin
                    MenuItem1.Enabled:=True;
                    MenuItem2.Enabled:=True;
                    MenuItem3.Enabled:=True;
                    MenuItem4.Enabled:=True;
                  end
              end;
          end;
      end;
    // **************************************************

    Petite question supplémentaire :
    Comment changer la couleur des items du popupmenu sous Ubunto ?
    Actuellement le fond est noir avec une écriture blanche, en cas de sélection le fond devient orange.
    D'avance merci

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 128
    Points
    13 128
    Par défaut
    Pourquoi ne pas tirer parti de la propriété Tag des composants ? Tu aurais un code plus concis et plus facile à maintenir.

    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
    const
      Cond1 = 1;
      Cond2 = 2;
      Cond3 = 4;
      Cond4 = 8;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Panel1.Tag     := Cond3 or Cond4;
      Panel2.Tag     := Cond1 or Cond2;
      Panel3.Tag     := Cond1 or Cond4;
      ScrollBox1.Tag := MaxInt;
    end;
     
    procedure TForm1.PopupMenu1Popup(Sender: TObject);
    begin
      with PopupMenu1 do
      begin
        Menu1.Enabled := Assigned(PopupComponent) and (PopupComponent.Tag and Cond1 <> 0);
        Menu2.Enabled := Assigned(PopupComponent) and (PopupComponent.Tag and Cond2 <> 0);
        Menu3.Enabled := Assigned(PopupComponent) and (PopupComponent.Tag and Cond3 <> 0);
        Menu4.Enabled := Assigned(PopupComponent) and (PopupComponent.Tag and Cond4 <> 0);
      end;
    end;

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 109
    Points : 45
    Points
    45
    Par défaut Suite
    Bonjour
    Encore une super solution Andnotor, merci beaucoup.
    J'avais simplifié à l'extrême ma question, en réalité en tant que membre d'un Fablab j'ai proposé d'écrire un programme afin de centraliser les logiciels disponibles et cela par activité.
    La fenêtre du programme doit afficher différents onglets (un onglet par répertoire et par activité), sur chacun onglet la liste des différentes applications installées avec à chaque fois une icône et un texte.
    J'avais jadis écrit un programme semblable sous Windows avec Delphi7 pour mon usage personnel que j'utilise encore.
    Delphi 7 a un composant ListViewFile qui simule parfaitement la page de droite de l'explorateur Microsoft avec une représentation ViewStyle=vsIcon des fichiers lnk (icône+nom).
    Mais le nouveau logiciel devait fonctionner sous Windows et surtout Linux Ubunto (problème de moyens).
    J'ai donc opté pour représenter les lanceurs (.desktop) de linux sous forme d'un panel 'bloc' qui encapsule un Timage pour l'image un Tpanel pour le nom du fichier.
    En plus pour facilité l'utilisation j'accepte aussi dans les répertoires des fichiers de type PDF;TXT,MP4,MHTML....
    D'où ma question, mon souci était que lors de l'utilisation du popup, seul les items qui concernent le type de fichier pointé apparaissent.
    Ce problème est résolu grâce à vous.
    Il me reste juste pour améliorer éventuellement la présentation de pouvoir modifier la couleur d'affichage des items et surtout de ceux des séparateurs qui sont à peine visibles sous Linux.

    La solution :
    Fonctionne en Windows mais pas en Linux
    PopupMenu1.OwnerDraw := true;
    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
    // **************************************************
    procedure TForm1.MenuItem11DrawItem(Sender: TObject; 
      ACanvas: TCanvas; ARect: TRect; Selected: Boolean);
    // Uniquement pour les séparations
      begin
        // change background
         {$IFDEF Windows}
        ACanvas.Brush.Color := clWhite; // clSilver; //ClBlack;
        ARect.Height:=ARect.Height-6;
         {$ELSE}
         ACanvas.Brush.Color := clWhite; // clSilver; //ClBlack;
         ARect.Height:=ARect.Height;
          {$ENDIF}
              ACanvas.Rectangle(ARect);
    end;   
    // **************************************************

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/07/2013, 15h23
  2. Réponses: 2
    Dernier message: 07/04/2009, 11h45
  3. Réponses: 1
    Dernier message: 29/12/2008, 15h21
  4. Réponses: 2
    Dernier message: 24/02/2008, 14h46
  5. Réponses: 3
    Dernier message: 16/07/2007, 15h16

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