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 Selektives csAcceptControls möglich? (https://www.delphipraxis.net/183689-selektives-csacceptcontrols-moeglich.html)

Whookie 28. Jan 2015 16:59

Selektives csAcceptControls möglich?
 
Ich glaube, ich stehe mal wieder auf der Leitung aber irgendwie finde ich keine Lösung für mein Problem:

Ich habe einen TPanel-Nachfolger (TMyPanel) das soll nur ein paar Componenten als Child akzeptieren (TLabel, TCheckBox und ein paar kleinere grafische Komponenten von mir).

Es sollte nicht möglich sein andere Komponenten über den Designer hinzuzufügen und auch wenn man programmatisch TMemo.Parent := MyPanel zu setzen versucht sollte eine Exception mit entsprechendem Hinweis ausgegeben werden...?!

Whookie 29. Jan 2015 10:47

AW: Selektives csAcceptControls möglich?
 
Einen Teilerfolg gibt es zumindestens, in der Form der CM_CONTROLLISTCHANGING Message

Delphi-Quellcode:
procedure TMyPanel.CMControlListChanging(var Message: TCMControlListChanging);
begin
  if Message.ControlListItem^.Control.ClassName = 'TShape' then
  begin
    Message.ControlListItem^.Parent := NIL;
    iFrm := GetParentForm(Self);
    Message.ControlListItem^.Control.Parent := iFrm;
  end;
end;
Damit kann kein TShape mehr hinzugefügt werden, er landet vorerst in der Form (oder hat keinen Parent). Das Problem hier ist, das ich bisher keine Möglichkeit gefunden habe die unerwünschte Componente sauber freizugeben (ein Message.ControlListItem^.Control.Free führt in späterer Folge zu einer Exception)

Whookie 30. Jan 2015 12:04

AW: Selektives csAcceptControls möglich?
 
Die endgültige Version verhindert nun auch das erzeugen der Komponente und sieht wie folgt aus:

Delphi-Quellcode:
procedure TMyPanel.CMControlListChanging(var Message: TCMControlListChanging);
begin
  if Message.ControlListItem^.Control.ClassName = 'TShape' then
  begin
    Message.ControlListItem^.Parent := NIL;
    raise EInvalidOperation.Create(SInvalidChild);
  end;
end;

DeddyH 30. Jan 2015 12:18

AW: Selektives csAcceptControls möglich?
 
Ich würde aber nicht über den Klassennamen gehen, sonst werden abgeleitete Klassen doch wieder akzeptiert.
Delphi-Quellcode:
//if Message.ControlListItem^.Control.ClassName = 'TShape' then
if Message.ControlListItem^.Control is TShape then

BadenPower 30. Jan 2015 15:56

AW: Selektives csAcceptControls möglich?
 
Ich würde allerdings in der If-Abfrage die Komponenten abfragen, welche erlaubt werden und im Else-Teil alles andere ablehnen, da (siehe Post #1) das Panel ja nur bestimmte Komponenten akzeptieren soll.


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