Panelgadget nach Button klick aufrufen

Anfängerfragen zum Programmieren mit PureBasic.
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Panelgadget nach Button klick aufrufen

Beitrag von TheSaint »

Hallo Zusammen,

ich habe folgende Frage zu den Panelgadgets:

Das Hauptpanelgadet umfasst mehrere Reiter.
In einem Panelgadget lasse ich die Tabellen einer ganzen Datenbank
als Panelgadget mit mehreren Reitern für jede Tabelle mit Inhalt anzeigen.

Der Aufruf beim Start des Programmes dauert, da ich ja alle Tabellen einlese, sehr lange.

Gibt es die Möglichkeit so ein Panelgadget nur aufzurufen, wenn man einen Button oder ähnliches drückt? Erst dann werden die Tabellen eingelesen und in das Panelgadget geschrieben?

Zur Zeit mache ich das während des: If OpenWindow ...

Kann ich das OpenWindow vom erstellen der Gadgets trennen?
Oder wie macht man sowas?
Ich weis ja auch nicht unbedingt wieviele Tabellen in der Datenbank sind.

Weis nicht wie ich das hinkriegen könnte.

Schon mal vielen Dank für Eure Hilfe
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

DisableGadget(#Gadget, Status) ?
oder auch
Hidegadget(#Gadget, Status)
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo X360 Andy,
X360 Andy hat geschrieben:DisableGadget(#Gadget, Status) ?
oder auch
Hidegadget(#Gadget, Status)
Vielen Dank für den Hinweis.
Leider hilft mir das überhaupt nicht weiter.

Ich starte ja mit: If OpenWindow ...
Während des erstellens des Fensters, erstelle ich auch
Panelgadgets und in einem Panelgadget lasse ich
eine komplette Datenbank anzeigen.

Nur während des Startens mit: If OpenWindow ...
wird die Datenbank ausgelesen.
Meine Frage ist jetzt kann ich das auch später
nach dem Anzeigen des Hauptfensters machen?

Nochmals vielen Dank für Deine Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja natürlich kannst du das, wo ist dein Verständnisproblem?

du kannst jederzeit UseGadgetList verwenden, um in ein Fenster oder ein Panel weitere Gadgets hinzuzufügen.
auch dynamisch, also eine beliebige Anzahl Gadgets mit #PB_Any erzeugen.
musst nur die Rückgaben anständig puffern, z.B. in einer Liste.

etliche Erzeuge- oder Darstellungs- Kommandos erzeugen Events,
das Ergebnis ist also erst richtig zu sehen, wenn diese verarbeitet wurden,
nachdem mehrfach (Wait)WindowEvent ausgeführt wurde.

und noch eine Kleinigkeit:
If OpenWindow
ist ja ganz nett, es ist wichtig, Rückgabewerte zu checken,
aber riesige If-Reichweiten erhöhen nicht gerade die Lesbarkeit.
eine sinnvolle Alternative ist z.B.

Code: Alles auswählen

If Not OpenWindow( ...
  MessageRequester( ...
  End
EndIf
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

@TheSaint:

u.U. wäre folgende Vorgehensweise eine Alternative für Dich:

Während des Erstellens Deines Panelgadgets liest Du nur die Tabellennamen
aus. Somit kannst Du Dir schon Deine Panels zusammenbauen. Das geht
ratz-fatz.

Du holst Dir erst die Tabellendaten (und trägst sie in Dein ListIconGadget
ein), wenn jemand auf ein Panel klickt.

Somit werden auch nur die Daten geladen, die der User sehen möchte (kann
ja sein, dass er sich nur für die Daten einer Tabelle interessiert; dann wäre
es sinnlos, die Daten aller Tabellen zu laden)

Grüße ... Kiffi
a²+b²=mc²
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Zusammen,

vielen Dank für Eure Antworten.

Hier z. B. der Code den ich benutze:

Code: Alles auswählen

            AddGadgetItem(#Panel10,-1,"DB Tabellen") ;
                ContainerGadget(#Pan6, 0, 0, 679, 374, #PB_Container_Flat)
                PanelGadget(#Panel13, 5, 5, 675, 350) 
                    DBOpenOrClose(0)    ;***** Datenbank öffnen
                    GetTables(db)   ;***** Tabellen in LinkedList einlesen
                    ResetList(Tabelle())
                    SortStructuredList(Tabelle(),#PB_Sort_NoCase ,OffsetOf(Tabelle\Tabellenname), #PB_Sort_String)
                    FirstElement(Tabelle())
                    Tabelle.s = Tabelle()\Tabellenname.s
                    sql.s = Tabelle()\Suchstring
                    ;***** Tabellenregister erstellen
                    TabGadGesamt = ListSize (Tabelle())
                    For tabgad = 1 To ListSize (Tabelle())
                        AddGadgetItem (#Panel13, -1, tabelle)
                        ListIconGadget(100+tabgad,10, 10, WindowWidth(#Window_0)-50, WindowHeight(0)-124,"",22,#PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect|#PB_ListIcon_MultiSelect|#PB_ListIcon_HeaderDragDrop)
                        SendMessage_(GadgetID(100+tabgad), #LVM_SETEXTENDEDLISTVIEWSTYLE, 0, #LVS_EX_LABELTIP)
                            ;**** Spaltenüberschriften erstellen
                            For Counter = 0 To DatabaseColumns(db) - 1
                                AddGadgetColumn(100+tabgad, Counter, DatabaseColumnName(db, Counter), 90)
                            Next
                                ;***** Tabelleninhalte einfügen
                                While NextDatabaseRow(db)
                                    DatabaseLine.s = ""
                                        For Counter = 0 To DatabaseColumns(db) - 1
                                            DatabaseLine + GetDatabaseString(db, Counter)
                                            If Counter < DatabaseColumns(db) - 1
                                                DatabaseLine + #LF$
                                            EndIf
                                        Next
                                    AddGadgetItem(100+tabgad, -1, DatabaseLine)
                                Wend                                
                        NextElement(Tabelle())
                        Tabelle.s = Tabelle()\Tabellenname.s
                        sql.s = Tabelle()\Suchstring
                        DatabaseQuery(db, sql)
                        ;***** Hier werden die Spalten zum Sortieren vorbereitet
                        PureLVSORT_SelectGadgetToSort(100+tabgad, #PureLVSORT_ShowClickedHeader_IconLeft)
                        ;PureLVSORT_SortListIconNow(100+tabgad, 0, 1)
;                         *ListBuffer = PureLVSORT_SaveListIconToMem(100+tabgad)
;                         PureLVSORT_DefineFilterCallback(@MyFilterCallback())
;                         PureLVSORT_SetFilter(100+tabgad)
                    Next tabgad
                    FinishDatabaseQuery(db)
                    ContainerGadget(#Pan7, 0, 0, 669, 324, #PB_Container_Flat)
            CloseGadgetList()
@Kaeru Gaman: Leider habe ich sowas noch nie gemacht: Gadgets dynamisch erzeugt.
Das muss ich mir noch ansehen und verstehen, wie das geht.
So das wiederfinden dann der Register im Panel ...
Vielen Dank für den Tip mit dem: If Not OpenWindow(...

@Kiffi: Die Idee hört sich super an. Nur, da fehlt mir noch das Verständnis, wie ich das umsetzen kann. Ich müsste, wenn ich das richtig verstehe, beim Anklicken auf ein Reiter(TabellenName) die Datenbank wieder öffnen eine SQL-Abfrage erstellen und dann die Daten in das ListIconGadget einlesen.

Schon mal vielen Dank für Eure Hilfe.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Beitrag von Andesdaf »

> So das wiederfinden dann der Register im Panel ...
Wenn du deine Panel-Register mit -1 erzeugst, wird trotzdem numeriert.
Das erste ist dann 0, das zweite 1 usw.

Damit du wieder auf das Gadget zugreifen kannst:

Code: Alles auswählen

UseGadgetList(WindowID(#Window)
  AddGadgetItem(#Panel,-1,"Neuer Tab")
CloseGadgetList() 
Win11 x64 | PB 6.20
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Andesdaf,
Andesdaf hat geschrieben:

Code: Alles auswählen

UseGadgetList(WindowID(#Window)
  AddGadgetItem(#Panel,-1,"Neuer Tab")
CloseGadgetList() 
Vielen Dank für den Tip.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Warum laedst du die Daten nicht einfach vor dem erstellen des Fensters?
Damit der User dann weiss dass das Fenster nicht eingeschlafen ist, zeigst
du, waehrend des ladens der Daten, ein Splashfenster an.

Beispiel :

Code: Alles auswählen

EnableExplicit

Structure Splash
  close.i
  status.i
EndStructure

Procedure ViewSplash(*Splash.Splash)
  
  Protected Splash.i
  Protected Status.i
  Protected event.i
  
  Splash = OpenWindow(#PB_Any,0,0,380,23,"App wird geladen ...",#PB_Window_BorderLess|#PB_Window_ScreenCentered)

  Status = ProgressBarGadget(#PB_Any,0,0,380,23,0,10000)

  Repeat    
    event = WaitWindowEvent(20)
    
    If event = 0
      SetGadgetState(Status, *Splash\status)
    EndIf 
    
  Until *Splash\close

  CloseWindow(Splash)
  
EndProcedure 

Procedure Main()
  Protected Splash.Splash
  Protected SplashThread.i
  Protected Window.i
  Protected event.i
  Protected i.i
  
  SplashThread = CreateThread(@ViewSplash(),@Splash)
  
  ; daten holen start
  For i = 1 To 10000 Step 200
    Splash\status = i
    Delay(50)
  Next 
  ; daten holen ende
  
  ; Splash Fenster schliessen
  Splash\close = #True

  ; warte auf das beenden des Splashthread
  WaitThread(SplashThread)
  
  Window = OpenWindow(#PB_Any,0,0,500,300,"App",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  Repeat    
    event = WaitWindowEvent(10)
    
  Until event = #PB_Event_CloseWindow  
  
EndProcedure:Main()

End
TheSaint
Beiträge: 143
Registriert: 21.12.2008 18:59

Beitrag von TheSaint »

Hallo Zusammen,

ich habe aus der Hilfe jetzt mal folgendes Beispiel:

Code: Alles auswählen

  ; Zeigt die Verwendung mehrerer Panels...
  If OpenWindow(0, 0, 0, 322, 220, "PanelGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    PanelGadget     (0, 8, 8, 306, 203)
      AddGadgetItem (0, -1, "Panel 1")
        PanelGadget (1, 5, 5, 290, 166)
          AddGadgetItem(1, -1, "Sub-Panel 1")
          AddGadgetItem(1, -1, "Sub-Panel 2")
          AddGadgetItem(1, -1, "Sub-Panel 3")
        CloseGadgetList()
      AddGadgetItem (0, -1,"Panel 2")
        ButtonGadget(2, 10, 15, 80, 24,"Button 1")
        ButtonGadget(3, 95, 15, 80, 24,"Button 2")
    CloseGadgetList()
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Folgende Frage nun dazu:

Wie kann ich denn nun z. B. nachdem das Fenster mit den Panels erstellt wurde, ich z. B. einen Button drücke, ein Sub-Panel 4 erstellen, oder weitere Panels auf der obersten Ebene???

UseGadgetList? Wie setze ich an? wo muss ich den z.B. AddGadgetItem setzen?
Ich kapiere es einfach nicht.
Und wie mache ich sowas dynamisch???

Sorry für diese Fragen. Schnall es einfach nicht.

Schon mal vielen Dank für Eure Hilfe und besonders für Eure Geduld mit mir.
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Antworten