Ik heb een nieuwe ListView classe gemaakt die gebaseerd is op TListView. Met deze classe is het mogelijk om een ListView te gebruiken, waarmee de gebruiker bijv gewoon kan scrollen maar hij kan niet andere items selecteren.
In deze nieuwe classe zit een property DisableSelection. Als die op True staat dan mag de gebruiker dus niet de selectie wijzigen. (Dus deze property is ongeveer hetzelfde als Enabled := False, alleen kan je dan bij die klasse van mij gewoon de kolommen resizen, scrollen, enz..)
Nu is er 1 ding wat ik niet voor elkaar krijg. Als het component een WM_SETFOCUS krijgt en DisableSelection is True, dan zou de message dus weggegooid moeten worden, omdat het component geen focus mag krijgen.
Ik heb de volgende code:
In de WndProc staat dus dat als de message WM_SETFOCUS is dat die die moet weggooien. Maar met deze code gaat het niet goed. Als ik een kolom van de ListView resize en de muis vervolgens los laat dan krijgt het component toch de focus.
Als ik het op de volgende manier doe dan werkt het wel:
In de OnEnter event van het component zet ik:
en ik haal in de WndProc van de klasse: (Message.Msg <> WM_SETFOCUS)
weg dan werkt het goed.
Maar dit is niet echt de beste oplossing, omdat ik dat dan in alle instanties van het component zou moeten doen.
Wie weet er een goede oplossing?
En als je in de WndProc procedure niet inherited toe bij een WM_SETFOCUS dan krijgt dat component toch niet de focus en houdt het huidige component toch de focus?
In deze nieuwe classe zit een property DisableSelection. Als die op True staat dan mag de gebruiker dus niet de selectie wijzigen. (Dus deze property is ongeveer hetzelfde als Enabled := False, alleen kan je dan bij die klasse van mij gewoon de kolommen resizen, scrollen, enz..)
Nu is er 1 ding wat ik niet voor elkaar krijg. Als het component een WM_SETFOCUS krijgt en DisableSelection is True, dan zou de message dus weggegooid moeten worden, omdat het component geen focus mag krijgen.
Ik heb de volgende code:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| type TlistviewDisable = class(Tlistview) private { Private declarations } FDisableSelection: Boolean; procedure SetDisableSelection(Value: Boolean); protected { Protected declarations } procedure WndProc(var Message: TMessage); override; public { Public declarations } property DisableSelection: Boolean read FDisableSelection write SetDisableSelection; published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Win32', [TlistviewDisable]); end; { TlistviewDisable } procedure TlistviewDisable.SetDisableSelection(Value: Boolean); begin FDisableSelection := Value; end; procedure TlistviewDisable.WndProc(var Message: TMessage); begin if not DisableSelection then inherited else if (Message.Msg <> WM_LBUTTONDOWN) and (Message.Msg <> WM_RBUTTONDOWN) and (Message.Msg <> WM_SETFOCUS) and (Message.Msg <> WM_LBUTTONUP) and (Message.Msg <> WM_RBUTTONUP) then inherited; end; end. |
In de WndProc staat dus dat als de message WM_SETFOCUS is dat die die moet weggooien. Maar met deze code gaat het niet goed. Als ik een kolom van de ListView resize en de muis vervolgens los laat dan krijgt het component toch de focus.
Als ik het op de volgende manier doe dan werkt het wel:
In de OnEnter event van het component zet ik:
Delphi:
1
2
3
4
5
6
7
8
| procedure Tfrm_ArtikelVerpakking.lstvw_VerpakkingenEnter(Sender: TObject); begin if (lstvw_Verpakkingen.DisableSelection) or (lstvw_Verpakkingen.Items.Count = 0) then SelectNext(lstvw_Verpakkingen, True, True) else if (lstvw_Verpakkingen.ItemFocused = nil) and (lstvw_Verpakkingen.Items.Count > 0) then SelectFirstItem; end; |
en ik haal in de WndProc van de klasse: (Message.Msg <> WM_SETFOCUS)
weg dan werkt het goed.
Maar dit is niet echt de beste oplossing, omdat ik dat dan in alle instanties van het component zou moeten doen.
Wie weet er een goede oplossing?
En als je in de WndProc procedure niet inherited toe bij een WM_SETFOCUS dan krijgt dat component toch niet de focus en houdt het huidige component toch de focus?