ImageView ... TreeView

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

ImageView ... TreeView

Beitrag von AUGE_OHR »

hi,

ich probiere mein "native" DXE_TreeView aus und kam zum Alaska Sample
c:\ALASKA\XPPW32\Source\samples\apps\ImgView\ImgView.prg

was ich nun nicht richtig verstehe ist der Ansatz von

Code: Alles auswählen

METHOD DirSelector:fillTree( oItem )
die Methode wird durch den Callback Slot o:itemSelected, von TreeView und Listbox, ausgeführt.

Code: Alles auswählen

METHOD DirSelector:create( oParent, oOwner, aPos, aSize, aPresParam, lVisible
   ::dirTree:itemSelected := {|oItem| ::fillTree( oItem ) }
   ::driveList:xbpListBox:itemSelected := {|| ::fillTree() }
   // am Anfang 1 x 
   ::fillTree( ::dirTree:rootItem )
am Anfang fülle ich über das o:rooItem den Tree.
wenn ich nun auf ein Node clicke -> oItemSelect.

Code: Alles auswählen

aItems    := ::dirTree:rootItem:getChildItems()
::dirTree:LockUpdate( .T. )
AEval( aItems, {|obj| ::dirTree:rootItem:delItem(obj) } )
hm ...
Frage : warum wird hier "gelöscht" ? ( Antwort später ? )

ich habe nun lange die Logfile analysiert und bin mir durchaus klar "was" da passiert ... nur die "Logik" ( OOP ?) sehe ich nicht ?
IMHO hat das ganze noch einen Fehler :
wenn man vom o:xbpListBox:itemSelected kommt, also das Laufwerk wechselt, dann "müsste" man ja auf "D:" statt "C:" sein :?:

Code: Alles auswählen

//
// NEED for DXE when change Drive ???
//
IF cLastDrive <> cDrive
   IF oItem == NIL
      //
      // komme von :xbpListBox:itemSelected
      //
      ::dirTree:rootItem:ClearAll()
   ENDIF
   cLastDrive := cDrive
ENDIF
und dann kommt das

Code: Alles auswählen

/*
 * Die Treeview beginnt mit dem Laufwerksbuchstaben
 */
 oParent := ::dirTree:rootItem:addItem( cDrive, ICON_DRIVE, ICON_DRIVE,ICON_DRIVE, ,cDrive)
"das" der TreeView "immer" mit einem Laufwerksbuchstaben beginnt ist klar ... aber was ist dem "alten" ?
im oben gezeigten AEval() werden doch nur Childs (recursive) "gelöscht" ...
die schliessen den "obersten" Parent = Root doch nicht mit ein , oder ?

Frage : ist das "erste" o:addItem "der Root" oder gibt es noch was "davor" ?

das "löschen" der Items ist also bei ImageView.EXE notwendig damit man den Tree wieder "neu" aufbauen kann ... hm ... :-k
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ImageView ... TreeView

Beitrag von AUGE_OHR »

den ersten Aufbau mit dem "native" Control ging schnell. Nun geht es beim click um den nächsten Aufbau.

ImageView.EXE will also erst "löschen" um dann neu aufzubauen.
Mein DXE_Treeview "erwischt" aber scheinbar nicht alle Child zu "löschen" -> die Nodelist wird länger und hat "doppelte" Einträge :(

Code: Alles auswählen

aItems    := ::dirTree:rootItem:getChildItems()
das o:rootItem benötige ich ja um an die TreeViewItem Method zu kommen.

Frage : die aItems enthalten doch die "obersten" Childs des Root-Item. Wenn ich per AEVAL() ein Node lösche ... dann auch die Childs von dem Node ?
Die Methode entfernt ein XbpTreeViewItem-Objekt, das mit :addItem() als Untereintrag angefügt wurde. Dadurch kann eine Baumstruktur dynamisch verwaltet werden.
obwohl nichts im Helpfile darüber steht wäre das Verhalten wohl "normal" für ein TreeView ... hm ... :-k

das würde auch erklären warum meine Nodelist immer grösser wurde ... die Childs eines Node werden in meiner DXE_TreeView Version (noch) nicht automatisch gelöscht ... :banghead:
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: ImageView ... TreeView

Beitrag von AUGE_OHR »

die Childs eines Node werden in meiner DXE_TreeView Version (noch) nicht automatisch gelöscht ... :banghead:
tatsächlich waren es die Xbase++ Sub-Dir Objecte die ja nicht "automatisch" gelöscht werden wie beim TreeView.
der API Befehl hat den Node und alle Sub-Nodes in der Treeview Anzeige gelöscht aber von Xbase++ Objecten wusste er nichts.

nach der rekursiven Erweiterung löscht er nun sauber mit AEVAL() alles bis auf das 1st. Rootitem was ich abfangen kann. weiterhin bleibt aber die Frage bei einem Laufwerkswechsel. wie kann er da, ohne Workaround, den alten "C:" Tree löschen wenn ich auf "D:" wechsle ?

soweit läuft DXE_TreeView nun auch mit Alaska's ImageView.EXE Demo, mit den Workarounds ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

TreeView:rootItem

Beitrag von AUGE_OHR »

ich hänge das mal mit hier in diesen Thread weil TreeView

über TreeView:rootItem, welches ein TreeViewItem ist, komme ich ja an deren Method und iVar

Code: Alles auswählen

a.) 
METHOD DXE_TreeView:DoItFromRoot()
   ::rootItem:MachMal()

b.) 
METHOD DXE_TreeViewItem:blabla()
   ::MachMal()

METHOD DXE_TreeViewItem:MachMal()
RETURN ::getChildItems()
ich habe in diesem Beispiel extra keine Parameter übergeben ... das wäre ja zu einfach ;)

Frage :
wenn man o:DoItFromRoot() ausführt "sollte" er die "obersten" Root Node Items als Childs bekommen, oder ?
wenn ich "von" einem Node ( = DXE_TreeViewItem ) komme sollte ich nur die Childs von "dem" Node bekommen, oder ?

... und wie unterscheide ich "das" in meiner "native" TreeView Control Class :?:
gruss by OHR
Jimmy
Antworten