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 Abfrage, ob ein Control "on top" ist? (https://www.delphipraxis.net/125954-abfrage-ob-ein-control-top-ist.html)

Luuuz 15. Dez 2008 16:41


Abfrage, ob ein Control "on top" ist?
 
Hallo!

Ich schreibe in Delphi7 eine Anwendung mit dynamisch generiertem GUI. Beim Synchronisieren dauert es leider recht lange, da ich sehr viele Controls geschachtelt(also auf TabSheets, Tabellen, usw) anlege.

Gibt es eine Möglichkeit zu überprüfen, ob ein Control gerade "on top" ist? Ich meine ob es für den User gerade sichtbar ist oder ob es sich auf einem TabSheet befindet, das gerade nicht angezeigt wird.

Ich bin für alle Tips dankbar!

Gruß
Tobias

oki 15. Dez 2008 16:48

Re: Abfrage, ob ein Control "on top" ist?
 
Focus

Gruß oki

himitsu 15. Dez 2008 17:16

Re: Abfrage, ob ein Control "on top" ist?
 
Focus zeigt nur an, daß ein Control den Eingabefokus (Tastatur) hat ... aber dafür muß es nicht sichtbar (ich mein nicht Visible) sein ... es kann sich auch ruhig hinter einem anderem Control verstecken.

Abfrage ob Sichtbar aka nicht verdeckt wird bei vielen auch wieder schwer ... vorallem wenn andere Controls es nur Teilweise verdecken.

Aber Ob es sich auf einem TagSheet oder Panel oder wo auch immer befindet, welches grad ausgeblendet (inaktiv ist), dürft recht einfach sein.

toms 15. Dez 2008 17:38

Re: Abfrage, ob ein Control "on top" ist?
 
Hallo

Es gab hier mal ähnliche Beiträge:

Feststellen, ob ein Control sichtbar... oder per GetClipbox

oki 15. Dez 2008 17:40

Re: Abfrage, ob ein Control "on top" ist?
 
Zitat:

Zitat von himitsu
Focus zeigt nur an, daß ein Control den Eingabefokus (Tastatur) hat ... aber dafür muß es nicht sichtbar (ich mein nicht Visible) sein ... es kann sich auch ruhig hinter einem anderem Control verstecken.

Upps und sorry für die unqualifizierte Antwort.

An der Stelle bin ich mir jetzt nicht ganz sicher, aber imho kannst du erst einmal auf Visible prüfen. Ich glaube, dass die Controls der nicht sichtbaren Seiten automatisch auf Visible False gesetzt werden.

Sonst kannst du prüfen, ob der Parent, der ja ein TabSheet ist gerade das aktive TabSheet ist. Wenn nicht ist alles klar. Wenn ja, dann wirds schon schwieriger. Ich denke, du kannst erstmal an hand der Position (Index) des Controls prüfen, an welcher Stelle der Conrols-Liste des Parent dein Control steht. Ich glaube, dass mit dem höchsten Index wird als letztes gezeichnet und liegt somit oben. Hast du den Index, dann mußt du prüfen, ob alle Controls mit einem höheren Index in der Liste dein Control überdecken. Das kannst du ganz einfach mit Funktion IntersectRect tun. Liegt eine Überschneidung der Rects der Conrols vor, so liefert die Funktion True zurück. Also prüfst du sozusagen, ob alle "höherwertigen" Controls in der Liste eine Überschneidung mit deinem Control-Rect haben. Ist dies der Fall, so ist dein Control ganz oder Teilweise verdeckt. Willst du den Fall der teilweisen Überdeckung mit auswerten, so musst du den Rückgabewert des resultierenden Rect aus der Funktion IntersectRect entsprechend verarbeiten und bewerten.

Ob das die sinnvollste Methode ist dein Problem zu lösen kann ich nicht sagen, aber besser wie meine erste Antwort ist es auf jeden Fall.

Gruß oki

himitsu 15. Dez 2008 17:41

Re: Abfrage, ob ein Control "on top" ist?
 
'ne einfache Version nur auf Visible und Co. beruhend ...
Delphi-Quellcode:
Function isVisibled(C: TControl): Boolean;
  Begin
    Repeat
      Result := C.Visible
        and (not (C is TTabSheet) or (TTabSheet(C).PageControl.ActivePage <> C));
        // and (not (C is Txyz) or not Txyz(C).{visibled})
      C := C.Parent;
    Until not Assigned(C) or not Result;
  End;

toms 15. Dez 2008 17:45

Re: Abfrage, ob ein Control "on top" ist?
 
Zitat:

Zitat von oki
Ich glaube, dass die Controls der nicht sichtbaren Seiten automatisch auf Visible False gesetzt werden.

Ist nicht der Fall. Visible bleibt True.

himitsu 15. Dez 2008 17:52

Re: Abfrage, ob ein Control "on top" ist?
 
Zitat:

Zitat von toms
Zitat:

Zitat von oki
Ich glaube, dass die Controls der nicht sichtbaren Seiten automatisch auf Visible False gesetzt werden.

Ist nicht der Fall. Visible bleibt True.

wäre ja och blöd ... stell dir mal vor die Übergeordnete Komponente überschreibt einfach Visible mit Valse, nur weil es diese Komponente grad nicht anzeigt ... was soll denn passieren wenn sie diese Komponente mal wieder anzeigen könnte ... soll es dann infach Visible auf True setzen?
(nur blöd, wenn der Programmierer selber die Komponente auf False gesetzt hate, weil er sie nicht anzeigen wollte und urplötzlich isse doch sichtbar, nur weil da irgendwas drin rumschrieb)

oki 15. Dez 2008 17:56

Re: Abfrage, ob ein Control "on top" ist?
 
Zitat:

Zitat von toms
Zitat:

Zitat von oki
Ich glaube, dass die Controls der nicht sichtbaren Seiten automatisch auf Visible False gesetzt werden.

Ist nicht der Fall. Visible bleibt True.

Ist heut nicht mein Tag. :wall:

Bin auch nur am rumspringen. Hausaufgaben der Kinder kontrollieren, Große zum Volleyball fahren ...
Ich hoffe ihr verzeiht mir. Der Rest sollte aber stimmen.

Guß oki

@himitsu: jaja, du mußt es ja nun nicht auch noch ausschlachten :roll: Gruß

Luuuz 16. Dez 2008 15:31

Re: Abfrage, ob ein Control "on top" ist?
 
Vielen Dank für eure Antworten!
Das geht ja alles sehr fix.

Ich durfte feststellen, dass ein Attribut von TWinControl mein Problem löst.

Delphi-Quellcode:
TWinControl(Obj).Showing
Zitat:

Die Eigenschaft Showing gibt an, ob das Steuerelement auf dem Bildschirm angezeigt wird.
Vielen Dank nochmal!


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