Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#4

Re: erkennen wenn anderes Control ausgewält wird

  Alt 18. Feb 2008, 08:45
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
42
  Mit Zitat antworten Zitat