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 :

VCL / tStringGrid et tStringList


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut VCL / tStringGrid et tStringList
    Bonjour à tous,
    Je cherche à intégrer, dans certaines colonnes d'un tStringGrid, un Combobox me donnant un accès à une liste d'objets par leur nom.

    Le test ci-dessous fonctionne parfaitement tant que je récupère le String.
    Est-il possible de récupérer, dans la cellule du StringGrid, l'objet qui est associé à au champ de la StringList, plutôt que la chaine elle-même ?

    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
     
    // Gestion StringList
      TGetEditStyleEvent = procedure(TSender: TObject; ACol, ARow: Integer;
        var EditStyle: TEditStyle) of object;
     
      TStringGrid = Class(Grids.TStringGrid)
      Private
        FDropdownRowCount: Integer;
        FOnEditButtonClick: TNotifyEvent;
        FOnGetEditStyle: TGetEditStyleEvent;
        FOnGetPickListItems: TOnGetPickListItems;
        procedure SetDropDownRowCount(value: Integer);
        // procedure SetOnEditButtonClick(value: TNotifyEvent);
        procedure SetOnGetPicklistItems(value: TOnGetPickListItems);
      protected
        function CreateEditor: TInplaceEdit; override;
        function GetEditStyle(ACol, ARow: Integer): TEditStyle; override;
      public
        constructor Create(AOwner: TComponent); override;
      published
        property DropdownRowCount: Integer read FDropdownRowCount
          write SetDropDownRowCount default cNbCtrlMax;
        // property OnEditButtonClick: TNotifyEvent read FOnEditButtonClick
        // write SetOnEditButtonClick;
        property OnGetEditStyle: TGetEditStyleEvent read FOnGetEditStyle
          write FOnGetEditStyle;
        property OnGetPickListItems: TOnGetPickListItems read FOnGetPickListItems
          write SetOnGetPicklistItems;
      end;
    avec :
    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
     
     
    Constructor TStringGrid.Create;
    begin
      inherited Create(AOwner);
      FDropdownRowCount := 2;
    end;
     
    function TStringGrid.CreateEditor: TInplaceEdit;
    begin
      result := TInplaceEditList.Create(self);
      with TInplaceEditList(result) do
      begin
        RowCount := FDropdownRowCount;
        OnGetPickListItems := FOnGetPickListItems;
        OnEditButtonClick := FOnEditButtonClick;
      end;
    end;
     
    function TStringGrid.GetEditStyle(ACol, ARow: Integer): TEditStyle;
    begin
      result := esSimple;
      if Assigned(FOnGetEditStyle) then
        FOnGetEditStyle(self, ACol, ARow, result);
      Invalidate;
    end;
     
    procedure TStringGrid.SetDropDownRowCount(value: Integer);
    begin
      FDropdownRowCount := value;
      if Assigned(InplaceEditor) then
        TInplaceEditList(InplaceEditor).DropdownRows := value;
      Invalidate;
    end;
     
    // procedure TStringGrid.SetOnEditButtonClick(value: TNotifyEvent);
    // begin
    // FOnEditButtonClick := value;
    // if Assigned(InplaceEditor) then
    // TInplaceEditList(InplaceEditor).OnEditButtonClick := value;
    // Invalidate;
    // end;
     
    procedure TStringGrid.SetOnGetPicklistItems(value: TOnGetPickListItems);
    begin
      FOnGetPickListItems := value;
      if Assigned(InplaceEditor) then
        TInplaceEditList(InplaceEditor).OnGetPickListItems := value;
      Invalidate;
    end;
     
    procedure TfrmDynFct.OnGetEditStyle(TSender: TObject; ACol, ARow: Integer;
      var EditStyle: TEditStyle);
    begin
      case ACol of
        cColRefObjectName:
          EditStyle := esPickList;
        cColOperateur:
          EditStyle := esPickList;
        cColRefValue:
          EditStyle := esSimple;
        cColFctNext:
          EditStyle := esPickList;
      end;
    end;
     
    procedure TfrmDynFct.OnGetPickListItems(ACol, ARow: Integer; Items: TStrings);
    begin
      case ACol of
        cColRefObjectName:
          Items.Assign(RefVisuelListe);
        cColOperateur:
          Items.Assign(RefOperateurListe);
        // cColRefValue:
        // cColDelay:
        cColFctNext:
          Items.Assign(RefLogiqueListe);
      end;
    end;
    Merci pour votre aide,

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 541
    Billets dans le blog
    10
    Par défaut
    tu peux attacher un objet à une cellule de la manière suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      Randomize;
      For i := 1 To StringGrid1.RowCount-1 do
        For j := 1 To StringGrid1.ColCount-1 Do
        begin
          StringGrid1.Cells[j, i] := IntToStr(Random(510));
          StringGrid1.Cols[i].Objects[J] := nil ;
        end;
    Tu remplaces nil par ton objet

  3. #3
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Merci Alweber,
    J'arrive
    - à proposer le contenu d'une cellule par une stringList (à laquelle je sais attacher des objets)
    - à attacher un objet à chaque cellule (notamment par la solution que tu proposes) de ma grille

    mais comment combiner les 2, c'est à dire, à la sélection, transmettre l'objet attaché à la string sélectionnée vers la cellule remplie ?

    La définition de TOnGetPickListItems me transmet bien une String comme Item
    TOnGetPickListItems = procedure(ACol, ARow: Integer; Items: TStrings) of Object;

    Y a-t-il une solution avec les Livebindings, ou ma technique pour inclure une stringList dans ma stringGrid n'est-elle pas la bonne ?
    Merci par avance pour vos idées. Si cela n'est pas possible, je me tournerais vers une autre interface...
    Cordialement,

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 615
    Billets dans le blog
    65
    Par défaut
    Bonjour,
    Citation Envoyé par Galet Voir le message
    Y a-t-il une solution avec les Livebindings ?
    Si cela n'est pas possible, je me tournerais vers une autre interface...
    Je me pencherai bien dessus mais je ne vois pas exactement l'objectif (ciel bouché ce matin)

    serait-ce quelque chose comme la stringgrid de TMS ?
    Nom : asg5.png
Affichages : 727
Taille : 5,5 Ko

  5. #5
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 541
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Galet Voir le message
    Merci Alweber,
    ...
    mais comment combiner les 2, c'est à dire, à la sélection, transmettre l'objet attaché à la string sélectionnée vers la cellule remplie ?
    Cordialement,
    Attention "string" n'est pas un objet au sens strict. Dis nous quel objet tu veux utiliser je t'envoie dans la mesure du possible un exemple

  6. #6
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Merci à tous les 2,

    Mon objectif est de pouvoir créer des "équations" composées de plusieurs lignes.
    Chaque ligne implique une "variable" (objet, principalement identifié par son nom, d'une liste générique). Ces objets peuvent avoir des caractéristiques différentes.
    C'est un peu comme si je voulais composer des requêtes vers une Base de données, composée par l'utilisateur.

    Un petit proto qui fonctionne parfaitement, en utilisant une stringrid pour stocker les lignes, et une stringListe pour la sélection (qui pointe vers mes objets) :
    Nom : Capture.PNG
Affichages : 697
Taille : 6,3 Ko

    Mon problème est qu'il est possible (c'est sur ce point que je dois travailler) que plusieurs objets portent un nom similaire (ce qui, pour le coup n'est pas très logique). Il est donc plus fiable (et plus rapide), dans la stringGrid, de récupérer le pointeur de mon objet plutôt que son nom (ce que je fais actuellement).
    Ne m'étant pas encore frotté aux LiveBinding, je me dis qu'une piste peut se trouver de ce côté... la encore, je dois creuser.
    Cordialement,

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 541
    Billets dans le blog
    10
    Par défaut
    Voici un 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
      For i := 1 To StringGrid1.RowCount-1 do
        For j := 1 To StringGrid1.ColCount-1 Do
        begin
          StringGrid1.Cells[j, i] := IntToStr(Random(510));
          ComboBox1:= TComboBox.Create(self);
          ComboBox1.Left := j*StringGrid1.DefaultColWidth ;
          ComboBox1.top := i*StringGrid1.DefaultRowHeight ;
          ComboBox1.Width := StringGrid1.DefaultColWidth - 3 ;
          ComboBox1.height := StringGrid1.DefaultRowHeight - 3 ;
          ComboBox1.Parent := stringGrid1 ;
          ComboBox1.Items.Add('A') ;
          ComboBox1.Items.Add('B') ;
          ComboBox1.Items.Add('C') ;
          ComboBox1.text := StringGrid1.Cells[j, i] ;
          ComboBox1.Visible := false ;
          StringGrid1.Cols[i].Objects[J] := ComboBox1 ;
        end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    var
      ComboBox1: TComboBox ;
    begin
      ComboBox1:= TComboBox (StringGrid1.Cols[ARow].Objects[ACol]) ;
      ComboBox1.Visible := true ;
    end;
    Fichiers attachés Fichiers attachés

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

    ce n'est pas un simple string mais un TStrings ancêtre de la TStringList ... tu dois pouvoir retrouver tes objets en transtypant l'item



    /////////////////////////////////////


    Ps : si c'est uniquement du VCL il existe le inplaceditor qui te permet de faire ce que tu cherche

  9. #9
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Merci pour ces 2 pistes que je vais étudier de près !

  10. #10
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Bon, finalement j'ai travaillé en profondeur pour résoudre le problème de nom unique (ce qui est nettement plus efficace).
    Je remets donc à plus tard le test des 2 pistes et classe en résolu pour libérer la place.
    Merci une nouvelle fois pour l'aide.

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

Discussions similaires

  1. [VCL][TListView]Montrer une ligne à l'écran
    Par ptitbob dans le forum Delphi
    Réponses: 4
    Dernier message: 23/07/2007, 16h35
  2. Delphi 7 et les TStringGrid
    Par Claude HENRY dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/05/2003, 09h18
  3. TStringList en array of string
    Par JediKerian dans le forum Langage
    Réponses: 2
    Dernier message: 20/03/2003, 15h37
  4. TStringList
    Par giaco dans le forum Composants VCL
    Réponses: 3
    Dernier message: 17/09/2002, 13h50
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

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