我用框架TFrame组合一个TPanel,一个TCheckBox,一个TImage
代表一个图层程序中根据层数动态创建这个框架移动TFrame表示图层的上下移动 怎么写?还有怎么得到Tframe所在的TForm?谢谢ps:相关内容还请参看我的另一贴:
http://expert.csdn.net/Expert/TopicView1.asp?id=1758115
代表一个图层程序中根据层数动态创建这个框架移动TFrame表示图层的上下移动 怎么写?还有怎么得到Tframe所在的TForm?谢谢ps:相关内容还请参看我的另一贴:
http://expert.csdn.net/Expert/TopicView1.asp?id=1758115
得到Tframe所在的TForm:
var ob:twincontrol;
begin
ob:=Frame31.Parent;
while not (ob is Tform) do
begin
ob:=ob.Parent;
end;
showmessage(tform(ob).Caption);
end;
谢谢关于我的说要的移动,就是如果创建了7个TFrame(Frame2.align:=alTop,上下),拖动其中任一个,eg,把第3个拖到第5个下面. 怎么弄啊?
>>Tframe.panel1.OnClick上执行,并且我把这部分写在一个Dll里. 要不你需要的是一个TFrame的一个OnFramePanelClick事件,要不你就要给你的Frame添加一个RelateComponent属性,要不你就需要把你要操作的那另一个组件和你的Frame封装在一起,如果你试图把外面的这个控件实例和你的Frame建立一个硬性的联系,那么你就错了,如果这一切只是因为你想写这样一个DLL,那么你写这个DLL的初衷就错了,至少也是不合理。>>先说移动. 你理解错了."一个框架代表一个图层",我是要移动图层间的上下顺序. 大概是在
>>OnDragDrop里写,但是我不确定. 因为框架是一个独立单元,在程序中动态创建,移动的时候
>>怎么判断和其它动态创建的TFrame的关系等等.--问题本身可能很简单,而我可能钻了牛角
>>了,所以来求助.
我觉得你起码需要借助于一个TFrameList类,所有的这些Frame应该是属于一个整体的你应该多花点时间在程序的逻辑结构上,现在你的技术问题其实很简单,移动Frame没什么问题,你自己的程序逻辑阻碍了你。可以看看设计模式
谢谢你的解析你可以就 "在若干个动态创建的TFrame中移动某一个的相对位置" 的写法 写个实例吗?谢谢
似乎还是没法回避 这个问题的具体写法哪位大侠能 就“在若干个动态创建的TFrame中移动某一个的相对位置” 写个实例 谢谢
“至于Frame单元里操作另一个组件的问题,倒并不是我违背OOP的思想,操作是在Tframe.panel1.OnClick上执行,并且我把这部分写在一个Dll里.”
即使是写在DLL中,也可以将当前调用DLL的程序中的函数按照 指针 的方式,传进去使用,就好像声明了一个事件一样。具体可以参考Windows API中,大概EnumChildWindow的实现方式。
“在若干个动态创建的TFrame中移动某一个的相对位置” 如果我理解的正确的话,您要实现的情况是否与:在窗体中,按Tab键实现当前窗体的焦点转换相类似,如果类似的话,也许可以参考Tab实现的方式。
其实, rustle() 提出的TFrameList是比较好的方法,通俗的说就是建一个所有动态创建的TFrame对象的管理类。
SysUtils, Classes, Controls, Forms, Dialogs;type
TFrameQueryEvent = procedure(Sender: TObject; var Enable: Boolean) of Object; TFrameMove = class(TComponent)
private
{ Private declarations }
FParentLeft: Integer;
FParentTop: Integer;
FOnInsertQuery: TFrameQueryEvent;
FOnRemoveQuery: TFrameQueryEvent;
FOnInsert: TNotifyEvent;
FOnRemove: TNotifyEvent;
function GetFrame: TFrame;
function GetIsInsert: Boolean;
procedure SetParentLeft(const Value: Integer);
procedure SetParentTop(const Value: Integer);
protected
{ Protected declarations }
function CanInsert: Boolean; virtual;
function CanRemove: Boolean; virtual;
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
function InsertFrame(FrameParent: TWinControl): Boolean;
function RemoveFrame: Boolean;
property Frame: TFrame read GetFrame;
property IsInsert: Boolean read GetIsInsert;
published
{ Published declarations }
property ParentLeft: Integer read FParentLeft write SetParentLeft default 0;
property ParentTop: Integer read FParentTop write SetParentTop default 0;
property OnInsertQuery: TFrameQueryEvent read FOnInsertQuery write FOnInsertQuery;
property OnRemoveQuery: TFrameQueryEvent read FOnRemoveQuery write FOnRemoveQuery;
property OnInsert: TNotifyEvent read FOnInsert write FOnInsert;
property OnRemove: TNotifyEvent read FOnRemove write FOnRemove;
end;procedure Register;implementationprocedure Register;
begin
RegisterComponents('User', [TFrameMove]);
end;{ TFrameMove }function TFrameMove.CanInsert: Boolean;
begin
Result := not IsInsert;
if Result and Assigned(OnInsertQuery) then
OnInsertQuery(Self, Result);
end;function TFrameMove.CanRemove: Boolean;
begin
Result := True;
if Assigned(OnRemoveQuery) then
OnRemoveQuery(Self, Result);
end;constructor TFrameMove.Create(AOwner: TComponent);
begin
if not (AOwner is TFrame) then
begin
ShowMessage('TFrameMove必须放在TFrame元件上.');
Exit;
end;
inherited;
end;function TFrameMove.GetFrame: TFrame;
begin
Result := TFrame(Owner);
end;function TFrameMove.GetIsInsert: Boolean;
begin
Result := Frame.HasParent;
end;function TFrameMove.InsertFrame(FrameParent: TWinControl): Boolean;
begin
Result := CanInsert and Assigned(FrameParent);
if Result then
begin
Frame.Parent := FrameParent;
if ParentLeft <> 0 then Frame.Left := ParentLeft;
if ParentTop <> 0 then Frame.Top := ParentTop;
if Assigned(OnInsert) then OnInsert(Self);
end;
end;function TFrameMove.RemoveFrame: Boolean;
begin
Result := IsInsert;
if Result then
begin
Result := CanRemove;
if Result then
begin
Frame.Parent := nil;
if Assigned(OnRemove) then OnRemove(Self);
end;
end;
end;procedure TFrameMove.SetParentLeft(const Value: Integer);
begin
if FParentLeft <> Value then
begin
FParentLeft := Value;
if IsInsert then Frame.Left := Value;
end;
end;procedure TFrameMove.SetParentTop(const Value: Integer);
begin
if FParentTop <> Value then
begin
FParentTop := Value;
if IsInsert then Frame.Top := Value;
end;
end;end.