小编mgh*_*hie的帖子

为什么不收集TInterfacedObject垃圾的后代?

我有一个基于TInterfacedObject的类.我将它添加到TTreeNode的Data属性.

TFacilityTreeItem=class(TInterfacedObject)
private
  m_guidItem:TGUID;
  m_SomeOtherNode:TTreeNode;
public
end;
Run Code Online (Sandbox Code Playgroud)

我创建了这个对象的许多实例,并假设因为它们被引用计数,我不需要释放它们.那会很方便.

但是,在检查时,我打开了ReportMemoryLeaksOnShutdown,发现它们毕竟没有被释放.

这些对象是在放置在主窗体上的框架中创建的.在主窗体的FormClose中,我清除树节点,以便释放每个对象.

发生了什么?

谢谢您的帮助!

delphi reference-counting tinterfacedobject

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

Delphi 5:如何暂停锚布局?

有没有办法暂停表单上的所有锚定控件暂时移动或调整大小?即:

procedure ScaleFormBy(AForm: TForm; n, d: Integer);
begin
    AForm.SuspendAnchors();
    try
       AForm.ScaleBy(n, d);
    finally
       AForm.ResumeAnchors();
    end;
end;
Run Code Online (Sandbox Code Playgroud)

我需要这样做,因为我正在打电话

AForm.ScaleBy(m, d);
Run Code Online (Sandbox Code Playgroud)

哪个不能正确处理锚定控件.(它将左侧+右侧或顶部+底部锚定控件推离窗体边缘.

注意:我想禁用Anchors,而不是Alignment.

delphi layout user-interface fonts

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

如何进行虚拟Treeview控制以始终按行滚动?

虚拟树视图垂直滚动的像素,不同的方式,标准德尔福网格,TListViewTTreeView(或大部分我所知道的其他此类管制的)滚动一行,并保持全线可见在任何时候控制的顶部.当我使用光标键进行导航时,根据方向,第一行或最后一行是完全可见的.使用鼠标滚动时无论如何都没有对齐.

例如,使用Delphi 2007和2009中的Structure窗口可以观察到此行为.

有没有办法设置许多属性以具有标准Windows控件的行为?或者是否有一组补丁来实现这一目标?

delphi virtualtreeview

4
推荐指数
2
解决办法
2648
查看次数

获取调用事件的按钮名称的最佳方法是什么?

在下面的代码(灵感来自这个片段),我用一个单一的事件处理程序buttonClick来改变窗口的标题.目前,我需要评估事件的Id是否与按钮的Id相对应.如果我决定添加50个按钮而不是2个,则此方法可能会变得很麻烦.有一个更好的方法吗?

import wx

class MyFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, 'wxBitmapButton',
            pos=(300, 150), size=(300, 350))
        self.panel1 = wx.Panel(self, -1)

        self.button1 = wx.Button(self.panel1, id=-1,
            pos=(10, 20), size = (20,20))
        self.button1.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.button2 = wx.Button(self.panel1, id=-1,
            pos=(40, 20), size = (20,20))
        self.button2.Bind(wx.EVT_BUTTON, self.buttonClick)

        self.Show(True)

    def buttonClick(self,event):
        if event.Id == self.button1.Id:
            self.SetTitle("Button 1 clicked")
        elif event.Id == self.button2.Id:
            self.SetTitle("Button 2 clicked")            

application = wx.PySimpleApp()
window = MyFrame()
application.MainLoop()
Run Code Online (Sandbox Code Playgroud)

python events user-interface wxpython event-handling

4
推荐指数
3
解决办法
9352
查看次数

函数的返回值可能未定义

好的,我有以下功能:

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result.Text := richDescription.Lines.Text; //stringlist
end;
Run Code Online (Sandbox Code Playgroud)

编译器会对此行生成以下警告:

[DCC警告] W1035函数'GetRTFDescription'的返回值可能未定义

关于如何清除此警告的任何想法?(除了在项目选项中关闭它)

我试过了:

function TfPackagedItemEdit.GetRTFDescription: TStringList;
begin
  Result.Text := '';
  Result.Text := richDescription.Lines.Text;
end;
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

delphi

4
推荐指数
2
解决办法
4414
查看次数

如何在我的TEdit控件中捕获VK_TAB键并且不让它失去焦点?

在我的TEdit字段中,我在表单中有文本<number1>..<number2>.

我的想法是:

当用户使用TAB另一个控件输入控件时,number1将被选中.

当我的TEdit控件有焦点并且用户TAB再次按下时,我想要number2选择并number1取消选择.

如果当前插入位置位于number2所在的位置,则按下TAB应该正常并将焦点移动到表单上的下一个控件.

我有2个问题.

  1. 当"编辑"字段已激活时,我无法按下Tab键.我只能在输入/聚焦此控件时捕获它.

  2. 我不知道是否有类似于#0的键,所以我可以把钥匙变成NoOP.

有什么想法,怎么做?

delphi keypress delphi-2009

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

如何为Delphi组件创建上下文菜单?

我想创建德尔福部件,如上下文菜单TDBGrid,TTreeView或者类似的.我怎样才能做到这一点?

delphi contextmenu

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

Delphi:EReadError,消息"属性持久性不存在"

我用Delphi 7编写的程序编译好了,但是当我运行它时它会给我错误信息:

Project1.Exe引发异常类EReadError,消息'属性持久性不存在'.流程已停止.

这只是在我安装TMS Component Pack以用于此项目之后才开始.谢谢你的帮助.

delphi exception

3
推荐指数
1
解决办法
1万
查看次数

TImage的透明度

创建新的TImage时,它是透明的.在将对象绘制到此图像后,我想清除它们.请注意,我需要保持图像透明,因为TImage被用作另一个图像的叠加层.

TImage的某种"清晰"功能是最好的.我想我在这里缺少一些简单的东西,我在TImage菜单中找不到任何明确的功能.

delphi timage

3
推荐指数
1
解决办法
1257
查看次数

如何在TScrollBox再次显示后显示滚动条?

我遇到了一个小问题.我正在动态生成一些控件并将它们放在一个TScrollbox组件上.但我注意到,如果滚动条可见,用户可以清楚地看到正在创建和放置的每个控件.所以看起来很多工作正在进行而且很慢.

我隐藏了滚动条并在其上生成了所有控件,这花费的时间更少,没有闪烁和相似.但这是问题所在.当我再次显示滚动条时,直到我实际调整表单大小时才会显示其滚动条.(滚动条的对齐方式是alClient)

有想法该怎么解决这个吗?

尝试重新粉刷,但它没有奏效.刷新也不起作用.

谢谢

编辑:

TScrollBox(Form1.FindComponent('termai')).Visible:= false;
for I := 0 to mazgas.GrafasPagalVarda(sActiveGrafas).Termai.Count - 1 do
begin
    fNaujasTermas(i,oHook);
end;
TScrollBox(Form1.FindComponent('termai')).Visible := true;
Run Code Online (Sandbox Code Playgroud)

上面的代码显示了我如何隐藏和显示滚动框.
fNaujasTermas生成一个包含多个轨迹栏,图像和编辑的面板.

我不确定可能会有一步一步的解释.只需创建一个过程,它将生成一些带有许多控件的面板,并将ScrollBox设置为父级.在生成任何内容之前隐藏滚动框,并在完成后取消隐藏它.
哦顺便说一句,面板是对齐的alTop.因此,每次创建新面板并将其放入滚动框时,它将显示在顶部,而所有其他面板将向下移动.

这就是我创建滚动条本身的方式

pTermai := TScrollBox.Create(Self);
pTermai.Parent := pLeft;
pTermai.Align := alClient;
pTermai.Name := 'termai';
pTermai.BorderStyle := bsNone;
pTermai.VertScrollBar.Increment := 40;
Run Code Online (Sandbox Code Playgroud)

EDIT2:我想我知道如何重现这一点.
看起来,当向滚动框添加新面板时,它不会将其计入已存在于该滚动框中的所有控件的总高度.

所以举个例子.让我们说1面板的高度为200px.
ScrollBox高度为300px.

因此,在创建2个高度为400px的面板后,即使第二个面板的一半不可见,滚动框也不会显示滚动条.如果我再添加一个面板= 600px,滚动条将显示滚动条,看起来它只会滚动每2个面板,而不是3.当尝试滚动这样的窗口时,值会重新计算,一切都很好地显示.

所以主要的问题是,如何使滚动条"及时"显示滚动条,这样没有面板被切成一半?

delphi delphi-2009 tscrollbox

3
推荐指数
1
解决办法
7586
查看次数