为什么可以';我在Delphi7中启用主题的TSpeedButtons上设置字体吗? 非常奇怪的事情发生了:

为什么可以';我在Delphi7中启用主题的TSpeedButtons上设置字体吗? 非常奇怪的事情发生了:,delphi,themes,delphi-7,Delphi,Themes,Delphi 7,我继承了一大堆TFrame(可能是TCustomFrame,不记得了,因为我在40多个帧和父帧之间创建了一个中间类),以构成“非常酷”HL7公式编辑器的配置部分。奇怪的是,尽管我从未在基类中实现过这些属性,但框架上的DFM一直在向DFM添加OldCreateOrder、PixelsPerInch和TextHeight,这一点并不重要 无论如何,我必须把这些属性放在我的子类中,即使我不想,否则它不会让我编译,很好。然后,我在我的一个框架中添加了一个颜色选择器控件,直到上周它才开始让我有了找不到父对

我继承了一大堆TFrame(可能是TCustomFrame,不记得了,因为我在40多个帧和父帧之间创建了一个中间类),以构成“非常酷”HL7公式编辑器的配置部分。奇怪的是,尽管我从未在基类中实现过这些属性,但框架上的DFM一直在向DFM添加OldCreateOrder、PixelsPerInch和TextHeight,这一点并不重要

无论如何,我必须把这些属性放在我的子类中,即使我不想,否则它不会让我编译,很好。然后,我在我的一个框架中添加了一个颜色选择器控件,直到上周它才开始让我有了找不到父对象的业务

所以。。。我去掉了所有的DFM,我把所有的框架都改成了面板,效果很好(在我的电脑上,在虚拟机中运行XP,没有主题),但对于我左边的同事(本机运行Windows 7),不管我在这些面板上用TSpeedButtons做什么,它们总是有相同的Sans 10pt粗体字体,这会起作用,但是我有一些奇怪的集合操作符号,我想保留它们,而CalcTextWidth完全失败了

我试过:

  • ParentFont:=true和false
  • Flat:=正确和错误
  • Parent.Font:=无论什么
我已经试过所有的老把戏了。唯一有效的方法就是删除XP清单(我提到的是Delphi7)。这不是一个选择,因为今年的某个时候我们将把所有的东西都移植到D2009上,然后。。。这不是一个选择

编辑 真正奇怪的是,使用TFrame和DFM,它可以工作(即使是使用古老的编译器)。使用TPanel它不起作用

TPanel上的主题(或TCustomPanel,两者都不起作用)和TFrame上的主题之间必须有一些区别

另外,我在按钮和TPanel之间有一个TGroupBox。也许这就是问题的根源。我可以很容易地改变

编辑2 使用按钮、extctrl、stdctrl

(对于Delphi 7,将XPManifest放在表单上)

在windows XP fine中,在2008服务器R2上进行了尝试,仅显示粗体sans字体

我试着在没有分组框的情况下使用它,但似乎效果不错


(使用框架进行操作很有效,但代码太多,无法发布)

Delphi7于2002年8月发布。Vista于2007年面世,Windows7于2009年面世。我认为期望2002年的编译器和开发系统能够与Vista/7中的所有新东西一起工作是有点过分的期望。升级后,您可能会看到这些功能正常工作

当然,升级编译器,特别是大型应用程序的编译器,从来都不容易


我真的很同情你,但我不会把它称为VCL中的bug。

好吧,我会为我自己的问题写一个答案,因为今天的答案不是升级

只要重写TSpeedButton中的Paint函数,就不会在表单上使用它


然后,当您最终将所有1200万行代码更新到D2009时,如果is问题再次出现,那么如果您不想使用子类TSpeedButton,您可以将该代码保留为那些奇特的帮助类函数之一。

我将首先尝试为您回答这个问题:

有什么奇怪的,但没说到点子上, 机架上的DFM一直开着吗 添加OldCreateOrder、PixelsPerInch 和文本高度到DFM,即使 我从未实现过这些属性 在基类中

这可能与其中任何一个有关

  • 帧继承(DFM文件包含错误的关键字:
    object
    ,而不是
    继承的
    ,请参阅)

  • 在.DPR文件中,框架单元后面的注释是错误的(注释实际上不是注释,它是对Delphi IDE的提示,告诉它需要选择哪个框架、表单或数据模块设计器)

  • 让我们知道这是否有帮助;然后关注TSpeedButton问题


    --杰罗恩

    好的,下面是有效的答案:

    groupbox.ParentBackground:=false


    不确定为什么组框的背景会改变速度按钮的前景。

    必须删除两件事(1)您自己的不情愿和(2)XP清单。当您移动到D2009时,让问题(重新)出现,我打赌不会出现。。。你是说这是VCL的错误?不,不是错误。只是一个旧的编译器试图用新的技术达到最佳状态。如果你认为这是一个TSpeedButton问题;然后尝试用一个简单的应用程序复制它:表单;框架速度按钮。如果它复制了,那么把这个样本添加到你的问题中,看看这里的人是否能找到一个解决办法。哇,我可以看出这真的很有帮助!现在不会回滚我的更改(除非我无法修复SturnButt事件,我确信我可以通过重写Price函数来跳过主题内容),我认为它们是更好的-即使我的代码现在看起来更像C++。只需翻转到你的版本控制系统中的版本;
    procedure TForm1.FormCreate(Sender: TObject);
    var
      Panel : TPanel;
      Grp : TGroupBox;
      Btn : TSpeedButton;
    begin
      Panel := TPanel.Create(Self);
      Panel.Parent := self;
      Panel.Align := alClient;
    
      Grp := TGroupBox.Create(Panel);
      Grp.Parent := Panel;
      Grp.Align := alClient;
    
      Btn := TSpeedButton.Create(Grp);
      Btn.Parent := Grp;
    
      Btn.Width := 117;
      Btn.Font.Name := 'Symbol';
      Btn.Caption := 'Here is some text';
    
    
    end;