Bonjour
Etant débutant en delphi, J'aimerais savoir s'il est possible de créer une variable depuis une procedure (en cliquant sur un bouton par exemple), comment tester si elle existe et comment la détruire.
Merci
Pat-lion
Bonjour
Etant débutant en delphi, J'aimerais savoir s'il est possible de créer une variable depuis une procedure (en cliquant sur un bouton par exemple), comment tester si elle existe et comment la détruire.
Merci
Pat-lion
une variable existe après sa déclaration (var machin: DeTypeTrucet pour sa portée et sa visibilité : globale au programme, à une unité, une procédure... selon l'endroit où elle est déclarée.
elle peut ne pas être initialisée : variable pointant sur un objet : tant qu'il n'est pas créé, elle ne pointe sur "rien" (nil, car delphi initialise d'office la plupart des variables!)
après libération de l'objet, la variable pointe toujours sur cet objet, qui n'existe plus... => assigner nil à la variable
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 procedure TForm1.Button1Click; var test; TObject; begin if test=nil then ShowMessage('nil') else ShowMessage('impossible'); test:=TObject.Create; ShowMessage(BoolToStr(Assigned(test))); test.Free; ShowMessage(BoolToStr(Assigned(test))); test:=nil; ShowMessage(BoolToStr(Assigned(test))); test:=TObject.Create; FreeAndNil(test); // mieux !!! ShowMessage(BoolToStr(Assigned(test))); end;
Créer !
Disons que
tu peux créer un objet même visuel et l'ajouter à ta fiche.
Tu peux agrandir un tableau de variable et donc en "créer" une.
Tu peux instancier une variable via un créateur d'objet
Tu peux faire appel à une fonction, procédure ou méthode dans laquelle une ou des variables seront déclarées et les utiliser dans cette même méthode.
Prenons un cas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 TForm1.Butonclick(sender : tobject) begin insertcontrol(TButton.create(self)); // ajout d'un bouton on ne sait //pas où sur la fiche probablement en 0 0 end;
Précise ta question et l'utilité de ta crétion de variable
en fait, j'aimerais quelque-chose du genre :
procedure buttonclick:
begin
creervariable(nom:string,valeur:string);
end;
puis quelque chose du genre
if variableexists(nom:string) then ...
et
detruirevariable(nom:string);
pour que la variable soit disponible pour toutes les procedures de la form
pas vraiment prévu ! et pas simple...
regarde les array of variant ?
sinon, un TList avec des noms et valeurs associées
[EDIT] mais pour être global, il faut déclarer le tableau ou la liste dans la section var de l'unité
salut pat-lion
intéressant ton problème... si tu trouves une solution je suis preneur...
Ceci dit je suis un peut perplexe car je ne voit pas comment tu peux creer une variable dans une fonction ou procédure (donc locale a cette variable ou procédure) et "jouer" avec cette meme variable dans une autre fonction ou procedure (il y a un probleme de visibilité qui se pose la)
Enfin je vais suivre car si y a une solution, je répéte, je suis preneur.
![]()
Utilise un TList et un record
si l'idée te séduit je te laisse le soin de tester et de terminer le code
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 Type My_Variable = record Nom : string; Valeur : String; end; PMy_Variable = ^My_Variable; TForm1 = class(TForm) private ListV : TStringList; procedure creervariable(nom:string,valeur:string); end procedure tform1.creervariable(nom:string,valeur:string); Var idx : integer; V : PMy_Variable ; begin if Not Assigned(ListV) then begin ListV := TStringList.create; ListV.Sorted := true; end; idx := ListV.IndexOf(nom); if idx=-1 then begin New(V); V.Nom := nom; V.Valeur := valeur; ListV.AddOject(nom,V); end else begin PMy_Variable(ListV.Ojects[idx])^.Valeur := valeur; end; end;
a+
Bonjour,
Les tstringlist font ça trés bien, moyennant quelques restrictions (comme sur la syntaxe des noms : pas de "="):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 tsl:=Tstringlist.create ; tsl.add('Name1'+'='+'Val1') ; tsl.add('Name2'+'='+'Val2') ; If tsl.indexofName('NameX')>0 then showmessage('NameX'+'='+tsl.values['NameX']) else showmessage('NameX'+' non trouvé') ; // ou alors Valeur=tsl.values['NameX'] ; If Valeur<>'' then showmessage('NameX'+'='+Valeur) else showmessage('NameX'+' non trouvé') ;
Bonjour,
Je crois que tu dois pouvoir mettre "résolu" parce que la solution de Graffito est surement la meilleure (c'est celle que j'utilise depuis déjà longtemps je l'avais même oubliée car encapsulée).
a+
Merci Graffito meme si ce n'est pas ce que je cherchais au départ ca va bien m'aider
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager