Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: TListView - viele Daten - viel Zeit ...

  Alt 17. Jul 2014, 08:53
Ich würde zunächst einmal die Methode aufteilen
  1. ListView Columns definieren
    Delphi-Quellcode:
    procedure TPostHauptformular.ListViewColumnsPrepare( ALV : TListView; AColumnTextWidth : Integer );
    var
      LColumn : TListColumn;
    begin
      ALV.Columns.BeginUpdate;
      try
        {Alle (alten) Spalten und ListenItems bereinigen.}
        ALV.Columns.clear;

        {Memo vorhanden?}
        LColumn := ALV.Columns.add;
        LColumn.Caption := ' ';
        LColumn.Width := AColumnTextWidth; // wo kommt die denn her? Mal als Parameter festgelegt s.o.

        {Versanddatum}
        LColumn := ALV.Columns.add;
        LColumn.Caption := 'Datum';
        LColumn.Width := AColumnTextWidth; // wo kommt die denn her? Mal als Parameter festgelegt s.o.

        // und noch 4 stück...

      finally
        ALV.Columns.EndUpdate;
      end;
    end; {FuelleEintragsliste}
  2. ListView Einträge füllen
    Delphi-Quellcode:
    procedure TPostHauptformular.FuelleEintragsliste( ALV : TListView; ADataList : TDataList { <- anpassen } );
    var
      NeuerEintrag: TListItem;
      LDataItem : TDataItem; { <- anpassen }
      i : integer;
      s : string;
    begin
      ALV.Items.BeginUpdate;
      try
        ALV.Items.clear;

        for i := 0 to AList.letzter do
        begin
          LDataItem := ADataList[i];

          NeuerEintrag := ALV.Items.Add;
          NeuerEintrag.Caption := s; // <- den hast du hoffentlich auch gesetzt
          NeuerEintrag.SubItems.Add( LDataItem.empfaenger );
          NeuerEintrag.SubItems.Add( LDataItem.inhalt );
          // und noch'n paar...

        end;
      finally
        Items.EndUpdate;
      end;
    end; {FuelleEintragsliste}
Und diese würde ich auch nicht beide immer ständig aufrufen, sondern nur dann, wenn die benötigt werden. Ist die ListView schon vorbereitet, dann brauche ich die ja nicht noch schon wieder vorbereiten (es ist ja alles da). Und auch wenn man an die Columns geht, dann eben auch dort ein BeginUpdate ... EndUpdate und das auch mit einem try ... finally absichern.

Wenn du eine generellere Methode zum Vorbereiten einer ListView haben möchtest, dann definierst du dir eben:
Delphi-Quellcode:
TColumnDef = record
  Caption : string;
  Width : Integer;
end;

procedure ListViewPrepare( ALV : TListView; AColumnDefs : array of TColumnDef );
var
  LIdx : Integer;
begin
  ALV.Columns.BeginUpdate;
  try
    ALV.Columns.Clear;
    
    for LIdx := Low(AColumnDefs) to High(AColumnDefs) do
    begin
      LColumn := ALV.Columns.Add;
      LColumn.Caption := AColumnDefs[LIdx].Caption;
      LColumn.Width := AColumnDefs[LIdx].Width;
    end;

  finally
    ALV.Columns.EndUpdate;
  end;
end;
Wie man sieht werden die Methoden wesentlich kürzer aber dafür flexibler
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (17. Jul 2014 um 09:37 Uhr)
  Mit Zitat antworten Zitat