- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我创建了一个自定义 Tpanel 并在里面放置了各种自定义组件......
procedure Panel_Comp(Location: TWinControl; NumOfComp: Integer;Left,Top,Height,width:Integer);
begin
MyPanel := TsPanel.Create(Conf);
MyPanel.Name := 'MyPanel' + IntToStr(NumOfComp);
MyPanel.Parent := Location;
MyPanel.Left := Left;
MyPanel.Top := Top;
MyPanel.Height := Height;
MyPanel.Width := width;
MyPanel.Caption := '';
end;
我是这样调用它的
Panel_Comp(Conf.ScrollBox1,1,8,10,70,322);
按照相同的逻辑,我在新面板中放入了其他自定义组件,包括具有 onclick 事件的 tBitbtn。
procedure BitBtn_Comp(Location: TWinControl; NumOfComp: Integer; Left,Top,Height,Width,ImageNum: Integer);
begin
MyBitBtn := TBitBtn.Create(Conf);
......
MyBitBtn.tag := NumOfComp;
MyBitBtn.OnClick:= Conf.CloseCurrentPanel;
end;
在主窗体中的TConf.CloseCurrentPanel;
procedure TConf.CloseCurrentPanel(Sender: TObject);
var
panelComp: TComponent;
begin
panelComp := FindComponentEx('Conf.MyPanel'+ IntToStr(TBitBtn(Sender).tag);
TPanel(panelComp).Free;
Application.ProcessMessages;
end;
当我调用它时,我遇到了访问冲突......我认为在释放面板之前我必须释放面板内的所有组件,但是我如何在面板之前释放 BitBtn 并继续点击事件的操作?
这是您需要的 FindComponetEx 函数...
function FindComponentEx(const Name: string): TComponent;
var
FormName: string;
CompName: string;
P: Integer;
Found: Boolean;
Form: TForm;
I: Integer;
begin
// Split up in a valid form and a valid component name
P := Pos('.', Name);
if P = 0 then
begin
raise Exception.Create('No valid form name given');
end;
FormName := Copy(Name, 1, P - 1);
CompName := Copy(Name, P + 1, High(Integer));
Found := False;
// find the form
for I := 0 to Screen.FormCount - 1 do
begin
Form := Screen.Forms[I];
// case insensitive comparing
if AnsiSameText(Form.Name, FormName) then
begin
Found := True;
Break;
end;
end;
if Found then
begin
for I := 0 to Form.ComponentCount - 1 do
begin
Result := Form.Components[I];
if AnsiSameText(Result.Name, CompName) then Exit;
end;
end;
Result := nil;
end;
最佳答案
出现 AV 是因为您正在破坏仍在处理 Windows 消息的组件 (MyBitBtn)。解决方案是通过 PostMessage
将销毁推迟到以后,类似于这样:
unit Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
ExtCtrls,
StdCtrls;
const
UM_DESTROYPANEL = WM_APP + 623; // some "unique" number; UM = user message
type
TConf = class(TForm)
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
strict private
procedure UMDestroyPanel(var Message: TMessage); message UM_DESTROYPANEL;
public
{ Public-Deklarationen }
end;
var
Conf: TConf;
implementation
{$R *.dfm}
procedure TConf.Button1Click(Sender: TObject);
begin
PostMessage(Handle, UM_DESTROYPANEL, 0, 0);
end;
procedure TConf.UMDestroyPanel(var Message: TMessage);
begin
Panel1.Free;
end;
end.
如果需要,您可以使用 wParam 和 lParam 来传递参数,如下所示:
procedure TConf.Button1Click(Sender: TObject);
begin
PostMessage(Handle, UM_DESTROYPANEL, WPARAM(Panel1), 0);
end;
procedure TConf.UMDestroyPanel(var Message: TMessage);
begin
TObject(Message.WParam).Free;
end;
编辑:在您的情况下,我可能会像这样重写 TConf.CloseCurrentPanel
:
procedure TConf.CloseCurrentPanel(Sender: TObject);
var
panelComp: TComponent;
begin
panelComp := FindComponentEx('Conf.MyPanel'+ IntToStr(TBitBtn(Sender).Tag);
PostMessage(Handle, UM_DESTROYPANEL, WPARAM(panelComp), 0);
end;
或者,您可以通过标签(可能是更好的解决方案,因为涉及的转换较少):
procedure TConf.CloseCurrentPanel(Sender: TObject);
begin
PostMessage(Handle, UM_DESTROYPANEL, TBitBtn(Sender).Tag, 0);
end;
procedure TConf.UMDestroyPanel(var Message: TMessage);
var
panelComp: TComponent;
begin
panelComp := FindComponentEx('Conf.MyPanel'+ IntToStr(Message.WParam));
panelComp.Free;
end;
AFAICT 不需要 Application.ProcessMessages
。
关于windows - 我怎样才能释放一个 Tpanel 有一个 TbitBtn 调用释放 Tpanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11877394/
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines准则。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
在编写继承自 TBitBtn 的自定义控件时,我正在寻找一种方法来覆盖或拦截仅绘制字形并自己绘制字形,而不必重绘整个控件。我广泛使用 VCL 样式,并希望避免重新创建所有绘图和样式 Hook 等。不幸
我需要更改TBitBtn的背景颜色。请建议我更改它的方法。 最佳答案 你不能。 您可以将您的 BitButton 替换为另一个实现此属性的按钮组件。 一个简单快捷的解决方案是用一对 SpeedButt
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我为 Delphi 6 应用程序创建了 list 文件,以便它可以根据 Windows 定义的主题(控件 6.0)显示控件。一切看起来都很好,除了使用旧主题显示的 TBitBtn 组件: 无论当前主题
我最近开始将我的 RAD Studio 2007 项目升级到 RAD Studio 2009。我注意到的一件事是看似简单的代码突然无法编译。 示例代码: class CButtonPopupMenu
我正在使用 Delphi 2007,并且我正在寻找一些看起来较新的字形来添加到我的 TBitBtns 中。老实说,我喜欢看起来更像 Tango Desktop 的东西或 KDE4,当涉及到字形时。 如
我创建了一个自定义 Tpanel 并在里面放置了各种自定义组件...... procedure Panel_Comp(Location: TWinControl; NumOfComp: Int
我是一名优秀的程序员,十分优秀!