Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Was ist bei dieser function die eine Tsrtings verarb. falsch (https://www.delphipraxis.net/78952-ist-bei-dieser-function-die-eine-tsrtings-verarb-falsch.html)

Dragon27 13. Okt 2006 17:04


Was ist bei dieser function die eine Tsrtings verarb. falsch
 
Hallo,

ich bekomme bei dieser unteren Funktion immer die Fehlermeldung "Abstrakter Fehler".... Kann mir hier jemand helfen?

Diese Function löscht alle Leerteichen und Leerzeilen die nicht dazugehören...

Delphi-Quellcode:
Function Tform1.Formatcode(Codesource:Tstrings):Tstrings;
Var liste, code:Tstrings;
i:integer;
begin
i:=0;
liste:=Tstrings.Create;
code:=Tstrings.Create;
for i:=0 to Codesource.Count-1 do begin
if trim(codesource[i])<>''
then begin
code.Add(codesource[i])
end;
end;

for i:=0 to code.count-1 do begin
Liste.Add(trim(code[i]));
end;
Result:=Liste;

end;

Danke für eure Hilfe!

Gruß

Andy

BenjaminH 13. Okt 2006 17:10

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Hallo,
hier gabs das schonmal.
TStringList statt TStrings wird wohl das beste sein.

Viele Grüße

mkinzler 13. Okt 2006 17:10

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
TStrings ist eine abstrakte Klasse, eine implementierende Subklasse wäre z.B. TStringList
Delphi-Quellcode:
Function Tform1.Formatcode(Codesource:Tstrings):Tstrings;
Var liste, code:Tstrings;
i:integer;
begin
i:=0;
liste:=TStringList.Create;

Christian Seehase 13. Okt 2006 17:46

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Moin Andy,

ausserdem ist es immer sehr ungünstig ein Objekt als Rückgabewert einer Funktion zu verwenden, da man sich leicht ein Speicherleck einhandeln kann, da man leicht die Übersicht verlieren kann, wer wann das Objekt freigeben darf/muss.

Hawkeye219 13. Okt 2006 17:56

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Zitat:

Zitat von Christian Seehase
[...]da man sich leicht ein Speicherleck einhandeln kann[...]

Eines ist ja schon drin - die (überflüssige) Liste code wird nicht freigegeben...

Gruß Hawkeye

semo 13. Okt 2006 18:13

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Zitat:

Function Tform1.Formatcode(Codesource:Tstrings):Tstrings;
Var liste, code:Tstrings;
i:integer;
begin
i:=0;
liste:=Tstrings.Create;
code:=Tstrings.Create;
for i:=0 to Codesource.Count-1 do begin
if trim(codesource[i])<>''
then begin
code.Add(codesource[i])
end;
end;

for i:=0 to code.count-1 do begin
Liste.Add(trim(code[i]));
end;
Result:=Liste;

end;
--> ohje mineh. das ist ja ein kauderwelsch.....


so in der art müsste das gehen (ist pseydocode, also bitte noch anpassen).
man kann doch direkt mir der liste arbeiten, anstatt weitere anzulegen, da die liste ja ein pointer ist und kein wert (steichwort "call by value" und "call by reference")
Delphi-Quellcode:
procedure Tform1.Formatcode(Codesource:Tstrings);
Var  
  i:integer;
begin
  i:=Codesource.Count-1;  
  while i > -1 do
  begin
    if Trim(codesource[i]) ='' then
      codesource.Delete(i)
    else
      codesource[i] := stringreplace(codesource[i], ' ', '',[replaceall]);

    Dec(i);
  end;
end;

Dragon27 13. Okt 2006 18:27

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Hallo,

danke für die vielen Antworten!

Ich habe nun den Code umstrukturiert und wollte diesen noch veröffentlichen..... Vielleicht braucht Ihn irgendwer mal:

Delphi-Quellcode:

procedure Formatcode(Codesource:Tstrings);
Var
  i:integer;
begin
  i:=Codesource.Count-1;
  while i > -1 do
  begin
    if Trim(codesource[i]) ='' then
      codesource.Delete(i)
    else begin
      Codesource.Insert(i,trim(codesource[i]));
      Codesource.Delete(i+1);
    end;
    Dec(i);
  end;
end;

Gruß

Andy

semo 13. Okt 2006 18:41

Re: Was ist bei dieser function die eine Tsrtings verarb. fa
 
Delphi-Quellcode:
      Codesource.Insert(i,trim(codesource[i]));
      Codesource.Delete(i+1);
kannst du dir doch sparen indem du wie von mir vorher angesprochen direkt den string bearbeitest
per

Delphi-Quellcode:
codesource[i] := trim(codesource[i])
wozu also die liste expandieren?

wobei noch anzumerken wäre, dass du in deinem ersten beitrag gesagt hast, dass du alle leerzeichen entfernen möchtest....
dann wäre nämlich
Delphi-Quellcode:
codesource[i] := stringreplace(codesource[i], ' ', '',[replaceall]);
ideal.

also: nächstes mal ein bissl genauer ausdrücken :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz