每当我调整我的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文件保存为文本而不是二进制(如果这很重要).
我怎样才能在Delphi中模拟一个OnDestroy事件TFrame?
我简单地添加了一个constructor和destructor我的框架,认为这是做什么的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) 嗨,我有一个内部有几个框架的表格.
对于某些帧,我希望滚动内容(或至少处理鼠标轮事件).
我尝试过以下方法:
只需为每个帧分配一个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)
不幸的是,两者似乎都没有用.
因此,简单地说,如何将鼠标滚轮事件指向鼠标光标所在的最顶层控件(无论光标位于哪个帧/父/窗体等)?
我有一个包含的表格TFrame.该TFrame包含ComboBox被动态填充.每个ComboBox条目都有一个关联的对象.当TFrame被调用的析构函数被调用时,ComboBox已经清除了中的Items 而没有释放它们的相关对象.无论我是ComboBox在设计器视图中删除表单,还是在代码中使用nil或TFrame作为其所有者动态创建它,都会发生这种情况.我目前使用contains的OnDestroy事件TForm来调用包含的清理过程TFrame.
是否有更好的方法不需要由TFrame容器进行显式过程调用?理想情况下,动态添加的对象应该ComboBox被释放?
我希望在Frames中有一个KeyPreview功能,我的意思是,当输入(例如,选择框架的一个控件,或鼠标在里面)是在一个框架(这将有几个面板和其他控件) )然后由框架首先处理用户按下的键.
有没有办法做到这一点?我没有在TFrame中找到类似于KeyPreview的属性.
我正在使用RAD Studio的XE5版本,尽管我主要使用的是C++ Builder.
我正冒险在Delphi中制作自己的组件.我很难开始组件开发.
我想制作复合控件,即由几个其他控件组成的控件,例如地址表单或类似的控件.
我是从TWinControl下降的.这会被认为是正确的选择吗?
最重要的是,我看不到在D2010中可视化设计组件的方法.这可能吗?例如,将一些文本框放到组件上,就像使用表单一样.我希望我不必将所有视觉方面的代码都交给我自己的组件.
此外,delphi组件开发的任何好链接都将非常受欢迎 - 尤其是复合控件.文件不是A1,它是一场斗争.我已经搜索了很多,我仍然无处可去.
是否可以创建运行时框架并添加现有面板,如将面板的父级设置为框架?当它添加时,重复框架并使用它?
喜欢:
f:= Tframe. create(..)
...
panel3.parent = f; //where panel3 has many controls.
Run Code Online (Sandbox Code Playgroud)
然后复制f?它可以吗?怎么样?或任何其他建议?Ë
我有一个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 2010(现在的Delphi XE)中没有任何问题.
谢谢.
在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
delphi ×10
tframe ×10
destructor ×2
tform ×2
c++builder ×1
delphi-2007 ×1
delphi-2010 ×1
delphi-5 ×1
focus ×1
forms ×1
ide ×1
inheritance ×1
keypreview ×1
mousewheel ×1
runtime ×1
vcl ×1