Entwickler-Ecke
Sonstiges (Delphi) - Variable geht verloren
Skynthos - Sa 10.08.02 20:44
Titel: Variable geht verloren
Hallo,
Ich habe eine Procedure in der ich eine Stringliste unter einem lokalen Variablennamen erzeuge. In dieser Procedure rufe ich die selbe Procedure erneut mit anderen Parametern auf.
Wenn diese 2. Procedure fertig ist und meine Hauptprocedure eigentlich fortfahren sollte, tritt mein Problem auf: Ich kann dann auf die ursprüngliche Stringliste nicht mehr zugreifen.
Die anderen Variablen sind jedoch korrekterweise unverändert. Liegt es dann am Aufruf "liste:=tstringlist.create;" ?
Ich bin ganz verwirrt, nicht zuletzt deshalb, weil ich gerade erfolglos versucht habe, das Problem mit einem globalen dynamischen Array von Stringlisten zu umgehen...
Skynthos
bis11 - Sa 10.08.02 21:17
Hi,
Du hast doch die Variable für die Stringliste global definiert oder ? Denn anderst kann ich mir deinen Verlust so spontan nicht erklären.
Steffer - Sa 10.08.02 21:30
Post mal den Source, dann wird es sich finden...
Skynthos - So 11.08.02 01:46
@bis11
Nein, die Variablen müssen leider lokal sein
@Steffer
Auf deine Verantwortung ;)
Zum ausprobieren eignet sich der code leider sehr schlecht, da
man noch das Formular und v.a. einen ftp-server braucht.
Wenn ihr euch immernoch keine Lösung einfällt, kann ich euch das Programm auch schicken...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure suchen(ziel:string;dir:string); var i:integer; listeN:tstringlist; begin with form1 do begin ftp.changedir(dir); listeN:=tstringlist.create; listeN:=liste_erzeugen; //gibt verzeichnisinhalt des ftp-servers zurück; funzt
for i:=0 to listeN.count-1 do begin //Nebensächlich Befehle weggelassen; Fehler tritt so weiterhin auf suchen(ziel,copy(listeN[i],2,length(listeN[i])-1)); //bei diesem ("suchen..") Befehl tritt der Fehler (Schutzverletzung) auf, //ABER nicht beim 1. mal, sondern erst, wenn die Procedure abgelaufen ist und //das Programm sozusagen bei Hauptprocedure fortfahren will //(Den Zeitpunkt habe ich mit Hilfe von Messageboxes u.s.w herausgefunden) end;
ftp.changedir('..'); listeN.free; end; end; |
zero - So 11.08.02 02:25
Hi,
ich versteh zwar nicht so ganz du schriebst in deiner thread eröffnung die variable "liste" die kommt in deiner procedure garnicht vor !? versuch mal deine procedure in der klasse zu reggen also
Quelltext
1:
| procedure TForm1.suchen(ziel:string;dir:string); |
und dann braucht du auch kein "with form1 do begin" mehr
zu den variablen in der procedure die sind nur LOKAL das heißt in DER function/procedure verfügbar.
mal ein bsp:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type TForm1 = class(TForm) procedure suchen(ziel:string;dir:string); // HIER DEINE PROCEDURE private { Private declarations } public liste:TStringList; // HIER DEINE VARIABLE { Public declarations } end; |
dein code dann:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TForm1.suchen(ziel:string;dir:string); var i:integer; listeN:tstringlist; begin ftp.changedir(dir); listeN:=tstringlist.create; listeN:=liste_erzeugen; //gibt verzeichnisinhalt des ftp-servers zurück; funzt
for i:=0 to listeN.count-1 do begin //Nebensächlich Befehle weggelassen; Fehler tritt so weiterhin auf suchen(ziel,copy(listeN[i],2,length(listeN[i])-1)); //bei diesem ("suchen..") Befehl tritt der Fehler (Schutzverletzung) auf, //ABER nicht beim 1. mal, sondern erst, wenn die Procedure abgelaufen ist und //das Programm sozusagen bei Hauptprocedure fortfahren will //(Den Zeitpunkt habe ich mit Hilfe von Messageboxes u.s.w herausgefunden) end;
ftp.changedir('..'); listeN.free; end; |
so müsste dann alles funtzen, wenn du noch fragen hast posten :)
bis dann
zero
Steffer - So 11.08.02 09:45
Du hast eine Fehler drin, der aber nicht die Ursache ist ...
Wenn Length(listN[i]) < 2 ist geht das nicht.
Dein Fehler aber ist, dass du suchen() aus der Procedure selbst heraus ausrufst .... Deine ganze for-Schleife macht keinen Sinn.
Vielleicht kannst du die Aufgabe von suchen() mal kurz erklären.
Skynthos - So 11.08.02 12:14
Also als erstes zwei Dinge: Danke für eure Bemühungen und sorry für den unübersichtlichen Quellcode.
Ich werde mich heute bemühen den Fehler(?) an einem allgemeinen Beispiel zu reproduzieren...
@zero
Zu "liste" und "listeN": In meinem Programm gings gestern ziemlich durcheinander :oops:
Das mit Form1 vorne dran weiß ich schon, aber hatte bisher noch keine Zeit soweit den Bildschirm rauf zu scrollen und den Befehl dort hinzuschreiben ;) Trotzdem danke!
Ich kann aber keine globalen Variablen verwenden, weil ich sozusagen immer wieder eine frische gleichgestellte Procedure brauche, die sich eben immer selbst aufruft. Wie gesagt, ich versuche ein allgemeines Beispiel zu programmieren.
@Steffer
Ja, der Befehl mit "copy" ist noch nicht so astrein, aber daran liegts nicht...
Zu Aufgabe von suchen: Die Procedure soll die Bekannte Technik des Durchsuchens der Festplatte auf einen Ftp-Server übertragen. Allerdings fehlen dazu in dem von mir angegebenen Code einige Befehle...
Skynthos
Skynthos - So 11.08.02 13:16
Die Ursache des Fehlers in meinem Programm muss woanders liegen, denn nach meiner Theorie wäre bei diesem Programm beim 4 mal "showmessage" die Schutzverletzung aufgetreten:
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:
| function fuellen:tstringlist; var temp: tstringlist; begin temp:=tstringlist.create; temp.add('test_alpha_1'); temp.add('test_beta_2'); temp.add('test_gamma_3'); temp.add('test_delta_4'); result:=temp; temp.clear; end;
procedure test(ftp_sim:integer); var liste:tstringlist; begin liste:=tstringlist.create; liste:=fuellen; showmessage(liste[0]); if ftp_sim=0 then test(ftp_sim+1); showmessage(liste[0]); liste.free; end;
procedure TForm1.Button1Click(Sender: TObject); begin test(0); end; |
Wenn ich noch etwas entdecke werde ich es posten...
Skynthos
Steffer - So 11.08.02 15:19
Ich entdecke da eine ganze Menge:
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:
| function fuellen:tstringlist; var temp: tstringlist; begin temp:=tstringlist.create; temp.add('test_alpha_1'); temp.add('test_beta_2'); temp.add('test_gamma_3'); temp.add('test_delta_4'); result:=temp; temp.clear; end; // Diese Function sollte : String; als Ergebniss liefern. Dann solltest du auch mal wieder etwas per .Free; auflösen, oder?
procedure test(ftp_sim:integer); var liste:tstringlist; begin liste:=tstringlist.create; //liste:=fuellen; liste.Text:= fuellen; showmessage(liste[0]); if ftp_sim=0 then test(ftp_sim+1); showmessage(liste[0]); liste.free; end; |
Du willst doch nur den Text, die StringList hast du hier doch schon erzeugt. Da gibt es gar nix, den dein if wird nur einmal, beim ersten Aufruf ausgeführt ...
Dein Kernproblem ist, das du suchen in suchen aufrufst... Ich erkläre es dir mal ein bischen in Steno:
Du rufst suchen auf und übergibst ein Variable Ziel und erzeugst eine StringList. Jetzt durchläufst du die StringList for 0 bis Count-1 Bei jeder Zeile, rufst du jetzt die Procedure wieder auf. Du übergibst die empfangene Variable wieder an die eigene Procedure und erzeugst eine StringList. Jetzt durchläufst du die StringList for 0 bis Count-1
.......
Skynthos - Mo 12.08.02 15:03
puh...
Ich hatte dort erst ein Free, aber dabei trat ein Fehler auf!
Ich erkläre kurz, was ich mit dem Beispielprogramm bezwecken wollte:
Eigentlich gar nichts, genauer gesagt wollte ich nur prüfen, ob ich
richtig vermutet habe, was den Grund des Fehlers anbelangt. Und nein, habe ich nicht.
Die procedure "füllen" hätte ich eigentlich auch in "test" mir hineinschreiben können und sollte nur eben nur irgendetwas in die stringlist hinneinfüllen.
Jedenfalls hab ich mein Problem jetzt selbst gelöst, indem ich (fast) immer in der for-Schleife den Verzeichnisinhalt neu einlese...nicht die geschicktest Lösung, aber es funzt.
Danke nochmal an alle!
Skynthos
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!