| |
|
|
Thomas Freier | Im Moment seh Io l' Wald vor lauter Bäumen nicht und eine Lösung, wenn mit der Maus ein Item zum Mostra gewählt wurde, anschließend von dieser Pos. mit der Pfeiltaste weiter zu gehen. Lieg's am Subproc? Mini-Beispiel:
' {$cleq}
$H Windows.ph
$H Messages.ph
$H commctrl.ph
Declare text$,Font&,Navi&
Declare hGrid&
Declare x&,x%
DEF $DRAGLISTMSGSTRING "commctrl_DragListMsg"
DEF &DL_BEGINDRAG 1157
DEF &DL_DRAGGING 1158
DEF &DL_DROPPED 1159
DEF &DL_MOVECURSOR 3
DEF &DL_COPYCURSOR 2
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct LVHitTestInfo = X&,Y&,flags&,Item&,SubItem&
Declare LVHTI#,l%,L.SubItem$,T_Tip&
Dim LVHTI#,LVHitTestInfo
Proc LV_HitTest
Parameters LV&,X%,Y%
~GetCursorPos(LVHTI#)
~ScreenToClient(LV&,LVHTI#)
SendMessage(LV&,~LVM_SUBITEMHITTEST,0,LVHTI#)
Return LVHTI#.SubItem&
EndProc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvDeSelect'deselectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=0
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
proc LvSelect'selectieren
parameters Lv&,Item&
Declare s#
dim s#,1024
long s#,12=$2
long s#,16=~LVIS_SELECTED | ~LVIS_FOCUSED
sendmessage(Lv&,~LVM_SETITEMSTATE,Item&,s#)
sendmessage(lv&,~LVM_SETHOTITEM ,item&,0)
sendmessage(lv&,~LVM_ENSUREVISIBLE ,Item&,0)
dispose s#
endproc
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Struct POINT = X&,Y&
Struct DRAGLISTINFO = uNotification&,hWnd&,ptCursor!POINT
Var FirstItem& = 0
Var LastItem& = 0
Var MoveString$ = ""
Var MoveCursor& = ~LoadCursor(~GetModuleHandle("shell32.dll"),1003)
'Genau diese spezielle Meldung muss registiert werden
'damit das Fenster die Drag&Drop Operationen verarbeiten kann.
Var DragMSG& = ~RegisterWindowMessage("commctrl_DragListMsg")
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SET("TRUECOLOR",1)
CLS RGB(255,255,255)
Font&=Create("Font","MS Sans Serif",16,0,0,0,0)
SETDIALOGFONT Font&
Windowstyle 538
Navi&=Create("Window",%hwnd,"",(%maxx-160),2,154,670)
Text$ = "Blätter;0;140"
hGrid& = Create("GridBox", Navi&, text$, 0, 8, 8, 130, 356)
'Die Listbox per Drag&Drop vobereiten
External("comctl32.dll","MakeDragList",hGrid&)
clearlist
AddString "Item 1"
AddString "Item 2"
AddString "Item 3"
AddString "Item 4"
AddString "Item 5"
AddString "Item 6"
AddString "Item 7"
AddString "Item 8"
MoveListToHandle(hGrid&)
SelectString(hGrid&,-1,GetString$(hGrid&,0))
LVSelect hGrid&,0
SEITE_ZEIGEN 0
@Set("FastMode", 1)
setfocus(Navi&)
SubClass navi&,1
AddHotKey 2020, 37, 0
AddHotKey 2022, 39, 0
AddHotKey 2021, 38, 0
AddHotKey 2023, 40, 0
while 1
WaitInput 1
Case %key=2:BREAK
If (%menuitem=2020) OR (%menuitem=2021)'linke Pfeiltaste
If GetCount(hGrid&)>0
x%=GetCurSel(hGrid&)
dec x%
case x%<0: x%=(GetCount(hGrid&)-1)
SelectString(hGrid&,-1,GetString$(hGrid&,x%))
x%=GetCurSel(hGrid&)
SEITE_ZEIGEN x%
endIf'
setfocus(navi&)
ElseIf (%menuitem=2022) OR (%menuitem=2023)'rechte Pfeiltaste
If GetCount(hGrid&)>0
x%=GetCurSel(hGrid&)
inc x%
SelectString(hGrid&,-1,GetString$(hGrid&,x%))
x%=GetCurSel(hGrid&)
SEITE_ZEIGEN x%
Endif
setfocus(navi&)
EndIf
EndWhile
SubClass navi&,0
@Set("FastMode", 0)
destroywindow(navi&)
DeleteObject Font&
destroywindow(%hwnd)
End
Proc SEITE_ZEIGEN
Parameters x%
var x1%= val(right$(GetString$(hGrid&,x%),1))
case x1%=1: MCls 600, 800 ,RGB(255,255,100)
case x1%=2: MCls 600, 800 ,RGB(255,255,0)
case x1%=3: MCls 600, 800 ,RGB(255,0,100)
case x1%=4: MCls 600, 800 ,RGB(255,0,255)
case x1%=5: MCls 600, 800 ,RGB(255,100,100)
case x1%=6: MCls 600, 800 ,RGB(100,255,0)
case x1%=7: MCls 600, 800 ,RGB(0,255,100)
case x1%=8: MCls 600, 800 ,RGB(255,0,0)
MCopyBmp 0,0 - 800,600 > 0,0;0
EndProc
SubClassProc
If SubClassMessage(navi&,DragMSG&)
var Info# = New(DRAGLISTINFO)
l% = LV_HitTest(hgrid&,%mousex,%mousey)
L.SubItem$=GetText$(hGrid&,LVHTI#.Item&,LVHTI#.SubItem&)
Info# = &slParam
If Info#.uNotification& = &DL_BEGINDRAG'Drag&Drop beginnt und Item merken
FirstItem& = LVHTI#.Item&
MoveString$ = GetText$(hGrid&,LVHTI#.Item&,LVHTI#.SubItem&)'Item-Text merken
T_Tip&=Create("Tooltip",%hwnd,hGrid&,MoveString$)
Set("WinProc", 0)
~SetCursor(MoveCursor&)
Return &DL_COPYCURSOR
ElseIf Info#.uNotification& = &DL_DRAGGING'Drag&Drop ist im Gange
LastItem& = LVHTI#.Item&
LvSelect hGrid&,LastItem&
Set("WinProc", 0)
'Item markieren
SendMessage(hGrid&,~Lb_SETCURSEL,LastItem&,0)
~SetCursor(MoveCursor&)
ElseIf Info#.uNotification& = &DL_DROPPED'Drag&Drop ist beendet
LastItem& = LVHTI#.Item&
If Lastitem& <> -1
IF Lastitem& <> Firstitem&
'das erste gemerkte Item löschen
DeleteString(hGrid&,FirstItem&)
'und an der Position des letzten gemerkten Items einfügen
InsertString(hGrid&,LastItem&,MoveString$)
Set("WinProc", 0)
LvSelect hGrid&,LastItem&
EndIf
DestroyWindow(T_Tip&)
SEITE_ZEIGEN LastItem&
EndIf
EndIf
EndIf
EndProc
|
|
|
| |
|
|
|
| Bei mir funktioniert das Programm "überhauptnicht" (XProfan11 32Bit XP SP2) -
ich bekomme auch im Kompilat garkeine GridBox zur Anzeige sondern nur ein gelbes hWnd und per Interpreter erhalte ich sofort einen Absturz.
Absturz im Interpreter bei
Übergibst an die API eine Def-Konstante - ist imho nicht unbedingt im Sinne des Erfinders - erwartet wird eine Speicheradresse und ne DEF-Konstante potuto da doch zu komplex sein - besser die Adresse eines einfachen Strings bzw. Speichers trasferimento. |
|
|
| |
|
|
|
| Wenn ich schreibe funktionierts und ich kann in Interpreter und Kompilat mit Maus und Tastatur wählen - halt einfach die Adresse eines Strings trasferimento |
|
|
| |
|
|
|
Thomas Freier | OK. War Andreas Code, der mit XP12 kein Problem bereitete. Aber ich suche noch, wenn mit der Maus z.B.: Item5 markiert wurde und ich anschließend die Pfeil-Taste runter benutze auch Item6 markiert und angezeigt wird. Meist erfolgt der Sprung an den Anfang. Ist mir auch schon bei anderer Software aufgefallen, dass wenn etwas mit der Maus in der Tabelle gewählt wird beim Drücken der Taste Bild runter, ein Sprung zu Zeile 1 erfolgt. |
|
|
| |
|
|
|
| Habs nicht getestet aber teste doch mal obs hilft wenn Du nach dem D&D z.B. mit SelectString entsprechende Zeile markierst oder gar mal eine andere und wieder zurück. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi Thomas!
Mal 'ne ganz dumme Frage: Lassen sich die DragListBox-Messages überhaupt auf ListViews (GridBoxen) anwenden? Laut MSDN sind die doch per normale Listboxen vorgesehen? Eigendlich sollte man doch per SubClassing die LVN_BEGINDRAG-Message des ListViews auswerten?
SeeYou Pascal |
|
|
| |
|
|
|
Thomas Freier | He Pascal, die Antwort muß ich dir schuldig bleiben, da ich bisher nur mit Franks ListView.dll gearbeitet habe und in diesem Fall es ohne machen wollte. Ein Beispiel von Andreas führte zum gewünschten Ergebnis. Nur bekomme ich jetzt Probleme bei der "Tastensteuerung". Aber du bist ja LV Spezi und siehst vielleicht eine Lösung. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi Thomas!
Standartmäßig kann man ja in jeder Art von Liste mit der Tastatur navigieren, wenn das betreffende Control den Focus hat. Darum wäre die einfachste Lösung, relevante Tastendrücke im Hauptfenster per SetFocus(Liste&) & SendKey(Liste&,Key%) an die Liste weiterzuleiten. Allerdings erkennt XProfan dabei möglicherweise nicht, das die Auswahl geändert wurde, wenn die Liste erstmal den Focus hat und behält (WaitInput wird nicht durchbrochen). Also entweder nach SendKey den Focus wieder auf's Hauptfenster legen oder sowas versuchen (hab's mit deinem Code noch nicht getestet):
settimer 100
while 1'--------------Beginn Eingabeschleife
waitinput
Neu%=getcursel(Liste&)
if Neu%<>Alt%
Alt%=Neu%
'---Irgendeine Reaktion auf geänderte Auswahl
endif
'---Weitere Abfragen per Bedienungselemente usw.
endif'----------------Ende Eingabeschleife
Eleganter wäre allerdings eine entsprechende Ereignis-Auswertung per SubClassing. Ich werd' da mal was vorbereiten
HTH Pascal |
|
|
| |
|
|
|
Thomas Freier | Bin schon gespannt. Einiges hatte ich naturalmente schon versucht, diesen "Schönheitsfehler" zu beheben. Möglich auch, dass ein vorhandenes EDIT bei meinen Lösungen ausbremsend war. Ich hatte es im Beispiel weg gelassen, und kann es zur Not in einen eigenen Dialog packen. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hi Thomas!
Habe mal ein paar Beispiele per Drag&Drop ( aktuelles XProfan 12 ) zusammengestellt.
Herunterladen externer Download
Die Umleitung der Tasten von Hwnd auf die jeweilige Liste erfolgt dabei immer nach dem gleichen oben erwähnten Prinzip per SubClassing, ebenso die Auswertung der neuen Auswahl. Unterschiedlich sind eigendlich nur die optischen Effekte. Vielleicht hilft es dir weiter. PS: Habe mir erlaubt, den Trick mit dem ToolTip zu klauen
SeeYou Pascal |
|
|
| |
|
|
|
Thomas Freier | He Pascal, feine Sache, die du zusammengestellt hast. Aufgefallen ist mir, dass bei Anwahl kleine Reaktionspausen entstehen. Nun bin ich mir noch unsicher, wie ich weiter verfahre.
Ein kleines Beispiel beigepackt. Nur, wenn auch noch mit einem kleinen Fehler, die Ansicht-Zeitung-1m.exe hat Endstand. Nach dem Start bitte erst einmal die Pfade zu den PNG- und ODT-File anlegen. Wer hat, kann dann zum Testen/Bearbeiten, eine OpenOffice.exe verknüpfen und die File dann auch als PDF speichern (Pfad dann einrichten). Die zur Anzeige benötigten PNG-File können circa IrfanView, wenn er PDFs öffnen kann, oder einen PDF-Reader (z.B.: Portable PDFXCview.exe) erstellt werden. Das Ganze mag umständlich klingen, aber leider gelang es mir noch nicht eine beliebige halbe PDF-Seite anzuzeigen. |
|
|
| |
|
|
|
Dieter Zornow | Also mit der Setcurselversion habe ich unter Win7 immer einen Absturz. Der Drop-Cursor erscheint dann kann ich klicken oder was auch immer, es passiert nichts mehr. Kann dann nur noch mit dem Taskmanager beenden. Ist aber schon so mit dem Originalcode von Pascal. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 15.12.2010 ▲ |
|
|
|