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 Panelwidth an Caption anpassen ? (https://www.delphipraxis.net/137499-panelwidth-caption-anpassen.html)

Hansa 22. Jul 2009 00:13


Panelwidth an Caption anpassen ?
 
Moin,

ich brauche ein paar Ideen. Es geht darum, die Breite eines Panels in Abhängigkeit von der Caption darzustellen. D.h. je länger die Caption, desto größer die Breite. Rechts und links von der Caption soll noch ein Rand hinzugefügt werden und der soll unabhängig von der Caption gleich groß sein. Egal, bei welcher Schrift. So was wie hier :
Delphi-Quellcode:
Font*length (Caption)
scheidet also direkt aus. Ich habe bereits eine Lösung im Kopf, die funktionieren müsste, zuerst will ich mal Meinungen hören, wie man das überhaupt machen könnte. :zwinker: Was mir bisher vorschwebt, das dürfte unnötig kompliziert sein. :mrgreen:

NickelM 22. Jul 2009 00:28

Re: Panelwidth an Caption anpassen ?
 
Es geht viel einfacher : Canvas hat ne Funktion, wo du die Textbreite in Pixel herausfinden kannst.


Delphi-Quellcode:
Canvas.TextWidth(Caption) +2; //die +2 für die abstehende Breite
//das geht nur wenn du einen neue Komponente erstellst. Zur Design-Zeit, also wo du die Komponenten aufs Form ziehst, musst du erst ne Variable Canvas erstellen
var Canvas : TCanvas;
begin
Canvas := TCanvas.Create;
Canvas.Handle := GetDC(Panel.Handle);
end;
//und dann halt TextWidth machen
Hoffe ich konnte dir helfen

Gruß NickelM

Luckie 22. Jul 2009 00:29

Re: Panelwidth an Caption anpassen ?
 
TCanvas kennt eine Methode, mit der man die Länge einer zeichenkette in Pixel bestimmen kann. Guck mal in der Hilfe nach, mir fällt gerade nicht der Name ein.

Namenloser 22. Jul 2009 01:19

Re: Panelwidth an Caption anpassen ?
 
Lass die Caption doch leer und nimm stattdessen ein Label. Das Label platzierst du im Panel und setzt bei beiden Autosize auf True. Abstände könntest du mit den Properties Padding bzw Margin einstellen.

uligerhardt 22. Jul 2009 08:07

Re: Panelwidth an Caption anpassen ?
 
Zitat:

Zitat von NickelM
Delphi-Quellcode:
//das geht nur wenn du einen neue Komponente erstellst. Zur Design-Zeit, also wo du die Komponenten aufs Form ziehst, musst du erst ne Variable Canvas erstellen

Muss er nicht:
Delphi-Quellcode:
type
  THACK_CustomPanel = class(TCustomPanel);

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Width := THACK_CustomPanel(Panel1).Canvas.TextWidth(Panel1.Caption) + 16;
end;

Hansa 22. Jul 2009 14:28

Re: Panelwidth an Caption anpassen ?
 
Panel hat doch kein Canvas ? :gruebel: Jedenfalls war keines der angeführten Beispiele zum laufen zu kriegen. Habe jetzt mal meine eigene Idee getestet und sie an, die geht :

Delphi-Quellcode:
lblHilf.Caption := (c as TPanel).Caption;
lblHilf.Font := (c as TPanel).Font;
(c as TPanel).Width := lblHilf.Width; // jetzt Breite anpassen
Was soll ich denn überhaupt in mein Programm eine WinAPI-Funktion reinmachen oder irgendwie ein Canvas erzeugen ? Ich lasse einfach das Label die richtige Width errechnen. Das liefert dann dem Panel die richtige Width und fertig. :shock: Was ist davon zu halten ?

angos 22. Jul 2009 14:54

Re: Panelwidth an Caption anpassen ?
 
Zitat:

Zitat von Hansa
Panel hat doch kein Canvas ? :gruebel: Jedenfalls war keines der angeführten Beispiele zum laufen zu kriegen. [...]

Deine idee wirkt halt son bissl gepfuscht :D, aber wenns geht dann gehts... allerdings muss ich sagen, dass das beispiel von uligerhardt bei mir problemlos funktioniert. Das machts halt n bissl schlanker, solltest vielleicht nochmal anschauen

Gruß
Ansgar

DeddyH 22. Jul 2009 15:11

Re: Panelwidth an Caption anpassen ?
 
Zitat:

Zitat von hansa
Panel hat doch kein Canvas ?

Doch, da es ja von TCustomControl abgeleitet ist. Allerdings wurde die Property als protected deklariert, so dass Du nur über den Umweg der Cracker-Klasse rankommst.

OldGrumpy 22. Jul 2009 15:59

Re: Panelwidth an Caption anpassen ?
 
Zitat:

Zitat von Hansa
Panel hat doch kein Canvas ? :gruebel:

Doch, hat es sehr wohl, ist jedoch protected. Es bietet sich daher an, eine eigene Klasse TAutoSizePanel zu erstellen (zum Beispiel), oder einfach vom Betriebssystem die passende Größe ermitteln zu lassen, dann gibts auch keine Probleme mit Widestrings und so weiter :)

Zitat:

Zitat von Hansa
Delphi-Quellcode:
lblHilf.Caption := (c as TPanel).Caption;
lblHilf.Font := (c as TPanel).Font;
(c as TPanel).Width := lblHilf.Width; // jetzt Breite anpassen

Abgesehen davon, dass das Resourcenverschwendung ist und um den Faktor zehn langsamer, funktioniert das nur, wenn lblHilf.AutoSize=true :) Außerdem hast Du den im Ursprungspost erwähnten Rand links und rechts vergessen :) Wenn Du Dich an Deine eigene Aufgabenstellung hältst, musst Du noch mehr machen als in den obigen Zeilen ;)

Zitat:

Zitat von Hansa
Was soll ich denn überhaupt in mein Programm eine WinAPI-Funktion reinmachen oder irgendwie ein Canvas erzeugen ? Ich lasse einfach das Label die richtige Width errechnen. Das liefert dann dem Panel die richtige Width und fertig. :shock: Was ist davon zu halten ?

"reinmachen" musst Du da nirgends :mrgreen: Die Unit Windows sollte in den allermeisten VCL-Programmen so oder so schon vorhanden sein :) Zum Rest siehe oben. Und wo das hinführt: Die Altlast an der ich momentan arbeite hat auf dem Mainform ca. 250 Controls in mehreren Schichten übereinander angeordnet, ca. 30 davon dienen nur dazu, irgendwelche X/Y-Positionen und Abstände zu ermitteln. Vollkommen bescheuert.


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