![]() |
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:
Aktuelle sieht es so aus: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;
Code:
Wie man sieht ändern sich nur die Variablennamen.
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; Wenn ich also mit folgendem Sourcecode den Namen rausbekomme
Code:
kann ich dann mit name := 'HV'test := (sender as TTrackbar).Name; name := Copy(test,0,Pos('Bar',test)-1); 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 |
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. |
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 |
Re: Dynamisch Variablenname erzeugen
Zitat:
Aber warum nimmst du nicht ein Record?
Delphi-Quellcode:
Jede Komponente hat auch noch das Feld "Tag". Da speicherst du durchgehend eine Zahl (je nachdem, an welcher Stelle dein Komponente in Txyz ist)
type Txyz=(HV,ThrMin,ThrMax,...,LedMax);
type TRec=record low,high:integer; end; type TAll=array[HV..LedMax] of TRec; 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; |
Re: Dynamisch Variablenname erzeugen
(PS: Arrays finde ich nicht so gut ...) |
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.
|
Re: Dynamisch Variablenname erzeugen
Zitat:
|
Re: Dynamisch Variablenname erzeugen
Na dann bleibt mir wohl doch nur der Weg für jeden Trackbar seine eigene Change-Routine zu schreiben
|
Re: Dynamisch Variablenname erzeugen
Zitat:
|
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; |
Re: Dynamisch Variablenname erzeugen
Zitat:
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: ![]() 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. |
Re: Dynamisch Variablenname erzeugen
Zitat:
|
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.
|
Re: Dynamisch Variablenname erzeugen
Zitat:
|
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:
MfG
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; ... Kolbi |
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 ... |
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 17:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz