Delphi-PRAXiS

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;

shmia 5. Nov 2007 11:02

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von blackmice
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.

Erfahrung aus der Praxis:
Man kann Probleme im Sourcode sofort beheben und benötigt dafür die Zeit X.
Man kann es auch lassen wie es ist. Nach einigen weiteren Änderungen merkt man dann,
dass die ganze Soße jetzt so komplex geworden ist, dass man eigentlich fast nichts mehr ändern
kann ohne Angst zu haben müssen, dass danach nichts mehr funktioniert. (*)
Stichwort: Antipattern , Spaghetticode
Nun braucht man die Zeit 5 bis 20 * X.

*) bei kommerzieller Software hat man dann "einen Klotz in der Hos'".
Nervige Anrufe der Kunden mit Fehlermeldungen kosten Arbeitszeit und schaden dem Image.

Deep-Sea 5. Nov 2007 11:02

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von leddl
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;

Du solltest auch drei Parameter übergebne, wenn deine Procedure drei erwartet :stupid:

blackmice 5. Nov 2007 11:05

Re: Dynamisch Variablenname erzeugen
 
Manchmal ist man ja auch so vernagelt in seinem Denken, dass einem die einfachsten Ideen nicht einfallen. Klar kann ich auch die Variablen im Aufruf mitgeben. Danke.

leddl 5. Nov 2007 11:05

Re: Dynamisch Variablenname erzeugen
 
Zitat:

Zitat von Deep-Sea
Du solltest auch drei Parameter übergebne, wenn deine Procedure drei erwartet :stupid:

Das passiert, wenn man nachträglich noch was einfügt :zwinker:

kolbaschedder 5. Nov 2007 11:10

Re: Dynamisch Variablenname erzeugen
 
Hallo,

Hatte mal ein ähnliches Problem. TObject hat eine frei verfügbare Eigenschaft "Tag : Integer". Hier kannst du jedem Trackbar eine ID zuordnen. Alle Trackbars bekommen die gleiche obChange zugeordnet.

in deiner onChange kannst du dann sowas machen

Delphi-Quellcode:
  case Sender.tag of
    1 : a := TTrackbar(Sender).position;
    2 : b := TTrackbar(Sender).position;
    3 : c := TTrackbar(Sender).position;
    4 : d := TTrackbar(Sender).position;
    5 : e := TTrackbar(Sender).position;
...
MfG

Kolbi

Deep-Sea 5. Nov 2007 11:12

Re: Dynamisch Variablenname erzeugen
 
Idee:
Du erstellt ein Objekt mit der Eigenschaft X (Name egal) als Index-Eigenschaft. Der Index-Parameter ist ein String, also hier der Name der Variable.
So kannst du überall wo auf eine Variable zugegriffen wird, wie zB. iThrMaxHigh, auf "Objekt.X['iThrMaxHigh']" zugreifen, es geht dann sowohl lesen als auch schreiben und du musst nur kurz die Funktion "Ersetzen" nutzen ...

blackmice 5. Nov 2007 11:22

Re: Dynamisch Variablenname erzeugen
 
Hmm, mal sehen, vielleicht kann ich beides kombinieren.

Ich danke allen auf jeden Fall für die Unterstützung und werde einfach mal mit den genannten Tipps ein bischen experimentieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 Uhr.

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