Einzelnen Beitrag anzeigen

aphexx

Registriert seit: 23. Apr 2010
19 Beiträge
 
#6

AW: Memo lässt Zeilen verschwinden

  Alt 27. Mär 2011, 14:53
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
Miniaturansicht angehängter Grafiken
debugger.png  
Angehängte Dateien
Dateityp: 7z 2011-03-27 dropbox chat.7z (307,6 KB, 0x aufgerufen)
Dateityp: pas main.pas (8,4 KB, 2x aufgerufen)

Geändert von aphexx (27. Mär 2011 um 16:39 Uhr)
  Mit Zitat antworten Zitat