Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TStringGrid, wordwrap, 1zeilig sieht es blöd aus (https://www.delphipraxis.net/137418-tstringgrid-wordwrap-1zeilig-sieht-es-bloed-aus.html)

hoika 20. Jul 2009 17:31


TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo #,

das angehängte Projekt soll ein StringGrd wordwrap-fähig machen.
Klappt soweit ganz gut (Button wordwrap).

Ist die Spalte aber gross genug,
soll sie genauso aussehen, wie nicht wordwrap-Zeilen.

Dort wird die Zeile durch den entsprechenden DrawText-Parameter
vertikal zentiert.
Das klappt mit dt_wordbreak aber nicht (sagt auch das SDK).

Was ich bräuchte, wäre eine Möglichkeit, festzustellen,
ob DrawText mehr als 1 Zeile erzeugt,
also ein wordbreak erfolgt.


Wie mache ich das ?


Heiko

Lannes 20. Jul 2009 17:57

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

DrawText mit Parameter DT_CALCRECT kann man zur Berechnung des Ausgaberechtecks verwenden.
Aus der zurückgegebenen Höhe kann man erforderlichen Umbruch ableiten.

hoika 20. Jul 2009 18:01

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

mache ich ja, aber wie stelle ch fest,
dass umgebrochen wird ?

Delphi-Quellcode:
        if (DrawRect.Bottom - DrawRect.Top) > RowHeights[R] then
        begin
          { cell word-wraps; increase row height }
          RowHeights[R]:= DrawRect.Bottom - DrawRect.Top;
          SetGridHeight(AGrid);
        end;

        if RowHeights[R]<=AGrid.DefaultRowHeight then
        begin
          // hierher kommt er , es passiert aber nichts
siehe der Screenshot


Heiko

DeddyH 20. Jul 2009 18:05

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Musst Du nicht mit >= vergleichen?

hoika 20. Jul 2009 18:08

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

Delphi-Quellcode:
        if RowHeights[R]<=AGrid.DefaultRowHeight then
        begin
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_singleline
                   or dt_vcenter
                   or iAlign);
        end          
        else
        begin
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_wordbreak
                   or iAlign);
        end;
<= ist richtig, ich will in diesem Fall ja per dt_singleline
und vor allem dt_vcenter das Standard-Verhalten malen,
also vertikal zentriert, so als ob es keinen Umbruch gibt.


Heiko

DeddyH 20. Jul 2009 18:12

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Achso, dann hab ich das falsch verstanden. Was ist denn nun noch das Probem?

hoika 20. Jul 2009 18:15

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

an Posting 1 ist ein Screenshot.
Die Spalte 3 sieht einfach blöd aus.

Das dt_vcenter funktioniert irgendwie nicht richtig.


Heiko

DeddyH 20. Jul 2009 18:20

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Du willst eine Multiline-Zelle vertikal zentrieren, hab ich das richtig verstanden?

hoika 20. Jul 2009 18:25

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

nein, das war ein Versuch.
Geht ja nicht (laut SDK).
Ich habe Posting #5 geändert.

Noch mal:

Delphi-Quellcode:
        if RowHeights[R]<=AGrid.DefaultRowHeight then
        begin
         // hier kommt er rein,
            aber siehe Screenshot
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_singleline
                   or iAlign);
        end          
        else
        begin
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_wordbreak
                   or dt_vcenter // klappt nicht, steht auch so im SDK
                   or iAlign);
        end;
Lade doch mal das Projekt runter und klicke auf den rechten Button.



Heiko

DeddyH 20. Jul 2009 18:28

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Nützt nix, da ich gerade kein Delphi verfügbar habe. Mit DT_VCENTER geht das nur in Verbindung mit DT_SINGLELINE, wie Du ja bereits bemerkt hast. Vielleicht kommt man aber mit MSDN-Library durchsuchenOffsetRect o.ä. weiter.

hoika 20. Jul 2009 18:32

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

OffsetRect bringt nix, es sieht so aus,
also ob er in das if RowHeights[R]<=AGrid.DefaultRowHeight then
nicht reingeht.
Macht er aber, sagt mein Debugger.

Naja, mal weiterbasteln.


Heiko

hoika 20. Jul 2009 18:43

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

LÖSUNG

Delphi-Quellcode:
if RowHeights[R]<=AGrid.DefaultRowHeight then
begin
  DrawRect:= Rect; // das hier war es
Delphi-Quellcode:
procedure DrawSGCell(AGrid: TStringGrid; C, R : integer; Rect : TRect;
          Style : TFontStyles; Wrap : boolean; Just : TAlignment;
          CanEdit : boolean);
  { draws formatted contents in string grid cell at col C, row R;
    Style is a set of fsBold, fsItalic, fsUnderline and fsStrikeOut;
    Wrap invokes word wrap for the cell's text; Just is taLeftJustify,
    taRightJustify or taCenter; if CanEdit false, cell will be given
    the background color of fixed cells; call this routine from
    grid's DrawCell event }
var
  S       : String;
  S2       : String;
  DrawRect : TRect;
  iAlign  : Integer;
begin
  iAlign:= dt_left;
  case Just of
    taCenter      : iAlign:= dt_center;
    taRightJustify : iAlign:= dt_right;
  end;

  with AGrid, Canvas do
  begin
    { erase earlier contents from default drawing }
    if (R >= FixedRows) and (C >= FixedCols) and CanEdit then
    begin
//      Brush.Color:= AGrid.Brush.Color;
    end
    else
    begin
      Brush.Color:= FixedColor;
    end;

    FillRect(Rect);
    { get cell contents }
    S:= Cells[C, R];

    if length(S) > 0 then
    begin
(*
   original code, keine Ahnung, was das soll ???
*)
      S2:= S;
(*
      case Just of
        taLeftJustify : S:= ' ' + S;
        taRightJustify : S:= S + ' ';
      end;
*)

      { set font style }
      Font.Style:= Style;
      { copy of cell rectangle for text sizing }
      DrawRect:= Rect;

      if Wrap then
      begin
       { get size of text rectangle in DrawRect, with word wrap }
        DrawText(Handle, PChar(S2), length(S2), DrawRect,
          dt_calcrect or dt_wordbreak or iAlign);
        if (DrawRect.Bottom - DrawRect.Top) > RowHeights[R] then
        begin
          { cell word-wraps; increase row height }
          RowHeights[R]:= DrawRect.Bottom - DrawRect.Top;
          SetGridHeight(AGrid);
        end;

        if RowHeights[R]<=AGrid.DefaultRowHeight then
        begin
          DrawRect:= Rect;
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_singleline
                   or dt_vcenter // klappt nicht, steht auch so im SDK
                   or iAlign);
        end
        else
        begin
          DrawText(Handle, PChar(S2), length(S2), DrawRect,
                   dt_wordbreak
                   or iAlign);
        end;
      end
      else
      begin
        { no word wrap }
        DrawText(Handle, PChar(S2), length(S2), DrawRect,
                 dt_singleline
                 or dt_vcenter
                 or iAlign);
      end; { if Wrap then }
    end; { if length(S) > 0 then } 

   { restore no font styles }
    Font.Style:= [];
  end;
end;

Puh !!!

DeddyH 20. Jul 2009 18:50

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
:thumb:

hoika 20. Jul 2009 19:13

Re: TStringGrid, wordwrap, 1zeilig sieht es blöd aus
 
Hallo,

:cheers:

jo, war schwer zu finden.


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz