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