I have created a theme manager for use in Access. It uses two tables, one with different themes and their colors for various controls and one with user settings and preferred themes. It is not just limited to dark and light, but unlimited themes. This works fine in Access.
I have tried to convert this to Clarion (11) and it uses two procedures: LoadTheme and ApplyTheme. LoadTheme complies fines, but ApplyTheme will not. It starts to complain already at the start with ‘wnd’ . Can somebody give me a suggestion on how to proceed. I have used Copilot to build the procedures, but must admit it is not great with Clarion. Good with Access and VBA. Not with Clarion. The two procedures:
LoadTheme PROCEDURE ! Declare Procedure
CODE
! Finn aktivt tema i AppUserSettings (SettingID = 1)
CLEAR(AppUserSettings)
AppUserSettings.SettingID = 1
GET(AppUserSettings, AppUserSettings.SettingID)
IF ERRORCODE()
MESSAGE('AppUserSettings: Fant ikke aktivt tema.')
RETURN
END
! Hent selve temaet fra AppTheme
CLEAR(AppTheme)
AppTheme.ThemeID = AppUserSettings.ThemeID
GET(AppTheme, AppTheme.ThemeID)
IF ERRORCODE()
MESSAGE('AppTheme: Fant ikke tema med ID ' & AppUserSettings.ThemeID)
RETURN
END
! Kopier alle felter inn i ThemeRecord
ThemeRecord.ThemeID = AppTheme.ThemeID
ThemeRecord.ThemeName = AppTheme.ThemeName
ThemeRecord.PrimaryColor = AppTheme.PrimaryColor
ThemeRecord.SecondaryColor = AppTheme.SecondaryColor
ThemeRecord.BackgroundColor = AppTheme.BackgroundColor
ThemeRecord.FormBackColor = AppTheme.FormBackColor
ThemeRecord.AccentColor = AppTheme.AccentColor
ThemeRecord.TextBoxBackColor = AppTheme.TextBoxBackColor
ThemeRecord.TextBoxForeColor = AppTheme.TextBoxForeColor
ThemeRecord.LabelForeColor = AppTheme.LabelForeColor
ThemeRecord.LabelBackColor = AppTheme.LabelBackColor
ThemeRecord.ButtonBackColor = AppTheme.ButtonBackColor
ThemeRecord.ButtonHoverColor = AppTheme.ButtonHoverColor
ThemeRecord.ButtonPressedColor = AppTheme.ButtonPressedColor
ThemeRecord.ButtonWidth = AppTheme.ButtonWidth
ThemeRecord.ButtonHeight = AppTheme.ButtonHeight
ThemeRecord.FontName = AppTheme.FontName
ThemeRecord.FontSizeLabel = AppTheme.FontSizeLabel
ThemeRecord.FontSizeTextBox = AppTheme.FontSizeTextBox
ThemeRecord.FontSizeHeader = AppTheme.FontSizeHeader
ThemeRecord.MarginOuter = AppTheme.MarginOuter
ThemeRecord.MarginInner = AppTheme.MarginInner
ThemeRecord.TabActiveColor = AppTheme.TabActiveColor
ThemeRecord.TabInactiveColor = AppTheme.TabInactiveColor
ThemeRecord.DetailBackColor = AppTheme.DetailBackColor
ThemeRecord.DetailAlternateBackColor = AppTheme.DetailAlternateBackColor
ThemeRecord.HeaderBackColor = AppTheme.HeaderBackColor
ThemeRecord.FooterBackColor = AppTheme.FooterBackColor
ThemeRecord.HeaderLabelBackColor = AppTheme.HeaderLabelBackColor
ThemeRecord.FooterLabelBackColor = AppTheme.FooterLabelBackColor
ThemeRecord.DetailLabelBackColor = AppTheme.DetailLabelBackColor
ThemeRecord.HeaderLabelForeColor = AppTheme.HeaderLabelForeColor
ThemeRecord.FooterLabelForeColor = AppTheme.FooterLabelForeColor
ThemeRecord.DetailLabelForeColor = AppTheme.DetailLabelForeColor
RETURN
```LoadTheme PROCEDURE ! Declare Procedure
CODE
! Finn aktivt tema i AppUserSettings (SettingID = 1)
CLEAR(AppUserSettings)
AppUserSettings.SettingID = 1
GET(AppUserSettings, AppUserSettings.SettingID)
IF ERRORCODE()
MESSAGE('AppUserSettings: Fant ikke aktivt tema.')
RETURN
END
! Hent selve temaet fra AppTheme
CLEAR(AppTheme)
AppTheme.ThemeID = AppUserSettings.ThemeID
GET(AppTheme, AppTheme.ThemeID)
IF ERRORCODE()
MESSAGE('AppTheme: Fant ikke tema med ID ' & AppUserSettings.ThemeID)
RETURN
END
! Kopier alle felter inn i ThemeRecord
ThemeRecord.ThemeID = AppTheme.ThemeID
ThemeRecord.ThemeName = AppTheme.ThemeName
ThemeRecord.PrimaryColor = AppTheme.PrimaryColor
ThemeRecord.SecondaryColor = AppTheme.SecondaryColor
ThemeRecord.BackgroundColor = AppTheme.BackgroundColor
ThemeRecord.FormBackColor = AppTheme.FormBackColor
ThemeRecord.AccentColor = AppTheme.AccentColor
ThemeRecord.TextBoxBackColor = AppTheme.TextBoxBackColor
ThemeRecord.TextBoxForeColor = AppTheme.TextBoxForeColor
ThemeRecord.LabelForeColor = AppTheme.LabelForeColor
ThemeRecord.LabelBackColor = AppTheme.LabelBackColor
ThemeRecord.ButtonBackColor = AppTheme.ButtonBackColor
ThemeRecord.ButtonHoverColor = AppTheme.ButtonHoverColor
ThemeRecord.ButtonPressedColor = AppTheme.ButtonPressedColor
ThemeRecord.ButtonWidth = AppTheme.ButtonWidth
ThemeRecord.ButtonHeight = AppTheme.ButtonHeight
ThemeRecord.FontName = AppTheme.FontName
ThemeRecord.FontSizeLabel = AppTheme.FontSizeLabel
ThemeRecord.FontSizeTextBox = AppTheme.FontSizeTextBox
ThemeRecord.FontSizeHeader = AppTheme.FontSizeHeader
ThemeRecord.MarginOuter = AppTheme.MarginOuter
ThemeRecord.MarginInner = AppTheme.MarginInner
ThemeRecord.TabActiveColor = AppTheme.TabActiveColor
ThemeRecord.TabInactiveColor = AppTheme.TabInactiveColor
ThemeRecord.DetailBackColor = AppTheme.DetailBackColor
ThemeRecord.DetailAlternateBackColor = AppTheme.DetailAlternateBackColor
ThemeRecord.HeaderBackColor = AppTheme.HeaderBackColor
ThemeRecord.FooterBackColor = AppTheme.FooterBackColor
ThemeRecord.HeaderLabelBackColor = AppTheme.HeaderLabelBackColor
ThemeRecord.FooterLabelBackColor = AppTheme.FooterLabelBackColor
ThemeRecord.DetailLabelBackColor = AppTheme.DetailLabelBackColor
ThemeRecord.HeaderLabelForeColor = AppTheme.HeaderLabelForeColor
ThemeRecord.FooterLabelForeColor = AppTheme.FooterLabelForeColor
ThemeRecord.DetailLabelForeColor = AppTheme.DetailLabelForeColor
RETURN
And the other procedure:
MEMBER()
INCLUDE('ABWINDOW.INC'),ONCE
MAP
ApplyTheme PROCEDURE(Wnd Window)
END
ApplyTheme PROCEDURE(Wnd WINDOW)
FieldNum LONG
CODE
Wnd{PROP:Background} = ThemeRecord.BackgroundColor
FieldNum = 0
LOOP
FieldNum = Wnd{PROP:NextField, FieldNum}
IF FieldNum = 0 THEN BREAK.
CASE FieldNum{PROP:Type}
OF 1 ! Prompt
FieldNum{PROP:Color} = ThemeRecord.LabelForeColor
FieldNum{PROP:Background} = ThemeRecord.LabelBackColor
OF 2 ! Entry
FieldNum{PROP:Color} = ThemeRecord.TextBoxForeColor
FieldNum{PROP:Background} = ThemeRecord.TextBoxBackColor
OF 3 ! Button
FieldNum{PROP:Color} = ThemeRecord.ButtonForeColor
FieldNum{PROP:Background} = ThemeRecord.ButtonBackColor
OF 7 ! List
FieldNum{PROP:Color} = ThemeRecord.LabelForeColor
FieldNum{PROP:Background} = ThemeRecord.DetailBackColor
FieldNum{PROP:Alternate} = ThemeRecord.DetailAlternateBackColor
FieldNum{PROP:HeaderBackColor} = ThemeRecord.HeaderBackColor
FieldNum{PROP:HeaderTextColor} = ThemeRecord.HeaderLabelForeColor
FieldNum{PROP:FooterBackColor} = ThemeRecord.FooterBackColor
FieldNum{PROP:FooterTextColor} = ThemeRecord.FooterLabelForeColor
OF 14 ! Tab
FieldNum{PROP:Background} = ThemeRecord.TabInactiveColor
IF FieldNum{PROP:Selected}
FieldNum{PROP:Background} = ThemeRecord.TabActiveColor
END
END
END