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..2of 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..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 - 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..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.


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