| Autor |
Beitrag |
Da_Knuddelbaer
      
Beiträge: 485
|
Verfasst: Sa 04.10.03 13:54
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
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: 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:
Delphi-Quelltext
Hoffe dir geholfen zu haben!!!
MfG
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Sa 04.10.03 14:26
Bedenke aber, dass ein PChar bereits nur die Adresse auf das erste Zeichen des Strings enthält.
_________________ Ist Zeit wirklich Geld?
|
|
Da_Knuddelbaer 
      
Beiträge: 485
|
Verfasst: Sa 04.10.03 19:34
Danke für die Antworten!
Nun, ich will nicht unbedingt mit Zeigern arbeiten  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
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: 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 
      
Beiträge: 485
|
Verfasst: 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
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Sa 04.10.03 21:01
Mir schwant böses.  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 ?
_________________ Gruß
Hansa
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: 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 
_________________ mfg.
mâximôv
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: 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.  Also, was soll der Unsinn ? Da fehlen einige elementare Grundlagen.
_________________ Gruß
Hansa
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: So 05.10.03 03:48
So sollte es gehen, aber dann kannst du keine normalen Variablen verwenden.
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 
      
Beiträge: 485
|
Verfasst: 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
@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
      
Beiträge: 4613
Erhaltene Danke: 24
XP home, prof
Delphi 2009 Prof,
|
Verfasst: 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.
_________________ In the beginning was the word.
And the word was content-type: text/plain.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: 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
www.delphi-forum.de/viewtopic.php?t=16593
aber das geht natürlich nicht mit normalen Variablen.
|
|
Da_Knuddelbaer 
      
Beiträge: 485
|
Verfasst: 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
      
Beiträge: 190
Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
|
Verfasst: 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
|
|