Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehlerhafte Ausgabe bei Stringlist+Verketteter liste (https://www.delphipraxis.net/133084-fehlerhafte-ausgabe-bei-stringlist-verketteter-liste.html)

Teekeks 25. Apr 2009 06:44


Fehlerhafte Ausgabe bei Stringlist+Verketteter liste
 
Hallo!
Ich habe ein Problem:
Ich möchte eine einfache verkettete Liste eingeben,sortieren und ausgeben.
Zum eingeben hab ich das hier:
Delphi-Quellcode:
procedure TReminderData.Add(Data:TData);
var hilfe:PListe;
begin
  New(hilfe);
  hilfe^.Data.Info:=Data.Info;
  hilfe^.Data.Termin:=data.Termin;
  hilfe^.Next:=FListe;
  FListe:=hilfe;
  Dispose(hilfe);
  SortData;
end;
wobei PListe und TData so definiert sind:
Delphi-Quellcode:
Type
  TData=record
    Info:string[10];
    Termin:TDateTime;
  end;

  PListe=^TListe;

  TListe=record
    Data:TData;
    Next:PListe;
  end;
Sortieren tu ich so:
Delphi-Quellcode:
procedure TReminderData.SortData;
var sorted,hilfe1,hilfe2:PListe;
    ende:array of TData;
    fertig:boolean;
    i:integer;
begin
  // array füllen:
  hilfe2:=FListe;
  i:=1;
  fertig:=false;
  while not fertig do
  begin
    SetLength(ende,i+1);
    ende[i-1].Info:=hilfe2^.Data.Info;
    ende[i-1].Termin:=hilfe2^.Data.Termin;
    inc(i);
    hilfe2:=hilfe2^.Next;
    fertig:=not (hilfe2<>nil);
  end;
  //erstes Element:
  sorted:=nil;
  New(hilfe1);
  hilfe1^.Data.Info:=ende[0].Info;
  hilfe1^.Data.Termin:=ende[0].Termin;
  hilfe1^.Next:=sorted;
  sorted:=hilfe1;
  for i:=1 to High(ende) do
  begin
    new(hilfe1);
    hilfe1^.Data.Info:=ende[i].Info;
    hilfe1^.Data.Termin:=ende[i].Termin;
    if sorted^.Data.Termin > hilfe1^.Data.Termin then
    begin
      hilfe1^.Next:=sorted;
      sorted:=hilfe1;
    end else
    begin
      hilfe2:=sorted;
      fertig:=false;
      while (hilfe2^.Next <>nil) and (not fertig) do
        if hilfe2^.Next^.Data.Termin > hilfe1^.Data.Termin then
        begin
          hilfe1^.Next:=hilfe2^.Next;
          hilfe2^.Next:=hilfe1;
          fertig:=true;
        end else
          hilfe2:=hilfe2^.Next;
      if not fertig then
      begin
        hilfe1^.Next:=hilfe2^.Next;
        hilfe2^.Next:=hilfe1;
      end;
    end;
  end;
end;
und ausgeben so:

Delphi-Quellcode:
function TReminderData.GetDates: TStringlist;
var hilfe1:PListe;
begin
  result:=TStringList.Create;
  hilfe1:=FListe;
  while hilfe1<>nil do
  begin
    result.Add(hilfe1^.Data.Info+'--'+DateAsString(hilfe1^.Data.Termin,'.'));
    hilfe1:=hilfe1^.Next;
  end;
end;
aufrufen tu ich das ganze so:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var x:TReminderData;
    bla:TData;
    sl:TStringList;
    i,ii:integer;
begin
  x:=TReminderData.Create;
  bla.Termin:=now;
  bla.Info:='Hallo';
  x.Add(bla);
  x.Add(bla);
  sl:=x.GetDates;
  ii:=5;
  Image1.Canvas.Font.Color:=clyellow;
  for i:=0 to sl.Count-1 do
  begin
    Image1.Canvas.TextOut(5,ii,sl.Strings[i]);
    ii:=ii+10;
  end;
  x.Free;
end;
Jetzt kommt das eigentliche Problem:
Es wird nur das hier ausgegeben:
Zitat:

K@J--25.4.2009
Was Hexadezimal so aussiet:
Zitat:

0C 4B 40 00 00 00 00 88 9B 4A 2D 2D 32 35 2E 34 2E 32 30 30 39 0A
Was dort eignetlich stehen sollte:
Zitat:

Hallo--24.4.2009
Hallo--24.4.2009
Das nächste problem ist:
Warum ist nur eine Zeile in der Stringlist?

Ich hoffe ihr könnt mir helfen.

gruß Teekeks
ps.: ich benutze Lazarus

Klaus01 25. Apr 2009 07:50

Re: Fehlerhafte Ausgabe bei Stringlist+Verketteter liste
 
Guten Morgen,

siehe meine Kommentare


Delphi-Quellcode:
procedure TReminderData.Add(Data:TData);
var hilfe:PListe;
begin
  New(hilfe);
  hilfe^.Data.Info:=Data.Info;
  hilfe^.Data.Termin:=data.Termin;
  hilfe^.Next:=FListe;
  FListe:=hilfe;
  Dispose(hilfe); // Hier wirfst Du das angehänge Element wieder weg.
                   // Auch FListe wird hier elemeniert.
  SortData;
end;

Grüße
Klaus

Teekeks 25. Apr 2009 08:04

Re: Fehlerhafte Ausgabe bei Stringlist+Verketteter liste
 
Danke!
Jetzt haut das mit dem String hin.
Das andere konnte ich so lösen:
Delphi-Quellcode:
function TReminderData.GetDates: TStringlist;
var hilfe1:PListe;
begin
  result:=TStringList.Create;
  hilfe1:=FListe;
  while hilfe1^.Next<>nil do
  begin
    result.Add(hilfe1^.Data.Info+'--'+DateAsString(hilfe1^.Data.Termin,'.'));
    hilfe1:=hilfe1^.Next;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 Uhr.

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