![]() |
Notification, falls Komponente nicht mehr sichtbar
Hallo zusammen,
Ich habe eine Checkbox in einer GroupBox und habe folgendes Problem. Setze ich nur GroupBox.Visible := false, dann wird die gesamte GroupBox ausgeblendet, die Properties Checkbox.Visible und Checkbox.Showing bleiben weiterhin auf TRUE. Das verstehe ich nun nicht. In der Checkbox-Klasse brauche ich eine Benachrichtigung, wenn diese nicht mehr sichtbar ist, d.h. auch wenn der Parent / einer der Parents ausgeblendet wird. Geht das überhaupt irgendwie? In der Checkbox-Komponente habe ich bereits die Messages CM_VISIBLECHANGED und CM_SHOWINGCHANGED ausprobiert, sie kommen aber nicht, wenn direkt die GroupBox.Visible verändert wird. |
AW: Notification, falls Komponente nicht mehr sichtbar
Zitat:
Delphi-Quellcode:
Aber welches Sinn hat das? Wenn die Groupbox nicht visible ist, werden die darin enthaltenen Controls auch nicht dargestellt, egal welchen Visible-State sie haben.
var
i: Integer; begin for i:=0 to grpTermindaten.ControlCount-1 do if grpTermindaten.Controls[i] is TCheckBox then TCheckBox (grpTermindaten.Controls[i]).Visible:=grpTermindaten.Visible; end; |
AW: Notification, falls Komponente nicht mehr sichtbar
Ich will nicht die TPanel/TGroupBox-Klasse erweitern und alle Instanzen davon in allen Fenster ersetzen, ist viel zu viel Aufwand.
Ich will auch nicht, dass wenn Panel.Visible bzw. GroupBox.Visible auf false gesetzt wird, dass auch CheckBox.Visible auf false gesetzt wird (das wäre ja falsch). Ich brauche die Information, ob die Komponente aktuell sichtbar ist / angezeigt wird. Bei GroupBox.Visible = false sollte wenigstens die Property Checkbox.Showing auf false gehen, da die Checkbox gerade nicht angezeigt wird. Ich brauche eine Rückmeldung (Event, Message, Callback, was auch immer) innerhalb meiner Checkbox-Klasse, wenn Parent.Visible = false gesetzt wird, um weitere Hintergrundsaktionen zu sperren bzw. zu aktivieren. Es ist nicht in Ordnung, dass Checkbox.Showing = true, wenn Parent.Visible = false, das macht keinen Sinn. Die Property Showing bildet aber nicht den tatsächlichen Zustand der Sichtbarkeit der untergeordneten Komponente ab, Auszug aus der Delphi-Hilfe: Zitat:
Ich habe schon eine Funktion, die die Parents durchgeht und darüber entscheidet, ob die Checkbox (oder eine andere Komponente in einem Panel/einer GroupBox) tatsächlich sichtbar ist oder nicht. Was aber fehlt ist, die Benachrichtigung seitens des Parents. Ich habe diverse abgeleiteten Klassen von TEdit, TCheckBox, TComboBox, etc. Diese werden je nach Anwendungsfall auf ein Panel / eine GroupBox platziert. Je nach Fenster können diese wiederum in weiteren übergeordneten Panels/GroupBoxen/PageControl platziert sein. Wenn eine dieser Hauptkomponenten ausgeblendet wird, möchte ich bei meiner Komponente (Edit, CheckBox, GroupBox) das schon mitbekommen, um weitere Hintergrundsprozesse zu deaktivieren, die sonst meine Komponente auslöst. |
AW: Notification, falls Komponente nicht mehr sichtbar
Hallo hellion,
vielleicht hilft Dir folgende Funktion etwas weiter:
Delphi-Quellcode:
Wenn CheckBox1.Visible True und die GroupBox1.Visible False ist, und somit Beides unsichtbar,
var
cbxBool: Boolean; ... begin cbxBool:=IsWindowVisible(CheckBox1.Handle); ... end; dann gibt IsWindowVisible False zurück. |
AW: Notification, falls Komponente nicht mehr sichtbar
Hallo ghubi01,
Ja, das kann ich schon so machen, aber halt nur von extern. Also kann ich es z.B. in der TForm-Instanz machen. Was ich aber brauche, ist ein Event innerhalb meiner TComboBox-Klasse "Parent.Visible wurde geändert" (PARENTVISIBLECHANGED), quasi eine analoge Message zu z.B. CM_PARENTFONTCHANGED oder CM_PARENTCOLORCHANGED. |
AW: Notification, falls Komponente nicht mehr sichtbar
Hallo hellion,
ich hab hier ![]() Mit den gezeigten Beispielen könnte man auf Änderungen von Visible der GroupBox reagieren und ggf. ein Property in der untergeordneten Checkbox einfügen und setzen. |
AW: Notification, falls Komponente nicht mehr sichtbar
Hallo hellion,
hier hätte ich noch eine Idee:
Delphi-Quellcode:
const
MY_MSG = WM_USER + 1; type TCheckBox = class(Vcl.StdCtrls.TCheckBox) private FParantVisible: Boolean; protected procedure ParentMsg(var Msg: TMessage); Message MY_MSG; public property ParantVisible: Boolean read FParantVisible; end; TComboBox = class(Vcl.StdCtrls.TComboBox) private FParantVisible: Boolean; protected procedure ParentMsg(var Msg: TMessage); Message MY_MSG; public property ParantVisible: Boolean read FParantVisible; end; ... procedure TCheckBox.ParentMsg(var Msg: TMessage); begin FParantVisible:=Boolean(Msg.WParam); end; procedure TComboBox.ParentMsg(var Msg: TMessage); begin FParantVisible:=Boolean(Msg.WParam); end; ... procedure TForm2.TestClick(Sender: TObject); var MyMsg: TMessage; begin //Nach jedem Visible-Wechsel eine Botschaft an Alle senden GroupBox1.Visible:=not GroupBox1.Visible; MyMsg.Msg:=MY_MSG; MyMsg.WParam:=integer(GroupBox1.Visible); MyMsg.LParam:=0; MyMsg.Result:=0; GroupBox1.Broadcast(MyMsg); // Die Message geht an alle Controls der GroupBox1 end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:40 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 by Thomas Breitkreuz