Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Memo lässt Zeilen verschwinden (https://www.delphipraxis.net/159382-memo-laesst-zeilen-verschwinden.html)

aphexx 28. Mär 2011 15:11

AW: Memo lässt Zeilen verschwinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von p80286 (Beitrag 1091563)
Viel wichtiger,
wie sieht der Eintrag für den Text in deinem array aus?
"vorletzter" scheint mir sehr unwahrscheinlich, es sei denn Du fügst noch einen Standardsatz am Ende ein.

Gruß
K-H

Das Array spiegelt genau den Inhalt aller TXTs pro user wider, mit der Ausnahme, dass in den Textdateien {{ und }} zum Trennen der Beiträge vorhanden sind. Das Array wird nimmt die Daten dazwischen auf.
EDIT: User/Datum = String und Nachricht TStringlist.

Ich habe die Problematik kurz skizziert (s. Anhang).

Danke und viele Grüße,
aphexx

p80286 28. Mär 2011 16:17

AW: Memo lässt Zeilen verschwinden
 
das war ein Mißverständnis,
Sind die Daten im Array vorhanden?
Wenn ich Deinen anhang richtig verstehe, dann fehlen die Daten in der Anzeige und sind in der/den Datei(en) vorhanden.

Gruß
K-H

aphexx 28. Mär 2011 17:35

AW: Memo lässt Zeilen verschwinden
 
Jo, alle Daten sind im Array und die Anzeige im Memo ist fehlerhaft.

Jumpy 29. Mär 2011 07:25

AW: Memo lässt Zeilen verschwinden
 
Hat wahrsch. nix mit dem Problem zu tun aber du machst vor der For-Schleife L.BeginUpdate, in der For-Schleife bei jedem Durchlauf L.BeginUpdate aber nur einmal nach der Schleife L.EndUpdate.
Ist das in der Schleife nicht überflüssig?

Zum Problem, kannst du dir nicht in einer weiteren For-Schleife mal den Inhalt von L ausgeben lassen?
Wenn da schon was fehlt liegts nicht am Memo sondern am füllen von L.

Ich würde mir vllt. einfach mal an versch. Stellen im Code den Stand der Dinge anzeigen lassen. Hat mit öfters schon geholfen, wenn ich einen gut versteckten logischen Fehler eingebaut hatte (soll jetzt nicht heißen, dass du einen solchen drin hast, kann gut auch was anderes sein).

P.S.: Hast du mal größere Beispiele durchgespielt? Ist wirklich immer nur der Vorletzte problematisch?

aphexx 29. Mär 2011 22:37

AW: Memo lässt Zeilen verschwinden
 
Zitat:

Zitat von Jumpy (Beitrag 1091668)
Hat wahrsch. nix mit dem Problem zu tun aber du machst vor der For-Schleife L.BeginUpdate, in der For-Schleife bei jedem Durchlauf L.BeginUpdate aber nur einmal nach der Schleife L.EndUpdate.
Ist das in der Schleife nicht überflüssig?

Zum Problem, kannst du dir nicht in einer weiteren For-Schleife mal den Inhalt von L ausgeben lassen?
Wenn da schon was fehlt liegts nicht am Memo sondern am füllen von L.

Ich würde mir vllt. einfach mal an versch. Stellen im Code den Stand der Dinge anzeigen lassen. Hat mit öfters schon geholfen, wenn ich einen gut versteckten logischen Fehler eingebaut hatte (soll jetzt nicht heißen, dass du einen solchen drin hast, kann gut auch was anderes sein).

P.S.: Hast du mal größere Beispiele durchgespielt? Ist wirklich immer nur der Vorletzte problematisch?

Danke, das mit dem BeginUpdate für L habe ich korrigiert.

Dein Hinweis mit der Anzeige von L und der Überprüfung im Allgemeinen war sehr gut, denn das Ergebnis ist, tadaa, dass das Array falsch sortiert wurde.
L ist nicht schuld, das Memo auch nicht ;)

Soweit so schlecht, denn dieser Sortieralgo ist doch eigentlich richtig, oder?
Ich versteh' dann trotzdem nicht, warum er ausgerechnet eine Stinglist aus dem Array haut.
Vor dem Sortieren war der vorletzte Array-Eintrag (inkl. StringList) vorhanden, danach nicht mehr.

EDIT: PS: bei größeren txt-Sammlungen ist es das selbe Ergebnis :/

Delphi-Quellcode:
procedure Sortieren(Aufsteigend: Boolean);
var
  E: TEntry;
  i, j, max: Integer;
  x, y: TDateTime;
begin
  E.Msg := TStringlist.Create;
  max := Length(Entries);
  for i:=0 to max-1 do
  for j:=0 to max-1 do
  begin
     DateSeparator := '.';
     ShortDateFormat := 'dd.mm.yyyy';
     LongTimeFormat := 'hh:nn:ss.zzz';

     if Aufsteigend = True
     then
     begin
       x := StrToDateTime(Entries[i].DatumZeit);
       y := StrToDateTime(Entries[j].DatumZeit);
     end
     else
     begin
       x := StrToDateTime(Entries[j].DatumZeit);
       y := StrToDateTime(Entries[i].DatumZeit);
     end;

     if x > y then
      begin
       E := Entries[i];
       Entries[i] := Entries[j];
       Entries[j] := E;
     end;
  end;
  E.Msg.Clear;
