TLink verschieben

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Schoppy

Betreff: TLink verschieben

BeitragMi, Dez 28, 2011 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich lege in einer function einen neuen List Eintrag an und speicher den TLink gleich mit:

NewGadget = New GUItype
NewGadget.link = GadgetList.AddLast(NewGadget)

Soweit so gut.

Jetzt werden mehrere Gadgets angelegt vom Typ WINDOW.

Ich möchte jetzt erreichen das immer das aktive Window zu letzt gezeichnet wird. Da es ja in den Vordergrund soll.

Nach lägerem Stöbern hier im Forum habe ich schon mal gelernt, dass der TLink mit gesichert werden sollte damit dieser nicht gesucht werden muss.

Folgende Function habe ich geschrieben welche aber lediglich den TLink löscht aber nicht unten anhängt:

Code: [AUSKLAPPEN]

Function sort_List(id:Int)

Local gadgetList_link:TLink

'Suche erst den Link zum Window
For Local Gadgets:GUItype = EachIn GadgetList
   If Gadgets.id = id
   gadgetList_link = Gadgets.link
   Exit
   EndIf
Next

'Lösche den alten Link
RemoveLink(gadgetList_link)

'Verlinke neu ganz unten   
gadgetList_link:TLink = GadgetList.AddLast()

EndFunction


Das Problem ist das der AddLast() Befehl ein Object erwartet.
Ich habe aber nur den TLink.

Wie lautet der richtige Befehl um einen TLink anzuhängen?

2.) Wenn ich schon mal weiter überlege, wenn später mal Buttons, Panels etc. hinzukommen müssten diese ja ebenfalls umsortiert werden.

Meine Idee dazu, in diesem WINDOW Type Eintrag eine List anlegen welche die TLinks von diesen weiteren Gadgets speichert.

Werden diese imType angelegten TLinks dann ebenfalls ans Ende der Hauptlist verschoben?

Gruss
Schoppy
 

PhillipK

BeitragMi, Dez 28, 2011 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde es - ungetestet - mal sorum versuchen (nie gemacht, aber blide spuckt mir die befehle aus!)

BlitzMax: [AUSKLAPPEN]

Local obj:Object = TLink._value()
TLink.Remove()
TList.AddLast(obj)


Statt TLink und TList sind hier die entsprechenden variablen zu verwenden Smile
So wie sich das liest, tut das genau das, was du willst.

Aber ich möchte dir noch eine andere möglichkeit ans herz legen: TList.sort()

BlitzMax: [AUSKLAPPEN]
TList.Sort(True, Sortiere)

Function Sortiere:Int(obj1:Object, obj2:Object)
'Return -1 wenn obj1 'größer' obj2
'Return 0 wenn obj1 'gleich' obj2
'Return 1 wenn obj2 'größer' obj1

Local eins:TMeinObjekt = TMeinObjekt(obj1)
Local zwei:TMeinObjekt = TMeinObjekt(obj2)

If eins.isActive Then Return - 1 'eins ist aktiv, -1 zurückgeben (so wirds allerdings 'nach vorne' sortiert, wenn du nicht aufpasst!)
If zwei.isActive Then Return 1 'zwei ist aktiv, 1 zurückgeben (s.o.)

Return 0 'beide sind inaktiv - also sind sie 'gleich' -> 0 zurückgeben.
End Function


Die List.Sort() methode erwartet 2 parameter: "Aufsteigend" sortieren (ich glaube, bei dir sollte es false sein, oder ich bring die parameter durcheinander Very Happy) und eine Funktion.
Diese funktion muss so aufgebaut sein, wie oben angegeben: Rückgabe Int, PArameter1 Object, Parameter2 Object.

In dieser funktion kannst du die inhalte deines types vergleichen und so entscheiden, wo sie "hinsortiert" werden sollen.
Das ist für eine solche simple aufgabe vielleicht noch nicht wirklich notwendig, aber das könnte dir helfen wenn du noch andere sortierkriterien hast und das simple 'hinten anfügen' nichtmehr ausreicht.

Wie gesagt, TLink.remove() und das objekt hinten wieder anfügen sollte reichen. Aber nur so als hintergrundwissen :>

Xeres

Moderator

BeitragMi, Dez 28, 2011 16:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder, man überlädt die Compare-Methode:
BlitzMax: [AUSKLAPPEN]
SuperStrict

Type TTest

Field z:Int

Global list:TList = New TList

Function Create(_z:Int)
Local t:TTest = New TTest
t.z = _z
TTest.list.AddLast(t)
End Function

Function Show()
For Local t:TTest = EachIn TTest.list
Print(t.z)
Next
Print("")
Print("---")
Print("")
End Function

'* Compare-Methode für dieses Objekt anders definieren!
Method Compare:Int(withObject:Object)
Return Self.z - TTest(withObject).z
End Method

End Type


'* Erstellen:
For Local i:Int = 0 To 10
TTest.Create(Rand(1, 100))
Next

'* Unsortiert:
TTest.Show()

'* Sortieren:
TTest.list.Sort()

TTest.Show()
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)

BtbN

BeitragMi, Dez 28, 2011 18:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Was zur folge hätte, dass er nach jedem Fenster anklicken einmal die ganze liste Sortiert, was je nach anzahl der Fenster länger dauert. Einfach den Link löschen und das Fenster neu hinzufügen geht dafür immer gleich schnell, und ist klar zu bevorzugen.
 

Schoppy

BeitragMi, Dez 28, 2011 22:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antworten.

Das funktioniert so leider nicht.

Es kommt die Fehlermeldung:
Expression of type 'Object' cannot be invoked

Was bedeutet _value ?

Wofür steht der _ ?

BladeRunner

Moderator

BeitragMi, Dez 28, 2011 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
_value ist ein Wert ,zzuimindest deutet es der name an, der Unterstrich ist nur als Kenzeichnung dass es eine Objektvariable ist, das ist eine Schreibkonvention und hat keine tiefere Bedeutung.
Der Invoke-Error bedeutet dass versucht wird ein Objekt wie eine Funktion aufzurufen, d.h. Klammern dahinter gesetzt wurden.
Es wäre leichter deine Fehler zu verstehen und zu korrigieren wenn Du den "Geht nicht"-Code mitlieferst. Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group