AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Notification, falls Komponente nicht mehr sichtbar

Ein Thema von hellion · begonnen am 16. Okt 2018 · letzter Beitrag vom 16. Okt 2018
Antwort Antwort
hellion

Registriert seit: 10. Jun 2010
4 Beiträge
 
#1

Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 11:22
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.
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#2

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 13:49
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.
Logisch. Du setzt ja auch nicht die Checkboxen auf Visible:=False, sondern nur die Groupbox. Das die darin enthaltene Controls ebenfalls Visible=False werden, dafür musst du schon selber sorgen.

Delphi-Quellcode:
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;
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.

Geändert von Hobbycoder (16. Okt 2018 um 13:51 Uhr)
  Mit Zitat antworten Zitat
hellion

Registriert seit: 10. Jun 2010
4 Beiträge
 
#3

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 14:41
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:
Haben die Visible-Eigenschaften einer Komponente und aller übergeordneten Komponenten in der Hierarchie übergeordneter Komponenten den Wert true, hat auch Showing den Wert true. Wenn eine der übergeordneten Komponenten, die das Steuerelement enthalten, den Wert false in der Eigenschaft Visible aufweist, kann Showing true oder false sein.

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.

Geändert von hellion (16. Okt 2018 um 14:44 Uhr)
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
129 Beiträge
 
Delphi 12 Athens
 
#4

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 15:29
Hallo hellion,

vielleicht hilft Dir folgende Funktion etwas weiter:
Delphi-Quellcode:
var
  cbxBool: Boolean;
  ...
  begin
    cbxBool:=IsWindowVisible(CheckBox1.Handle);
  ...
  end;
Wenn CheckBox1.Visible True und die GroupBox1.Visible False ist, und somit Beides unsichtbar,
dann gibt IsWindowVisible False zurück.
  Mit Zitat antworten Zitat
hellion

Registriert seit: 10. Jun 2010
4 Beiträge
 
#5

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 15:42
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.
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
129 Beiträge
 
Delphi 12 Athens
 
#6

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 16:01
Hallo hellion,

ich hab hierhttps://www.delphipraxis.net/96445-a...reagieren.html im Forum noch etwas gefunden das Dir weiterhelfen könnte.

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.
  Mit Zitat antworten Zitat
ghubi01

Registriert seit: 18. Nov 2017
129 Beiträge
 
Delphi 12 Athens
 
#7

AW: Notification, falls Komponente nicht mehr sichtbar

  Alt 16. Okt 2018, 21:59
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;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 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