AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Fehlerhafte Ausgabe bei Stringlist+Verketteter liste
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlerhafte Ausgabe bei Stringlist+Verketteter liste

Ein Thema von Teekeks · begonnen am 25. Apr 2009 · letzter Beitrag vom 25. Apr 2009
Antwort Antwort
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#1

Fehlerhafte Ausgabe bei Stringlist+Verketteter liste

  Alt 25. Apr 2009, 07:44
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
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Fehlerhafte Ausgabe bei Stringlist+Verketteter liste

  Alt 25. Apr 2009, 08:50
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
Klaus
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Fehlerhafte Ausgabe bei Stringlist+Verketteter liste

  Alt 25. Apr 2009, 09:04
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;
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 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