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 TScrollBox, VerticalScrollbar, Range (https://www.delphipraxis.net/211805-tscrollbox-verticalscrollbar-range.html)

Alex_ITA01 4. Nov 2022 06:33

TScrollBox, VerticalScrollbar, Range
 
Hallo zusammen,
ich habe folgende Situation und würde die Range der TScrollbox automatisch berechnen:

Formular mit einer Höhe von knapp 250 Pixeln.
Darauf liegt die Scrollbox mit alClient.
In der Scrollbox liegt ein Panel mit alClient.
Dem Panel weise ich unterschiedlich langen Text mit Zeilenumbrüchen etc zu.
Das heißt, der Text in dem Panel ist kann mal 600 Pixel hoch sein, mal aber auch 900, mal aber auch nur 400.
Wie kann ich diese Pixelhöhe des Textes berechnen, sodass ich die Range der Scrollbox nach Zuweisung des Textes auf das Panel automatisch setzen kann? Ich hoffe, ihr könnt mir dabei helfen.

BerndS 4. Nov 2022 07:48

AW: TScrollBox, VerticalScrollbar, Range
 
Hast du auf dem Panel für den Text ein Label oder ein Memo?
Bei einem Label wäre es einfach.
Für Panel und Label Align = atTop und Autosize = True setzen.
Bei einem Memo könntst du es GetScrollRange versuchen.

Alex_ITA01 4. Nov 2022 08:34

AW: TScrollBox, VerticalScrollbar, Range
 
Weder noch, der Text wird direkt ins Panel geschrieben, dass brauche ich auch zwingend, da es ein spezielles Panel ist und ich bestimmte Eigenschaften davon brauche, die das normale Panel nicht bietet.

BerndS 4. Nov 2022 08:56

AW: TScrollBox, VerticalScrollbar, Range
 
Wenn dein Panel ein Canvas hat, was bei einem normalen Panel protected ist, könntest du es so machen:
Beispiel für normales TPanel
Delphi-Quellcode:
 
type
  THackPanel = class(TPanel);

function PanelTextHeight(APanel: TPanel; AText: string): Integer;
var
  R: TRect;
begin
  R.Create(0,0,0,0);
  THackPanel(APanel).Canvas.TextRect(R, AText, [tfCalcRect]);
  Result := R.Height;
end;

Alex_ITA01 4. Nov 2022 09:29

AW: TScrollBox, VerticalScrollbar, Range
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe ich versucht, sieht aber meiner Meinung nach falsch aus.
Als Result wird mir 13 geliefert (=Bottom). Right sieht entsprechend lang aus aber auch keine 25k Pixel...

Edit:

Als String habe ich mal testweise folgendes übergeben:
Delphi-Quellcode:
'Hallo Welt #13#10 Hallo Welt #13#10 Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt'

TMyPanel(aPanel).Canvas.TextRect(R, aText, [tfCalcRect]);
Result := R.Height;

Result := TMyPanel(aPanel).Canvas.TextHeight(aText);

Result := TMyPanel(aPanel).Canvas.TextExtent(aText).Height;
Alle 3 Results liefern 13.
Sieht man aber sofort, dass es nicht nur 13 Pixel sein können

BerndS 4. Nov 2022 09:42

AW: TScrollBox, VerticalScrollbar, Range
 
Die Frage ist, was steht im Text?
Wird der Text vom Panel automaisch auf mehrere Zeilen umgebrochen obwohl dort kein #13#10 enthalten ist?

Alex_ITA01 4. Nov 2022 10:02

AW: TScrollBox, VerticalScrollbar, Range
 
Also in der Eigenschaft Text steht entsprechend der lange Text.
Das Panel macht anhand bestimmter Sonderzeichen in dem Text automatisch ein Zeilenumbruch.
Deswegen wollte ich ja gerne die tatsächliche Höhe des Textes ermitteln.
Am Ende steht alles untereinander weil #13#10 ein "Enter" einfügt.

itblumi 4. Nov 2022 10:06

AW: TScrollBox, VerticalScrollbar, Range
 
Zitat:

Zitat von Alex_ITA01 (Beitrag 1514292)
Habe ich versucht, sieht aber meiner Meinung nach falsch aus.
Als Result wird mir 13 geliefert (=Bottom). Right sieht entsprechend lang aus aber auch keine 25k Pixel...

Edit:

Als String habe ich mal testweise folgendes übergeben:
Delphi-Quellcode:
'Hallo Welt #13#10 Hallo Welt #13#10 Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 #13#10 Hallo Welt Hallo Welt Hallo Welt #13#10 Hallo Welt Hallo Welt'

TMyPanel(aPanel).Canvas.TextRect(R, aText, [tfCalcRect]);
Result := R.Height;

Result := TMyPanel(aPanel).Canvas.TextHeight(aText);

Result := TMyPanel(aPanel).Canvas.TextExtent(aText).Height;
Alle 3 Results liefern 13.
Sieht man aber sofort, dass es nicht nur 13 Pixel sein können

Um die Zeilenumbrüche musst du dich selbst kümmern, das TCanvas macht dies nicht automatisch für dich.
Das könnte dir dabei helfen: https://shrimpworks.za.net/2006/05/2...-on-a-tcanvas/

Edit: ok hatte nicht gedacht das es dies macht. Mein Fehler.

itblumi 4. Nov 2022 10:11

AW: TScrollBox, VerticalScrollbar, Range
 
Das TCanvas besitzt eine Funktion TextHeight so kannst du die tatsächliche höhe des Textes ermitteln.

BerndS 4. Nov 2022 10:21

AW: TScrollBox, VerticalScrollbar, Range
 
Zitat:

Das TCanvas besitzt eine Funktion TextHeight so kannst du die tatsächliche höhe des Textes ermitteln.
Leider ignoriert diese Funktion #13#10 und gibt nur die Höher einer Zeile zurück. Hat man mehrer Zeilen muss man dann noch das Result damit multiplizieren.
Ich würde mir mal bei diesem für uns unbekannten Panel die Methode anschauen, die den Text ausgibt (sofern die Quellen vorhanden sind) oder mal in die Quellen von TCustomLabel reinschauen.
TCustomLabel kann Wordwrap und Autosize.


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