Wenn ich RefreshDialog manuell aufrufe, klappt es. Es sieht so aus, als ob RefreshDialog von der Änderung der Schriftart noch nichts mitbekommen hat in der Prozedur, wo ich die Schrift setze.
Umgehen kann ich das Problem, wenn ich RefreshDialog durch Timer verzögert aufrufe. In meinem Demo-Code kann man in der Prozedur SetStringGadgetFont() durch entfernen des Semikolons den Timer aktivieren. (Die Zeile habe ich markiert)
Unter GTK2 und QT gibt es diesen Fehler nicht.
Code: Alles auswählen
EnableExplicit
Structure s_font
name$
size.i
style.i
EndStructure
#RefreshTimer = 0
#StringFont = 0
#RefreshDelay = 100 ; Verzögerung für RefreshDialog
Runtime Enumeration Windows
#FormMain
EndEnumeration
Runtime Enumeration Gadgets
#FormMain_Button_Font
#FormMain_Button_RefreshDialog
#FormMain_Text_1
#FormMain_String_1
#FormMain_Text_2
#FormMain_String_2
#FormMain_Text_3
#FormMain_String_3
EndEnumeration
Global stringfont.s_font
Procedure SetStringGadgetFont()
; Setzt die neue Schriftart für die StringGadgets
Protected fntID
With stringfont
fntID = LoadFont(#StringFont, \name$, \size, \style)
SetGadgetFont(#FormMain_String_1, fntID)
SetGadgetFont(#FormMain_String_2, fntID)
SetGadgetFont(#FormMain_String_3, fntID)
RefreshDialog(#FormMain) ; <==== geht nicht ========
; AddWindowTimer(#FormMain, #RefreshTimer, #RefreshDelay) ; <==== Fehlerumgehung durch Verzögerung
EndWith
EndProcedure
Procedure RefreshTimer()
; Verzögerter Aufruf von RefreshDialog
RefreshDialog(#FormMain)
RemoveWindowTimer(#FormMain, #RefreshTimer)
EndProcedure
Runtime Procedure FormMain_Button_Font()
; Schriftart für die StringGadgets ändern
With stringfont
If FontRequester(\name$, \size, 0, 0, \style)
\name$ = SelectedFontName()
\size = SelectedFontSize()
\style = SelectedFontStyle()
SetStringGadgetFont()
EndIf
EndWith
EndProcedure
Runtime Procedure FormMain_Button_RefreshDialog()
RefreshDialog(#FormMain)
EndProcedure
Procedure Main()
Protected XML$
XML$ + "<?xml version='1.0' encoding='UTF-16'?>"
XML$ + ""
XML$ + "<dialogs><!--Created by Dialog Design0R V1.84 => get it from: https://hex0rs.coderbu.de/en/sdm_downloads/dialogdesign0r/-->"
XML$ + " <window flags='#PB_Window_SystemMenu | #PB_Window_SizeGadget' width='400' height='80' name='main' xpos='0' ypos='0' id='#FormMain'>"
XML$ + " <vbox align='top' expand='no'>"
XML$ + " <hbox align='left' expand='no'>"
XML$ + " <button text='Change Font' id='#FormMain_Button_Font' onevent='FormMain_Button_Font()'/>"
XML$ + " <button text='Refresh Dialog' id='#FormMain_Button_RefreshDialog' onevent='FormMain_Button_RefreshDialog()'/>"
XML$ + " </hbox>"
XML$ + " <gridbox colexpand='item:2'>"
XML$ + " <text text='Vorname:' id='#FormMain_Text_1'/>"
XML$ + " <string text='Paul Peter' id='#FormMain_String_1'/>"
XML$ + " <text text='Name:' id='#FormMain_Text_2'/>"
XML$ + " <string text='Hans-Müller' id='#FormMain_String_2'/>"
XML$ + " <text text='Adresse:' id='#FormMain_Text_3'/>"
XML$ + " <string text='Straße des Friedens' id='#FormMain_String_3'/>"
XML$ + " </gridbox> "
XML$ + " </vbox>"
XML$ + " </window>"
XML$ + "</dialogs><!--DDesign0R Definition: PureBasic|1|1|1|_|with_declares_winnames|1-->"
If ParseXML(0, XML$) And XMLStatus(0) = #PB_XML_Success
CreateDialog(#FormMain)
If OpenXMLDialog(#FormMain, 0, "main", 100, 100)
With stringfont
\name$ = "Noto Sans"
\size = 13
\style = 0
SetStringGadgetFont()
EndWith
BindEvent(#PB_Event_Timer, @RefreshTimer(), #FormMain)
Define event
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
EndIf
EndIf
EndProcedure : Main()