Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   TAdvStringGrid: OnGetCellText vs. AutoSizeCol (https://www.delphipraxis.net/190001-tadvstringgrid-ongetcelltext-vs-autosizecol.html)

hoika 18. Aug 2016 17:51

TAdvStringGrid: OnGetCellText vs. AutoSizeCol
 
Hallo,
mal wieder das ewige Leid mit umfangreichen Grids (RowCount=1000 -> Kundenwunsch).

Das TAdvStringGrid hat ja diesen schicken virtuellen Modus,
also ColCount und RowCount setzen, Cells lassen wir links liegen
und reagieren auf OnGetCellText und geben dort unsere Strings zurück.

Bei etwas größeren (RowCount) Grids ist der Performance-Gewinn sagenhaft.
Dummerweise mache ich aber eine AutoSizeCol und schon muss er alle Zeilen per OnGetCellText abfragen ;(

Ich bin jetzt schon am überlegen, ob ich dem Nutzer erlaube, die Spaltenbreite selbst zu setzen,
dann wäres das mit dem AutoSizeCol.

PS:
"BeginUpdate", "RowCount auf 2 lassen" ist alles schon eingebaut

hoika 18. Aug 2016 19:09

AW: TAdvStringGrid: OnGetCellText vs. AutoSizeCol
 
Hallo,
hat sich erledigt,
auch mit OnGetDisplText klappt das mit dem AutoSizeCol in "atemberaubender" Geschwindigkeit.

Uwe Raabe 18. Aug 2016 19:20

AW: TAdvStringGrid: OnGetCellText vs. AutoSizeCol
 
Nur so eine Idee:
  • BeginUpdate
  • RowCount merken
  • OnGetCellText merken
  • RowCount auf 2
  • OnGetCellText auf nil
  • Setze Cells[col, 1] auf längsten möglichen Text
  • AutoSizeCol
  • Cells[col, 1] wieder leer machen
  • OnGetCellText und RowCount wieder herstellen
  • EndUpdate

Man kann auch die längsten N Texte ermitteln und setzt RowCount und Cells entsprechend. Das Finden des längsten Texts kann entweder durch einfache Textlänge oder durch jeweiligen Aufruf von AdvStringGrid1.Canvas.TextWidth erfolgen. Das kann natürlich auch schon mal komplizierter werden, wenn die Texte noch aufwendig formatiert werden müssen. Wie gesagt - nur 'ne Idee.

hoika 18. Aug 2016 19:44

AW: TAdvStringGrid: OnGetCellText vs. AutoSizeCol
 
Hallo,
das klappt alles ohne die "Umwege".
Hätte ich nicht gedacht.

Delphi-Quellcode:

procedure TForm69.SGGetDisplText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
begin
  if CBOnGetCellText.Checked then
  begin
    Value := IntToStr(ACol)+'/'+IntToStr(ARow)
  end;
end;

procedure TForm69.CBOnGetCellTextClick(Sender: TObject);
var
  iTick1: Integer;
  iTick2: Integer;
begin
  iTick1 := GetTickCount;

  SG.RowCount := 2;

  SG.RowCount := 30000;
  SG.Invalidate;

  iTick2 := GetTickCount;

  AutoSize;

  MessageBox(0, PChar(IntToStr(iTick2-iTick1)), 'Dauer (msec)', 0);
end;

procedure TForm69.AutoSize;
var
  iCol: Integer;
begin
  for iCol:= 0 to SG.ColCount-1 do
  begin
    begin
      SG.AutoSizeCol(iCol);
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 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