AGB  ·  Datenschutz  ·  Impressum  







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

erkennen wenn anderes Control ausgewält wird

Ein Thema von oki · begonnen am 16. Aug 2007 · letzter Beitrag vom 18. Feb 2008
Antwort Antwort
oki

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

erkennen wenn anderes Control ausgewält wird

  Alt 16. Aug 2007, 16:40
Hi,

ich möchte in einem Control erkennen, wenn der Focus auf ein anderes Control wechselt. Dazu benutze ich die vererbten Methoden DoEnter und DoExit. Funzt auch super. Nun ist es aber so, dass eins meiner Controls (Panel) den Container für andere Controls darstellt. Der Focus wechselt aber nur, wenn ein Control in einem anderen Container den Focus enthält. Clicke ich auf meinen Container, so verliert das darin enthaltene Element jedoch nicht den Focus; zumindest wird nicht OnExit (DoExit) aufgerufen. Da ich dies aber zum selektieren meiner Controls benutze, hab ich hier ein Problem.

Bei meinem Beispiel im anhang soll also folgendes passieren:
- Klicke ich mein Panel an, so soll das Panel selectiert sein und das Label nicht.
- Klicke ich mein Label an, so soll mein Label selektiert sein und mein Panel nicht.

Im MouseDown meiner Controls wird self.SetFocus aufgerufen.

Das ganze klappt nur, wenn ich z.B. zwichen zwei Panels hin und her clicke (steht so auch korrekt in der Hilfe). Also es macht schon das richtige. Das ist aber nicht das was ich will.

Kennt hier jemand eine andere Lösung?
Miniaturansicht angehängter Grafiken
container_131.png  
42
  Mit Zitat antworten Zitat
FritzAT
(Gast)

n/a Beiträge
 
#2

Re: erkennen wenn anderes Control ausgewält wird

  Alt 26. Aug 2007, 20:04
Hallo!

Habe da etwas in meinen fundus gefunden(woher? - keine ahnung).

{ (Beispiel) Hier die allgemein gültige Procedure für OnMouseUp.
Die Behandlung von OnClick bleibt dabei erhalten:
die Funktionalität aus OnMouseUp kommt dazu. }

Delphi-Quellcode:
procedure TForm1.GenericMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  TWC: TWinControl;
begin
  TWC := FindControlAtPos;
  //what for a class !
  Showmessage('Here we are: ' + TWC.ClassName);
  //Let it blink...
  TWC.Visible := False;
  Sleep(150);
  TWC.Visible := True;
end;
Denke mit diesen code kannst du weitermachen...
  Mit Zitat antworten Zitat
oki

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

Re: erkennen wenn anderes Control ausgewält wird

  Alt 26. Aug 2007, 20:57
Hi FritzAT,

erstmal Dank für die Antwort.
Leider ist es nun so, dass das nicht mein Problem ist. Meine Controls implementieren die Procedure MouseDown. Somit kann ich die Auswahl meines Controls problemlos erkennen.
Die Frage ist, wie kann ich alle anderen Controls davon benachrichtigen, dass sie deselektiert sind?

Gruß Oki
42
  Mit Zitat antworten Zitat
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, 09: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
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 07:34 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