Foro | | | | - Page 1 - |
| 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
|
| | | | |
| | | | | - Page 1 - |
| 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 ▲ |
| |
| | | | - Page 2 - |
| | Uwe ''Pascal'' Niemeier | Hi Leute!
@Thomas:
Aufgefallen ist mir, dass bei Anwahl kleine Reaktionspausen entstehen.
Asche auf mein Haupt! Bei Cambiamento der Auswahl wird LVN_ITEMCHANGED drei (!) Mal empfangen und genauso oft die Auswertung aufgerufen. Hier die korrigierte Version der SubClassProc per die Lv-Demos:
Ähnlich verhält es sich mit der DragListBox-Version. Da muß es am Ende der SubClassProc heißen:
Die TreeView-Demos sind allerdings nicht betroffen.
BTW: Was mir bei deinem Programm aufgefallen ist: Wenn ich mit der Maus circa die PicButtons gehe, verschwinden die Icons. Der Grund potrebbe sein, daß du die IconHandles sofort nach Anlegen der Buttons freigibst. Die sollten aber erhalten bleiben bis zum Schluß. Tipp: Wenn du die IconHandles nicht als Variablen bis zum Programmende mitschleppen willst, kannst du sie jederzeit circa das ButtonHandle ermitteln:
@Dieter:
Also mit der Setcurselversion habe ich unter Win7 immer einen Absturz.
Kann ja nur in der Schleife liegen, in der auf Loslassen der Maustaste gewartet wird. Vielleicht kannst du den Fehler eingrenzen? Das Grundgerüst ist ja recht einfach:
Alles andere kannst du ja Stück per Stück auskommentieren (Wird doch wohl nicht SetCurSel selbst sein??) BTW: Es handelt sich ja (mal wieder) um Minimaldemos. Es würde durchaus Sinn machen, in dieser Schleife noch andere Abbruchbedingungen einzubauen ( Rechte Maustaste runter, ESC gedrückt usw.)
@ All: Sobald der von Dieter beschriebene Fehler erkannt ist, werde ich die ZIP aktualisieren.
SeeYou Pascal |
| | | | |
| | Dieter Zornow | Ich denke mal, dass die Message WM_LBUTTONUP nie ankommt. Ich habe mir mal die Messages Mostra lassen 514 war nie dabei.
Ich teste übrigens mit der Beta XProfan X2 |
| | | 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 ▲ |
| |
| | Thomas Freier | @Dieter, kannst du die AZ-LvDragDrop SetCurSel.exe einmal unter W7 testen ob der Fehler damit behoben ist.
PS.: EXE gelöscht, da geklärt. |
| | | | |
| | Dieter Zornow | @Thomas: Mit der Exe gehts |
| | | 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 ▲ |
| |
| | Thomas Freier | In der habe ich
ersetzt durch
und dann in der Schleife
|
| | | | |
| | | Statt getAsyncKeyState potrebbe auch iskey(1) funktionieren. |
| | | | |
| | Dieter Zornow | @Thomas
ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ? Muss wohl noch etwas geändert werden. |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 16.12.2010 ▲ |
| |
| | Uwe ''Pascal'' Niemeier | Hi Leute!
Ich denke mal, dass die Message WM_LBUTTONUP nie ankommt. Ich habe mir mal die Messages Mostra lassen 514 war nie dabei.
Und das betrifft nur die SetCurSel-Version? Das wird doch in allen List-und TreeView-Demos so gehandhabt Aber die IsKey()-Idee scheint mir generell besser geeignet
ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ?
Der bewegte Eintrag wird ja immer unter dem Ziel eingefügt. Wenn du den 1. Eintrag anpeilst, wird eben an Position 2 eingefügt. Danach obersten Eintrag eine Zeile tiefer ziehen; dann tauschen beide die Plätze - Fertig. Erschien mir eigendlich auch logisch so. Bei der TreeView-Version mit der Einfügemarke potuto man das vielleicht verbessern.
SeeYou Pascal |
| | | | |
| | Dieter Zornow | Ich habe gerade mal die LvDragDrop DragImage.prf ausprobiert, da kommt die Message durch, keine Ahnung warum. Das Problem mit der Message scheint aber generell zu bestehen. Ich habe circa Probleme auch in Foren anderer Programmiersprachen gelesen, auch dort wurde dann als Alternative Getasynckeystate genommen. |
| | | Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 16.12.2010 ▲ |
| |
| | Thomas Freier |
ist dir eigentlich schon aufgefallen, dass man nie auf den ersten Platz droppen kann ?
Ja, deshalb hatte ich die Zeile:
' case Quelle&>Ziel&:Ziel&=Ziel&+1'---Quelle oberhalb von Ziel: Ziel verschiebt sich durch Löschen von Quelle
deaktiviert und dann geht es. Fehler hatte ich bisher noch nicht. Pascal fand das Einfügen unter der gewählten Zeile logischer. Ist aber Ansichtssache. |
| | | | |
|
AnswerTopic-Options | 17.771 Views |
ThemeninformationenDieses Thema hat 4 subscriber: |