Autor Beitrag
Luncustaf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: Di 17.12.02 10:40 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 17.12.02 10:54 
Hi,

am einfachsten wäre eine tStringList zu benutzen. Mit dieser kannst du mehrere Strings verwalten!

Gruß
TINO
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



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

ausblenden Quelltext
1:
2:
3:
4:
5:
var
  MyStrArray: array of String;
begin
  Setlength(MyStrArray, 1);
  MyStrArray[0] := 'Hello world',
Luncustaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: 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.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



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

Win 2k
D7 Ent.
BeitragVerfasst: Di 17.12.02 11:36 
ok danke :)


gr€€tz
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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.
ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



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

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
ausblenden 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.
ausblenden Quelltext
1:
Header : pStrList;					

3. Um das ende (der noch leeren Liste) zu makieren setz man den Header im Constructor auf NIL;
ausblenden Quelltext
1:
Header := 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)
ausblenden 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.
ausblenden 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.
ausblenden 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
ausblenden Quelltext
1:
new(pStrList);					

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

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

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Luncustaf Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324

Win 2k
D7 Ent.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

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

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert