Seite 1 von 2
Übereinanderliegende Gadgets
Verfasst: 27.02.2018 09:57
von ProgOldie
Hallo,
ich habe ein ListiconGadget mit der GadgetNr LIcNr und ein Gadget mit der GadgetNr ColGadNr. Letzteres kann in das Listicon eingepasst werden. Dabei treten zwei Fälle auf:
Das Gadget mit ColGadNr soll sichtbar und aktiv sein und vor dem ListiconGadget liegen;
Code: Alles auswählen
HideGadget(ColGadNr,0)
DisableGadget(ColGadNr,0)
DisableGadget(LIcNr,1)
SetActiveGadget(LIcNr)
Das Gadget mit ColGadNr soll unsichtbar und nicht aktiv sein, während das Listicon auf z.B. Clicks reagieren soll:
Code: Alles auswählen
HideGadget(ColGadNr,1)
DisableGadget(ColGadNr,1)
DisableGadget(LIcNr,0)
SetActiveGadget(LIcNr)
Eigentlich müssten beide Lösungen korrekt sein. Alles scheint zu klappen, außer wenn es sich um ein ComboBoxgadget handelt. In dem Fall erscheint das der Text der ComboBox, aber die komplette Box erst dann, wenn ich mit der Maus darüber gehe.
Was mache ich falsch? (PB 5.60, Windows10)
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:32
von RSBasic
Kannst du einen funktionierenden, kleinen fertigen Beispielcode zum Testen posten?
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:32
von mk-soft
Überlapende Gadget machen meistens Probleme
Scheint ein probleme mit den neu zeichnen des Gadget zu liegen
Vieleicht hilft dieses. Habe ich aber nicht getestet
Code: Alles auswählen
Procedure RedrawGadget(Gadget)
Protected lpRect.rect
lpRect\left = GadgetX(Gagdet)
lpRect\top = GadgetY(Gadget)
lpRect\right = lpRect\left + GadgetWidth(Gadget)
lpRect\bottom = lpRect\top + GadgetHeight(Gadget)
ProcedureReturn InvalidateRect_(GadgetID(Gadget), @lpRect, #True)
EndProcedure
P.S. Ein Code zum testen von Dir wäre schon Schön.
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:40
von ProgOldie
@RSBasic
Sorry, mehr als 1000 Zeilen.
Ich sitze schon seit Wochen an einer relativ allgemeinen Datenbankanbindung, bei der die Daten der DB in einem ListiconGadget angezeigt und geändert werden können. Bei der Änderung erscheint in der jeweiligen Zelle des ListIcons ein Gadget, das dem Datentyp angepasst ist. (z.B. Date, String,Blob,Enumeration....)
Das sieht schon ganz gut aus, hat aber halt noch seine 'kleinen' Probleme, von denen ich eins geschildert habe.
In geraumer Zeit mehr darüber.
Edit :Ich schreibe schnell 'mal eine Miniversion, an der man hoffentlich die Problematik sieht.
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:49
von mk-soft
Ich glaube das reicht
Habe aber keine Lust ein Testcode zu schreiben...
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:52
von ProgOldie
Habe aber keine Lust ein Testcode zu schreiben...
Verstehe ich gut, also probier ich's mal mit einer Abspeckung meiner Lösung.
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 10:53
von RSBasic
ProgOldie hat geschrieben:@RSBasic
Sorry, mehr als 1000 Zeilen.
Deshalb solltest du auch:
RSBasic hat geschrieben:[...] einen funktionierenden, kleinen fertigen Beispielcode zum Testen posten
Sonst muss jeder hier im Forum, der dir helfen möchte, einen eigenen Beispielcode basteln, um dein Problem überhaupt nachstellen zu können. Man könnte viel Zeit sparen, wenn du selber einmalig einen kleinen Code für uns alle bereitstellst. Hättest du das am Anfang gemacht, dann hättest du wahrscheinlich schon längst eine Lösung von mir oder von einem anderen User bekommen und du könntest jetzt mit deinem Projekt weiterarbeiten.
Und raten, was es sein könnte und wie man es vielleicht mal so oder vielleicht so machen könnte, um das Problem eventuell zu beheben, ist nicht so gut.
Ich hätte jetzt auch InvalidateRect_() o.ä. vorgeschlagen, aber ob es daran liegt, weiß ich nicht. Deshalb ist ein Beispielcode das A und O.
ProgOldie hat geschrieben:mk-soft hat geschrieben:
Habe aber keine Lust ein Testcode zu schreiben...
Verstehe ich gut
Genau aus dem Grund. Lieber gleich sofort einen Beispielcode.

Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 11:57
von ProgOldie
Hier nun ein Beispielcode, bei dem aber alles wie gewünscht klappt. Der Fehler muss also bei mir in den 1000 Zeilen irgendwo anders liegen......
Code: Alles auswählen
EnableExplicit
;Umschalten zwischen des Gadgets mit F1 bzw. F2
Define WinNr.i,LIcNr.i,GadNr.i,Ev.i,Nr.i,GridZeile.s,ColGad.i
Procedure GridFirst(GridNr.i,ColGadNr.i)
HideGadget(ColGadNr,1)
DisableGadget(ColGadNr,1)
DisableGadget(GridNr,0)
SetActiveGadget(GridNr)
EndProcedure
Procedure ColGadFirst(GridNr.i,ColGadNr.i)
HideGadget(ColGadNr,0)
DisableGadget(ColGadNr,0)
DisableGadget(GridNr,1)
SetActiveGadget(ColGadNr) ; <-- nach einem Hinweis von matbal geändert,Danke!
EndProcedure
WinNr=OpenWindow(#PB_Any,20,20,600,200,"Testwindow")
AddKeyboardShortcut(WinNr,#PB_Shortcut_F1,1)
AddKeyboardShortcut(WinNr,#PB_Shortcut_F2,2)
LicNr=ListIconGadget(#PB_Any,10,30,400,160,"Nr",50,#PB_ListIcon_FullRowSelect)
ColGad=ComboBoxGadget(#PB_Any,80,48,80,30)
AddGadgetItem(ColGad,-1,"Auswahl A1")
AddGadgetItem(ColGad,-1,"Auswahl b1")
AddGadgetItem(ColGad,-1,"Auswahl C1")
SetGadgetText(ColGad,"Auswahl b1")
AddGadgetColumn(LicNr,1,"Spalte 1",90)
AddGadgetColumn(LicNr,2,"Spalte 2",90)
AddGadgetColumn(LicNr,3,"Spalte 3",90)
For Nr=1 To 5
GridZeile=Str(Nr)+Chr(10)+"A"+Chr(10)+"B"+Chr(10)+"C"+Chr(10)
AddGadgetItem(LicNr,-1,GridZeile)
Next
Repeat
Ev=WaitWindowEvent()
If Ev=#PB_Event_Menu
Select EventMenu()
Case 1
ColGadFirst(LicNr,ColGad)
Case 2
GridFirst(LicNr,ColGad)
EndSelect
EndIf
Until Ev=#PB_Event_CloseWindow
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 20:02
von ccode_new
Hallo ProgOldie,
bei dir kann man leider nur Orakeln.
Aber das Orakel scheint kaputt.
Es sieht nach einen Zeichenbug aus.
2 Versuche:
-> Benutze einmal FreeGadget() (statt Hide) und erstelle das Gadget neu.
-> Probiere mal unter einem anderen OS (anderen Fensterthemen)
...Zum Beispiel mit einem Windows 7 gegen Windows 10 Style.
...Oder noch besser: (Wenn dein Code plattformunabhängig ist) Teste man unter einem anderen Fenstermanager (Teste unter Linux)
Ansonsten: ???
Anbei: Überlagerungen von Gadgets sind in vielen Fällen unschön.
Re: Übereinanderliegende Gadgets
Verfasst: 27.02.2018 22:57
von DarkSoul
Der Beispielcode läuft auch tadellos unter Mint 18 bzw. Cinnamon (abgesehen von dem kleinen Bug, dass zu Beginn beide Gadgets aktiv sind, bis eine der F-Tasten gedrückt wird, was aber ein simpler Programmierfehler im Beispielcode ist).
Ich nehme zur Eingrenzung solcher "irgendwo in 10000 Codezeilen"-Bugs immer die Kaputtes-Leuchtmittel-in-1000er-Weinachtslichterkette-Finde-Strategie (Hälfte rausschmeißen. Problem noch da? Ja - Das Problem ist in der verbliebenen Hälfte. Davon wieder die Hälfte raus. Problem noch da? Nein - Das Problem ist in der herausgeworfenen Hälfte...bis irgendwann nur noch wenige Codezeilen übrig sind, die sich leicht debuggen lassen.)
Ich finde das Ünereinanderbasteln von Gadgets auch nicht schön.
Kannst du es nicht so machen, dass an entsprechender Stelle ein kleines randloses Fenster mit dem Dropdownfeld geöffnet wird? So ähnlich wie ein Kontextmenü? Das fände ich schöner.
