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 TListBox mit OnChange? (https://www.delphipraxis.net/132498-tlistbox-mit-onchange.html)

PeterPanino 14. Apr 2009 00:44


TListBox mit OnChange?
 
Hallo, das ist eine Frage, die offenbar bereits von tausenden Leuten im Internet gestellt wurde, aber nirgends befriedigend beantwortet wurde (ich habe stundenlang gesucht):

Wie kann man einer TListBox ein OnChange Event hinzufügen? Und zwar so, dass wenn ListBox.ItemIndex programmatisch geändert wird, das Ereignis OnChange aufgerufen wird?

Ein (virtueller) Lorbeerkranz demjenigen, der diese Frage beantworten kann!

jaenicke 14. Apr 2009 00:57

Re: TListBox mit OnChange?
 
Das ist doch (Entschuldigung) Schwachsinn, wenn du selbst das im Programm änderst, dann hast du doch bereits Code, der ausgeführt wird, wenn der ItemIndex sich ändert...
Du machst also einen Handler für OnClick der ListBox und wenn du selbst den ItemIndex änderst, dann rufst du den auch gleich auf. Wenn der User den ItemIndex ändert, wird der automatisch aufgerufen.

PeterPanino 14. Apr 2009 01:04

Re: TListBox mit OnChange?
 
Zitat:

Zitat von jaenicke
Das ist doch (Entschuldigung) Schwachsinn, wenn du selbst das im Programm änderst, dann hast du doch bereits Code, der ausgeführt wird, wenn der ItemIndex sich ändert...
Du machst also einen Handler für OnClick der ListBox und wenn du selbst den ItemIndex änderst, dann rufst du den auch gleich auf. Wenn der User den ItemIndex ändert, wird der automatisch aufgerufen.

Glaub mir, es gibt Situationen, wo ein OnChange-Handler ein großes Vereinfachungspotential darstellt ... :mrgreen:
Bei kleinen einfachen Programmen geb' ich dir recht, bei sehr komplexen Programmen schaut das ganz anders aus, da ist man über jede Vereinfachung froh. Außerdem war meine Frage nicht, ob es berechtigt ist, sondern wie man das machen könnte?

jaenicke 14. Apr 2009 01:05

Re: TListBox mit OnChange?
 
Dann leite dir eine eigene TListBox ab oder schreibe einfach eine Prozedur, der du den neuen Wert übergibst und die dann den OnClick-Handler direkt mit aufruft. Dann ist es auch nur noch eine statt zwei Zeilen...

hoika 14. Apr 2009 07:07

Re: TListBox mit OnChange?
 
Hallo,

TListBox ist aus der guten alten Win3x-Zeit.
Tu dir selbst einen Gefallen und steige auf TListView um.


Heiko

Luckie 14. Apr 2009 08:13

Re: TListBox mit OnChange?
 
Zitat:

Zitat von hoika
TListBox ist aus der guten alten Win3x-Zeit.
Tu dir selbst einen Gefallen und steige auf TListView um.

Was soll den jetzt diese blödsinnige Aussage? Wenn ich die erweiterte Funktionalität (mehrere Spalten, Ansichten und Spaltenköpfe) eines Listviews nicht brauche, dann kan ich sehr gut eine Listbox nehmen.

hoika 14. Apr 2009 08:15

Re: TListBox mit OnChange?
 
Hallo,

die Aussage betraf das OnChange.
Mit TListBox ist es nicht möglich, den obigen Wunsch zu erfüllen.

(Auch LBN_CHANGE geht nicht, wie ich ergoogelt habe.)


Heiko

Luckie 14. Apr 2009 08:24

Re: TListBox mit OnChange?
 
LBN_CHANGE find eich in meinem Windows SDK auch gar nicht.

hoika 14. Apr 2009 08:28

Re: TListBox mit OnChange?
 
Hallo,

heisst ja auch LBN_SELCHANGE ...
Hatte der im Artikel (Google) auch falsch getippt.

Könnte man ja probieren per Subclassing (also eigene TListBox-Klasse
und dort WndProc überschreiben).

Startpunkt wäre vielleicht das folgende Tutorial:
Win32-API
Dort nach LBN_SELCHANGE suchen.
Und auch mal die Kapitel davor (es geht ja um WM_COMMAND).

Ausserdem würde ich im MSDN danach suchen
MSDN
Dort vor allem auch die Hinweise (LB_SETCURSEL).


Nur warum der Aufwand, wenn in TListView alles schon fertsch ist ? ;)


Heiko

jaenicke 14. Apr 2009 14:48

Re: TListBox mit OnChange?
 
Das Problem ist, dass bei einer Änderung des ItemIndex die Information über die Änderung nicht an die Komponente geschickt wird (wie bei einer Änderung durch den Benutzer), sondern dass die Komponente die Änderung an das Control schickt. Und deshalb bekommt man davon eben nichts mit.

Ganz einfach, weil es eben normalerweise hinderlich wäre, wenn auch eigene Aktionen per Code das Event auslösen. Schließlich könnte so etwas bei entsprechender Programmierung dann auch einen Ping-Pong-Effekt geben, usw., zudem ist so eine Funktionalität eben absolut überflüssig.

Wenn der Benutzer einen anderen Eintrag auswählt, gibt es ja ein Event (OnClick, welches auch bei einer Änderung per Tastatur ausgelöst wird).

Da man bereits Code hat, der ausgeführt wird, wenn eine eigene Änderung per Code durchgeführt wird, braucht man kein Event. Wenn man dort Code ausführen will, kann man das auch direkt tun. Wenn man dies oft benötigt, kann man eine eigene Prozedur schreiben, die die Änderung und das Auslösen des OnClick-Ereignisses kombiniert.


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