end;

Satty67 30. Mär 2011 02:15

AW: Memo lässt Zeilen verschwinden
 
BubbleSort? Die äußere Schleife High-1 oder in Deinem Fall
Delphi-Quellcode:
for i:=0 to max-2 do
.
oder war es die innere?

Für TStringList würde ich aber ganz klar die Methode CustomSort verwenden. Delphi-Referenz durchsuchenTStringList.CustomSort

aphexx 30. Mär 2011 14:07

AW: Memo lässt Zeilen verschwinden
 
Zitat:

Zitat von Satty67 (Beitrag 1091886)
BubbleSort? Die äußere Schleife High-1 oder in Deinem Fall
Delphi-Quellcode:
for i:=0 to max-2 do
.
oder war es die innere?

Für TStringList würde ich aber ganz klar die Methode CustomSort verwenden. Delphi-Referenz durchsuchenTStringList.CustomSort

OK, ich habe den Bubblesort nun umgeschrieben, doch das Problem besteht weiterhin, nur in anderem Gewand. Es wird bei aufsteigender Sortierung die 5. Nachricht nicht angezeigt und bei absteigender Sortierung die 2. Nachricht. Dein Tipp mit CustomSort ist etwas hanebüchen, da ich die einzelnen Text-Nachrichten ja nicht sortiere, sondern das Array of TEntry, welches aus 2 Strings und einmal TStringlist besteht.
Delphi-Quellcode:
procedure Sortieren(Aufsteigend: Boolean);
var
  E: TEntry;
  i, j, max: Integer;
  x, y: TDateTime;
begin
  E.Msg := TStringlist.Create;
  max := Length(Entries);
  for i:=Low(Entries) to High(Entries) do
  for j:=Low(Entries) to High(Entries)-1 do
  begin
     DateSeparator := '.';
     ShortDateFormat := 'dd.mm.yyyy';
     LongTimeFormat := 'hh:nn:ss.zzz';

     if Aufsteigend = True
     then
     begin
       x := StrToDateTime(Entries[j].DatumZeit);
       y := StrToDateTime(Entries[j+1].DatumZeit);
     end
     else
     begin
       x := StrToDateTime(Entries[j+1].DatumZeit);
       y := StrToDateTime(Entries[j].DatumZeit);
     end;

     if x > y then
      begin
       E := Entries[j];
       Entries[j] := Entries[j+1];
       Entries[j+1] := E;
     end;
  end;
  E.Msg.Clear;
end;

Jumpy 30. Mär 2011 15:17

AW: Memo lässt Zeilen verschwinden
 
Weiß den Fehler auch nicht, möchte aber mal wieder bei dir Aufräumen: ;-)

Zitat:

Zitat von aphexx (Beitrag 1091992)
Delphi-Quellcode:
     DateSeparator := '.';
     ShortDateFormat := 'dd.mm.yyyy';
     LongTimeFormat := 'hh:nn:ss.zzz';

1. Muss das in der Schleife stehen? Reicht das nicht, das einmalig festzulegen?

2. Irgendwie sieht mir der Sortieralgorhytmus noch komisch aus. Setzt doch einfach mal einen anderen um, z.B. SelectionSort, oder so.

Just my 2 ct.

p80286 30. Mär 2011 17:02

AW: Memo lässt Zeilen verschwinden
 
wie wäre es statt des Arrays eine Tlist zu verwenden?
Da gibt es eine funktionierende Sortierung.

Gruß
K-H

aphexx 30. Mär 2011 21:28

AW: Memo lässt Zeilen verschwinden
 
Zitat:

Zitat von p80286 (Beitrag 1092074)
wie wäre es statt des Arrays eine Tlist zu verwenden?
Da gibt es eine funktionierende Sortierung.

Gruß
K-H

Ich hab' nun das Array in eine funktionierende TList umgewandelt. Die Datenübergabe funzt perfekt, allerdings habe ich jetzt noch ein kleines Problem mit der Sortierung. Die Reihenfolge ist überhaupt nicht korrekt und sieht nur 'etwas' sortiert aus. Außerdem wird die Reihenfolge jedes mal geändert, wenn ich die Liste sortiere. Klar ist das erwünscht, wenn ich meine Boolean-Variable mit ins Spiel bringe, aber ohne Variable muss das Ergebnis doch immer gleich aussehen. Für eine absteigende Sortierung (siehe Code-Block) würde ich in der if-Klausel X > Y schreiben. Wäre das korrekt?


Nach ein wenig Recherche sieht meine TListSortCompare so aus:
Delphi-Quellcode:
function Dh_CompareDateB(Item1, Item2: pointer):integer;
var
  X, Y: TDateTime;
begin
  x := StrToDateTime(PEntry(Item1).DatumZeit);
  y := StrToDateTime(PEntry(Item2).DatumZeit);
  if (X < Y)
  then Result := 1
  else if (X = Y) then Result := 0
                    else Result := -1;
end;
@Jumpy: Danke für's aufräumen, ich habs umgesetzt. :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.
Seite 2 von 3     12 3      

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