Programujeme ve Visual Basic .NET - 25. díl - metody pro práci s řetězci

Diskuze čtenářů k článku

Hladik M.  |  09. 02. 2005 16:43  | 

Ac tema serialu jsou metody pro praci s retezci, rad bych oslovil zkusenejsi programatory ve VB.NET a zeptal se na reseni nasledujiciho problemu.
Standardni prvek ListWiew poskytuje mimo jine i udalost KeyDown. Potreboval bych ale pokud je stisknuta jista klavesa, abych tuto udalost odchytil jeste drive nez ji obslouzi prvek ListView sam. Konkretne jde o sipky nahoru a dolu. Prvek totiz automaticky se stiskem sipky oznacuje i polozky. Ja potrebuji jenom posun fokusu.
Diky za pripadnou radu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  09. 02. 2005 21:12  | 

Té technice se říká subclassing (někdy též "hákování") a rámcově se provádí tak, že událostní proceduře okna podstrčíte delegáta (pointer) funkce, která se napíchne ("zahákne") na frontu systémových vzkazů, které generují frontu událostí - na ty požadované provede vlastní akci, na ty zbývající zavolá výchozí systémovou proceduru WndProc, která dokončí normální zpracování. Okno - které může představovat libovolný ovládací prvek by pak nemělo "poznat", že jej volá jiná, než při vytvoření okna zaregistrovaná procedura. Daná ukázka parametry systémových volání prostě vypisuje do konzole tak, jak přicházejí do okna ListView.
 Imports System.Windows.Forms
Module MMain
Delegate Function SubClassDelegate%(hwnd%, msg%, wParam%, lParam%)
Declare Sub CallWindowProcA Lib "USER32.DLL" (lpPrev%, hwnd%, msg%, wParam%,lParam%)
Declare Function SetWindowLongA% Lib "USER32.DLL" (hwnd%, attr%, lVal%)
Declare Function SetWindowLongA% Lib "USER32.DLL" (hwnd%, attr%, lVal As SubClassDelegate)
Dim WithEvents LV As New ListView: Dim lptHandler%
Sub Main
Dim F As New Form(): F.Controls.Add(LV)
For i As Integer = 1 To 100: LV.Items.Add(i): Next
lptHandler = SetWindowLongA(LV.Handle.ToInt32, -4, AddressOf SubClassProc)
Application.Run(F)
End Sub
Function SubClassWindow(ByVal hWnd%)
SetWindowLongA(hWnd, (-4), AddressOf SubClassProc)
End Function
Function SubClassProc%(hWnd%, lMsg%, wParam%, lParam%)
Select Case lMsg
Case Else
System.Console.WriteLine("{0} {1} {2}", lMsg, wParam, lParam)
CallWindowProcA(lptHandler, hWnd, lMsg, wParam, lParam)
End Select
End Function
End Module

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  09. 02. 2005 21:39  | 

Druhá možnost mi přijde jednodušší  - a sice odznačit položky zasláním LVIF_STATE zprávy do ListView v události SelectedIndexChanged:
 Imports System.Windows.Forms
Module MMain
Dim WithEvents LV As New ListView
Declare Sub SendMessageA Lib "user32" (hwnd%, iMsg%,wParam%, ByRef lParam As LV_ITEM)
Structure LV_ITEM
Dim mask%, iItem%, iSubItem%, state%, stateMask%, pszText$, cchTextMax%, iImage%, lParam%, iIndent%
End Structure
Sub Main
Dim F As New Form(): F.Controls.Add(LV)
For i As Integer = 1 To 100: LV.Items.Add(i): Next
Application.Run(F)
End Sub
Sub LV_SelectedIndexChanged(S As Object, EA As System.EventArgs) Handles LV.SelectedIndexChanged
Dim LVI As LV_ITEM
LVI.mask = &H8S ' LVIF_STATE
LVI.state = 0
LVI.stateMask = &H2S ' LVIS_SELECTED
SendMessageA(LV.Handle.ToInt32, 4139, -1, LVI) ' LVM_SETITEMSTATE
End Sub
End Module

Souhlasím  |  Nesouhlasím  |  Odpovědět
Hladik M.  |  10. 02. 2005 07:16  | 

Diky moc za obe rady.

Mimochodem, co se deje s p. Machem? Snad jste se nepohadali

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  10. 02. 2005 10:10  | 

Naposledy tvrdil, že se zkusí podívat na moji OpenGl ukázku v Pythonu - možná se ji dosud snaží optimalizovat na výkon C.
 
Vidím to na dýl....

Souhlasím  |  Nesouhlasím  |  Odpovědět
Daniel, Daniel  |  10. 02. 2005 14:09  | 

Tak to je fakt komedie :oDDDD Normálně, celkové diskuze pod tímto článkem, mě bavili od začátku tohoto dílu, ale tohle mě dostalo :o) Ale jen tak dál :o) Samozřejmě i se seriálem :o)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Daniel, Daniel  |  10. 02. 2005 14:10  | 

"začátku tohoto dílu, ale tohle mě dostalo " mělo být seriálu :o)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Hladik M.  |  11. 02. 2005 07:29  | 

Uznavam ze je to mimo dane tema, ale ze by to byla komedie? Mimochodem, Vas reakce take nebyla na dane tema serialu o metodach pro praci s retezci. Ruku na srdce, myslite ze ano?

Souhlasím  |  Nesouhlasím  |  Odpovědět
Daniel  |  11. 02. 2005 07:39  | 

Pochvala autorovi patří ke každému článku! :o)

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petr Mach  |  16. 02. 2005 03:30  | 

Ale kdepak, jen nemuzu venovat cely svuj zivot diskusim pod timto serialem, takze, jak je mozno si vsimnout, tak
diskutuji jen par dnu pod kazdym sudym dilem. Ale ten 26 nejak nevysel . Bohuzel, takove krasne ukazky jsem mel
pripravene. Ale koho zajima python, muze se podivat na:

http://new.ceskaskola.cz/ICTveskole/F.asp?ARI=101919&HID=1&CAI=2129

Souhlasím  |  Nesouhlasím  |  Odpovědět
Petrik  |  16. 02. 2005 13:49  | 

Po společné poradě s redakcí Živě jsme dospěli k jednomyslnému názoru, že bez Vás by nemělo další díl seriálu ani rozjíždět....
 
Nicméně - diskusi jste zahájil rozpoutal zde, tak ji tady můžete i dokončit. Audit pod článkem na ceskaskola.cz byl přetížen a Vaše ukázky kompaktního a stručného Pythonu jej zřejmě dorazily - mě vyhazuje timeout. Nemusíte sem ani svoje ukázky pastovat, stačí je naliinkovat a mě osobně zajímá pouze, zda je rychlost Pythonu srovnatelná s C, když používá ty grafické knihovny, jak jste tvrdil.

Souhlasím  |  Nesouhlasím  |  Odpovědět
Zasílat názory e-mailem: Zasílat názory Můj názor
Aktuální číslo časopisu Computer

Jak prodloužit výdrž notebooku

Velké testy: gamepady a inkoustové tiskárny

Důkladný test Sony Playstation 5