| |
|
|
Dieter Zornow | ich habe mich hiermal an einem Treeview probiert, das die Verzeichnisse von der Platte einliest und die einzelnen Elemente abfragbar sind. Der Code basiert weitestgehend auf dem Beispiel von Uwe (Pascal). Das ist ja clever gemacht und ich wollte das Rad nicht nicht neu erfinden. Das Beispiel von Pascal hat den Nachteil, dass es durch die Assemblerroutinen nicht mit dem Windowsstyle 512 funktioniert. XProfan aber dummerweise bei vielem diesen Stil braucht zum ordungungsgemäßen funktionieren. Dashalb habe ich den Code etwas verändert, ein paar Sicherheiten was das anklicken von nicht bereiten Laufwerken betrifft und auf Assembler verzichtet. Es ist fast fertig, noch nicht optimiert, aber es läuft. Es gibt ein Problem, das ich nicht finden kann. Xprofan stürzt unregelmäßig ab, Manchmal kann man klicken und klicken und es passiert gar nichts. Manchmal stürzt es schon nach wenigen Klicks ab. Ist unerklärlich da ja alles über die gleichen Routinen läüft. Ich habe es nun aufgegeben, da es somit unbrauchbar ist und den Code begelegt. Vielleicht findet ja jemand heraus, wie es stabil wird. Fehler scheinen keine vorhanden zu sein, da weder der Inspector noch XPSE etwas zu bemängeln haben. Im Augenblick läuft es nur unter XProfan 11, da einiges, nicht viel, davon verwendet wird. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 11.09.2008 ▲ |
|
|
|
|
Frank Abbing | Gibst du die PIDL eigentlich irgendwo wieder frei?
Solche Abstürze passieren oft, wenn Strukturen die verkehrte Größe besitzen oder bei erneutem Benutzen vorher nicht vollständig gelöscht wurden. |
|
|
| |
|
|
|
Dieter Zornow | Das kann es nicht sein, da nur über Profan nicht über API eingelesen wird |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 12.09.2008 ▲ |
|
|
|
|
Frank Abbing | Kann nicht sein? Also ich sehe einiges an API in der INC, aber wenn du meinst...
~SHGetFileInfo(a&,0,SHF#,270,16393) -------------Flags: SHGFI_SMALLICON + SHGFI_PIDL
Das erzeugt ein PIDL-Handle, und meines Erachtens nach musst du das freigeben. |
|
|
| |
|
|
|
Dieter Zornow | Ja du hast recht, 1 Funktion gibt ein PIDL (SHGetSpecialFolderLocation), die anderen jeweils nur die Icons. Das dürfte aber nicht das Programm stören, da das nur jeweils 1 x am Programmanfang aufgerufen wird. Die Funktion die du meinst gibt eigentlich auch kein PIDL zurück
SHGFI_PIDLIndicates that pszPath is the address of an ITEMIDLIST structure rather than a path name.
Ich denke das Problem liegt mehr bei XProfan, denn selbst wenn ich mir den Speicher zuknallen würde und alles andere einwandfrei läuft, sollte das Programm ebenfalls laufen und nicht abstürzen. |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 12.09.2008 ▲ |
|
|
|
|
Dieter Zornow | ich denke ich habe den Fehler abgegrenzt. es ist die Funktion die den Klick auf das Kreuz ermöglicht. Diese braucht man aber ansonsten muss man erst direkt den Eintrag anklicken und den Eintrag füllen, bevor die Klicks auf Kreuz Wirkung zeigen. Man braucht also hier nur etwas besseres dann gehts, mir fällt aber gerade nichts mehr ein.
Das ist der Übeltäter KompilierenMarkierenSeparieren
proc Getitem holt über das Kreuz
parameters sel&
declare hit#:dim hit#,16
declare po#:dim po#,8
clear hit#:clear po#
GetCursorPos(po#)
ScreenToClient(tv&,po#)
Long hit#,0=Long(po#,0)
Long hit#,4=Long(po#,4)
Long hit#,8 = 8 Tvht_onitemindent
Long hit#,12 = sel&
var pos& = sendmessage(tv&,4369,0,hit#) TVM_HITTEST
dispose hit#,po#
return pos&
endproc
|
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 12.09.2008 ▲ |
|
|
|
|
Frank Abbing | Deswegen ja meine Vermutung im vorvorhergehenden Posting. Solche unvermittelten Abstürze riechen förmlich nach einer Speicherüberschreibung oder falscher Initialisierung. Vielleicht auch einer fehlenden Sicherheitsabfrage, ob eine API tatsächlich das gewünschte Ergebnis geliefert hat. |
|
|
| |
|
|
|
Uwe ''Pascal'' Niemeier | Hallo Dieter!
Bin mir nicht sicher, wo der Fehler liegt; die veröffendlichte Demo ist ja schon etwas älter...
Bei neueren Versionen (unter XProfan 10) verwende ich SubClassing, um nach der Message TVN_ITEMEXPANDINGW zu fischen. Wenn diese auftritt, enthält der 4. Parameter der WindowProc (LParam) einen Pointer auf eine NMTREEVIEW-Struktur. NMTREEVIEW wird z.B. auch bei Selektion eines Items verwendet und enthält Infos zum aktuellen und zum vorher aktiven Item.
Die Stuktur besteht grob gesagt aus einer NMHDR-, zwei TVITEM- und einer POINT-Struktur Stark vereinfacht und nicht lauffähig (!!) sähe das für XProfan 10 etwa so aus: KompilierenMarkierenSeparierenstruct NMTREEVIEW=hwndFrom&,idFrom&,code&,action&,
maskO&,ItemO&,stateO&,stateMaskO&,TextO&,TextMaxO&,ImageO&,SelectedImageO&,ChildrenO&,ParamO&,
maskN&,ItemN&,stateN&,stateMaskN&,TextN&,TextMaxN&,ImageN&,SelectedImageN&,ChildrenN&,ParamN&,
x&,y&
--Die Bezeichnungen habe ich willkührlich gewählt: O=Old ; N=New
dim TvN#,NMTREEVIEW
proc DlgProc------------------------------------DlgProc-------------------------------------
parameters wnd&,msg&,wparam&,lparam&
if msg&=~WM_NOTIFY
TvN#=lparam&
if TvN#.Code&=~TVN_ITEMEXPANDINGW
TvItem&=TvN#.ItemN&----TvItem&: Eintrag, dessen "+" geklickt wurde
---Weitere Aktionen, z.B. sendmessage(%hwnd,5000,0,0)
endif
endif
return ~CallWindowProc(DlgProc&,wnd&,msg&,wparam&,lparam&)
endproc-------------------------------------------------------------------------------------
Sollte der geklickte Eintrag noch keine Untereinträge haben, werden diese eben nachgeladen. Zu testen übrigens mit SendMessage(Tv&,~TVM_GETNEXTITEM,~TVGN_CHILD,Item&) (Gibt das Handle des 1. ChildItems zurück)
Noch was: Um Ereignisse per SubClassing abzufragen, sende ich meist aus der WindowProc heraus eine selbstdefinierte und als UserMessage angemeldete Message ans Hauptfenster, um das WaitInput in der Haupteingabeschleife zu durchbrechen. Abhängig von dieser Message (oder ihren Parametern) werden dann irgendwelche Aktionen ausgelöst.
Universelles lauffähiges Snipped hab ich im Moment leider nicht zur Hand Hoffe es hilft trotzdem
SeeYou Pascal |
|
|
| |
|
|
|
Dieter Zornow | @Uwe, Danke dir, ich werde es mal ausprobieren ob es was wird. Wichtig ist halt, dass es unter jedem Windowstyle läuft.
Gruß
Dieter |
|
|
| Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2 | 15.09.2008 ▲ |
|
|
|