Einzelnen Beitrag anzeigen

Perlsau
(Gast)

n/a Beiträge
 
#17

AW: Probleme mit TextWidth im String Grid

  Alt 3. Sep 2013, 08:50
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;
  Mit Zitat antworten Zitat