Autor Beitrag
Skynthos
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 10.08.02 20:44 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

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



BeitragVerfasst: Sa 10.08.02 21:30 
Post mal den Source, dann wird es sich finden...

_________________
Keine Signatur ...
Skynthos Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



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



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

_________________
Keine Signatur ...
Skynthos Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 13



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



BeitragVerfasst: So 11.08.02 15:19 
Ich entdecke da eine ganze Menge:
ausblenden 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
.......

_________________
Keine Signatur ...
Skynthos Threadstarter
Hält's aus hier
Beiträge: 13



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