标签: tframe

Delphi IDE将TFrame视为Form

每当我调整我的TFrame类(添加属性,方法等)时,IDE就会感到困惑,并且表现得好像它认为框架是一个表单,包括标题/标题,边框等等.但是,很明显该类被声明为TFrame后代.关于是什么原因,如何预防,以及如何解决的任何想法?

我正在使用Delphi 2007专业版.另请注意(如果重要),TFrame后代通常通过设计时包在IDE(即调色板)上注册.


后来:其他"细节":我现在遇到此问题的框架在视觉上是一个非常基本的TFrame(仅从全新的TFrame改变大小和背景颜色).

这是它的类声明:

TBasePanel = class(TFrame)
  private
    FPanelManager: TPanelManager;
    procedure SetPanelManager(const Value: TPanelManager);
  protected
    procedure Connect; virtual; abstract;
    procedure Disconnect; virtual; abstract;
    procedure Refresh; virtual;
    procedure Requery; virtual; abstract;
  published
    property PanelManager: TPanelManager read FPanelManager write
        SetPanelManager;
Run Code Online (Sandbox Code Playgroud)

该帧用作许多其他帧的基类.我通常直接从它所属的BPL项目编辑它(因为所有这些框架安装到调色板中),而不是作为EXE项目的一部分,相关的窗体打开等.

此外,在"工具" - >"选项"中选中"嵌入式设计器".

我将所有DFM文件保存为文本而不是二进制(如果这很重要).

ide delphi inheritance tframe

6
推荐指数
1
解决办法
3471
查看次数

如何在Delphi中模拟TFrame上的OnDestroy事件?

我怎样才能在Delphi中模拟一个OnDestroy事件TFrame


我简单地添加了一个constructordestructor我的框架,认为这是做什么的TForm:

TframeEditCustomer = class(TFrame)
...
public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   ...
end;

constructor TframeEditCustomer.Create(AOwner: TComponent)
begin
    inherited Create(AOwner);

    //allocate stuff
end;

destructor TframeEditCustomer.Destroy;
begin
   //cleanup stuff

   inherited Destroy;
end;
Run Code Online (Sandbox Code Playgroud)

这个问题是,当我的析构函数运行时,框架上的控件已经被破坏并且不再有效.

原因在于包含表单的析构函数,它用于触发OnDestroy事件:

destructor TCustomForm.Destroy;
begin
   ...
   if OldCreateOrder then DoDestroy; //-->fires Form's OnDestroy event; while controls are still valid
   ...
   if HandleAllocated then DestroyWindowHandle; //-->destroys all controls on the form, and child frames
   ...
   inherited …
Run Code Online (Sandbox Code Playgroud)

delphi destructor delphi-5 tframe

6
推荐指数
1
解决办法
6276
查看次数

Delphi 7 - 处理表单中嵌入式帧的MouseWheel事件?

嗨,我有一个内部有几个框架的表格.

对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).

我尝试过以下方法:

只需为每个帧分配一个OnMouseWheel事件处理程序

覆盖父窗体的MouseWheel事件:

procedure TFmReview.MouseWheelHandler(var Message: TMessage);
var   Control: TControl;
begin
    Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True);
    if Assigned(Control) and (Control <> ActiveControl) then
    begin
         ShowMessage(Control.Name);
         Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam);
         if Message.Result = 0 then
            Control.DefaultHandler(Message);
     end else inherited MouseWheelHandler(Message);
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,两者似乎都没有用.

  • 在情况1中,事件永远不会被触发,但是父表单鼠标轮处理程序被触发.
  • 在情况2中,接收焦点的控件是保持我希望发送鼠标轮事件的帧的面板.

因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?

delphi focus mousewheel tframe tform

6
推荐指数
1
解决办法
3046
查看次数

在哪里释放动态分配的TFrame组件的对象?

我有一个包含的表格TFrame.该TFrame包含ComboBox被动态填充.每个ComboBox条目都有一个关联的对象.当TFrame被调用的析构函数被调用时,ComboBox已经清除了中的Items 而没有释放它们的相关对象.无论我是ComboBox在设计器视图中删除表单,还是在代码中使用nil或TFrame作为其所有者动态创建它,都会发生这种情况.我目前使用contains的OnDestroy事件TForm来调用包含的清理过程TFrame.

是否有更好的方法不需要由TFrame容器进行显式过程调用?理想情况下,动态添加的对象应该ComboBox被释放?

delphi destructor tframe

6
推荐指数
3
解决办法
1675
查看次数

有没有办法在使用Frames时具有类似KeyPreview的功能?

我希望在Frames中有一个KeyPreview功能,我的意思是,当输入(例如,选择框架的一个控件,或鼠标在里面)是在一个框架(这将有几个面板和其他控件) )然后由框架首先处理用户按下的键.

有没有办法做到这一点?我没有在TFrame中找到类似于KeyPreview的属性.

我正在使用RAD Studio的XE5版本,尽管我主要使用的是C++ Builder.

delphi vcl c++builder tframe keypreview

6
推荐指数
1
解决办法
1529
查看次数

是否可以在设计时直观地设计自定义组件?

我正冒险在Delphi中制作自己的组件.我很难开始组件开发.

我想制作复合控件,即由几个其他控件组成的控件,例如地址表单或类似的控件.

我是从TWinControl下降的.这会被认为是正确的选择吗?

最重要的是,我看不到在D2010中可视化设计组件的方法.这可能吗?例如,将一些文本框放到组件上,就像使用表单一样.我希望我不必将所有视觉方面的代码都交给我自己的组件.

此外,delphi组件开发的任何好链接都将非常受欢迎 - 尤其是复合控件.文件不是A1,它是一场斗争.我已经搜索了很多,我仍然无处可去.

delphi tframe delphi-2010

5
推荐指数
1
解决办法
1840
查看次数

在运行时创建Tframe:

是否可以创建运行时框架并添加现有面板,如将面板的父级设置为框架?当它添加时,重复框架并使用它?

喜欢:

f:= Tframe. create(..)
...

panel3.parent = f; //where panel3 has many controls.
Run Code Online (Sandbox Code Playgroud)

然后复制f?它可以吗?怎么样?或任何其他建议?Ë

delphi runtime tframe

5
推荐指数
1
解决办法
5321
查看次数

在TFrame里面的EventHandler?

我有一个TForm(TVehicleEditForm)里面有3个相同的TFrames(TVehicleUnitFrame).

这个想法是框架的每个实例都通过框架eventhandler内部处理自己的事件.问题是eventhandler没有调用.

我试图eventhandler通过覆盖Create方法在框架内分配by代码,但在这种情况下也不会调用处理程序.

但是如果我eventhandler从表单中指定框架外部它可以正常工作.像这样:

fraVehicleUnitFrame1.cmdNewOwner.OnClick := fraVehicleUnitFrame1.cmdNewOwnerClick;
fraVehicleUnitFrame2.cmdNewOwner.OnClick := fraVehicleUnitFrame2.cmdNewOwnerClick;
fraVehicleUnitFrame3.cmdNewOwner.OnClick := fraVehicleUnitFrame3.cmdNewOwnerClick;
Run Code Online (Sandbox Code Playgroud)

这只适用于一个按钮!因为我在框架内有许多组件,这将导致许多分配...当这应该直接在对象检查器中完成时,相当丑陋的代码.

我正在使用D2007.对原因有什么看法?

关心罗兰

delphi event-handling delphi-2007 tframe

4
推荐指数
1
解决办法
2096
查看次数

Delphi:框架属性在我预期时不会更新(它们卡住了)

我在表格上有一个框架.当我更改框架(添加/删除按钮,标签)时,表单上不会出现任何更改,或者控件在框架中的表单中有其他位置.如果要从表单中删除框架并再次添加 - >确定.

为什么?我记得在Delphi 2010(现在的Delphi XE)中没有任何问题.

谢谢.

delphi tframe tform

4
推荐指数
1
解决办法
2781
查看次数

Delphi - 如何在该表单上关闭来自WITHIN的表单?

在Delphi 2010中,我创建一个表单,然后创建一个TFrame,将TFrame.Parent分配给表单,然后显示表单MODALLY.工作得很好......框架有一个DBNavigator,一个字段DBFields等.当用户点击发布/保存时,我想自动关闭表单.我尝试了一些东西,比如Close,Action = caFree,(DBNav.parent.parent)作为TForm.Free等,似乎什么都没有用.我如何 - 从TFrame中关闭表格?

创建这个东西的代码是......

 // Create the Window
    ThisWin := TEmptyFrameWin.Create(nil);

  // Create the Frame for the Window
  ThisFrame := TFrameUsage.Create(Application);

  ThisFrame.Parent := ThisWin;

  // Load the data
  ThisFrame.tUsage.Open;
  ThisFrame.tUsage.FindKey([StrToInt(ID)]);
  ThisFrame.LoadDateFields;

  ThisWin.Caption := 'Change Appointment Information';
  // Only show the POST button    
  ThisFrame.UsageNav.VisibleButtons := [sbPost];

  try
    ThisWin.ShowModal;
  finally
    ThisWin.Free;
  end;
Run Code Online (Sandbox Code Playgroud)

谢谢,

GS

forms delphi tframe

4
推荐指数
1
解决办法
1773
查看次数