Panelgadget nach Button klick aufrufen
Panelgadget nach Button klick aufrufen
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
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 ]
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
Hallo X360 Andy,
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.
Vielen Dank für den Hinweis.X360 Andy hat geschrieben:DisableGadget(#Gadget, Status) ?
oder auch
Hidegadget(#Gadget, Status)
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 ]
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
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.
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
@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
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²
Hallo Zusammen,
vielen Dank für Eure Antworten.
Hier z. B. der Code den ich benutze:
@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.
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()
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 ]
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
> 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:
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
Hallo Andesdaf,
Vielen Dank für den Tip.Andesdaf hat geschrieben:Code: Alles auswählen
UseGadgetList(WindowID(#Window) AddGadgetItem(#Panel,-1,"Neuer Tab") CloseGadgetList()
Gruß, TheSaint
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]
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 :
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
Hallo Zusammen,
ich habe aus der Hilfe jetzt mal folgendes Beispiel:
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.
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
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 ]
___________________________
[ XP Prof SP 3 | Vista | PB 4.30 ]