Also ich setz die Spaltenbreiten bereits beim Befüllen und ganz ohne OnCellDraw, wie man
in diesem Testprojekt sehen kann:
Delphi-Quellcode:
// ********** BEFÜLLEN DES GRIDS MIT ORT-INFORMATIONEN AUS ORT-OBJEKTEN **************************************************************
Procedure TFormMain.GridFill_Orte;
Var
Liste,
SepList : TStrings;
Land : String;
Breit,
i,z,k,x : Integer;
Start,
Ende : TDateTime;
Sek : Extended;
Breite : Array[0..ColMax] OF Integer; // Array für die Spaltenbreiten
begin
Start := Now;
Land := Combo_Land.Text;
Label_Orte_Anzahl.Caption := 'Bitte warten ...';
Label_Orte_Dauer.Caption := 'Orts-Daten werden geladen ...';
Forms.Application.ProcessMessages;
Liste := TStringList.Create;
SepList := TStringList.Create;
SepList.Delimiter := ';';
SepList.StrictDelimiter := True;
Try
Einrichten_Orte;
StrGrid_Orte.Visible := False;
IF HC.GetOrteFromLand(Land,Liste) THEN
BEGIN
z := Liste.Count;
IF z > 0 THEN
BEGIN
FOR i := 0 TO StrGrid_Orte.ColCount -1 DO Breite[i] := StrGrid_Orte.ColWidths[i];
FOR i := 0 TO z-1 DO
BEGIN
SepList.DelimitedText := Liste[i];
x := SepList.Count;
IF x > 0 THEN
FOR k := 0 TO x-1 DO
BEGIN // Zuweisung der Zell-Inhalte und Setzen der Spaltenbreiten
StrGrid_Orte.RowCount := i + 2;
StrGrid_Orte.Cells[k,i+1] := SepList[k];
Breit := StrGrid_Orte.Canvas.TextWidth(SepList[k]) + GridSpace;
IF Breit > Breite[k] THEN Breite[k] := Breit;
END;
END;
END;
END;
Finally
SepList.Free;
Liste.Free;
Label_Orte_Anzahl.Caption := 'enthält ' + IntToStr(z)+ ' Einträge';
Breit := 55;
FOR i := 0 TO ColMax DO
BEGIN
StrGrid_Orte.ColWidths[i] := Breite[i];
Breit := Breit + Breite[i];
END;
StrGrid_Orte.Visible := True;
FormMain.Width := Breit; // Die Integer-Variable Breit ist die Summe aller Werte im Breite-Array
StrGrid_Orte.SetFocus;
Ende := Now;
Sek := DateUtils.MilliSecondsBetween(Start,Ende) / 1000;
Label_Orte_Dauer.Caption := 'Ladezeit: ' + FloatToStr(Sek) + ' sec';
End;
end;