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 Doppelklick in Listbox "nachrüsten" (https://www.delphipraxis.net/20421-doppelklick-listbox-nachruesten.html)

Uncle Cracker 17. Apr 2004 17:14


Doppelklick in Listbox "nachrüsten"
 
Ich habe mein Programm komplett mit den Flatstyle-Komponenten geschrieben, ging alles ohne Probleme. Aber jetzt ist mir aufgefallen, dass bei der Listbox der Komponenten die Eigenschaft fehlt "OnDblClick" :? Es fehlen zwar noch ein paar mehr Eigenschaften, aber mir geht es nur um den Doppelklick in der Listbox.

Gibt es vielleicht eine Möglichkeit dies irgendwie "nachzurüsten"?


:love: Danke UC

Nicolai1234 17. Apr 2004 17:19

Re: Doppelklick in Listbox "nachrüsten"
 
Vielleicht kann man bei OnClick zählen wie oft schon geklicktwurde!
Den Zeitpunkt des ersten Klicks speichern und vom Zeitpunkt des zweiten Klicks abziehen. Ist die Differenz <= 00:00:01 dann war es ein Doppelklick!

Christian S. 17. Apr 2004 17:30

Re: Doppelklick in Listbox "nachrüsten"
 
Zitat:

Zitat von Nicolai1605
Vielleicht kann man bei OnClick zählen wie oft schon geklicktwurde!
Den Zeitpunkt des ersten Klicks speichern und vom Zeitpunkt des zweiten Klicks abziehen. Ist die Differenz <= 00:00:01 dann war es ein Doppelklick!

Die Zeit für einen Doppelklick ist in der Systemsteuerung verstellbar, diese Lösung ist also nicht gut.
Was man aber machen könnte, ist, eine eigene Komponente von der bestehenden abzuleiten und in der abgeleieten Komponente ein Ereignis OnDblClick zu erstellen, welches die Nachricht WM_LBUTTONDBLCLK verarbeitet.

Uncle Cracker 17. Apr 2004 22:27

Re: Doppelklick in Listbox "nachrüsten"
 
Ähhhmmm und wie mach ich das? Mit zählen wollte ich das auch machen, doch die Idee gefiel mir dann doch nicht.

Christian S. 18. Apr 2004 11:14

Re: Doppelklick in Listbox "nachrüsten"
 
Hallo!

Ansich ist es ganz einfach, auf solche Windows-Nachrichten zu reagieren. Nehmen wir mal an, die Listbox-Komponente, von der Du ableiten möchtest, heißt "TYourListbox". Dann geht es folgendermaßen:

Delphi-Quellcode:
type TMyListbox = class(TYourListbox)
  private
    FOnDblClick : TNotifyEvent;
    procedure DblClick(var message : TMessage); message WM_LBUTTONDBLCLK;
  public
  published
    property OnDblClick : TNotifyEvent read FOnDblClick write FOnDblClick;
  end;

{...}
implementation
{...}

procedure TMyListbox.DblClick(var message : TMessage);
begin
  inherited;
  {Hier kannst Du noch Standardbehandlungen rein machen, die immer ausgeführt werden,
   unabhängig, welche Aktionen Du dem Ereignis einer Instanz dieser Klasse zuweist!}
  if Assigned(FOnDblClick) then FOnDblClick(self);
end;


{...}
procedure TForm1.DblClick(Sender : TObject); //Das Ereignis, welches Du verwenden willst.
                                             //Wie jedes andere auch.
begin
  ShowMessage('Doppelklick');
end;

procedure TForm1.Button1Click(Sender : TObject);
var MyListbox : TMyListbox;
begin
  MyListbox := TMyListbox.Create(form1); //oder sowas ... eben die Komponente zur Laufzeit erstellen
  {...}
  MyListbox.OnDblClick := DblClick;
end;
Hoffe, das hilft. (Habe es mit TYourListbox = TListbox probiert, da funtkioniert es.)

MfG
Peter

Uncle Cracker 18. Apr 2004 20:23

Re: Doppelklick in Listbox "nachrüsten"
 
Also, ich habe das jetzt nochmal probiert. Bei klappt das nicht wirklich, auch wenn ich die normale Listbox nehmen, ich mache sicher irgendwo einen Fehler. :?

Wenn ich das so einsetzte wie oben, dann kommt an der Stelle "procedure TForm1.DblClick(Sender : TObject);" der Fehler, dass das undefiniert ist. Trage ich anstatt "TForm1.DblClick" "TMyListbox.DblClick" ein, kommt die Meldung das die sich von der vorherigen Dekleration unterscheidet (auch logisch, denn es wurde ja auch anders deklariert). Wenn ich jetzt aber "TForm1" komplett weglasse und nur "DblClick" hinschreibe, dann kommt unten beim Aufruf "MyListbox.OnDblClick := DblClick;" die Meldung "Inkompatible Typen: Liste der Paramter ist unterschiedlich".

Was mache ich falsch? Kannst du mir oder ein anderer vielleicht nochmal helfen?


:love: Danke UC

tommie-lie 18. Apr 2004 21:00

Re: Doppelklick in Listbox "nachrüsten"
 
Zitat:

Zitat von Uncle Cracker
Wenn ich das so einsetzte wie oben, dann kommt an der Stelle "procedure TForm1.DblClick(Sender : TObject);" der Fehler, dass das undefiniert ist.

Delphi-Quellcode:
type
  TForm1 = class(Form)
    {...}
  public
    procedure TForm1.DblClick(Sender : TObject);
    {...}
end;
Und im OI natürlich das OnClick-Event der eigenen Listbox mit dem entsprechenden Handler in Form1 verknüpfen, sowas geht dann per DropDown-Liste. Ob der altbekannte Doppelklick reicht, weiß ich hier bei eigenen Komponenten nicht, wenn man sie nicht anständig registriert hat.

Christian S. 18. Apr 2004 21:03

Re: Doppelklick in Listbox "nachrüsten"
 
Wie jedes andere Ereignis und jede andere Memberfunktion auch, muss man "TForm1.DblClick(Sender : TObject)" natürlich noch im interface-Teil in TForm1 deklarieren. So wie Delphi das z.B. mit einem "TForm1.Button1Click(Sender : TObject)" auch tut. Also irgendwie so:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    procedure theListboxDblClick(Sender : TObject);
  public
  end;

{...}
implementation
{...}
procedure TForm1.theListboxDblClick(Sender : TObject);
begin
  ShowMessage('Doppelklick!');
end;
Hätte ich vielleicht dazu schreiben sollen, aber ich dachte, das wäre klar.

MfG
Peter

P.S.: Ich habe die Prozedur mal anders genannt. Ist ein wenig mehr mit der Delphi-Art der Bennennung konform.

//edit:
@tommie-lie: Wenn man die eigene Listboxkomponente zur Laufzeit erzeugt (wie ich das oben getan habe), braucht man es nicht im OI machen und registrieren braucht man sie auch nicht. :-)

//edit2:
nochmal @tommie-lie: so wird die Deklaration im interface aber nichts. Einmal TForm1 reicht. ;-)

tommie-lie 18. Apr 2004 21:12

Re: Doppelklick in Listbox "nachrüsten"
 
Zitat:

Zitat von Peter Lustig
//edit:
@tommie-lie: Wenn man die eigene Listboxkomponente zur Laufzeit erzeugt (wie ich das oben getan habe), braucht man es nicht im OI machen und registrieren braucht man sie auch nicht. :-)

Zur Laufzeit?
Hmpf, wieso lese ich deine Quellcodes nur nie komplett durch?

Zitat:

Zitat von Peter Lustig
//edit2:
nochmal @tommie-lie: so wird die Deklaration im interface aber nichts. Einmal TForm1 reicht. ;-)

Aaargh. Scheint echt nicht mein Tag zu sein, diese Woche.

Edit: Naja, jeder blamiert sich so gut er kann (wenn falsch, dann wenigstens richtig) :mrgreen:


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