Entwickler-Ecke
Sonstiges (Delphi) - Variable zur laufzeit erzeugen
Luncustaf - Di 17.12.02 10:40
Titel: Variable zur laufzeit erzeugen
Hi,
ich hab hier gesucht aber nicht genau das gefunden was ich gesucht habe.
ich bräuchte eine Variable die ich zur laufzeit erzeugen kann, da ich diese variable vom Namen her mehrmals erzeugen muss - klar wird der name verändert aber diese variable muss öfter vorkommen.
ich bräuchte nur ein beispiel wie ich eine string variable erzeuge :?
danke schonmal für die antworten.
gr€€tz
Tino - Di 17.12.02 10:54
Hi,
am einfachsten wäre eine tStringList zu benutzen. Mit dieser kannst du mehrere Strings verwalten!
Gruß
TINO
Delete - Di 17.12.02 11:05
Zitat: |
einen String in einer Variablen erzeugen
|
:shock:
Du meinst wohl:
Zitat: |
Ich will einen String in einer Variablen speichern.
|
Variablen kann man nicht zur Laufzeit anlegen, da bekannt sein muß wie viel Speicher reserviert werden muß.
Eine andere Möglichkeit wären dynamische Arrays.
Quelltext
1: 2: 3: 4: 5:
| var MyStrArray: array of String; begin Setlength(MyStrArray, 1); MyStrArray[0] := 'Hello world', |
Luncustaf - Di 17.12.02 11:12
hi,
was ich eher meine ist eine variable vom typ string zur laufzeit zu erzeugen. hmm mit erklärung hab ich es irgendwie :)
ist das nicht möglich?
wenn nicht dan nehm ich den array :) das ist dann denke ich das einfachste.
gr€€tz
PS: danke für eure antworten.
Delete - Di 17.12.02 11:21
Luncustaf hat folgendes geschrieben: |
was ich eher meine ist eine variable vom typ string zur laufzeit zu erzeugen |
Und ich habe dir geantwortet, dass es nicht geht. Wenn du was dynamisches brauchst, dann nimm eine TStringList oder ein dynamisches Array vom Typ String.
Luncustaf - Di 17.12.02 11:36
ok danke :)
gr€€tz
Klabautermann - Di 17.12.02 11:49
Hallo,
Luckie hat folgendes geschrieben: |
Und ich habe dir geantwortet, dass es nicht geht. |
tschuldigung, aber das ist nicht richtig.
Natürlich lassen sich auch Strings Dynamisch erzeugen.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| TYPE pString = ^String; [...] procedure TForm1.Button1Click(Sender: TObject); VAR Dyn : pString; begin New(Dyn); Dyn^ := 'Hallo Welt!'; ShowMessage(Dyn^); end; |
Das Problem ist, das man ihn nachher auch im Speicher wieder finden muss. Dafür sind dann verkettete Listen zu verwenden (ich glaube zu dem Thema mache ich bei gelegenheit mal ein Tutorial). Auch das Freigeben der Dynmischen Variablen sollte nicht vergessen werden. Alles in allen ist das natürlich ein wenig Aufwändiger als Dynamische Arrays oder tStrings aber möglich ist es allemal.
Gruß
Klabautermann
Delete - Di 17.12.02 11:54
Aber da hast du zur Entwicklungszeit auch schon alles deklariert. Unter zur Laufzeit erstellen verstehe ich, wenn ich in einem Edit den Variablennamen und den Typ angebe und dann wird die Variable angelegt. Und das geht defintiv nicht!
Klabautermann - Di 17.12.02 12:31
Hallo,
ja, in diesem kleinem Beispiel habe ich alles zur Laufzeit deklariert. Aber der Speicher wird erts durch den Aufruf von New belegt.
In der Paxis sieht das Arbeiten mit Listen inetwa so aus:
1. Man deklariert sich einen Listentyp. Dieser enthällt Neben den Daten noch einen Zeiger auf das nächste Element:
Quelltext
1: 2: 3: 4: 5: 6:
| Type pStrList = ^tStrList; tStrList = RECORD Data : STRING; Next : pStrList; end; |
2. Man deklariert sich eine (meist Objektglobale) Header Variable, um das erste Element der Liste wiederzufinden. Dies ist nur ein Zeiger, da kann noch kein String Reingeschrieben werden.
3. Um das ende (der noch leeren Liste) zu makieren setz man den Header im Constructor auf NIL;
4. Um Elemente einfach hizufügen zu können Scheibt man sich eine Methode die dies ermöglicht. Diese verwendet meist eine Lokale hilfs Variable. Der Wert ist aber auch nach dem verlassen der Funktion (und dem damit verbundenen freigeben der Hilfsvariablen) noch im Speicher. (Wegen der Einfachheit hier eine LIFO [Last In First Out] Liste)
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure StrAdd(NeuerWert : String); VAR tmp : pStrList; begin New(tmp); // Hier wid erst die Variable erzeugt tmp^.Data := NeuerWert; // hier Wird Automatisch mehr Speicher für den vorher leeren String reserviert. tmp^.Next := Header; // Die bisherige Liste wird "hinter" das neue Element gehängt. Header := tmp; // Das neue Element der Liste Wird zum Header end; |
5. Wenn man nun ein einzelnes Element aus der Liste Raussuchen will muss man die Liste "Abklappern". Hier wird nach dem ersten Element mit den übergebenen Inhalt gesucht. Auch hierzu verwende ich wieder einen Hilfsvariable.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function FindFirstEle(Inhalt : STRING) : pStrList; VAR Runner : pStrList; // Dies ist wieder nur ein Zeiger (32 Bit egall was man über ihn ausliest) begin Runner := Header; // Den läufer an den Anfang der Liste setzen WHILE (Runner <> NIL) AND (Runner^.Data <> Inhalt) DO // Solang nicht am Ende der List und das Element nicht das gesuchte ist Runner := Runner^.Next; // Schiebe den Läufer ein Element weiter Result := Runner; // Ergebnis zurückgeben (kann ein Element mit dem String oder NIL sein) end; |
6. Wenn man irgentwann fertig ist, muss man den Speicher wieder Frei geben. Hier wird (weil es einfacher ist) die Komplette Liste freigegeben. Auch hierbei hilft wieder eine Variable, damit ich nicht die anderen Elemente der Liste verliere.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure ClearStrList; VAR tmp : pStrList; begin while (Header <> NIL) DO BEGIN // Solange Liste nicht Leer tmp := Header; // Das Aktuelle Element in die Hilfsvariable Herader := Header^.Next; // Den Listenanfang um eins nach hinten rücken Dispose(tmp); // Den Speicher auf den die Hilfsvariable Zeigt freigeben END; end; |
Das alles ist jetzt natürlich die Schnellversion, aber es soller einen Einduck der Technik geben. Der Speicher wird Dynamisch reserviert und bleibt reserviert, auch wenn die Hilfs-Variablen schon lange wieder freigegeben sind.
Man kann auch mit
speicher Reservieren, man kann dann nur nicht drauf zugreifen, weil man ihn im RAM nicht mehr wiederfindet. Deshalb sind die Hilfsvariablen notwendig Aber man benötigt nur eine davon Permanent (Header) um den Anfang der Liste immer wieder zu finden. Also auch wenn man 10.000 Elemente in der Liste hat muss man nur eine Hilfsvariable (welche 32 Bit belegt) permanent vorhalten.
Bliebe noch zu erwähnen, das sämlicher ode ungetestet weil hier im Forum getippt ist. Ählichen code habe ich aber schon häufiger verwendet ;).
Luckie hat folgendes geschrieben: |
Unter zur Laufzeit erstellen verstehe ich, wenn ich in einem Edit den Variablennamen und den Typ angebe und dann wird die Variable angelegt. Und das geht defintiv nicht! |
Das geht natürlich nicht. Man müsste sich ja auch eine Variable mitführen alleine um sich den Variablennamen zu merken. Und wie würde der Code aussehen, wenn er das eine Mal mit der Der Variable HaenschenMueller und das andere mal mit LieschenMeier funktionieren müsste.
Deswegen sind Dynamische Variablen die, für die
zur Laufzeit der Befehl zum Speicher reservieren erteilt wird. (Alles was im Varblock steht zählt nicht obwohl diese Definition im Grunde auch auf den zutrifft)
Gruß
Klabautermann
UGrohne - Di 17.12.02 13:58
Wenn man eine Variable zur Laufzeit erzeugt, heißt das ja nicht, dass man in der Entwicklungszeit nicht weiß, wie die heißt, es heißt lediglich, dass während der Laufzeit die Variable irgendwann speicher belegt und auch während der Laufzeit wieder freigegeben wird. Alles was im VAR-Teil steht wird ja beim Starten des Programms im Speicher erzeugt und am Ende wieder freigegeben. Das sind eben speicherresidente Variablen (also zur Laufzeit), dynamische kann man z.B. nur temporär in einer Prozedur nutzen, um zwischendurch etwas zu speichern und den SPeicher danach nciht weiter zu blockieren. So würde ich z.B. auch sehr speicherintensive Berechnungen machen lassen, nur während der Berechnung selbst braucht das Prog erheblich viel Speicher nach Ende der Berechnung wird er wieder freigegeben. Das is ja der Vorteil davon....
Gruß...
tommie-lie - Di 17.12.02 16:01
was ist denn der Sinn der Sache, wenn ich mal fragen dürfte (vielleicht wird's dann klarer, was gemeint ist)?
Du willst eine Variable dynamisch erstellen. D.h. du kennst weder Namen, noch Datentyp, noch ob sie überhaupt benötigt wird zur Programmierzeit. Einen solchen Fall gibt es nicht.
Wenn man weiß, daß man später eine Variable benötigen könnte, deklariert man sie einfach. Der Speicheraufwand dürfte minimal sein, vor allem wenn man's in Prozeduren macht. Und wenn man nicht weiß, ob es eine Variable gibt, dann gibt es sie auch nicht. Ich wüsste daher nichtmal, wie du dir das vorgestellt hast...
Luncustaf - Di 17.12.02 16:08
ich weis das ich diese variable benötige ich weis auch das sie vom typ string ist ich weis nur nicht wie oft.
zu erklärung.
ich erzeuge einige memofelder zur laufzeit je nach dem wieviel der benutzer haben will. in dieses memo wird dann eine datei geladen - dort muss ich den pfad speichern für spätere zwecke und nun soll zu jedem memofeld das ich erzeuge eine variable erzeugt werden in der ich den pfad der datei abspeichere die ich in das memo lade.
hab das ganze nun mit nem dynamischen array gemacht funktioniertauch ganz gut :)
thx nochmal an Luckie :)
gr€€tz
tommie-lie - Di 17.12.02 18:23
ahhhh.
Also eine unbegrenzte Anzahl von Strings.
'ne Stringlist wäre eine Alternative gewesen, aber ein Array of String tut's natürlich auch. Allerdings nimmt dir 'ne Stringlist ein bisschen Verwaltungsarbeit ab, zum Beispiel beim Einfügen oder Entfernen von Strings aus der Liste. Aber wenn du das nicht brauchst, ist ein Array die kompaktere und schnellere Alternative.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!