Autor Beitrag
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
BeitragVerfasst: Sa 04.10.03 14:08 
Hi,

wenn du Zeigern arbeiten willst, dann mach's doch so:
ausblenden Delphi-Quelltext
1:
2:
3:
Var 
wert: Integer;
Adresse_wert: ^Integer; //beachte das ^

Wenn du die Adresse des Wertes brauchst:
ausblenden Delphi-Quelltext
1:
Adresse_wert:=@wert; //beachte das @					

Hoffe dir geholfen zu haben!!!

MfG
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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 ?

_________________
Gruß
Hansa
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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:

_________________
mfg.
mâximôv
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: 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.

_________________
Gruß
Hansa
obbschtkuche
Gast
Erhaltene Danke: 1



BeitragVerfasst: So 05.10.03 03:48 
So sollte es gehen, aber dann kannst du keine normalen Variablen verwenden.

ausblenden volle Höhe 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:

ausblenden Delphi-Quelltext
1:
vars['test'] := pchar('hallo');					
Da_Knuddelbaer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 190

Win2000,Win XP,Linux(SuSE9.2)
Delphi 5 Prof.
BeitragVerfasst: Mo 06.10.03 06:06 
Ein letzter Versuch,
vieleicht hilft dir ja das!
ausblenden 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