CreateGadgetList

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
batzilla
Beiträge: 37
Registriert: 17.12.2005 21:44

CreateGadgetList

Beitrag von batzilla »

In der Hilfe steht folgendes:
Hinweis: Es gibt in PureBasic keine getrennte Verwaltung der Gadgetlisten für jedes geöffnete Fenster. Verwenden Sie deshalb auch bei mehreren Fenstern fortlaufend durchnummerierte 'GadgetID's. Oder verwenden Sie die neue #PB_Any Konstante als 'GadgetID'.
Heißt das, dass ich auch bei Verwendung von mehreren Fenstern nur einmal beim erstellen des "Hauptfensters" CreateGadgetList benutze?

Wenn ich mein Hauptfenster erzeuge und dort CreateGadgetList(WindowID(#Hauptfenster)) aufrufe, dann aber ein zweites Fenster erzeuge ohne dort CreateGadgetlist(WindowID(#Fenster2)) aufzurufen werden die Gadgets die fürs neue Fenster gedacht sind im Hauptfenster gezeichnet.

Wie ist es also richtig? Für alle Fenster eine GadgetList oder für jedes Fenster eine eigene?

Batzilla
PB 4.02
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Für alle Fenster jeweils eine Gadgetliste, jedoch keine doppelten IDs!
IDs am besten in einer Enumeration erstellen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
batzilla
Beiträge: 37
Registriert: 17.12.2005 21:44

Beitrag von batzilla »

Danke dir.

Das hatte ich mir schon gedacht und mein Code ist auch so ausgelegt. Allerdings habe ich noch ein Verständnissproblem bezüglich der Erstellung von ListIconGadgets.

Kann man ein ListIconGadget auch wieder komplett entfernen? In meinem Fall möchte ich je nach Benutzerauswahl einen anderen Inhalt dort darstellen, welcher auch noch andere Spaltenanzahlen bzw. Spaltenüberschriften hat.

Also würde ich gerne folgendes realisieren:

Code: Alles auswählen

Select table.s
    Case "Kunden"
      ListIconGadget(#ListIcon, 5, 28, WindowWidth(#MainWindow) - 10, WindowHeight(#MainWindow) * 0.5, "NAME", ColumnWidth("Kunden"), #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
      AddGadgetColumn(#ListIcon, 1, "NUMMER", ColumnWidth("Kunden"))
      AddGadgetColumn(#ListIcon, 2, "ILN", ColumnWidth("Kunden"))
      AddGadgetColumn(#ListIcon, 3, "STANDORT", ColumnWidth("Kunden"))
      AddGadgetColumn(#ListIcon, 4, "VERBINDUNG", ColumnWidth("Kunden"))
    Case "Server"
      ListIconGadget(#ListIcon, 5, 28, WindowWidth(#MainWindow) - 10, WindowHeight(#MainWindow) * 0.5, "GESELLSCHAFTER", ColumnWidth("Server"), #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
      AddGadgetColumn(#ListIcon, 1, "HOSTNAME", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 2, "DOMÄNE", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 3, "FUNKTION", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 4, "IPADRESSE", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 5, "PROTOKOLL", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 6, "BETRIEBSSYSTEM", ColumnWidth("Server"))
      AddGadgetColumn(#ListIcon, 7, "VERSIONSSTAND", ColumnWidth("Server"))
    Case "Aufwahl"
      ListIconGadget(#ListIcon, 5, 28, WindowWidth(#MainWindow) - 10, WindowHeight(#MainWindow) * 0.5, "TIMESTAMP", ColumnWidth("Aufwahl"), #PB_ListIcon_FullRowSelect | #PB_ListIcon_GridLines)
      AddGadgetColumn(#ListIcon, 1, "HOSTNAME", ColumnWidth("Aufwahl"))
      AddGadgetColumn(#ListIcon, 2, "IPADRESSE", ColumnWidth("Aufwahl"))
      AddGadgetColumn(#ListIcon, 3, "PROTOKOLL", ColumnWidth("Aufwahl"))
      AddGadgetColumn(#ListIcon, 4, "BENUTZER", ColumnWidth("Aufwahl"))
      AddGadgetColumn(#ListIcon, 5, "AUFWAHLGRUND", ColumnWidth("Aufwahl"))
  EndSelect
Ich stelle zuerst also beispielsweise die Kunden in einem ListIconGadget dar, danach wähle ich die Server und mein Programm erstellt an der gleichen Stelle meines Fensters wieder ein ListIconGadget mit anderer Spaltenanzahl, anderen Spaltenüberschriften und anderem Inhalt.

Das klappt auch alles, nur nicht mehr wenn ich durch das öffnen einen neuen Fensters eine zweite Gadgetlist erstelle. Sobald ich dieses neue Fenster wieder schließe und abermals Kunden, Server oder Aufwahl auswähle und damit im Hauptfenster das ListIcaonGadget erneut erstelle wird das ListIconGadget nicht neu erstellt sondern das bereits vorhandene um die Spalten meiner zuletzt getroffenen Auswahl ergänzt.

Wie gesagt, passiert nur wenn ich eine zweite GadgetList erstelle die ich in meinem zweiten Fenster verwende.

Jemand eine Idee?
PB 4.02
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

den zusammenhang von "wie/wann/wo" was gelöscht wird, versteh ich nich ganz.
Aber vll solltest du zusätzlich noch "freegadget()" benutzen, bevor du ein neues mit gleicher id erstellst
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Listicongadget löschen ist blödsinn, einfach neu füllen. Statt neu erstellen, fügste einfach

Code: Alles auswählen

ClearGadgetItemList()
ein.

Gadgets während der Laufzeit zerstören und neu erstellen sollte
man unbedingt vermeiden, führt zu flackern, wenns nicht anders geht, alle
gadgets übereineinander und nicht benötigte verstecken.

Code: Alles auswählen

HideGadget()
Um mehrere auf einmal aus/einzublenden kann man auch Container
verwenden, wobei dann nur der Container versteckt wird.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
batzilla
Beiträge: 37
Registriert: 17.12.2005 21:44

Beitrag von batzilla »

a14xerus hat geschrieben:den zusammenhang von "wie/wann/wo" was gelöscht wird, versteh ich nich ganz.
Aber vll solltest du zusätzlich noch "freegadget()" benutzen, bevor du ein neues mit gleicher id erstellst
Ich weiß, ist nicht so einfach nachzuvollziehen. Aber der Tipp freeGadget() war sehr gut. Man, wer such denn in der Hilfe nach freeIrgendetwas wenn er etwas löschen will... Hätte ja mit deleteGadget, removeGadget oder so gerechnet aber die machen ja was anderes.

Ich lösche das ListIconGadget mit freeGadget() bevor ich es neu erstelle. Das brachte allerdings einen neuen Fehler hoch, hier beschwerte sich AddGadgetColumn, dass das ListIconGadget nicht initialisiert sei. Wie gesagt, nachdem ich das zweite Fenster schließe.

Bevor ich das zweite Fenster schließe aktiviere ich nun die GadgetList des Hauptfensters wieder mit UseGadgetList(WindowID(#MainWindow)).

Jetzt läuft wie gewünscht.

@Thomas

Das flackern ist hier zweitrangig, nach erstellen des ListIcons führe ich eine Datenbankabfrage durch, die braucht auch ein klein wenig Zeit.

Ich werd mal schauen, ob ich deinen Vorschlag umsetzte. Ich bin auch kein Freund von unnötigem Code. Danke euch beiden.

Gruß

Michael
PB 4.02
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

ts-soft hat geschrieben:Listicongadget löschen ist blödsinn,[...]
Wiegesagt ich habe es nicht so ganz genau verstanden.. und falls er es in einem anderen fenster benutzen will oder was weiß ich, dachte ich mal, freegadget() könnte i-wie hilfreich sein, weil mans auch nich direkt findet, wenn man nach "delete" oder "remove" sucht
Also wenn du das Gadget in anderer Weise benutzen willst, könntest du es leeren, soll es woanders hin, würde ich es löschen. Im löschen (free) Fall muss es natürlich wieder neu erstellt werden, bevor es wieder befüllt wird
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Wenn Du löscht, dann mußte auch im EventLoop bzw. Callback immer
IsGadget abfragen um Fehler zu vermeiden. Neubefüllen, verschieben,
verstecken usw. sind alles bessere Möglichkeiten.

Fenster die man öfters benötigt sollte man auch lediglich verstecken und nicht
immer neu erstellen.

Freegadget sollte man besser nur dann einsetzen, wenn das Gadget bis
Programmende nicht mehr gebraucht wird. Gadgeterstellung im Eventloop ist
auch nicht so empfehlenswert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten