Avatar billede js_delphi Nybegynder
25. august 2009 - 12:27 Der er 9 kommentarer og
2 løsninger

Finde variabel dynamisk?

Hej,

Jeg har set mig blind paa en formentlig simpel opgave.
Hvis man dynamisk vil have fat i en komponent paa en Form, kan man goere dette:

for i := 1 to 5 do
  TButton(frmMain.FindComponent('Button' + IntToStr(i))).Caption := 'Test1';

Hvordan forholder det sig, hvis man vil have fat i en variabel?
Noget i denne retning:

var
  var1, var2, var3, var4, var5: Integer;

for i := 1 to 5 do
  Integer(FindVariable('var' + IntToStr(i))) := 2;


Paa forhaand tak!
Avatar billede a_nor Nybegynder
25. august 2009 - 13:29 #1
Det kan du ikke :-(

Variabler lægges på stak og heap, og oversætter erstatter variabelnavne med direkte adressering.
Avatar billede js_delphi Nybegynder
25. august 2009 - 14:03 #2
Det havde jeg frygtet.
Goer det nogen forskel, hvis det er pointere, man arbejder med?
F.eks.:

var
  var1, var2, var3, var4, var5: ^Integer;
  var11, var12, var13, var14, var15: Integer;

var1 := @var11;
var2 := @var12;
var3 := @var13;
var4 := @var14;
var5 := @var15;

for i := 11 to 15 do
  Integer(FindPointer('var' + IntToStr(i))^) := 2;
Avatar billede js_delphi Nybegynder
25. august 2009 - 14:04 #3
Hov, saadan her mente jeg:

for i := 1 to 1 do
  Integer(FindPointer('var' + IntToStr(i))^) := 2;
Avatar billede hrc Mester
25. august 2009 - 14:29 #4
Du kan gøre det vha RTTI (Run Time Type Information). Laver du en property til variablene kan du sættes værdien på dem. Faktisk kan du finde en masse interessante oplysninger vha RTTI.

http://delphi.about.com/od/oopindelphi/a/delphirtti.htm

... men basalt er det vist en rigtig forkert fremgangsmåde du har gang i.
Avatar billede a_nor Nybegynder
25. august 2009 - 14:49 #5
Men så er det jo heller ikke simple variable mere, men objekter !
Avatar billede js_delphi Nybegynder
25. august 2009 - 14:59 #6
-> hrc:

Du har helt ret i, at det ikke er helt fint, det, jeg har gang i her :-)
Det er et gammelt program, som jeg er ved at opdatere med nye funktioner. Den gang havde jeg som bekendt ikke styr paa det objektorienterede...

Jeg er nu lige gaaet igang med at omskrive programmet komplet, da det andet vist bliver noget rod.

Laeg svar begge to, saa vi kan faa lukket.


hrc, fik du min mail forleden?
Avatar billede a_nor Nybegynder
25. august 2009 - 15:00 #7
Ja, man kan nemt komme til at "hænge" med noget gammel kode.
Avatar billede hrc Mester
25. august 2009 - 21:58 #8
Kan næsten ikke holde mig fra at pille i grim kode nu jeg med stor sikkerhed (hovmod falder hver gang) "ved" hvordan det skal laves. Nogle gange skal det bare gennem trinene if it works, fix it 'til it don't, hvorefter det, længe efter det burde være færdigt, ender med at virke sådan omtrent ligeså godt som udgangspunktet...
Avatar billede Slettet bruger
31. august 2009 - 13:04 #9
Hvorfor bruger du ikke bare et array?

var
  arvar: array[1..5] of Integer;

for i := 1 to 5 do
  arvar15[i] := 2;
Avatar billede Slettet bruger
31. august 2009 - 13:05 #10
Skulle selvfølgelig være:

var
  arvar: array[1..5] of Integer;

for i := 1 to 5 do
  arvar[i] := 2;
Avatar billede js_delphi Nybegynder
31. august 2009 - 13:33 #11
Min ovenstaaende kode var bare et simpelt eksempel.
De variabler, jeg bruger, har forskellige meningsfulde navne.
Det er faktisk pointere, som peger paa et array.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester