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 |
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! |
Re: Doppelklick in Listbox "nachrüsten"
Zitat:
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. |
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.
|
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:
Hoffe, das hilft. (Habe es mit TYourListbox = TListbox probiert, da funtkioniert es.)
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; MfG Peter |
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 |
Re: Doppelklick in Listbox "nachrüsten"
Zitat:
Delphi-Quellcode:
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.
type
TForm1 = class(Form) {...} public procedure TForm1.DblClick(Sender : TObject); {...} end; |
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:
Hätte ich vielleicht dazu schreiben sollen, aber ich dachte, das wäre klar.
type
TForm1 = class(TForm) private procedure theListboxDblClick(Sender : TObject); public end; {...} implementation {...} procedure TForm1.theListboxDblClick(Sender : TObject); begin ShowMessage('Doppelklick!'); end; 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. ;-) |
Re: Doppelklick in Listbox "nachrüsten"
Zitat:
Hmpf, wieso lese ich deine Quellcodes nur nie komplett durch? Zitat:
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