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 Feststellen, ob ein Control sichtbar... (https://www.delphipraxis.net/87536-feststellen-ob-ein-control-sichtbar.html)

hermannhass 1. Mär 2007 22:43


Feststellen, ob ein Control sichtbar...
 
Hallo
ich benutze Delphi 7 und möchte gerne feststellen, ob eine Komponente(twincontrol) zur zeit sichtbar ist oder nicht. Oder halt die zustandsänderung abfangen.
Zum beispiel ob es auf einem anderen tabcontrol ist.
Visible (cm_visiblechanged)geht nicht, da es auch true ist, wenn eine anderer tabsheet aktiv ist.
Grund: habe rechenintensive processe, dir nicht "laufen" müssen, wenn das element nicht sichtbar ist. z.B. eine animiertes gif oder eine Movie....

Hawkeye219 1. Mär 2007 23:04

Re: Feststellen, ob ein Control sichtbar...
 
Hallo,

für TWinControls könnte das funktionieren:

Delphi-Quellcode:
function IsVisible (aControl: TWinControl): Boolean;
begin
  Result := (FindVCLWindow(aControl.ClientOrigin) = aControl);
end;
Gruß Hawkeye

hermannhass 1. Mär 2007 23:45

Re: Feststellen, ob ein Control sichtbar...
 
Danke, mit nem twincontrol klappt es, mit meinem abgewandelten TGraphicControl natürlich nicht.
Wäre kein beinbruch, kann ich simulieren....
Aber kann ich die Zustandänderung irgendwie abfangen.
also wenn von sichtbar auf unsichbar, dann "stoppe" eine Process sonst umgekehrt.
irgendeine Message, die aich abfangen kann und dann teste
beim sichtbarwerden das WM_Paint,aber beim "verschwinden"....

efknarf 2. Mär 2007 01:19

Re: Feststellen, ob ein Control sichtbar...
 
Die Message, die du abfangen müsstest ist
CM_VisibleChanged.

Diese Message sendet das Control an sich selbst, wenn das Flag geändert wird. Desweiteren stellt jedes Control eine eigene dynamische Methode bereit, welche aufgerufen wird, wenn das Flag geändert wird.
Diese Methode heißt wohl

procedure VisibleChanging; dynamic

und macht bei TControl nichts.

Leite also von deinen gewünschten Komponenten, welche Nachfahren von TControl sind, neue Komponenten ab und fange die Message ab oder überschreibe ganz einfach die Methode. Den Rest findest du selbst heraus.

Ansonsten solltest du mit dem Umschalten deines Sheets eine eigene Message senden, welche die bestimmten Actionen Ein- bzw. ausschaltet.

Gruß Frank

hermannhass 2. Mär 2007 02:02

Re: Feststellen, ob ein Control sichtbar...
 
Das VisibleChanging brint mich nicht weiter, weder bei einem Twincontrol(z.B. ein TEdit) noch bei meinem Tgraphiccontrol( ein Timage).
VisibleChanging kommt beim ändern der Visible eigenschaft. und die ändert sich nicht, wenn z.B. ein anderes tabcontrol aufgerufen wird und das "Control" quasi verschwindet....
Das "wiedererscheinen" kann ich mit dem wm_paint abfangen, nur das verschwinden nicht.

efknarf 2. Mär 2007 03:30

Re: Feststellen, ob ein Control sichtbar...
 
Vielleicht hilft dir die Message

CM_ShowingChanged

weiter?

Weiß jetzt aber nicht sicher, ob diese Message auch an TGraphicControl gesendet wird. Glaube aber eher nicht.
Dort kannst du dann das Flag Showing abfragen, welches aber nur ab TWinControl verfügbar ist.

hermannhass 2. Mär 2007 03:57

Re: Feststellen, ob ein Control sichtbar...
 
Danke für Eure Hilfe...
CM_ShowingChanged wird auch nur beim ersten Show aufgerufen.
kann das fenster oder den Tab verstecken und wiederaufrufen, nix tut sich.
dann muss ich mich über die Parents "hochhangeln" und prüfen, ob diese sichtbar sind.
mühsam und viele sonderfälle, aber hilft nix.

efknarf 2. Mär 2007 11:46

Re: Feststellen, ob ein Control sichtbar...
 
Hallo,

nicht gleich die Flinte ins Korn werfen. Also: Wenn du wirklich ein TTabControl verwendest, dann mußt du, wenn die Komponenten verschwinden sollen, die Eigenschaft Visible der Komponenten verwenden. Und dann verstehe ich dein Problem nicht.
Anders sieht das aus bei einem TPageControl. Wenn du dieses verwendest, dann verstehe ich dein Problem, daß du da mit Messages nicht weiter kommst. Doch dafür gibt es beim TPageControl den Event 'OnChange'. Damit lassen sich bei Seitenwechsel, welcher durch einen Klick auf das Tab ausgelöst wurde, diverse Programme aus- bzw. einschalten, was einer ereignisgesteuerten Anwendung schon sehr nahekommt.
Auch kannst du, um feststellen zu können, welche Page Eigentümer deiner Komponente ist, die Eigenschaft Tag der Komponenten verwenden. Dann brauchst du dich nicht durch die Parents zu hangeln, sondern hast direkten Zugriff auf die Page. Doch diesen Tag-Wert mußt du manuell im Constructor oder wo auch immer setzen.


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