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 :

listbox plus "sexy"


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Points : 42
    Points
    42
    Par défaut listbox plus "sexy"
    Bonjour a tous,

    Je voudrais remplacer mon austère Tlistbox par un composant plus sexy.
    Quelque chose qui ressemble au listbox sortable de Jquery :
    http://jqueryui.com/demos/sortable/
    L'effet pour le drag and drop étant assez sympa je trouve.

    Donc qu'utilisez-vous comme listbox?

    Merci,

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    faut lui mettre un string

    j'utilise souvent TListBox en mode VirtualOwnerDraw

    Je gère à côté une liste d'objets qui possèdent une méthode draw et j'ai juste à mettre à jour le Count de la liste et à invoquer la méthode Draw de l'item sur OnDrawItem

    pour ajouter l'effet drag & drop, il faut une fenêtre satyontop sur laquelle l'objet se dessine et avec un peu d'efforts le tour est joué

    maintenant il existe peut-être des composants qui font ça pour toi
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    j'avais besoin d'avoir quelque chose qui fonctionne comme un Tlistbox, mais en plus jolie / conviviale

    avec l'aide d'un membre j'ai réussis à faire quelque chose de très sympa, mais on a du coder tout à 0

    donc si tu es motivé, il y a du travail !

    tout est créé dynamiquement, les items sont des Tpanel, qui s'affiche dans un TScrollBox

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 51
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Pas con pour le String^^
    Je ne peux pas me permettre de passer plus d'une heure sur le listbox, ce n'est pas un point cruciale.

    Merci

  5. #5
    Membre habitué
    Inscrit en
    Juillet 2007
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juillet 2007
    Messages : 113
    Points : 170
    Points
    170
    Par défaut
    En terme de sexy les compo tms encore et tjrs (30eu sans les sources) :
    http://www.tmssoftware.com/site/advsmoothlistbox.asp

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    j'utilise souvent TListBox en mode VirtualOwnerDraw

    Je gère à côté une liste d'objets qui possèdent une méthode draw et j'ai juste à mettre à jour le Count de la liste et à invoquer la méthode Draw de l'item sur OnDrawItem
    Avec un peu de retard je relance la discussion car cette technique m'interresse...

    Pouvez-vous m'expliquer ou me donner un exemple Paul ?
    Concernant les compos TMS je trouve mes applis gourmandes en ressources avec... Avis partagé ou simple présomption..?

    Merci.

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    voici un exemple bidon

    avec ce principe il est même possible de gérer une arborescence, il suffit de dessiner les "+" et "-" quand nécessaire et d'insérer les enfants dans la liste quand on clique sur "+" et les supprimer quand on clique sur "-"

    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        ListBox1: TListBox;
        procedure FormCreate(Sender: TObject);
        procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
          Rect: TRect; State: TOwnerDrawState);
      private
        { Déclarations privées }
        List: TList;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
     
    {$R *.dfm}
     
    type
      TCustomItem = class
        Text: string;
        constructor Create(const AText: string);
        procedure Draw(Canvas: TCanvas; const Rect: TRect; State: TOwnerDrawState); virtual;
      end;
     
      TGras = class(TCustomItem)
        procedure Draw(Canvas: TCanvas; const Rect: TRect; State: TOwnerDrawState); override;
      end;
     
      TItalic = class(TCustomItem)
        procedure Draw(Canvas: TCanvas; const Rect: TRect; State: TOwnerDrawState); override;
      end;
     
    constructor TCustomItem.Create(const AText: string);
    begin
      Text := AText;
    end;
     
    procedure TCustomItem.Draw(Canvas: TCanvas; const Rect: TRect; State: TOwnerDrawState);
    begin
      with Canvas do
      begin
        FillRect(Rect);
        Brush.Style := bsClear;
      end;
    end;
     
    procedure TGras.Draw(Canvas: TCanvas; const Rect: TRect; STate: TOwnerDrawState);
    begin
      Canvas.Font.Style := [fsBold];
      Canvas.TextOut(Rect.Left, Rect.Top, Text);
      Canvas.Font.Color := clRed;
      Canvas.TextOut(Rect.Left + 50, Rect.Top, 'Gras');
    end;
     
    procedure TItalic.Draw(Canvas: TCanvas; const Rect: TRect; STate: TOwnerDrawState);
    begin
      Canvas.Font.Style := [fsItalic];
      Canvas.TextOut(Rect.Left, Rect.Top, Text);
      Canvas.Font.Color := clBlue;
      Canvas.TextOut(Rect.Left + 50, Rect.Top, 'Italic');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      List := TList.Create;
      List.Add(TGras.Create('hello'));
      List.Add(TItalic.Create('there'));
      ListBox1.Count := List.Count;
    end;
     
    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
      Rect: TRect; State: TOwnerDrawState);
    begin
      TCustomItem(List[Index]).Draw(ListBox1.Canvas, Rect, State);
    end;
     
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Pour ma part, je me contente de personnaliser une ListBox comme ici :
    http://www.developpez.net/forums/d12...e-description/

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  9. #9
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Bonjour,

    Pour ma part, je me contente de personnaliser une ListBox comme ici :
    http://www.developpez.net/forums/d12...e-description/

    A+.
    oui ça fonctionne, mais c'est pratique uniquement si tu gères une liste de string, si tes objets sont un peu plus complexes ça devient difficile.

    j'utilise ma technique dans un soft de gestion de compte bancaire avec un tableau qui donne les dépenses mensuelles sur l'année, la colonne de gauche donne des catégories de façon arborescentes et les colonnes suivantes donnent les sous-totaux mensuels pour une année donnée. Quand on clique sur un "+", les sous totaux disparaissent pour donner des lignes détails....
    Pour faire ça il est bcp plus simple d'avoir des objets non visuels qui possèdent une méthode Draw() invoquée par la listbox.
    Nom : Presse-papiers-1.jpg
Affichages : 206
Taille : 26,5 Ko
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-Bonjour,

    Paul TOTH : oui ça fonctionne, mais c'est pratique uniquement si tu gères une liste de string, si tes objets sont un peu plus complexes ça devient difficile.
    ... Exact plus les trucs sont complexes plus c'est difficile.
    ... Mais ça me donne une idée pour des trucs peu complexes mais plus qu'une liste de string : utilisation d'une StringList avec AddObject ... faudra que j'essaye un jour.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Points : 46
    Points
    46
    Par défaut
    Je viens d'essayer et cela fonctionne bien. Merci.

    Je souhaiterai également ajouter des boutons sur les lignes.
    Suis-je obligé de les dessiner ou y a-t-il un moyen d'ajouter les composants directement ?

    Merci pour votre aide.

  12. #12
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par BobaL Voir le message
    Je viens d'essayer et cela fonctionne bien. Merci.

    Je souhaiterai également ajouter des boutons sur les lignes.
    Suis-je obligé de les dessiner ou y a-t-il un moyen d'ajouter les composants directement ?

    Merci pour votre aide.
    les deux sont possibles, mais si tu places des boutons il faudra gérer leur déplacement en fonction du défilement...c'est assez pénible.

    il me semble plus simple de les dessiner et de gérer sur le Click si la souris se trouve sur le bouton.

    Voici par ailleurs une méthode pour dessiner un bouton via l'API Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.FormPaint(Sender: TObject);
    begin
      DrawFrameControl(Canvas.Handle, Rect(10,12,80,41), DFC_BUTTON, DFCS_BUTTONPUSH {or DFCS_PUSHED});
      Canvas.TextOut(25,20,'Button1');
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Merci Paul TOTH pour DrawFrameControl()
    ... et avec une TList au lieu d'une tStringlist ça donne un résultat assez chouette :

    A+.
    Images attachées Images attachées  
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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