Autor Beitrag
combatman
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 29.07.02 13:38 
Ich möchte für mein Programm Übersetzungen in andere Sprachen ermöglichen. Dabei habe ich nun folgendes Problem:
Da die Textbreite natürlich bei verschiedenen Sprachen variiert, möchte ich z.B. bei einer Radiobox die Breite des Textes in Pixeln abfragen, um die Breites des Controls entsprechend anzupassen.
Hat jemand eine Idee wie man das anstellen könnte? Bisher bin ich leider noch nicht fündig geworden.


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 09.01.2009 um 17:27
GPF
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 85



BeitragVerfasst: Mo 29.07.02 14:51 
TCanvas stellt die Methoden TextWidth und TextHeight zur Verfügung.
Damit kannst Du Pixel-genau die Breite bzw. Höhe eines Strings ermitteln.
Einziger Haken dabei ist allerdings, daß einige Standardkomponenten den Canvas nicht veröffentlicht haben und Du dann damit Canvas.Textwidth und Canvas.Textheight nicht aufrufen kannst.
In einem solchen Fall mußt Du einfach eine abgeleitete Komponente erstellen und nur den Canvas im public Bereich veröffentlichen. Bei der RadioBox bin ich mir nicht sicher ob Du dieses noch machen mußt oder nicht.

MfG
GPF
combatman Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 29.07.02 22:18 
Titel: Danke
Klingt ja gar nicht so schwer, werde ich morgen gleich mal ausprobieren. Wichtig ist, dass die tatsächliche Textbreite bekomme, nicht die Breite des Controls.
FriFra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 557

Win XP Prof, Win XP Home,Win Server 2003,Win 98SE,Win 2000,Win NT4,Win 3.11,Suse Linux 7.3 Prof,Suse Linux 8.0 Prof
D2k5 Prof, D7 Prof, D5 Standard, D3 Prof, K3 Prof
BeitragVerfasst: Mo 29.07.02 22:28 
Die Textbreite kannst du mit
ausblenden Delphi-Quelltext
1:
Form1.canvas.textwidth('Dein Text');					

ermitteln. Du kannst den Canvas vom Form nehmen, da das Form ja idR. die gleichen Fonteinstellungen wie Radiobuttons etc. haben. Falls es bei Dir anders ist, kannst Du ja auch den Canvas eines Labels verwenden.

Bei RadioButtons und CheckBoxen musst Du allerding noch einen fixen Wert addieren, da die vorangestellten "Images" deren Breite erhöhen.

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Fr 09.01.09 17:44 
@GPF
Wie komme ich z.B. an den Canvas eines TPanel?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  TPanel = class(TCustomPanel)
  TCustomPanel = class(TCustomControl)
  TCustomControl = class(TWinControl)
    protected
      property Canvas: TCanvas read FCanvas;

Ich will kein neues TPanel erfinden, aber TCustomPanel versteckt ihn...

Knulli

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Fr 16.01.09 06:35 
user profile iconKnulli hat folgendes geschrieben Zum zitierten Posting springen:
Wie komme ich z.B. an den Canvas eines TPanel?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  TPanel = class(TCustomPanel)
  TCustomPanel = class(TCustomControl)
  TCustomControl = class(TWinControl)
    protected
      property Canvas: TCanvas read FCanvas;

Ich will kein neues TPanel erfinden, aber TCustomPanel versteckt ihn...

Knulli

Das Panel hat die Eigenschaft AutoSize. Schaus dir mal an. Ansonsten nimm doch wie schon vorgeschlagen das Canvas des Forms:
ausblenden Delphi-Quelltext
1:
Panel1.Width := Form1.Canvas.TextWidth(Panel1.Caption); //evtl. noch TMargin und TPadding- Werte addieren					
Biergeneral
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35

WIN XP
Delphi 7 Ent., Delphi 2007 Ent., C/C++ (Eclipse)
BeitragVerfasst: So 18.01.09 12:57 
Es gibt noch eine andere Möglichkeit an die Textbreite zu kommen, ohne über die TCanvas Klasse zu gehen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure GetControlTextExtents(AControl: TControl; const Text: string): TSize;
begin
  GetTextExtentPoint32(AControl.Handle, Text, length(Text), Result);
end;



Result.cx beschreibt dann die Breite und Result.cy die Höhe des Textes.
( Das ist übrigens nichts anderes, als das TCanvas nutzt um die Ausdehnung des Textes zu errechnen )



Grüße ;-)