Einzelnen Beitrag anzeigen

David Martens

Registriert seit: 29. Sep 2003
205 Beiträge
 
Delphi XE Enterprise
 
#8

AW: Textbreite innerhalb der Titelleiste

  Alt 18. Jun 2010, 20:17
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.
  Mit Zitat antworten Zitat