Autor Beitrag
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 05.08.04 22:24 
Tach Leute.
Ich hab hier folgendes Problem:
Gibt es in diesem code einen Fehler?
Es wird compiliert, aber beim aufrufen der Funktion mit
Memo1.Lines:=clearStrings(Memo1.Lines);
kommt ein "Zugriffsverletzung" Fehler! woran liegts, und, wie bekomm ich die leerzeieln aus einem Memo raus, wenn nicht so?

Hier der Source:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function clearStrings(s:TStrings):TStrings;
var x:TStrings;
    i:integer;
begin
x.Clear;
for i:=0 to s.Count do begin
  If s[i]<>'' then x.Add(s[i]);
end;
ClearStrings:=x;
end;


Moderiert von user profile iconKlabautermann: Code durch Delphi-Tags ersetzt.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Fr 06.08.04 17:18, insgesamt 2-mal bearbeitet
naleh
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Do 05.08.04 23:05 
zu problem eins also X musst du erst mal erstellen folglich
x:=TStringlist.Create; vor alles
und zuguterletzt
X.free;
zu prob 1 das les ich nochmal aber wenn du ne art config / ini laedst dann kuck mal nach TIniFile(s) oder so da gibts schon fertige sachen
so habs mal angekuckt, aber mir faellt spontan kein gehler im ersten auf
MfG naleh
achja und ich glaub es sollte nich clearstrings := X sondern result := X heissen oder du machst es so
procedure clearStrings(var s:TStrings);
dann kannst du direkt mit S arbeiten
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 05.08.04 23:44 
das hat nix mit ini dateien zu tun und danke für das mit dem create... das kannte ich zwar, aber ich wusste nicht, dass man es hier braucht. hätte ich einich wissen sollen, schon von TStringStream her...
aber mit ini dateien hat das garnix zu tun...

und das mit dem result, ich glaub das ist nur für C++, jedenfalls hat es schon ganz gut bei mir mit <nameDerFunktion>:=<ergebnis> geklappt. also daran liegts ned.

aber danke! wenn jetzt blos noch mein erstes problem gelöst wäre...

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 05.08.04 23:54 
Ignoreirt diesen post! ich hab grad meinen quelltext mit
x:=TStrings.Create;
ergänzt und mich gewundert, was ein abstrakter fehler ist...
STRINGLIST MUSS ES HEISSEN!!! SORRY für diesen überflüssigen post. danke für die hilfe!
Zugriffsverletzung kommt aber immernoch.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 06.08.04 00:01 
TStrings ist eine abstrakte Klasse deren Methoden meist noch nicht implementiert sind. Nimm statt dessen ein Nachfahren zum Beispiel TStringlist. Dann: Der Index des ersten Elementes ist 0 dem zu folge hat das letzte Element den Index Anzahl-1, lass deine Schleife also bis s.count-1 laufen.

Auf den Rest habe ich keine Lust, das ist ja ansolut chaotisch hier, wenn man mehrere Fragen in einen Thread packt. Wer hat denn jetzt wo auf was wie geantrwortet und wo gibt es da mit was jetzt noch Problem? :gruebel: :roll:


Zuletzt bearbeitet von Luckie am Fr 06.08.04 01:51, insgesamt 1-mal bearbeitet
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 06.08.04 00:21 
Ok luckie. nachdem du mir meine frage beantwortet hast, werde ich einfach die bereits beantwortete frage löschen. du hast rech.. wird sehr unübersichtlich...
aber LEIIIDER kommt immernoch die zugriffsverletzung

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 06.08.04 01:52 
Wie sieht denn dein Quellcode jetzt aus?
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 06.08.04 12:32 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
function clearStrings(s:TStrings):TStrings;
var x:TStringlist;
    i:integer;
begin
x:=TStringlist.Create;
for i:=0 to (s.Count-1) do begin
  If s[i]<>'' then x.Add(s[i]);
end;
ClearStrings:=x;
x.Free;
end;

das ist mein jetziger code. habs auch schon mit var x:TStrings und trotzdem x:= TStringlist.create; versucht. beides blieb ohne verbesserung.
Die Funktion wird so aufgerufen:
Memo1.Lines:=clearStrings(Memo1.Lines);

das andere problem kommt jetzt erstmal weg. vlt. mach ichs in ne neue topic, vlt. mach ichs später, wenn meine erste frage beantwortet ist wieder rein, ich denke, beides ist übersichtlich.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
SvenAbeln
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 334
Erhaltene Danke: 3



BeitragVerfasst: Fr 06.08.04 16:46 
Hallo,

ausblenden Delphi-Quelltext
1:
2:
  ClearStrings:=x;
  x.Free;

deine Funktion soll X als Ergebnis zurückgeben, aber du gibst dieses Objekt in der nächsten Zeile direkt wieder frei.



ausblenden Delphi-Quelltext
1:
Memo1.Lines:=clearStrings(Memo1.Lines);					

Durch diesen Aufruf hast du ein Memory Leak, da du die Referenz auf ein Objekt verlierst und es nicht wieder freigeben kannst. Denn das Objekt auf Memo1.Lines bleibt auch nach dieser Zuweisung im Speicher.

Du kannst dies auf zwei Arten verhindern:
Beim Aufruf:
ausblenden Delphi-Quelltext
1:
2:
3:
  TempStrings:=clearStrings(Memo1.Lines);
  Memo1.Lines.Assign(TempStrings);
  TempStrings.free;


Oder du verwendest eine Prozedur und schreibst das Ergebnis direkt in die übergebene Liste.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
prozedure clearStrings(s:TStrings);
var x:TStringlist;
    i:integer;
begin
x:=TStringlist.Create;
for i:=0 to (s.Count-1) do begin
  If s[i]<>'' then x.Add(s[i]);
end;
s.assign(x);                    // <<=========
x.Free;
end;
JayEff Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 06.08.04 17:17 
-huch-

ok. danke. hat geklappt! aber.. :shock: wow! so viele fachwörter auf einem haufen... nicht schlecht! Ich hab deine ProZedure 1:1 übernommen... vielen danke! wenn doch alle fragen so gründlich beantworten würden!
Delphiforum Rules!

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.