Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamisch Variablenname erzeugen (https://www.delphipraxis.net/102801-dynamisch-variablenname-erzeugen.html)

blackmice 5. Nov 2007 10:18


Dynamisch Variablenname erzeugen
 
Wahrscheinlich wurde auch diese Frage schon zu Tode diskutiert, aber ich habe keine Einträge gefunden (Wahrscheinlich suche ich bloß falsch)

Also ich habe 6 Trackbars, die beim Verschieben eigentlich alle das gleiche tun sollen, nur mit verschiedenen Variablen.
Gibt es eine Möglichkeit (Statt 6 verschiedene Routinen zu schreiben) eine Routine zu schreiben und anhand des Aufrufenden Trackbars bestimmte Variablen zu ändern?

Also hier das Beispiel

Code:
 
iHVHigh      : Integer = 0;
iHvLow       : Integer = 0;
iThrMinHigh  : Integer = 2;
iThrMinLow   : Integer = 0;
iThrMaxHigh  : Integer = 127;
iThrMaxLow   : Integer = 0;
iLedMinHigh  : Integer = 0;
iLedMinLow   : Integer = 0;
iLedMaxHigh  : Integer = 0;
iLedMaxLow   : Integer = 0;
Aktuelle sieht es so aus:

Code:
procedure TForm1.THRMinBarChange(Sender: TObject);
var cThrMin : String;
begin
  cThrMin := IntToHex(ThrMinBar.Position,4);
  iThrMinLow := StrToInt('$' + copy(cThrMin,3,2));
  iThrMinHigh := StrToInt('$' + copy(cThrMin,0,2));
  ThrMinEdt.Text := IntToStr(round(500*ThrMinBar.Position*2.5/4096));
  Form1.RS232Panel.Caption := BuildCaption;
  bRS232Changed := True;
end;

...

procedure TForm1.HVBarChange(Sender: TObject);
var cHV : String;

begin
  cHV := IntToHex(HVBar.Position,4);
  iHVLow := StrToInt('$' + copy(cHV,3,2));
  iHVHigh := StrToInt('$' + copy(cHV,0,2));
  HVEdt.Text := IntToStr(round(500*HVBar.Position*2.5/4096));
  Form1.RS232Panel.Caption := BuildCaption;
  bRS232Changed := True;
end;
Wie man sieht ändern sich nur die Variablennamen.
Wenn ich also mit folgendem Sourcecode den Namen rausbekomme

Code:
 
test := (sender as TTrackbar).Name;
name := Copy(test,0,Pos('Bar',test)-1);
kann ich dann mit name := 'HV'
irgendwie auf die Variablen
iHVLow
iHVHigh
zugreifen?

müsste dann ergo für name := 'THRMax'
irgendwie auf die Variablen
iTHRMaxLow
iTHRMaxHigh

Die Variablennamen setzen sich immer aus i + Name des Trackbar + Low oder + High zusammen

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt. Bin noch nicht so lange dabei.

Danke
Blackmice

sirius 5. Nov 2007 10:22

Re: Dynamisch Variablenname erzeugen
 
Jo, schau dir mal an, was der Parameter Sender so beinhaltet!

Edit: Im Beispiel kam ja noch ne zweite Frage.
Also Variablennamen kann (und will und soll!) Delphi auch nicht auseinandernehmen. Die Namen gibts auch zu Laufzeit nicht mehr.
Ich würde hier ein array aus einem Record vorschlagen, oder wenn es komplizierter wird: polymorphe Klassen.

blackmice 5. Nov 2007 10:31

Re: Dynamisch Variablenname erzeugen
 
Ich habe doch Sender schon auseinander genommen und rausgefunden, dass mein Trackbar z.B. HVBar heisst

Ich weiss jetzt auch, dass ich auf die Variablen

iHVLow und iHVHigh zugreifen will, aber wie bringe ich das dem Computer bei?

Delphi-Quellcode:
 
test := (sender as TTrackbar).Name; // Hier steht jetzt der Name des Trackbar drin. In diesem Fall HVBar;
name := Copy(test,0,Pos('Bar',test)-1);
cHV := (sender as TTrackbar).Position

'i' + name + 'Low' := StrToInt('$' + copy(cHV,3,2));

wird wohl nicht das gewünschte Ergebnis bringen

sirius 5. Nov 2007 10:42

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von blackmice
wird wohl nicht das gewünschte Ergebnis bringen

Nö, nie! Da bist du bei Delphi an der falschen Stelle. Variablen sind nach dem Compilieren nur noch Adressen. Namen werden nirgends abgespeichert. Das kann man über den Umweg einer Klasse machen, welcher beim compilieren der eigene Name mitgegeben wird. Dies ist z.B. bei allen Nachfahren von TComponent der Fall.

Aber warum nimmst du nicht ein Record?
Delphi-Quellcode:
type Txyz=(HV,ThrMin,ThrMax,...,LedMax);

type TRec=record
       low,high:integer;
end;

type TAll=array[HV..LedMax] of TRec;
Jede Komponente hat auch noch das Feld "Tag". Da speicherst du durchgehend eine Zahl (je nachdem, an welcher Stelle dein Komponente in Txyz ist)
Und dann so:
Delphi-Quellcode:
var xyz:Txyz;
begin
  xyz:=Txyz((sender as TTrackbar).Tag);
  All[xyz]:= //ja und jetzt machst du mit deinen Strings dasselbe
end;

Deep-Sea 5. Nov 2007 10:45

Re: Dynamisch Variablenname erzeugen
 
  • TStrinList mittels "Values".
  • Eigene Objekte.
  • TTrackbar ableiten und die benötigten Eigenschaften hinzufügen
  • etc.
Es gibt dutzende Wege ...
(PS: Arrays finde ich nicht so gut ...)

blackmice 5. Nov 2007 10:50

Re: Dynamisch Variablenname erzeugen
 
Vor allem finde ich das mit dem Array jetzt auch zu kompliziert umzusetzen. Ich hab nen fertigen Sourcecode der auf diesen Variablen aufbaut, und das an so vielen verschiedenen Stellen. Nur ist demjenigen für den ich das Programm schreibe erst jetzt eingefallen, dass er statt 1 Trackbar mehr braucht. Und wenn ich jetzt diese Variablen in nen Array setze, kann ich an 1000 Stellen anfangen alles neu zu machen.

Deep-Sea 5. Nov 2007 10:52

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von blackmice
Vor allem finde ich das mit dem Array jetzt auch zu kompliziert umzusetzen. Ich hab nen fertigen Sourcecode der auf diesen Variablen aufbaut, und das an so vielen verschiedenen Stellen. Nur ist demjenigen für den ich das Programm schreibe erst jetzt eingefallen, dass er statt 1 Trackbar mehr braucht. Und wenn ich jetzt diese Variablen in nen Array setze, kann ich an 1000 Stellen anfangen alles neu zu machen.

Tja, du wirst da nicht drum rum kommen, es anders zu lösen ...

blackmice 5. Nov 2007 10:56

Re: Dynamisch Variablenname erzeugen
 
Na dann bleibt mir wohl doch nur der Weg für jeden Trackbar seine eigene Change-Routine zu schreiben

Deep-Sea 5. Nov 2007 11:00

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von blackmice
Na dann bleibt mir wohl doch nur der Weg für jeden Trackbar seine eigene Change-Routine zu schreiben

Oder so ... wenn auch sicherlich eine unschöne Methode :P

leddl 5. Nov 2007 11:00

Re: Dynamisch Variablenname erzeugen
 
Delphi-Quellcode:
procedure WasAuchImmer(Var a : Integer; Var b : String; Sender : TObject)
begin
  a := (Sender as TTrackBar).Position;
  b := "Ich bin ein String";
end;

procedure TForm1.THRMinBarChange(Sender: TObject);
Begin
  WasAuchImmer(ersterInteger, ersterString);
End;

procedure TForm1.HVBarChange(Sender: TObject);
Begin
  WasAuchImmer(zweiterInteger, zweiterString);
End;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz