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/)
-   -   TStringgrid mehrzeiliger vertikaler Text (https://www.delphipraxis.net/170375-tstringgrid-mehrzeiliger-vertikaler-text.html)

pHL 14. Sep 2012 05:31

TStringgrid mehrzeiliger vertikaler Text
 
Hallo,

Ich möchte den Text in einzelnen Zellen vertikal anzeigen. Da der Text teilweise sehr lang ist, möchte ich aber mehrere Zeilen
anzeigen.

Ich fülle die Zellen zum Beispiel so:
Delphi-Quellcode:
Cells[0,0] := 'Hallo' + sLineBreak + 'Hans';


Im OnDraw des Stringgrid gebe ich den Text folgendermaßen aus:
Delphi-Quellcode:
Canvas.TextRect(Rect, Cells[0,0], [tfCenter])


So werden die Zeilenumbrüche dargestellt, jedoch ist der Text horizontal. Wenn ich im OnDraw die Font.Orientation auf 900 setze dann
wird mir der Text zwar vertikal angezeigt jedoch verliere ich die Zeilenumbrüche.

Wie löse ich das am besten?

MfG.
pHL

Furtbichler 14. Sep 2012 06:22

AW: TStringgrid mehrzeiliger vertikaler Text
 
Da das Canvas.DrawText-Ereignis ist nicht in der Lage ist, Text mehrzeilig auszugeben, musst Du Dir wohl eine eigene Routine schreiben oder die SuFu/Guhgel benutzen, um etwas fertiges zu finden.

Bummi 14. Sep 2012 06:41

AW: TStringgrid mehrzeiliger vertikaler Text
 
Du kannst jedes Canvas drehen,zoomen,verschieben über SetWorldTransform, mit etwas Rechenaufwand kannst Du die Parameter entsprechend festlegen und den Text beliebig ausgeben.

Delphi-Quellcode:
Procedure ResetCanvas(ACanvas:TCanvas);
begin
   SetCanvasZoomAndRotation(ACanvas , 1, 0, 0,0);
end;

Procedure SetCanvasZoomAndRotation(ACanvas:TCanvas;Zoom:Double;Angle:Double;CenterpointX,CenterpointY:Double);
var
    form : tagXFORM;
    Winkel:Double;

begin
      Winkel := Grad2Rad(Angle);
      SetGraphicsMode(ACanvas.Handle, GM_ADVANCED);
      SetMapMode(ACanvas.Handle,MM_ANISOTROPIC);
      form.eM11 := Zoom * cos( Winkel);
      form.eM12 := Zoom *Sin( Winkel) ;
      form.eM21 := Zoom * (-sin( Winkel));
      form.eM22 := Zoom * cos( Winkel) ;
      form.eDx := CenterpointX;
      form.eDy := CenterpointY;
      SetWorldTransform(ACanvas.Handle,form);
end;

pHL 14. Sep 2012 06:51

AW: TStringgrid mehrzeiliger vertikaler Text
 
Dankeschön, probier ich gleich aus :)

MfG.

pHL 14. Sep 2012 07:41

AW: TStringgrid mehrzeiliger vertikaler Text
 
Verstehe ich das richtig: Ich zeichne ganz normal auf meinen Canvas und rotiere diesen anschließend?

Ich habe nämlich gerade folgendes getestet: TImage erstellt, Bild geladen und dann hab ich die Procedure so aufgerufen:
Delphi-Quellcode:
SetCanvasZoomAndRotation(Image1.Canvas, 1, 30, 5, 5);


Es passiert aber garnichts, was ist der Fehler?

MfG.
pHL

Bummi 14. Sep 2012 08:02

AW: TStringgrid mehrzeiliger vertikaler Text
 
Liste der Anhänge anzeigen (Anzahl: 2)
Du musst vor dem Zeichnen die Transformation setzen

Delphi-Quellcode:
Procedure RotText(left:Boolean;C:TCanvas;r:Trect;Const s:String);
var
 tr:TRect;
 ts:String;
begin
    ts := s;
    if Left then   SetCanvasZoomAndRotation(c,1,-90,r.Left,r.Bottom)
    else SetCanvasZoomAndRotation(c,1,90,r.Right,r.top);
    tr.Left := 0;
    tr.Top := 0;
    tr.Right := r.Bottom - r.Top;
    tr.Bottom := r.Right - r.Left;
    InflateRect(tr,-2,-2);
    c.TextRect(tr,ts,[tfWordBreak]);
    ResetCanvas(c);
end;

procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
Const
  C_TEXT='Irgend ein Testtext der etwas länger ist';
  Procedure Default;
    var
     ar:TRect;
     ast:String;
    begin
       ar := Rect;
       InflateRect(ar,-2,-2);
       ast:= C_TEXT;
       StringGrid1.Canvas.Textrect(ar,ast,[tfWordBreak]);
    end;
begin
   if (ARow=3) then
      begin
         if ACol=2 then
            begin
                RotText(true,StringGrid1.Canvas,Rect,C_TEXT)
            end
         else if Acol=3 then
            begin
               RotText(false,StringGrid1.Canvas,Rect,C_TEXT)
            end
         else Default;

      end else Default;
end;

pHL 14. Sep 2012 09:21

AW: TStringgrid mehrzeiliger vertikaler Text
 
Danke für die tolle Hilfe, funktioniert wunderbar! :)

MfG.
pHL


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:55 Uhr.

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