Deutsch
Forum

Treeview

 

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.

6 kB
Hochgeladen:11.09.2008
Ladeanzahl91
Herunterladen
 
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.
 
11.09.2008  
 




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.
 
12.09.2008  
 




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.
 
12.09.2008  
 




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:
KompilierenMarkierenSeparieren
struct 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
 
15.09.2008  
 




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  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.934 Betrachtungen

Unbenanntvor 0 min.
Member 862464117.04.2024
RudiB.07.04.2022
H.Brill04.01.2022
Stephan Sonneborn12.04.2012
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie