Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - mit gegebenem String auf die gleichnamige Variable zugreifen


Da_Knuddelbaer - Sa 04.10.03 13:54
Titel: mit gegebenem String auf die gleichnamige Variable zugreifen
Tag zusammen,

da programmiere ich schön an meinem Programm und stoße jetzt auf das folgende Problem:

Der Benutzer gibt in ein Edit-Feld einen Variablen-Namen ein und ich will dann die Variable mit diesem Namen verändern, und zwar mit dem Wert, der in einer zweiten Edit-Box steht.

Ich habe versucht per Addr-Funktion einen Pointer zu erstellen (das klappt soweit auch, er findet die Variablen auch alle, außer sie existieren nicht) und dann über den Pointer auf die Variable zuzugreifen. Das wiederum klappt nicht. Ich erhalte immer die Fehlermeldung dass der Quellcode Fehler enthält...


Delphi-Quelltext
1:
2:
3:
4:
var neu: Pointer;
begin
  neu := Addr(Variable);  // Variable ist vom Typ PChar
end;


Dieser Code funktioniert. Es passiert ja eigentlich auch nicht wirklich viel. Wenn ich jetzt aber auf den Pointer neu zugreifen will bekomme ich lauter Fehler schon in Code-Fenster.

Ich hoffe dass mir jemand helfen kann.

Gruß,
Knuddelbaer


highhatcompy - Sa 04.10.03 14:08

Hi,

wenn du Zeigern arbeiten willst, dann mach's doch so:

Delphi-Quelltext
1:
2:
3:
Var 
wert: Integer;
Adresse_wert: ^Integer; //beachte das ^

Wenn du die Adresse des Wertes brauchst:

Delphi-Quelltext
1:
Adresse_wert:=@wert; //beachte das @                    

Hoffe dir geholfen zu haben!!!

MfG


AndyB - Sa 04.10.03 14:26

Bedenke aber, dass ein PChar bereits nur die Adresse auf das erste Zeichen des Strings enthält.


Da_Knuddelbaer - Sa 04.10.03 19:34

Danke für die Antworten!

Nun, ich will nicht unbedingt mit Zeigern arbeiten :lol: war nur eine Idee von mir.

@highhatcompy: Angenommen der Benutzer gibt noch zusätzlich an um was für einen Typ es sich handelt...
was ich brauche ist die Möglichkeit, alleine aus einem String die zugehörige Variable zu ermitteln, damit ich diese dann den Wünschen des Benutzers anpassen kann.

@AndyB: Hmm, wenn ich also das erste Zeichen von diesem String nehmen hätte ich den gleichen Effekt?


highhatcompy - Sa 04.10.03 20:06

Hali hallo,
verstehe ich dich richtig (!?),der Benutzer gibt z.B. ein Var-name ein (myVar) und einen Wert (3 oder 'Test'). Und jetzt willst du wissen ob der Wert ein String, Integer oder Real ist ? :?:
Was programmierst du eigentlich, einen eigenen Interpreter so wie Basic??

Mfg


Da_Knuddelbaer - Sa 04.10.03 20:53

Hi,

nein, ich möchte diese Variable einfach nur ändern, von mir aus kann es erstmal auch nur auf Strings angelegt sein, mir wurscht. Also man soll den Namen angeben, wie die Variabel heisst, und das Prog selber soll diese Variabel dann auf "Hallo" setzen...

Gruß,
Knuddelbaer


hansa - Sa 04.10.03 21:01

Mir schwant böses. 8) Willst Du etwa im Quelltext eine Variable haben, die so heißt wie der String, den der Benutzer eingibt und diese dann bearbeiten ? Das wäre aber wohl völlig abwegig. Oder willst du den WERT einer Variable auf die Benutzereingabe setzen ?


maximus - Sa 04.10.03 23:34

*g* Lange rede kurzer sinn...das ist leider so nicht möglich, da die namen im code nur dazu da sind, dass wir uns orientieren können - deshalb sind sie in der EXE nicht mehr verfügbar!

Da gibt es allerdings eine möglichkeit das mit properties von objecten zu machen...genau genommen kannst du, mit hilfe der RTTI tabellen, auf alle published properties lesen und schreiben.

Ist das für dich eine reale möglichkeit?...dann erzähl ich dir mehr :wink:


hansa - So 05.10.03 00:42

Das da ist mir alles zu ungenau und dazu noch sinnlos. Mit solchen Abwegen kommt man abwegig auf Abwege. :P Also, was soll der Unsinn ? Da fehlen einige elementare Grundlagen.


Anonymous - So 05.10.03 03:48

So sollte es gehen, aber dann kannst du keine normalen Variablen verwenden.


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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
//...

type
  TVars = class
  private
   vs: array of record
                 name: string;
                 data:pointer;
                end;
   function idx(n: string): integer;
   function getv(name: string): pointer;
   procedure setv(name: stringconst Value: pointer);
  public
   constructor Create;
   destructor Destroy;
   property V[name: string]: pointer read getv write setv; default;
  end;

implementation

{ TVars }

function TVars.idx(n: string): integer;
var
 i: integer;
begin
 result := -1;
 for i := 0 to high(vs) do
  if vs[i].name = n then
  begin
   result := i;
   exit;
  end;
end;

function TVars.getv(name: string): pointer;
var
 i: integer;
begin
 i := idx(name);
 if i > -1 then
  result := vs[i].data
 else
  result := nil;
end;

procedure TVars.setv(name: stringconst Value: pointer);
var
 i: integer;
begin
 i := idx(name);
 if i > -1 then
  vs[i].data := Value
 else
 begin
  setlength(vs, length(vs)+1);
  vs[high(vs)].name := name;
  vs[high(vs)].data := Value;
 end;
end;

constructor TVars.Create;
begin
 setlength(vs,0);
end;

destructor TVars.Destroy;
begin
 setlength(vs,0);
end;

end.


Die Klasse kann wie ein Array verwendet werden. z.B:


Delphi-Quelltext
1:
vars['test'] := pchar('hallo');                    


Da_Knuddelbaer - So 05.10.03 10:14

Hi,

vielen Dank nochmal für die Antworten, freut mich :)

Zitat:

Willst Du etwa im Quelltext eine Variable haben, die so heißt wie der String, den der Benutzer eingibt und diese dann bearbeiten ?


Korrekt, genau das will ich 8)

@maximus: ka was RTTI-Tabellen sind, insofern habe ich nicht wirklich viel Ahnung wovon du sprichst. Wenn ich also auf die Variablen nicht mehr zugreifen kann ist es so "ohne weiteres" nicht möglich, richtig?

@hansa: Was ist zu ungenau?

@obbschtkuche: Hmm, wäre eine gute Idee! Nur müsste ich dann alle meine Variablen (und da es ein recht großes Projekt ist habe ich davon einige) zu einem Record umschreiben, ne?


Nochmals vielen Dank! Hätte echt nicht erwartet dass so viele Antworten kommen :)

Cheers,
Knuddelbaer


matze - So 05.10.03 11:41

machs doch einfacher. und zwr mit einem assoziativen array. also per stringlist in die du die variabnelnnamen nud werte einträgst und per stringlist.values abfrägst.


Anonymous - So 05.10.03 14:04

da kann er genauso gut meine klasse nehmen...
aber die varaiblen können da auch einfach so gesetzt werden, ohne dass sie borher existieren. man müsste also eventl. noch eine abfrage einbauen.

zu RTTI Tabellen hab ich bei Tutorials was geschrieben
http://www.delphi-forum.de/viewtopic.php?t=16593

aber das geht natürlich nicht mit normalen Variablen.


Da_Knuddelbaer - So 05.10.03 15:43

hmm, ok, ich glaube ich vergesse das einfach mal ganz schnell...

Danke für die Hilfe :)

Gruß,
Knuddelbaer


highhatcompy - Mo 06.10.03 06:06

Ein letzter Versuch,
vieleicht hilft dir ja das!

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
var
 test: ^string;
 vari: string;
begin
        vari:=edit1.text;
        test:=@vari;
        test^:=edit2.text;
      showmessage(vari);
end;

Mfg Highhatcompy