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

Langage Delphi Discussion :

control as Tcombobox or TListbox


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut control as Tcombobox or TListbox
    Bonjour

    j'ai deux procedure dont l'une provient d'un combobox et l'autre d'un listbox
    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
    PROCEDURE Tform1.combobox1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    VAR
          Itemtext: STRING;
          S1:LONGINT;
    BEGIN
          WITH control as Tcombobox DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END; {Tform1}
    END;
     
    PROCEDURE Tform1.list1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    VAR
          Itemtext: STRING;
          S1:LONGINT;
    BEGIN
          WITH control as TListbox DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END; {Tform1}
    END;
    comment puis-je faire pour faire qu'une seule procedure
    j'ai tester
    WITH control as Tcombobox or TListbox
    mais cela ne fonctionne pas
    ensuite essayer avec
    var sender:Tobject;
    mais je ne sais pas comment faire.
    merci de me donner quelques suggestions:

    ma solution serai de faire
    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
     
    IF (control is Tcombobox) THEN
          WITH control as Tcombobox DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END
    IF (control is TListbox) THEN
          WITH control as TListbox DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END; {Tform1}
    mais je veux juste que le WITH soit commun.
    j'ai fait des recherches sur le net mais pas trouvé.

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Avis personnel : les mots clé ne majuscule,; c'est pas beau, en tout cas, ça suit les habitudes stylistiques de Delphi.

    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
     
    PROCEDURE Tform1.list1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
     
      procedure DrawColored(Canvas: TCanvas; aColor: TColor; aText: String);
      begin
        Canvas.Font.Color  := aColor;
        IF Odselected IN STATE THEN THEN
          Canvas.Brush.Color := 0
        ELSE
          Canvas.Brush.Color:= Clwindow
        Canvas.Fillrect(Rect);
        Canvas.Textout(Rect.Left + 2 , Rect.Top, atext);
      End;
     
    begin
      if (control is TListbox) then
        with control as TListbox do
          DrawColored(Canvas, TColor(ITEMS.OBJECTS[Index]), ITEMS[Index]);
      if (control is Tcombobox) then
        with control as Tcombobox do
          DrawColored(Canvas, TColor(ITEMS.OBJECTS[Index]), ITEMS[Index]);
     { selon la version de Delphi essayer TCustomListControl :
      if (control is TCustomListControl) then
        with control as TCustomListControl do
          DrawColored(Canvas, TColor(ITEMS.OBJECTS[Index]), ITEMS[Index]);
      qui remplace alors les deux précédents}
    End;
    La classe TCustomListControl n'existe peut-être pas dans toutes les verison de Delphi (j'ai regardé la doc en ligne actuelle d'Embarcadero).

    @+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour la rapidité de votre réponse marche pour moi.
    en ce qui concerne le mots clefs en majuscule c'est parce que
    j'utilise une routine en pascal qui me les mets en capitale
    (je trouve cela plus jolie pour ma part).

    avec la Propriétés TCustomListControl

    ITEMS[Index] me génère une erreur: identificateur non déclaré. (DELPHI 7)

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Salut

    Je viens de vérifier dans les sources de la VCL D7, TListBox et TComboBox partagent bien l'ancêtre commun TCustomListControl (qui est une classe et une propriété, attention à la terminologie). Mais TCustomListControl n'a pas de propriété Items, celle-ci n'apparaît que dans les types dérivés, pas de bol !

    Je pense qu'il va falloir se limiter à la première solution (distinction des classes TComboBox et TListBox). Elle n'est pas très élégante mais elle reste simple à comprendre et à maintenir.

    @+

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Je vois 2 solutions :

    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
    procedure Traitement(Items:  TStrings; Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    VAR
          Itemtext: STRING;
          S1:LONGINT;
    BEGIN
          WITH control DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END; {Tform1}
    END;
     
    PROCEDURE Tform1.combobox1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    begin
      Traitement(control as Tcombobox).Items, Control, Index, Rect, STATE);
    end;
     
    PROCEDURE Tform1.list1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    BEGIN
      Traitement(control as TListbox).Items, Control, Index, Rect, STATE);
    END;
    ou alors, avec le meme evenement pour les 2 :
    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
    PROCEDURE Tform1.combobox1drawitem(Control: Twincontrol; Index: LONGINT; Rect: TRECT; STATE: Townerdrawstate);
    VAR
      items: TStrings;
          Itemtext: STRING;
          S1:LONGINT;
    BEGIN
      if control is Tcombobox then
        Items := TCombobox(control).Items
      else if control is TListboxthen
        Items := TListbox(control).Items
      else
        Exit;
     
          WITH control DO
          BEGIN
                Itemtext := ITEMS[Index];
                S1:=LONGINT(ITEMS.OBJECTS[Index]); // doit contenir la couleur
                IF Odselected IN STATE THEN
                BEGIN
                        Canvas.Font.Color  := S1;
                        Canvas.Brush.Color := 0;
                END
                ELSE
                BEGIN
                      Canvas.Font.Color := S1;
                      Canvas.Brush.Color:= Clwindow;
                END;
                Canvas.Fillrect(Rect);
                Canvas.Textout(Rect.Left + 2 , Rect.Top, Itemtext);
          END; {Tform1}
    END;

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 955
    Points
    3 955
    Par défaut
    Petite rectification :
    Avis personnel : les mots clé ne majuscule,; c'est pas beau, en tout cas, ça suit les habitudes stylistiques de Delphi.
    il fallait lire :
    Avis personnel : les mots clé ne majuscule, c'est pas beau, en tout cas, ça ne suit pas les habitudes stylistiques de Delphi.
    J'aurais dû me relire. Ce n'est évidemment pas l'argument esthétique (purement perso) qu'il faut retenir.

Discussions similaires

  1. [VB6] [Réseau] Prendre le contrôle d'un téléchargement
    Par Tchetch dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/10/2002, 14h18
  2. [VB6] [Interface] Nbre de contrôles maxi dans une feuille
    Par Midou dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/10/2002, 16h09
  3. [VB6] [Interface] Tester le Type de Controle
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/09/2002, 09h51
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. Rx Controls Gif animés
    Par toufou dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/08/2002, 14h09

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