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 Caption vertikal zentrieren (https://www.delphipraxis.net/127554-caption-vertikal-zentrieren.html)

MarvinM 15. Jan 2009 11:32


Caption vertikal zentrieren
 
Hallo zusammen,

ich stelle mir z.Zt. die Frage, wie es möglich ist, in einem TBitBtn die Caption vertikal zu zentrieren. In dem Fall bei einer TButtonList.

Ich bin mir sicher, dass die Antwort trivial ist, aber die Forensuche konnte mir nicht helfen ;-)

Danke!

QuickAndDirty 15. Jan 2009 11:46

Re: Caption vertikal zentrieren
 
Paint überschreiben

mimi 15. Jan 2009 16:49

Re: Caption vertikal zentrieren
 
Schau dir mal dazu die Methode: TextRect an. Die bietet einige nette Möglichkeiten dazu.
Am besten eine neue Klasse erstellen, die diese Funktion aufweist.

MarvinM 18. Jan 2009 15:14

Re: Caption vertikal zentrieren
 
Ok, also das muss in das Ereignis OnDrawButton rein, soviel ist klar.
Dann muss ich wahrscheinlich sehen, wie viele Zeilenumbrüche die Caption enthält und dementsprechend um n * Höhe_Zeile / 2 die Caption nach oben verschieben. Nur wie mache ich das? Ich werde aus den hier im Forum genannten Beispielen nicht schlau...

Danke für Eure Hilfe!

himitsu 18. Jan 2009 15:24

Re: Caption vertikal zentrieren
 
Canvas.TextLength, Canvas.TextHeight und Canvas.TextExtent rechnen inclusive Zeilenumbruch (TextHeight ist also die höhe aller Zeilen zusammen)

MarvinM 18. Jan 2009 15:46

Re: Caption vertikal zentrieren
 
Ich glaube mir steht wer auf der Leitung...

Ich habe jetzt mal mit Canvas.TextHeight rumprobiert und als Parameter mal ein, zwei und dreizeilige Strings eingefügt, aber immer kommt 13 als Höhe heraus, was nicht wirklich logisch ist :-(

himitsu 18. Jan 2009 15:49

Re: Caption vertikal zentrieren
 
:shock: ich glaub jetzt steh ich auf'm Schlauch ... dachte eigentlich das wäre Zeilenabängig :gruebel:

MarvinM 18. Jan 2009 15:53

Re: Caption vertikal zentrieren
 
Ich hab den folgenden "Test-Code" gebastelt:
Delphi-Quellcode:
Button6.Caption := IntToStr(Canvas.TextHeight('hallo' + slinebreak + 'hallo'));
Und egal wie viele sLineBreaks da drin sind, es kommt immer 13 raus.

PS: 42 wäre auch interessant ;-)

himitsu 18. Jan 2009 16:01

Re: Caption vertikal zentrieren
 
auch grad getestet :shock: ... muß ich ja eines meiner Programme mal schnell durchsehn/überarbeiten.

noch ungetestet!
Delphi-Quellcode:
Function TextExtentEx(Canvas: TCanvas; S: String): TSize;
  Var S2: String;
    i, i2: Integer;
    ts: TSize;

  Begin
    Result.cx := 0;
    Result.cy := 0;
    While S <> '' do Begin
      i := Pos(#13, S);
      i2 := Pos(#10, S);
      If (i > 0) and (i2 > 0) and (i2 < i) Then i := i2;
      If i = 0 Then i := Length(S) + 1;
      S2 := Copy(S, 1, i - 1);
      If Copy(S, i, 2) = #13#10 Then Delete(S, 1, i + 1)
      Else Delete(S, 1, i);
      If S2 <> '' Then Begin
        ts := Canvas.TextExtent(S2);
        Result.cx := Max(ts.cx, Result.cx);
        Inc(Result.cy, ts.cy);
      End Else Begin
        ts := Canvas.TextExtent('X');
        Inc(Result.cy, ts.cy);
      End;
    End;
  End;

Function TextWidthEx(Canvas: TCanvas; Const S: String): Integer;
  Begin
    Result := TextExtentEx(Canvas, S).cx;
  End;

Function TextHeightEx(Canvas: TCanvas; Const S: String): Integer;
  Begin
    Result := TextExtentEx(Canvas, S).cy;
  End;

MarvinM 18. Jan 2009 16:13

Re: Caption vertikal zentrieren
 
Danke für Deine Mühe!

Aber mir erschließt sich noch nicht ganz wie ich diese Funktionen aufrufen muss, stellen die einen Ersatz zu den Standard-Funktionen dar?

himitsu 18. Jan 2009 16:29

Re: Caption vertikal zentrieren
 
du übergibst einfach nur das Canvas, worauf zu den Text zeichnen willst (der Font und sonstiges würde dann aus diesem Canvas ausgelesen) und natürlich noch den zu messenden Text.
Delphi-Quellcode:
// dieses
i := TBitBtn(Sender).Canvas.TextHeight('derText')

// würde dann so aussehn
i := TextHeightEx(TBitBtn(Sender).Canvas, 'derText');

Hawkeye219 18. Jan 2009 16:35

Re: Caption vertikal zentrieren
 
Hallo,

mit der API-Funktion MSDN-Library durchsuchenDrawTextEx kann man auch messen:

Delphi-Quellcode:
var
  s : string;
  R : TRect;
begin
  s := 'Dies ist ein Text,'#10'der sich über drei Zeilen erstreckt.'#10'Dies ist die letzte Zeile.';

  ZeroMemory(@R, SizeOf(R));
  DrawTextEx(Canvas.Handle, PChar(s), Length(s), R, DT_CALCRECT, nil);

  ShowMessage (Format('cx=%d, cy=%d', [R.Right, R.Bottom]));
end;
Gruß Hawkeye

MarvinM 18. Jan 2009 16:44

Re: Caption vertikal zentrieren
 
Das müsste dann ja so im OnDrawButton-Event aussehen:
Delphi-Quellcode:
TextHeightEx(TBitBtn(Sender).Canvas, TBitBtn(Sender).Caption);
Bei TBitBtn(Sender).Canvas hat der Compiler ein Problem "undefinierter Bezeichner".

Was mir leider immernoch nicht klar ist, ist was ich mit dem Rückgabewert (TSize) der Funktion zu tun habe :gruebel:

himitsu 18. Jan 2009 16:53

Re: Caption vertikal zentrieren
 
Dafür müßter es es doch erstmal zeichen, um die größe zu bekommen, aber er möchte ja erst messsen, um an der richtigen Stelle zu zeichnen.

für TBitBtn(Sender).Canvas mußt du natürlich das Canvas angeben, worauf du zeichnest (wußte ja nicht wie deine Zeichenroutine bisher aussieht)

MarvinM 18. Jan 2009 17:02

Re: Caption vertikal zentrieren
 
Ich sollte vielleicht erwähnen, dass meine Canvas-Kenntnisse nicht der Brüller sind :oops:

Ich denke mal, dass ich die Rückgabewerte deiner beiden Funktionen in ButtonGroup1.Canvas.TextOut als Parameter packen muss, richtig?

Das geht mit einer Zeile auch wunderbar, bei zwei ignoriert er dann einfach den Umbruch.

himitsu 18. Jan 2009 17:26

Re: Caption vertikal zentrieren
 
Delphi-Quellcode:
var ts: TSize;
  S: String;

S := 'derText';

ts := DrawTextEx(ButtonGroup1.Canvas, S);
ButtonGroup1.Canvas.TextOut(X - ts.cx div 2, Y - ts.cy div 2, S);
hierbei wären X und Y die Position, an welcher der Text zentriert gezeichnet werden soll

MarvinM 18. Jan 2009 17:43

Re: Caption vertikal zentrieren
 
Jetzt ignoriert er leider jedlichen Zeilenumbruch.

Wie kann ich denn in der Methode sagen, dass er das Bild an die ursprüngliche Stelle und den Text in der Mitte 5 oder 10 Pixel daneben zentriert. Ich hatte es mit x := ButtonGroup1.Images.Width + 15; probiert, das hat allerdings nicht funktioniert. Y hab ich unter Kontrolle!

Ich hätte nie gedacht, dass das so kompliziert ist...

MarvinM 18. Jan 2009 19:31

Re: Caption vertikal zentrieren
 
Vielen, vielen Dank für Eure Hilfe, aber das wird mir ein wenig zu komplex. Ich werde die Anzahl der Buttons reduzieren, sodass ich die einzelne Spalte breiter machen kann.

Danke nocheinmal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 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