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); 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; |
Wenn du die Adresse des Wertes brauchst:
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: string; const Value: pointer); public constructor Create; destructor Destroy; property V[name: string]: pointer read getv write setv; default; end;
implementation
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: string; const 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
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!