| |
|
|
Matthias Arlt |
'Es wird nicht der standardmäßige Inplace-Editor der Listview genutzt.
'Dieser würde nur für die erste Spalte zur Verfügung stehen...
'Original-Source Thomas Freier - modifiziert Matthias Arlt
Window 0,0 - 600,410
declare LV&,Spalte&,Zeile&,Item&,Edit&,Font&,Txt$
declare rect#,cellpos_x%,cellpos_y%,cellwidth%,cellheight%
Font&=CreateFont("Verdana",16,0,0,0,0)
SetDialogFont Font&
LV&=Create("GridBox",%hwnd,"Spalte 1;1;60;Spalte 2;1;120;Spalte 3;1;80;Spalte 4;1;80;Spalte 5;1;80",0,10,10,460,250)
SetFont LV&,Font&
whileloop 0,20
Addstring(LV&,str$(&loop) + "|0|0|0|0")
wend
Edit& = create("Edit",LV&,"",0,0,0,0)
setfont Edit&,Font&
proc SetSubItemEdit
dim rect#,16
SendMessage(LV&,$100E,Zeile&,rect#)'LVM_GETITEMRECT
cellpos_x% = long(rect#,0)
cellpos_y% = long(rect#,4) - 1
cellwidth% = sendmessage(LV&,$101D,Spalte&,0)
cellheight% = (long(rect#,12) - long(rect#,4)) + 1
if Spalte& > 0
whileloop 0,(Spalte& - 1),1
cellpos_x% = cellpos_x% + sendmessage(LV&,$101D,&loop,0)
wend
endif
dispose rect#
settext Edit&, Txt$
setwindowpos Edit& = cellpos_x%,cellpos_y% - cellwidth%,cellheight%
setfocus(Edit&)
'SendMessage(Edit&,"+({END})") 'Cursor ans Ende setzen...
SendMessage(Edit&,$B1,0,-1)'oder Alles markieren... (Explorer-konform)
endproc
AddHotKey 13, 13, 0
AddHotKey 37, 37, 0
AddHotKey 38, 38, 0
AddHotKey 39, 39, 0
AddHotKey 40, 40, 0
SubClass %hwnd, 1
usermessages 2000
SubClassProc
if SubClassMessage(%hwnd, 78)'WM_NOTIFY
if (Long(&sLParam,8) = -3)
Item&=Long(&sLParam,12)
if (Item& <> -1)
SendMessage(%hwnd,2000,Item&,Long(&sLParam,16))
endif
elseif (Long(&sLParam,8) = -180)'LVN_BEGINSCROLL
settext LV&,Zeile&,Spalte&,gettext$(Edit&)
setwindowpos Edit& = 0,0-0,0
endif
endif
endproc
while 1
waitinput
if (%umessage = 2000)
Txt$ = GetText$(LV&,&uwparam,&ulparam)
Spalte&= &ulparam
Zeile&= &uwparam
SetSubItemEdit
while getfocus(Edit&)
waitinput
if (%menuitem = 13)
break
elseif (%menuitem = 37) | (%menuitem = 38) | (%menuitem = 39) | (%menuitem = 40)
settext LV&,Zeile&,Spalte&,gettext$(Edit&)
case (%menuitem = 37) : Spalte& = (Spalte& - 1)
case (%menuitem = 38) : Zeile& = (Zeile& - 1)
case (%menuitem = 39) : Spalte& = (Spalte& + 1)
case (%menuitem = 40) : Zeile& = (Zeile& + 1)
Txt$ = GetText$(LV&,Zeile&,Spalte&)
SetSubItemEdit
endif
wend
settext LV&,Zeile&,Spalte&,gettext$(Edit&)
setwindowpos Edit& = 0,0-0,0
setfocus(%hwnd)
endif
wend
usermessages 0
SubClass %hwnd, 0
end
|
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 02.11.2016 ▲ |
|
|
|
|
Ernst | Einen Haken hat die Geschichte, wenn der Scrollbalken ins Spiel kommt - das Edit-Feld bzw. der Cursor lässt sich nicht mitscrollen.
z.B.: ein Subitem in der dritten Zeile wird doppelgeklickt -> Edit erscheint; beim hinaufscrollen um eine Zeile sieht man das Erscheinungsbild des Edits in der zweiten und den Cursor darunter in der dritten Zeile. Bei der Eingabe wird in der dritten Zeile unter dem Edit geschrieben (scheinbar) - beim Klick auf ein anderes Subitem wird der Text in das eigentlich richtige Subitem (zweite Zeile) übernommen. |
|
|
| |
|
|
|
Matthias Arlt | Eigentlich soll das Edit standardmäßig ja garnicht mitscrollen (im Explorer tut es das ja auch nicht...). Ich habs nochmal überarbeitet. Damit sollte nun das gewohnte Verhalten hergestellt sein.
Und der Vollständigkeit halber das Ganze noch etwas optimiert und gleich noch mit Weiterschaltung mittels Pfeiltasten...
Ich habe das mal in die Code-Box im Eingangsbeitrag verschoben. Schließlich macht es keinen Sinn, dort den noch nicht fehlerbereinigten Source stehen zu lassen. Das geht nur zu Lasten der Übersichtlichkeit. Siehe also weiter oben...
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 11.01.2017 ▲ |
|
|
|