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 Wie stelle ich fest ob ein Control nur halb sichtbar ist? (https://www.delphipraxis.net/208303-wie-stelle-ich-fest-ob-ein-control-nur-halb-sichtbar-ist.html)

Der schöne Günther 12. Jul 2021 14:30

Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe ein TFlowPanel mit einer dynamischen Anzahl an Buttons drin. Wenn das FlowPanel zu klein wird reicht der Platz nicht mehr und dann sind z.B. die Buttons in der untersten Zeile nur halb drauf und unten abgeschnitten.

Ich stehe auf dem Schlauch, wie kann ich eigentlich herausbekommen, ob ein Button nur noch halb sichtbar ist?

PS: Die Frage wurde vor ein paar Jahren schon einmal gestellt, allerdings auch ohne Antwort:
https://www.delphipraxis.net/192365-...-autosize.html

Delphi.Narium 12. Jul 2021 14:48

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Du weißt wo der Button beginnt: Button.Top
Du weißt wie hoch der Button ist: Button.Height.
Du weißt wie hoch sein Parent ist: Button.Parent.Height.

Ist nun Button.Top + Button.Height > Button.Parent.Height, so ist der Button nicht vollständig sichtbar.

Bei der Breite geht's analog:

Sind Button.Left + Button.Width > Button.Parent.Width, dann ist der Button nicht vollständig sichtbar.

Zumindest mit diversen TImageEn auf 'ner TScrollBox funktioniert diese Logik.

Der schöne Günther 12. Jul 2021 16:33

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Natürlich! Ich dachte schon an Umrechnen in Bildschirmkoordinaten und dann die Parents abwandern wie da die Schnittmengen sind, aber natürlich, es geht ganz einfach:

Delphi-Quellcode:
function TControlHelper.isClipped(): Boolean;
begin
   if(not Assigned(parent)) then
      Exit(False);

   Result :=
      (Top < 0)
      or
      ((Top + Height) > parent.ClientHeight)
      or
      (Left < 0)
      or
      ((Left + Width) > parent.ClientWidth);
end;
Vielen Dank 👍

Uwe Raabe 12. Jul 2021 18:10

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Geht auch etwas stylischer :) :
Delphi-Quellcode:
function TControlHelper.isClipped(): Boolean;
begin
   if(not Assigned(parent)) then
      Exit(False);
   Result := not Parent.ClientRect.Contains(BoundsRect);
end;

venice2 12. Jul 2021 18:35

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1492232)
Geht auch etwas stylischer :) :
Delphi-Quellcode:
function TControlHelper.isClipped(): Boolean;
begin
   if(not Assigned(parent)) then
      Exit(False);
   Result := not Parent.ClientRect.Contains(BoundsRect);
end;

:thumb:

Delphi.Narium 12. Jul 2021 20:04

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Ginge nicht auch
Delphi-Quellcode:
function TControlHelper.isClipped(): Boolean;
begin
  Result := Assigned(Parent) and Parent.ClientRect.Contains(BoundsRect);
end;
Ok, geht nicht, wenn boolsche Ausdrücke vollständig ausgewertet werden ;-)

himitsu 12. Jul 2021 21:39

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1492235)
Ok, geht nicht, wenn boolsche Ausdrücke vollständig ausgewertet werden ;-)

Wer sowas macht, muß eben mit den Konsequenzen leben.


Also WENN überhaupt, dann sollte man Dieses eh nur begrenzt einsetzen.

Aber stattdessen kann man oft auch einfach mit der Reihenfolge spielen, um sowas zu beeinflussen.
Delphi-Quellcode:
VARIABLE and/or FUNKTION
versus
Delphi-Quellcode:
FUNKTION and/or VARIABLE

Delphi.Narium 12. Jul 2021 21:54

AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
 
Na klar, dashier wäre dann eher suboptimal ;-)
Delphi-Quellcode:
Result := Parent.ClientRect.Contains(BoundsRect) and Assigned(Parent);


Oder etwas flacher formuliert:

Wenn rechts was steht, was scheitern kann, dann muss links davon was stehen, dass sicherstellt, dass das zum Scheitern verurteilte nie erreicht wird.

Oder aber auch: Assigned steht zuerst, wenn das ok ist, kann man rechts davon problemlos auf das per Assigned geprüfte zugreifen. Scheitert Assigned, kommt man dort erst garnicht an.


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