2

如果我尝试使用 TRibbonCombobox 更改功能区样式,则会遇到访问冲突。

然后,我修改了 delphi 功能区演示以提供一个组合框方法来设置样式:

  1. 在功能区栏上添加了一个 TRibbonCombobox
  2. 添加了一个事件处理程序

这是事件代码:

procedure TfrmRibbonDemo.RibbonComboBox1Change(Sender: TObject);

begin

  if RibbonComboBox1.Text='Luna' then

    Ribbon1.Style:=RibbonLunaStyle

    else

    Ribbon1.Style:=RibbonSilverStyle;

end;

当我使用 TRibbonCombobox 更改样式(尤其是不止一次)时,我得到:

date/time         : 2009-10-02, 11:11:29, 843ms
operating system  : Windows XP Service Pack 3 build 2600
physical memory   : 583/2047 MB (free/total)
free disk space   : (C:) 71.72 GB
display mode      : 1280x1024, 32 bit
allocated memory  : 23.59 MB
executable        : RibbonDemo.exe
exec. date/time   : 2009-10-02 11:11
compiled with     : Delphi 2009
madExcept version : 3.0k
exception class   : EAccessViolation
exception message : Access violation at address 0054767C in module 'RibbonDemo.exe'. Read of address 0000005F.

main thread ($ed0):
0054767c +054 RibbonDemo.exe RibbonActnCtrls           TCustomRibbonComboBox.SetBounds
00546e52 +0a2 RibbonDemo.exe RibbonActnCtrls           TRibbonComboControl.SetBounds
00516f39 +0f1 RibbonDemo.exe ActnMan                   TCustomActionControl.CalcBounds
0051853d +005 RibbonDemo.exe ActnCtrls                 TCustomButtonControl.CalcBounds
00546482 +00a RibbonDemo.exe RibbonActnCtrls           TRibbonComboControl.CalcBounds
00516754 +030 RibbonDemo.exe ActnMan                   TCustomActionControl.SetSpacing
0051a243 +01b RibbonDemo.exe ActnCtrls                 TCustomActionToolBar.CreateControl
00557f16 +01a RibbonDemo.exe Ribbon                    TCustomActionControlBar.CreateControl
0056205a +006 RibbonDemo.exe Ribbon                    TCustomRibbonGroup.CreateControl
0051243f +087 RibbonDemo.exe ActnMan                   TCustomActionBar.CreateControls
00519b35 +005 RibbonDemo.exe ActnCtrls                 TCustomActionDockBar.CreateControls
0051a2c6 +022 RibbonDemo.exe ActnCtrls                 TCustomActionToolBar.CreateControls
00557fcb +027 RibbonDemo.exe Ribbon                    TCustomActionControlBar.CreateControls
00562075 +005 RibbonDemo.exe Ribbon                    TCustomRibbonGroup.CreateControls
00514542 +05e RibbonDemo.exe ActnMan                   TCustomActionBar.RecreateControls
0050e081 +04d RibbonDemo.exe ActnMan                   TCustomActionManager.SetStyle
0055dac3 +02f RibbonDemo.exe Ribbon                    TCustomRibbon.SetStyle
0056720c +04c RibbonDemo.exe RibbonDemoMainForm 387 +3 TfrmRibbonDemo.RibbonComboBox1Change

如果我使用功能区栏上的按钮更改样式,则效果很好。

感谢您的帮助!

4

1 回答 1

1

您正在修改功能区的样式,这也会修改触发事件的组合框。

为了使其工作,编程接口必须是“可重入的”,而功能区系统显然不是。

有几种可能的解决方案:

  • 不要从功能区修改功能区,将配置 GUI 移动到其他位置。
  • 使组合框在某处存储所需的操作并触发另一个事件,该事件将在您的组合框事件终止后执行。例如,您可以设置一个非常小的间隔 (1) 的 TTimer,然后在组合框事件中启用该定时器,这样当触发 TTimer 事件时,功能区系统可以根据新选择进行修改,而无需可重入api。
于 2009-10-06T14:27:33.540 回答