Also ich hab mal beide Varianten gegenüber gestellt.
Angepasst an meine Combobox mit 7.000.000 Zellen (7 mal 1.000.000).
einmal:
Delphi-Quellcode:
var
WMF : TMetafile; // virtuelle WMF bzw. EMF Datei (enthält das Image)
WMFCanvas : TMetafileCanvas; // virtuelle Oberfläche des Metafiles
i, j, iWidthTest : integer;
begin
WMF := TMetafile.Create;
WMFCanvas := TMetafileCanvas.Create(WMF, 0);
WMFCanvas.Brush.Style := bsClear;
WMFCanvas.Font := Self.Font;
for i := 0 to FGrid.RowCount - 1 do
begin
for j := 1 to FGrid.ColCount - 1 do
begin
if FGrid.ColWidths[j] < WMFCanvas.TextWidth(FGrid.Cells[j, i]) + 9 then
if WMFCanvas.TextWidth(FGrid.Cells[j, i]) + 5 < FMaxColWidth then
begin
FGrid.ColWidths[j] := WMFCanvas.TextWidth(FGrid.Cells[j, i]) + 9;
end
else
begin
FGrid.ColWidths[j] := FMaxColWidth;
end;
end;
end;
WMFCanvas.Free;
WMF.Free;
...
und dann:
Delphi-Quellcode:
var
i, j, iWidthTest : integer;
Metrics : TNonClientMetrics;
begin
Metrics.cbSize := SizeOf(Metrics);
SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(Metrics), @Metrics, 0);
Canvas.Font := Font;
for i := 0 to FGrid.RowCount - 1 do
begin
for j := 1 to FGrid.ColCount - 1 do
begin
if FGrid.ColWidths[j] < Canvas.TextExtent(FGrid.Cells[j, i]).cx + 9 then
if Canvas.TextExtent(FGrid.Cells[j, i]).cx + 5 < FMaxColWidth then
begin
FGrid.ColWidths[j] := Canvas.TextExtent(FGrid.Cells[j, i]).cx + 9;
end
else
begin
FGrid.ColWidths[j] := FMaxColWidth;
end;
end;
end;
...
mit meinem WMF bin ich NICHT signifikant schneller. Meine Variante braucht 4,1.. e-5 und die Metrics braucht 4,2.. e-5.