Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Seite 1 von 2  1 2      

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