Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Variable anhand des Namens finden
jjturbo - Fr 03.07.09 09:46
Titel: Variable anhand des Namens finden
Moin Forum,
kann man eine Variable anhand ihres Namens finden?
So nach dem Prinzip:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var Zaehler1 :Integer; Zaehler2 :Integer;
function FindeVariable:Integer; begin Result := MachIrgendwas('Zaehler' + IntToStr(1)); end; |
Nersgatt - Fr 03.07.09 10:03
Benutze ein Array:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var zahler : Array [1..2] of Integer;
begin Result := MachIrgendwas(Zaehler[1]);
end; |
jjturbo - Fr 03.07.09 10:22
Nein nein, so war das nicht gemeint.
Ich möchte wirklich den NAMEN einer Variablen finden.
Hintergrund: In userem Projekt befinden sich ziemlich viele Konstanten
z.B.:
Delphi-Quelltext
1: 2:
| Merker_Roba_335A_Belegt = '493.5'; Merker_Roba_335A_Reset = '493.6'; |
Jetzt habe ich an einer Stelle im Programm nur die Info 335A zur Verfügung und möchte den entsprechenden String dazu finden.
Z.B. möchte ich abfragen ob die entsprechende Station belegt ist:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function FindeVariable(VariablenName:String):String; begin Result := MachIrgendwas(VariablenName); end;
procedure LosGehts; var s :String; begin s := FindeVariable('Merker_Roba_' + '335A' + '_Belegt'); Showmessage(s); end; |
Und den Wert '493.5' würde ich in diesem Beispiel als Rückgabewert haben wollen.
jaenicke - Fr 03.07.09 10:45
Das geht so nicht. Die Namen der Konstanten sind in der Exe nicht mehr enthalten. Solche Informationen musst du zusätzlich über ein konstantes Array z.B. mitgeben und dieses durchschauen. Konstanten sind nur dafür da, dass man einen Wert nicht überall als Zahl schreiben muss. Der Compiler ersetzt die Konstante dann überall durch den Wert.
So geht es:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TMyRecord = record Name, Value: String; end;
const MyData: array[0..1] of TMyRecord = ( (Name: '335A_Belegt'; Value: '493.5'), (Name: '335A_Reset'; Value: '493.6') ); |
Und jetzt musst du nur das Array durchgehen und wo MyData[i].Name den richtigen Wert hat, nimmst du MyData[i].Value.
Nersgatt - Fr 03.07.09 10:50
Dann benutz doch Arrays :D
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| const Merker_Roba_Namen : Array [0..1] of String = ('335A', '0815'); Merker_Roba_Belegt : Array [0..1] of Double = (493.5, 999.5);
Function GetIndexFromName(name : string) : Integer; var i : integer; begin result := -1;
i := low(Merker_Roba_Namen); while (i <= high(Merker_Roba_Namen)) and (Result < 0) do begin if Merker_Roba_Namen[i] = Name then result := i; inc(i); end;
end;
begin ShowMessage(FloattoStr(Merker_Roba_Belegt[GetIndexFromName('335A')])); end; |
Natürlich kann man die Suche optimieren und Errorhandling betreiben, aber es zeigt das Prinzip.
jjturbo - Fr 03.07.09 10:52
Ok, danke für die Antwort.
BenBE - Fr 03.07.09 14:36
Über das Compiler-Mapfile ginge es, das will man aber oftmals aus verschiedenen Gründen nicht herausgeben. Außerdem ist der Aufwand für das Parsing nicht zu vernachlässigen (Siehe OmMAP und Omorphia Debug Interface).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!