Ok, wie es ausschaut, habe ich doch irgendeinen Denkfehler gemacht, denn auch in der neuen Version, bei der pro Chat-User immer nur eine txt angelegt wird, wird die Nachricht des vorletzten Eintrags ausgelassen.
Und weil das nicht schon nervig genug ist, wird auch nur die letzte Zeile einer Nachricht angezeigt.
Bitte bitte helft mir, ich stehe so kurz vorm Ziel und Verzweifeln.
Zur Veranschaulichung habe ich die Prozeduren zum Füllen des Arrays und Darstellung im Memo etwas kommentiert, hoffentlich hilft's.
Delphi-Quellcode:
//################################################### Deklaration
type
TEntry = record
User: String[25];
Msg: TStringList;
DatumZeit: String;
end;
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
BSend: TButton;
MOutput: TMemo;
MMessage: TMemo;
EUser: TEdit;
Label1: TLabel;
EDiv: TEdit;
Label2: TLabel;
BSort: TButton;
Icons: TImageList;
BRefresh: TButton;
procedure FormCreate(Sender: TObject);
procedure BSendClick(Sender: TObject);
procedure BSortClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure BRefreshClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
Entry: TEntry;
Entries: Array of TEntry;
AufAb: Boolean;
//################################################### Deklaration Ende
{...verschiedene Funktionen...}
//################################################### Sortieren
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;
//################################################### Array füllen
procedure InitFillEntries(Liste: TStringList);
var
i, eintrAuf, c: Integer;
Inhalt, temp: TStringlist;
PosisAuf, PosisZu: Array of Integer;
f: String;
begin
Inhalt := TStringlist.Create;
temp := TStringlist.Create;
//Array leeren
for i := 0 to Length(Entries) - 1 do
begin
Entries[i].Msg.Clear;
Entries[i].User := '';
Entries[i].DatumZeit := '';
end;
SetLength(Entries,0);
//Array leeren Ende
//Alle TXT-Dateien in "temp" reinladen | "Liste" enthält die Filenames
for i := 0 to Liste.Count - 1 do
begin
f := Liste[i];
if FileExists(f) then Inhalt.LoadFromFile(f);
temp.BeginUpdate;
temp.AddStrings(Inhalt);
temp.EndUpdate;
end;
//TXT-Dateien Ende
eintrAuf := 0; //Nachrichtenzähler nullen
SetLength(PosisAuf, 0); //Start-Merker nullen
SetLength(PosisZu, 0); //Ende-Merker nullen
//"temp" scannen
for i := 0 to temp.Count - 1 do
begin
if temp.Strings[i] = '{{' then //Start eines Beitrags | Start-Merker
begin
Inc(eintrAuf);
SetLength(PosisAuf, Length(PosisAuf)+1);
PosisAuf[High(PosisAuf)] := i;
end;
if temp.Strings[i] = '}}' then //Ende eines Beitrags | Ende-Merker
begin
SetLength(PosisZu, Length(PosisZu)+1);
PosisZu[High(PosisZu)] := i;
end;
end;
SetLength(Entries, eintrAuf); //Array auf die Anzahl der Einträge setzen
for i := 0 to eintrAuf-1 do //Array durchlaufen
begin
Entries[i].User := temp[PosisAuf[i]+1]; //Übergabe aus "temp" --> User-Name
Entries[i].DatumZeit := temp[PosisAuf[i]+2]; //Übergabe aus "temp" --> Datum/Zeit
for c := PosisAuf[i]+1 to PosisZu[i] - 1 do //Zeilenweise Übergabe aus "temp" --> Nachricht
begin
Entries[i].Msg := TStringList.Create;
Entries[i].Msg.Add(temp.Strings[c]);
end;
end;
//Leichen begraben
SetLength(PosisAuf, 0);
SetLength(PosisZu, 0);
Inhalt.Clear;
temp.Clear;
end;
//################################################### An Memo Übergeben
procedure PassEntries;
var
i, c: Integer;
L: TStringlist;
Liste: TStringlist;
s, dir: String;
begin
L := TStringlist.Create; //Zukünftiger Inhalt vom Memo
Liste := TStringlist.Create; //Liste der TXT-Dateien
dir := ExtractFilePath(ParamStr( 0 ))+'dbchat\';
GetFilesInDirectory(dir, '*.txt', Liste, False, True); //Alle TXT-Dateien in Verz. "dbchat" einlesen
L.BeginUpdate;
L.Clear;
InitFillEntries(Liste); //Array Füllen
Sortieren(AufAb); //Array nach Datum/Zeit sortieren
for i := 0 to Length(Entries) - 1 do //"L" befüllen
begin
L.BeginUpdate;
L.Add(Entries[i].User);
L.Add(Entries[i].DatumZeit);
L.Add('');
for c := 0 to Entries[i].Msg.Count - 1 do //Zeilen aus der Nachricht holen
begin
L.Add(Entries[i].Msg[c]);
end;
for c := 0 to 19 do s := s + Form1.EDiv.Text; //20 Zeichen als Trennlinie
L.Add(s);
s := '';
end;
L.EndUpdate;
Form1.MOutput.Lines.Clear; // "L" an Memo übergeben
Form1.MOutput.Lines.Assign(L);
Liste.Free; //Freigeben
L.Free;
//Scrollen
if AufAb = True then Form1.MOutput.Perform(EM_LineScroll, 0 , Form1.MOutput.Lines.Count-1);
end;
EDIT:
Ich habe den Anhang um den Screenshot "debugger.png" erweitert. Dieser zeigt, was sich tatsächlich im Array verbirgt.
Username ist ok, Datum/Zeit ist ok. Aber warum steht unter Msg (TStringlist) nicht der Text? Das macht mich echt mürbe -.-
EDIT2:
Delphi-Quellcode:
for i := 0 to eintrAuf-1 do //Array durchlaufen
begin
Entries[i].User := temp[PosisAuf[i]+1]; //Übergabe aus "temp" --> User-Name
Entries[i].DatumZeit := temp[PosisAuf[i]+2]; //Übergabe aus "temp" --> Datum/Zeit
Entries[i].Msg := TStringList.Create;
for c := PosisAuf[i]+3 to PosisZu[i] - 1 do //Zeilenweise Übergabe aus "temp" --> Nachricht
begin
Entries[i].Msg.Add(temp.Strings[c]);
end;
end;
Ich hatte die Stringlist an der falschen Stelle created. Nun funzen zumindest alle Einträge bis auf den vorletzten. Sry für den monolog, aber vllt. sieht es sich ja trotzdem noch einer an