Hi Leute,
habe jetzt eine Lösung gefunden. Ich denke, die ist auch recht elegant.
Erstens: eigene Botschaft erstellen:
const wm_Deselect = wm_User + 1;
Zweitens: Botschaftsbehandhandlung implementieren
Delphi-Quellcode:
TBaseCustomControl = class(TCustomControl)
private
procedure WMDESELECT(var AMsg: TMessage); message WM_DESELECT;
....
// setzt eigene Eigenschaft und zeichnet deselektiertes Control
procedure TBaseCustomControl.WMDESELECT(var AMsg: TMessage);
begin
if Pointer(AMsg.LParam) <> self then
self.Selected := False;
end;
Drittens: aufrufen des Ereignisses für Container und alles entaltenen Controls
Delphi-Quellcode:
procedure TBaseCustomControl.MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer);
begin
if not FSelected then begin
self.SetFocus;
Selected := True;
// wenn Shift-Tase nicht gedrückt ist, dann alle anderen Controls deselectieren
if not (ssShift in Shift) then
DeselectControls;
end;
inherited;
end;
procedure TBaseCustomControl.DeselectControls;
var
Msg: TMessage;
begin
Msg.Msg := wm_Deselect;
Msg.LParam := Longint(self);
Msg.WParam := 0;
Msg.Result := 0;
// Container deselekteieren wenn selektiert
Parent.Broadcast(Msg);
// alle anderen Controls deselektieren
Parent.Perform(wm_Deselect, Msg.LParam, Msg.WParam);
end;
Jo, das klappt bei mir super.
Gruß oki