Autor Beitrag
jjturbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 516

Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
BeitragVerfasst: Fr 03.07.09 09:46 
Moin Forum,

kann man eine Variable anhand ihres Namens finden?

So nach dem Prinzip:
ausblenden 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;

_________________
Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 03.07.09 10:03 
Benutze ein Array:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var zahler : Array [1..2of Integer;

begin
  Result := MachIrgendwas(Zaehler[1]);

end;

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jjturbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 516

Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
BeitragVerfasst: 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.:

ausblenden 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:

ausblenden 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.

_________________
Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TMyRecord = record
    Name, Value: String;
  end;

const
  MyData: array[0..1of TMyRecord = (
    (Name: '335A_Belegt'; Value: '493.5'), // Merker_Roba_335A_Belegt
    (Name: '335A_Reset'; Value: '493.6')   // Merker_Roba_335A_Reset
  );
Und jetzt musst du nur das Array durchgehen und wo MyData[i].Name den richtigen Wert hat, nimmst du MyData[i].Value.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Fr 03.07.09 10:50 
Dann benutz doch Arrays :D

ausblenden 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..1of String = ('335A''0815');
      Merker_Roba_Belegt : Array [0..1of Double = (493.5999.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 < 0do
  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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
jjturbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 516

Win2000 prof., WinXP prof.
D4 Stand., D5 Prof, D7 Prof, D2007 Prof.
BeitragVerfasst: Fr 03.07.09 10:52 
Ok, danke für die Antwort.

_________________
Windows XP: Für die einen nur ein Betriebssystem - für die anderen der längste Virus der Welt...
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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).

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.