Übereinanderliegende Gadgets

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Übereinanderliegende Gadgets

Beitrag 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)
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Übereinanderliegende Gadgets

Beitrag von RSBasic »

Kannst du einen funktionierenden, kleinen fertigen Beispielcode zum Testen posten?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Übereinanderliegende Gadgets

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Übereinanderliegende Gadgets

Beitrag 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.
Zuletzt geändert von ProgOldie am 27.02.2018 10:51, insgesamt 1-mal geändert.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
mk-soft
Beiträge: 3871
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Übereinanderliegende Gadgets

Beitrag von mk-soft »

Ich glaube das reicht

Code: Alles auswählen

InvalidateRect_(GadgetID(Gadget), 0, #True)
Habe aber keine Lust ein Testcode zu schreiben...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Übereinanderliegende Gadgets

Beitrag von ProgOldie »

Habe aber keine Lust ein Testcode zu schreiben...
Verstehe ich gut, also probier ich's mal mit einer Abspeckung meiner Lösung.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Übereinanderliegende Gadgets

Beitrag 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. :)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Übereinanderliegende Gadgets

Beitrag 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

Zuletzt geändert von ProgOldie am 28.02.2018 09:03, insgesamt 1-mal geändert.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Übereinanderliegende Gadgets

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
DarkSoul
Beiträge: 689
Registriert: 19.10.2006 12:51

Re: Übereinanderliegende Gadgets

Beitrag 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. :mrgreen:
Bild
Antworten