MaxGUI - Treeview Item einen Type zuweisen?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: MaxGUI - Treeview Item einen Type zuweisen?

BeitragMo, Jun 18, 2012 16:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe mal wieder ein Problem mit der TreeView in BlitzMax:
Ich habe einen Type TFile, dieser sieht wie folgt aus BlitzMax: [AUSKLAPPEN]
Type TFile
Field Name:String
Field ID:String
Field Typ:Int
Field Size:Int
End Type

Global FileList:TList = CreateList()


Nun kann der Benutzer durch anwählen des Menüpunktes "Datei hinzufügen" eine neue Datei hinzufügen. Die Funktion dazu sieht wie folgt aus BlitzMax: [AUSKLAPPEN]
Function TV_AddFile(Name:String, Size:Int)
Local TempNode:TGadget = SelectedTreeViewNode(mw_archivsicht)
If(TempNode = Null)
AddTreeViewNode(Name, mw_stdarchiv, 0)
Else
AddTreeViewNode(Name, TempNode, 0)
EndIf
Local TempObj:TFile = New TFile
TempObj.Name = Name
TempObj.ID = ID
TempObj.Size = Size
ListAddLast(FileList, TempObj)
End Function

(Zur Erklärung:
- mw_archivsicht: Dies ist die TreeView
- mw_stdarchiv: Dies ist das StandartArchiv (Der Oberste Knoten)
- Name: Hier wird der Name übergeben (Das ergebnis von StripDir(Requestfile(...)))
- Size: Hier wird die Größe der Datei übergeben (Das Ergebnis von Filesize(...)))

Jetzt möchte ich die ID herausfinden, die das Objekt kriegen soll. Diese ist wie folgt aufgebaut:
user posted image

Dazu muss ich herausfinden, welche ID das Verzeichnis in dem die Datei enthalten ist, bekommen hat, um dann die Einträge in dem Verzeichnis zu zählen und den wert dann hinter die andere ID - getrennt durch einen Punkt - zu schreiben. Wie kriege ich das raus? Ich kann ja nicht einfach die Liste durchgehen und nach dem Namen des momentan angeklickten Nodes suchen, da ja auch mehrere Objekte den gleichen Namen haben können...

(Ich hoffe man kann mein Problem verstehen Embarassed )
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Lobby

BeitragMo, Jun 18, 2012 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Nodes von TreeViews der MaxGUI sind meines Wissens nach TGadget-Objekte. Diese besitzen für diese und ähnliche Zwecke ein Feld extra:Object, in welchem du beispielsweise die ID als String oder in einer anderen Klasse speichern kannst.
Beim Erstellen der Verzeichnisse also kannst du einfach die ID in diesem Feld speichern, und später beim Abrufen des ausgewählten Nodes wieder auslesen.

Sieh dir hierzu am besten auch die Befehle SetGadgetExtra und GadgetExtra an, welche eben dieses Feld verwenden.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Xeres

Moderator

BeitragMo, Jun 18, 2012 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Speicher nicht den ID String sondern gleich das richtige TFile-Objekt - das unnötige heraussuchen kannst du sparen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Hummelpups

BeitragMo, Jun 18, 2012 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
zusätzlich, um die lesbarkeit zu erhöhe würde ich dann die führenden
Nullen entfernen. Außerdem steht im Titel schon v1.0? ist zwar offtopic
aber wozu versionieren, wenn von vornherein eh schon 1.0 feststeht :>


und wenn es darum geht, wie du so eine ID bilden kannst:

bau eine funktion, definieren einen String,
gehe die childs des funktionsparameter Nodes durch der dein TFile sucht.
als start gibst du den rootpunkt des Treeviews an, das alle "Top-Level"-Nodes ohne
parent (bis auf root) durchgegangen werden,
ist das ausgewählte Node in einem Ordner dieser Nodes, füge die ID
an den String an. übergib den String an die gleiche funktion (rekursion) und als ausgangspunkt
den verzeichnis node usw. am ende gibt jedes programm die ID zurück und die
zuerst aufgerufene funktion (sollte sich erst beenden, wenn alle anderen rekursions-funktionen
durchlaufen worden) gibt den endgültigen string zurück


Treeviews haben - afaik - kein extra Objekt (zumindest in meiner BMax version) und wenn das bei
dir auch der fall ist, kannst du die

Code: [AUSKLAPPEN]
gadget=addTreeViewNode
mapInsert(map,gadget,inst:TFile)


erstellten gadgets in einer TMap mit den TFile instanzen mappen und mit

Code: [AUSKLAPPEN]
MapValueForKey(map,TGadget( EventExtra() ))


wieder suchen

EDIT: alles klar, die aktuellen Versionen von maxGUI haben den extra parameter

Grüße
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

jsp

BeitragMo, Jun 18, 2012 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie Xeres bereits gesagt hat, man speichert das TFile object im GadgetExtra, alles andere ist viel zu aufwendig.
Bleibt eigentlich nur anzumerken, dass das TGadget auch noch ein Context Feld besitzt. Das wurde von vielen benutzt bevor das Extra Feld entstanden ist. Es hat kein Getter und Setter und deshalb ist das Extra Feld immer vorzuziehen, aber wie es manchmal eben ist, kann es trotzdem sehr hilfreich sein. Es kann bei allen Gadgets benutzt werden ausser dem TextField und der TextArea, die benutzen es für ihren Filter.
Möchte man zwei Objecte oder ein Object und ein String speichern, braucht man keine extra Klasse anlegen oder sich sonst wie verrenken, das ist oft sehr praktisch.
MYNode.Context=Pfad$
S:String=String(MyNode.Context)
Logic Gui Professional a Gui Designer for MaxGui
 

CO2

ehemals "SirMO"

BeitragDi, Jun 19, 2012 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok,
Das mit dem Extra-Objekt habe ich noch nicht wirklich verstanden... Habe nun folgende Funktionen gebastelt:

Datei hinzufügen BlitzMax: [AUSKLAPPEN]
Function TV_AddFile(Name:String, Size:Int)
SizeOfArchive = SizeOfArchive + Size
Local TempNode:TGadget = SelectedTreeViewNode(mw_archivsicht)
Local TempObj:TFile = New TFile
TempObj.Name = Name
TempObj.ID = ID 'Hierfür wird noch eine Funktion geschrieben
TempObj.Size = Size
ListAddLast(FileList, TempObj)
If(TempNode = Null)
AddTreeViewNode(Name, mw_stdarchiv, 0, TempObj)
Else
AddTreeViewNode(Name, TempNode, 0, TempObj)
EndIf
End Function

(Erklärung: Siehe oben)

So, jetzt habe ich aber ein Problem beim Informationen-wieder-auslesen, hier meine momentane Funktion (bei der das Programm immer abschmirt Embarassed ) BlitzMax: [AUSKLAPPEN]
Function TV_GetInformation()
ShowGadget(FileInfoWindow)
Local TempNode:TGadget = SelectedTreeViewNode(mw_archivsicht)
If(TempNode <> Null)
AddGadgetItem(fi_InfoBox, "Name: " + TempNode.Name)
AddGadgetItem(fi_InfoBox, "ID: " + TempNode.ID)
If(TempNode.Typ = 1)
AddGadgetItem(fi_InfoBox, "Typ: Datei")
AddGadgetItem(fi_InfoBox, "Größe: " + TempNode.Size)
Else
AddGadgetItem(fi_InfoBox, "Typ: Verzeichnis")
EndIf
EndIf
End Function

(Erklärung: - FileInfoWindow: Ist ein Extra-Fenster, welches eine Listbox enthält. Hier werden die Informationen zur ausgewählten Datei angezeigt.
- fi_InfoBox: Die oben genannte Listbox)

Wie kann ich denn die Daten aus dem Extra-Parameter wieder auslesen?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

ZEVS

BeitragDi, Jun 19, 2012 16:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Das mit dem Extra-Objekt habe ich noch nicht wirklich verstanden...

Das Extra-Objekt ist ein sehr nützlicher Wert, der zu jedem Gadget angibt, was du als Programmierer damit assoziierst.
Mit SetGadgetExtra weist du ein Objekt zu; mit GadgetExtra liest du es wieder aus. Außerdem gibt es mit jedem Event ein Extra Feld (CurrentEvent.extra bzw. EventExtra()), dass genau diesen Wert enthält (der GadgetExtra-Wert von der Event-Source).
Der Extra-Wert kann (manchmal) auch beim Erstellen des Gadgets angegeben werden.

ZEVS
 

CO2

ehemals "SirMO"

BeitragDi, Jun 19, 2012 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Dem Gadget habe ich ja Extra-Objekt zugewiesen (Siehe TV_AddFile - Funktion). Nur habe ich momentan das Problem, dieses Extra-Objekt wieder "auszulesen". Ich habe mal ein wenig rumprobiert, leider ohne Erfolg... Hier die beiden Funktionen:
1.) TV_AddFile BlitzMax: [AUSKLAPPEN]
Function TV_AddFile(Name:String, Size:Int)
SizeOfArchive = SizeOfArchive + Size
Local TempNode:TGadget = SelectedTreeViewNode(mw_archivsicht)
Local TempObj:TFile = New TFile
TempObj.Name = Name
TempObj.ID = ID
TempObj.Size = Size
ListAddLast(FileList, TempObj)
If(TempNode = Null)
AddTreeViewNode(Name, mw_stdarchiv, 0, Object(TempObj))
Else
AddTreeViewNode(Name, TempNode, 0, Object(TempObj))
EndIf
End Function


2.) TV_GetInformation BlitzMax: [AUSKLAPPEN]
Function TV_GetInformation()
ShowGadget(FileInfoWindow)
Local TempNode:TGadget = SelectedTreeViewNode(mw_archivsicht)
If(TempNode <> Null)
Local TempObj:TFile = New TFile
TempObj = TFile(GadgetExtra(TempNode))
AddGadgetItem(fi_InfoBox, "Name: " + TempObj.Name)
AddGadgetItem(fi_InfoBox, "ID: " + TempObj.ID)
If(TempObj.Typ = 1)
AddGadgetItem(fi_InfoBox, "Typ: Datei")
AddGadgetItem(fi_InfoBox, "Größe: " + TempObj.Size)
Else
AddGadgetItem(fi_InfoBox, "Typ: Verzeichnis")
EndIf
EndIf
End Function


Wenn ich dann den Code ausführe und die Informationen zu einer Datei einsehen will, bekomme ich folgenden Fehler Zitat:
Unhandled Exception:Attempt to access field or method of Null object

Markiert wird dann die Zeile BlitzMax: [AUSKLAPPEN]
AddGadgetItem(fi_InfoBox, "Name: " + TempObj.Name)
(In der TV_GetInformation - Funktion)
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Hummelpups

BeitragDi, Jun 19, 2012 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
auch wenn ich dem extra einen String zuweise und es anzeigen lasse,
ist extra="". Hab dann mal bei meinem Projekt nachgeschaut und es
so gemacht, wie bereits erklärt und in einer TMapdie gadgets den TFile
(in deinem Fall) zugeordnet und dann gesucht

Code: [AUSKLAPPEN]
Import MaxGui.Drivers
Strict

Local window:TGadget=CreateWindow("My Window",50,50,240,240,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS)
Local treeview:TGadget=CreateTreeView(5,5,ClientWidth(window)-10,ClientHeight(window)-10,window)

Local root:TGadget=TreeViewRoot(treeview)

Local help:TGadget=AddTreeViewNode("Help",root)
AddTreeViewNode "Topic 2",help,,"Hallo"

While WaitEvent()
   Print CurrentEvent.ToString()
   Select EventID()
   Case EVENT_WINDOWCLOSE
      End
   End Select
Wend


Auch ein Update auf die aktuellste Maxgui version hilft bei mir nicht :/
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group