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 :

Une StringList avec des Variants


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 740
    Par défaut Une StringList avec des Variants
    Bonjour,

    J'aimerais stocker dans un TStringList un variant lié à chaque chaine.

    Le AddObject permet de stocker un TObject, mais quid des variables autres ? Entiers, réels, datetime ou, dans mon cas variants.

    Comment les stocker et comment les récupérer ?

    Voilà, toute info sur le sujet m'intéresse.

    A+
    JS

    PS : Lazarus 0.9.30.4, FPC 2.6.0 sous Seven 32bits.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je ne sais pas pour un StringList et un Variant mais avec un TStringGrid, je procède ainsi :
    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
    {La déclaration}
    type
      TClassAddOn = class(TObject)
         private
           Selected : Boolean;
         public
           ID       : string[20];
           CellColor  : TColor;
       //  constructor Create(???); virtual;
        end; 
     
    [...]
     
    {L'initialisation}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      iCol, iRow : integer;   
    begin                            
     with SG do //La StringGrid
       for iRow := 0 to RowCount -1 do
        for iCol := 0 to ColCount -1 do begin
         if TClassAddOn(Objects[iCol,iRow]) = nil then Objects[iCol,iRow] := TClassAddOn.Create();
          TClassAddOn(Objects[iCol,iRow]).CellColor := clWindow;
        end;   
    [...]
    end;
     
    {Une affectation}
    procedure TForm1.SGMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      iCol, iRow: Longint;
    begin
      with SG do begin
        MouseToCell(X, Y, iCol, iRow);
        if iRow = 0 then exit;
        if (ssLeft in Shift) then begin
         Cells[iCol,iRow] := sgEMC.Cells[EMmatCol,sgEMC.Row]+LineEnding+sgEMC.Cells[EMEnsCol,sgEMC.Row];
         TClassAddOn(Objects[iCol,iRow]).CellColor  := StringToColor(sgEMC.Cells[EMhexCol,sgEMC.Row]);
        end;
        if (ssRight in Shift) then begin
          Cells[iCol,iRow] := '';
          TClassAddOn(Objects[iCol,iRow]).CellColor  := clWindow;
        end;
      end;
    end;  
     
    {Une lecture}
    procedure TForm1.SGPrepareCanvas(sender: TObject; aCol, aRow: Integer;
      aState: TGridDrawState);
    begin
      with SG do begin
       if (aRow =0) and (aCol =0) then
        Canvas.Font.Color:= clRed;
        if ARow = 5 then  
          Canvas.Brush.Color := clBtnFace;
     
        if (aCol > 0) and (aRow > 0) and (aRow <> 5) then begin
          Canvas.Brush.Color :=  TClassAddOn(Objects[aCol,aRow]).CellColor;
        end;
      end;
    end;
    J'en profite d'avoir ouvert mon Lazarus (pour essayer de comprendre une explication de Delphiste...). J'extrais le code tel quel. Cela fonctionne avec un Tcolor donc pourquoi pas avec un variant ? Si cela peut vous aider.

    Sur ce, je retourne à mon Juno... (Le PM est consacré à Java et le matin à Pascal )

    Bonne fin de journée.
    Cordialement. Gilles

  3. #3
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 740
    Par défaut
    Merci,

    Je vais voir comment je peux transcrire cela avec mes variants (pour le conteneur, ça ne devrait pas changer grand-chose).

    A+
    JS

  4. #4
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Salut

    Alors, il y a deux moyens d'arriver a ce résultat :

    La première méthode, c'est celle de selzig : Créer une classe (TClassAddOn) dans laquelle tu viens définir un (ou plusieurs) membres publics. A chaque création de chaine, tu ne dois pas oublier de créer l'objet correspondant, en faisant par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var AddOn : TClasseAddOn
     
    AddOn:=TClasseAddOn.Create;
    StringList.AddObject('Ma chaine', AddOn);  //Au lieu de StringList.Add('Ma chaine')
    Pour accéder a la propriété :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TClassAddOn(StringList.Objects[i]).CellColor := ... //pour reprendre l'exemple de selzig
    Attention, n'oublies pas de bien libérer les objets (regarde autour de OwnObjects)...


    Cette technique est la plus propre, mais il en existe une plus simple et plus rapide (mais plus limitée). Au lieu de créer un TObject, tu cast directement le pointeur vers le type voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringList.AddObject('Ma chaine', TObject(18)); //Stocke l'entier 18 a l'endroit du pointeur
    Pour le lire ou le modifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Integer(StringList.Objects[i]) := ...
    Et tu n'a plus besoin de te soucier de la libération mémoire, car tu n'alloues rien (tu ne fais pas de Create() ).

    Avec cette méthode, il faut faire attention a la taille de ce que tu stockes dans ce pointeur. Je pense que le pointeur est un pointeur sur 32 bits, aussi, tu ne pourra pas stocker un Int64 par exemple (Je ne suis pas sûr, a vérifier avec SizeOf() )

    Voila les deux méthodes exposées. A toi de les adapter pour un Variant. Vérifie bien la taille de ce type.

    J'aimerais ajouter qu'il est très rare d'utiliser un Variant. Depuis que je programme, je n'en ai jamais utilisé. Peut tu nous expliquer a quoi cela te sert il ? Il y a peut être un moyen plus simple de faire ce que tu veux ? (L'utilisation des Variant me semble assez lourde)

    selzig > Pour répondre a ta remarque, je pense que la StringGrid s'appuie sur une StringList, d'ou les similitudes des fonctions ... Donc ton code fonctionnera pour une StringList

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    L'utilisation des Variant me semble assez lourde
    Elle est certainement notablement plus lente également.

    Si on peut définir un ^Variant, il suffit de le caster en TObject au TStringList.AddObjects pour résoudre le problème éventuel de taille.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 740
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 740
    Par défaut
    Bonjour,

    Je n'ai hélas pas le choix. Car c'est pour piloter OpenOffice et je suis obligé de passer par des Variants.

    Merci, en tout cas pour cette astuce de cast.

    A+

    JS

Discussions similaires

  1. Piloter une interface avec des relais
    Par Yepazix dans le forum API, COM et SDKs
    Réponses: 13
    Dernier message: 26/10/2004, 19h46
  2. Creer une requete avec des LEFT JOIN et des GRO
    Par donbuz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2004, 15h53
  3. [MFC] creer une liste avec des check????
    Par ginounet dans le forum MFC
    Réponses: 4
    Dernier message: 16/06/2004, 11h47
  4. Erreur sur une fonction avec des paramètres
    Par Elois dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 05/05/2004, 21h00
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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