![]() |
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: ![]() |
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. |
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:
Vielen Dank 👍
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; |
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; |
AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
Zitat:
|
AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
Ginge nicht auch
Delphi-Quellcode:
Ok, geht nicht, wenn boolsche Ausdrücke vollständig ausgewertet werden ;-)
function TControlHelper.isClipped(): Boolean;
begin Result := Assigned(Parent) and Parent.ClientRect.Contains(BoundsRect); end; |
AW: Wie stelle ich fest ob ein Control nur halb sichtbar ist?
Zitat:
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:
versus
VARIABLE and/or FUNKTION
Delphi-Quellcode:
FUNKTION and/or VARIABLE
|
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 02:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz