GVKun编程网logo

delphi – 创建自定义提示窗口(delphi 自定义控件)

8

此处将为大家介绍关于delphi–创建自定义提示窗口的详细内容,并且为您解答有关delphi自定义控件的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi2010、DelphiXE

此处将为大家介绍关于delphi – 创建自定义提示窗口的详细内容,并且为您解答有关delphi 自定义控件的相关问题,此外,我们还将为您介绍关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、delphi 7 – 创建自定义警告、delphi – 为自定义组件创建样式的正确方法、delphi – 使用新事件创建自定义框架的有用信息。

本文目录一览:

delphi – 创建自定义提示窗口(delphi 自定义控件)

delphi – 创建自定义提示窗口(delphi 自定义控件)

我正试图找到一种方法来使用我的第二种形式作为我的第一种形式的组件(例如TLabel)的提示窗口.

目前,我正在探索使用THintwindow和HintwindowClass,但是不可能直接将TForm分配给HintwindowClass.到目前为止我看到的一些例子使用的是TBitmap,然后在THintwindow.Canvas上绘制,这也不错,但我还是想使用某种集成的自动机制.

我想到的另一个解决方案是使用所述Tlabel的OnMouseEnter,OnMouseMove和OnMouseLeave事件手动实现此功能.

如果确实有一种方法可以将TForm“赋值”给HintwindowClass,我想问一下是否有人可以提供说明这一点的代码片段.谢谢.

解决方法

THintwindow是TCustomControl的后代. TForm不是这两个类的后代,因此您不能将任何TForm类分配给HintwindowClass.提示窗口需要从THintwindow下降.你可以放在表格上的任何东西,你也可以穿上THintwindow.您只需手动实例化它并指定其Parent属性以使其显示.

你可以在“视觉上”设计一个提示窗口的最接近的是设计一个框架.让你的THintwindow后代创建一个框架的实例,然后覆盖ActivateHint(和ActivateHintData,如果你需要数据)将提示文本和所需的大小转发到你的框架.

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结

总结

以上是小编为你收集整理的.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

delphi 7 – 创建自定义警告

delphi 7 – 创建自定义警告

我使用的是Delphi 7,我想创建一个自定义的警告消息(这将在编译时显示),所以我可以通过一些修改警告其他程序员.我在互联网上搜索过,但没有找到任何相关的内容.

其他解决方案也受到欢迎,因为其他编程人员在编译/构建源代码时会对我想要的东西进行警告.

解决方法

在D2007你可以写
{$MESSAGE 'Hello'}

要么

{$MESSAGE ERROR 'Hello'}

– 见documentation.这works since D6(信息提供Sertac Akyuz).

delphi – 为自定义组件创建样式的正确方法

delphi – 为自定义组件创建样式的正确方法

我在另一篇文章的末尾有点问这个问题,但觉得这个话题需要一个自己的问题……

如果我用自己的.style创建了我自己的组件,那么将它与Delphi提供的已定义样式合并而不修改默认值的正确程序是什么?

我可以将默认样式嵌入到我创建的组件中吗?嵌入式样式是否可以继承其父控件的大部分样式?

我觉得我错过了一个我正在努力描述的链接.
我的应用程序有一个TStyleBook,默认情况下加载(例如)“dark.style”.
我的组件有自己的“MyComponent.style”文件.
TStyleBook可以加载“dark.style”或“MyComponent.style”,但不能同时加载两者.
并且应用程序需要加载“MyComponent.style”似乎不对,因为这应该以某种方式由组件引用.如果每次在应用程序中使用单独的样式文件时,它也不会使组件非常便携.

我可以编辑自己的“MyDark.style”并将MyComponent添加到其中但这似乎也不正确,因为它会产生一个问题,以使其与Embarcadero所做的更改保持同步.

我希望我已经清楚地解释了这一点.
马丁

解决方法

感谢Ray Konopka,他对CodeRage进行了精彩的演讲,并让我走上正确的轨道来回答这些问题.

问题1.我可以在组件中嵌入默认样式吗?

是的,您将要与组件一起分发的默认样式嵌入到RT_RCDATA类型的资源中.然后只需将该资源包含在源中:

{$R *.res}

注意:如果在布局编辑器中创建外部对象(TLayout)之前将其放入res中,则需要将其删除.

然后重写GetStyleObject方法以从资源加载样式.

function TLFButton.GetStyleObject: TControl;
var
  S: TResourceStream;
  obj: TLayout;
const;
begin
  result := inherited GetStyleObject;
  if FStyleLookup = 'cornerbuttonstyle' then
  begin
    if FindResource(HInstance,PChar(Style),RT_RCDATA) <> 0 then
    begin
      S := TResourceStream.Create(HInstance,Style,RT_RCDATA);
      try
        obj := TLayout(TStyleManager.LoadFromresource(HInstance,RT_RCDATA));
        //obj := TLayout( CreateObjectFromStream(nil,S) ); << XE2 version
        Result.Addobject(obj);
        Exit;
      finally
        S.Free;
      end;
    end;
  end;
end;

问题2:如何将其与默认样式合并.

在我的例子中,我的组件的基础是TCornerButton.我修剪了我的.style文件,以便它只有我想要的额外位的代码.在这种情况下,一个小三角形表示一个下拉按钮,一行用于分割按钮:

object TLayout
  Align = alRight
  Position.Point = '(76,0)'
  Locked = True
  Width = 15.000000000000000000
  Height = 24.000000000000000000
  object TPath
    StyleName = 'dropdownbutton'
    Align = alCenter
    Position.Point = '(4,9)'
    Width = 8.000000000000000000
    Height = 5.000000000000000000
    HitTest = False
    Fill.Color = claBlack
    stroke.Kind = bkNone
    Data.Path = {
      04000000000000000000000000000000010000000000803F0000000001000000
      0000003F0000803F030000000000000000000000}
  end
  object TLine
    StyleName = 'dropdownsplit'
    Align = alLeft
    Width = 1.000000000000000000
    Height = 24.000000000000000000
    HitTest = False
    LineType = ltLeft
  end
end

我以完全相同的方式将它放入资源中.

在我的构造函数中,我将StyleLookup设置为“cornerbuttonstyle”

constructor TLFButton.Create(AOwner: TComponent);
begin
  FStyleLookup := 'cornerbuttonstyle';
  fdropDownButton := false;
  inherited;
end;

然后我更改GetStyleObject,以便它加载新的东西并将其添加到现有样式.

function TLFButton.GetStyleObject: TControl;
var
  S: TResourceStream;
  obj: TLayout;
const;
begin
  result := inherited GetStyleObject;
  if FStyleLookup = 'cornerbuttonstyle' then
  begin
    if FindRCData(HInstance,Style) then
    begin
      S := TResourceStream.Create(HInstance,RT_RCDATA);
      try
        obj := TLayout( CreateObjectFromStream(nil,S) );
        Result.Addobject(obj);
        Exit;
      finally
        S.Free;
      end;
    end;
  end;
end;

我希望这有助于其他人,我发现这一切都非常难以获得信息.

马丁

delphi – 使用新事件创建自定义框架

delphi – 使用新事件创建自定义框架

我正在研究delphi XE2.
我需要的:
我需要带有框架的MyFrame类,没有任何可见的组件,但是在Object Inspector中可以看到新事件.此事件将通知我的表单(将放置MyFrame对象),即f.e.框架上的所有数据都已满.

是)我有的:
基于this post和TOndrej的答案,以及Ba显示的that hint,对于XE2,我们需要更换

delphivclide := GetModuleHandle('delphivclide160.bpl');

有了这个:

delphivclide := GetModuleHandle('vcldesigner160.bpl');

我有新框架的代码:

unit MyFrame;
interface
uses
  System.Classes,Vcl.Forms;
type
  TMyFrame = class(TFrame)
  private
  protected
    FOnFilledData : TNotifyEvent;
  public
  published
    property OnFilledData : TNotifyEvent read FOnFilledData write FOnFilledData;
  end;
implementation
end.

注册单位的代码:

unit MyFrameReg;
interface
procedure Register;

implementation
uses Windows,DesignIntf,Dialogs,wFrame;

procedure Register;
var
  delphivclide: THandle;
  TFrameModule: TCustomModuleClass;
begin
  delphivclide := GetModuleHandle('vcldesigner160.bpl');
  if delphivclide <> 0 then
  begin
    TFrameModule := GetProcAddress(delphivclide,'@Vclformcontainer@TFrameModule@');
    if Assigned(TFrameModule) then
    begin
      ShowMessage('I''m here');
      RegisterCustomModule(TMyFrame,TFrameModule);
    end;
  end;
end;
end.

当我构建我的包时,我收到了我在这里的消息,所以我说,MyFrame已注册.

我的问题是什么:
问题是,它最终无法发挥作用.
当我选择New VCL Application时,想要通过选择File – >来创建MyFrame;新 – >其他 – >德尔福项目 – > MyFrame然后在下面显示奇怪的窗口.
当我在那里选择一些目录并单击OK按钮时,将关闭新的Delphi项目并打开我的包项目.

如果有人可以告诉我,我做错了,我会很高兴的.

解决方法

A.框架类注册

没有必要以“hacky方式”做到这一点

uses
...
  DMForm,VCLFormContainer,...

procedure Register;
begin
...
  RegisterCustomModule(TYourFrameClass,TFrameModule);   // for frames
  RegisterCustomModule(TYourModuleClass,TDataModuleCustomModule);   // for data modules
...
end;

还有另一种方法可以添加帧

type
  TnestableWinControlCustomModule = class (TWinControlCustomModule)
  public
    function nestable: Boolean; override;
  end;

function TnestableWinControlCustomModule.nestable: Boolean;
begin
  Result := True;
end;

 

RegisterCustomModule(TYourFrameClass,TnestableWinControlCustomModule);

单位名称(在XE7中测试):

TCustomModule => DesignEditors

TDataModuleCustomModule => DMForm(designide.dcp)

TWinControlCustomModule => WCtlForm(designide.dcp)

TFrameModule => VCLFormContainer(vcldesigner.dcp)

我想,对于FireMonkey,它应该可以以类似的方式(找到fmxdesigner.dcp&检查记事本里面的内容)

B.要在“新建…”向导中使用它,您需要注册向导类.
如果您没有时间编写向导类,只需创建新框架然后手动替换父类名称并将相应的单元添加到“使用”列表中.就这样

PS.在较旧的Delphi版本中,单元DMDesigner中有TDataModuleDesignerCustomModule元类而不是TDataModuleCustomModule

PPS.其他现有的元类名称:

TCustomFormCustomModule

TIDESourceModuleCustomModule

我们今天的关于delphi – 创建自定义提示窗口delphi 自定义控件的分享已经告一段落,感谢您的关注,如果您想了解更多关于.Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结、delphi 7 – 创建自定义警告、delphi – 为自定义组件创建样式的正确方法、delphi – 使用新事件创建自定义框架的相关信息,请在本站查询。

本文标签: