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 OnClick abfangen (https://www.delphipraxis.net/90198-onclick-abfangen.html)

Quake 13. Apr 2007 10:55


OnClick abfangen
 
Hallo,

In einem Form gibt es ja die Möglichkeit, mit KeyPreview einen Tastendruck zuerst im Form auszuwerten und danach erst im Steuerelement. Gibt es sowas auch für einen Mausklick?
Oder kann ich aus Steuerelementensicht, bei einem Klick darauf das Mausklick-Ereignis abfangen bevor das Steuerelement den Focus erhält.
Ich möchte also, dass das Steuerelemet zwar die Klicks verarbeitet oder dabei nicht den Focus bekommt.

ciao
Martin

uwewo 13. Apr 2007 11:14

Re: OnClick abfangen
 
Hallo Martin,

falls es sich um einen Button handelt, wäre es das einfachste Du verwendest einen SpeedButton, da dieser von Hause aus keinen Focus erhält.

Quake 13. Apr 2007 11:27

Re: OnClick abfangen
 
Nein, leider ist es kein Button, es geht um eine ListBox.

himitsu 13. Apr 2007 11:45

Re: OnClick abfangen
 
Du kannst ja den Focus wieder woanderes hinsetzen, nachdem mit der Maus da reingeklickt wurde.


Delphi-Quellcode:
procedure TForm1.ListBox1MouseUp...;
begin
  Edit.SetFocus;
  // oder Form1.ActiveControl := Edit1;
  // oder ...
end;

uwewo 13. Apr 2007 11:50

Re: OnClick abfangen
 
Vielleicht so

Delphi-Quellcode:
procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 LastFocus := Form1.ActiveControl;
end;

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Form1.ActiveControl := LastFocus;
end;

Quake 13. Apr 2007 12:13

Re: OnClick abfangen
 
Das funktionier bei mir nicht, da im Steuerelement, welches verlassen wurde OnExit ausgelöst wird, und das darf nicht sein. Das OnExit soll nur ausgelöst werden, wenn ich auf irgend ein anderes Steuerelement klicke, aber nicht wenn ich auf die eine ListBox klicke.

Ich glaube manchmal, dass ich zu hohe Ansprüche an die Entwicklungsumgebung bzw. an meine eignenen Programme habe. :lol:

himitsu 13. Apr 2007 12:14

Re: OnClick abfangen
 
dann eher so:
Delphi-Quellcode:
procedure TForm1.ListBox1MouseMove...;
begin
  if ActiveControl <> ListBox1 then
    LastFocus := ActiveControl;
end;
denn bis ListBox1MouseUp aufgerufen wurde, hatte sich vorher mal die Maus über der ListBox befunden/bewegt und LastFocus wäre demnach ListBox1 :stupid:

uwewo 13. Apr 2007 12:28

Re: OnClick abfangen
 
Zitat:

Zitat von himitsu
dann eher so:
Delphi-Quellcode:
procedure TForm1.ListBox1MouseMove...;
begin
  if ActiveControl <> ListBox1 then
    LastFocus := ActiveControl;
end;
denn bis ListBox1MouseUp aufgerufen wurde, hatte sich vorher mal die Maus über der ListBox befunden/bewegt und LastFocus wäre demnach ListBox1 :stupid:

Bin mir jetzt auch nicht sicher, aber wenn MouseMove Eintritt, hat in diesem Moment doch ein anderes Steuerelement den Focus. Dieses wird in LastFocus gespeichert un nach MouseUp wieder übergeben.

Ok, vielleicht ist ja auch falsch.

Quake 13. Apr 2007 12:32

Re: OnClick abfangen
 
Aber wenn ich auf die ListBox klicke, ist das erste was passiert, sie bekommt den Focus und damit wird OnExit meines letzten Steuerelemenmts ausgelöst.

himitsu 13. Apr 2007 13:00

Re: OnClick abfangen
 
MouseMove tritt immer ein, wen die Maus über das Element fährt, egal ob dieses den Fokus hat, oder nicht.



OnExit ist zwar schön, nur kennt nicht alles dieses Ereignis und für jedes Element auf der Form dieses einzurichten könnte auch noch ein bissl viel sein.

Da macht sich etwas, welches nur in der ListBox und/oder Forum ist einfacher.

uwewo 13. Apr 2007 13:04

Re: OnClick abfangen
 
Zitat:

Zitat von Quake
Aber wenn ich auf die ListBox klicke, ist das erste was passiert, sie bekommt den Focus und damit wird OnExit meines letzten Steuerelemenmts ausgelöst.

Stimmt, funktioniert leider nicht, nur wenn Du die Maus beim Klick nicht bewegst,das ist allerdings fast unmöglich.

Das hier funktioniert allerdings doch, Dank himitsu :wink:

Delphi-Quellcode:
var
  Form1: TForm1;
  LastFocus : TWinControl;


implementation

{$R *.DFM}

//------------------------------------------------------------------------------

procedure TForm1.ListBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ActiveControl <> ListBox1 then
  LastFocus := Form1.ActiveControl;
end;

//------------------------------------------------------------------------------

procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 Form1.ActiveControl := LastFocus;
end;

//------------------------------------------------------------------------------

Light 13. Apr 2007 13:08

Re: OnClick abfangen
 
Hi Ihr,

dann Frag doch in deinem OnExit des anderen Steuerelements ab,
ob der Fokus jetzt auf die Listbox gesetzt wurde,
und falls ja setzt du ihn wieder zurück
und falls nein kannst du dein eigentliches OnExit auslösen:

Delphi-Quellcode:
procedure TForm1.OnExit(Sender: TObject);
begin
  if ( Form1.ActiveControl.Name = ListBox1 ) //oder so ähnlich *g*
  then
    begin
      Sender.SetFocus; //oder so ähnlich ^^
    end
  else
    begin
      //Mache was du sonst normalerweise in OnExit gemacht hättest!
    end;
end;

himitsu 13. Apr 2007 13:09

Re: OnClick abfangen
 
:angel:


Zitat:

Zitat von uwewo
Stimmt, funktioniert leider nicht, nur wenn Du die Maus beim Klick nicht bewegst,das ist allerdings fast unmöglich.

Schon allein wenn du die Maus nur über die ListBox bewegst würde OnMouseMove ausgelöst.
und du mußt ja die Maus erstmal über die ListBox schieben, damit du draufklicken dannst.
(es sei denn das Programm startet und die Maus ist schon reinzufällig an der richtigen Stelle)

uwewo 13. Apr 2007 13:18

Re: OnClick abfangen
 
Zitat:

Zitat von himitsu
Schon allein wenn du die Maus nur über die ListBox bewegst würde OnMouseMove ausgelöst.
und du mußt ja die Maus erstmal über die ListBox schieben, damit du draufklicken dannst.
(es sei denn das Programm startet und die Maus ist schon reinzufällig an der richtigen Stelle)

Ich gebe Dir ja Recht und habe es auch ausprobiert, das Problem ist das MouseMove auch beim Klick ausgeführt wird, und deshalb LastFocus = ListBox ist.

Ansonsten wäre es OK. :?

Light 13. Apr 2007 13:59

Re: OnClick abfangen
 
HiIhr,

Funktioniert den meine Überlegung oder hab ich irgendwas übersehen / lesen??

Leuchtende Grüße

Stefan

PS: Der Link ist eigentlich nur der Aurfruf eines Ankers,
aber nur den Akner will er nicht als Link anerkennen.
Vergleiche SELFHTML

himitsu 13. Apr 2007 14:10

Re: OnClick abfangen
 
müßte gehen (denk ich jetzt mal)
aber so geht es dann halt nur dafür, wo du diese Ereignisprozedur angegeen hast (darfst dann also nichts vergessen, da du es ja bei JEDER andendern Komponenten eintragen mußt)
Delphi-Quellcode:
procedure TForm1.IrgendwasOnExit(Sender: TObject);
begin
  if Form1.ActiveControl = ListBox1 then
    begin
      Sender.SetFocus;
    end
  else
    begin
      //Mache was du sonst normalerweise in OnExit gemacht hättest! 
    end;
end;

// ach, ich liebe ja Kurzformen ^^
procedure TForm1.IrgendwasOnExit(Sender: TObject);
begin
  if Form1.ActiveControl <> ListBox1 then begin
    //Mache was du sonst normalerweise in OnExit gemacht hättest! 
  end else Sender.SetFocus;
end;

// oder falls man nichts anderes machen möchte
procedure TForm1.IrgendwasOnExit(Sender: TObject);
begin
  if Form1.ActiveControl = ListBox1 then
    Sender.SetFocus;
end;

[add]
Zitat:

Zitat von Light
PS: Der Link ist eigentlich nur der Aurfruf eines Ankers,
aber nur den Akner will er nicht als Link anerkennen.

[url] prüft vor der Umwandlung auf gültige URLs und anker gehören bei der hier verwendeten Definition halt nicht dazu ;)

aber schau in die Posts (da bei der #Nummer) http://www.delphipraxis.net/template...n_minipost.gif

Quake 16. Apr 2007 09:02

Re: OnClick abfangen
 
Hallo,

ich habe erst jetzt wieder Zeit weiter zu machen :) .

Ja das sieht sehr Erfolgsversprechend aus. Wenn die Behandlung bei allen anderen Steuerelementen gleich ist, kann in allen Steuerelementen die selbe Procedure angegeben werden und muss nicht x-mal geschrieben werden.

Vielen Dank erstmal
ciao
Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz