我有一个MDI主(父)表单和一个MDI子表单.我在运行时创建了这样的子代:
VAR
FrmDereplic: TFrmDereplic;
procedure TMainFrm.Button2Click(Sender: TObject);
begin
FrmDereplic:= TFrmDereplic.Create(MainFrm);
FrmDereplic.Show;
end;
Run Code Online (Sandbox Code Playgroud)
重现错误的步骤:
我启动应用程序,按下按钮创建子项,我按下主(父)表单上的'x'按钮关闭应用程序,我得到一个"无法创建表单.没有MDI表单是目前有效"错误.
出现错误的行在子窗体中:
procedure TFrmDereplic.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TFrmDereplic.FormDestroy(Sender: TObject);
VAR MyIniFile: TCubicIniFile;
begin
MyIniFile:= TCubicIniFile.Create(AppINIFile);
TRY
with MyIniFile DO
begin
if WindowState<> wsMaximized then
begin
// save form's screen pos
...
end;
WriteInteger ('Dereplicator', 'fltExtensions', fltExtensions.ItemIndex); <----- HERE
FINALLY
FreeAndNil(MyIniFile);
END;
end;
Run Code Online (Sandbox Code Playgroud)
我将很多表单的属性(以及其他控件属性)保存到INI文件中.但是当我尝试保存fltExtensions.ItemIndex(这是一个TFilterComboBox)时它才会失败.如果我评论那条线它完美无缺.
知道为什么它在我实际关闭应用程序时尝试创建一个表单?????????
我需要找到TScrollBox的整个大小(也称为"逻辑区域") - 与通过Width和Height属性(或ClientWidth ClientHeight)获得的可见区域相反.
我想在TScrollBox中创建一些控件.其中一个(称为TViewer)需要与TScrollBox本身一样高.问题是在创建过程中,TScrollBox向下滚动以显示上次创建的控件.因此,使用Top = 1将不起作用,因为我的控件将具有top = 1,这不是逻辑区域的顶部.
德尔福7
在最近的帖子中(我的程序永远不会释放内存.为什么?)我表明在使用FastMM时,应用程序不会释放大量内存回系统.最近我创建了一个人工测试程序,以确保它不是一个内存的问题,它只出现在FastMM中.
在这个程序中,我创建并销毁一个对象(与前一篇文章中使用的对象相同)500次.
内存要求是("私人工作集"):
没有FastMM
在运行循环之前:1.2MB
运行循环后:2.1MB
使用FastMM(激进的调试模式)
在运行循环之前:2.1MB
运行循环后:25MB
使用FastMM(发布模式)
运行循环之前:1.8MB
运行循环后:3MB
如果我多次运行循环,则内存要求不会增加.这意味着重用未释放的内存,因此这不是内存泄漏(内存泄漏会增加内存占用,每次运行时会有几KB/MB).
我的问题是:
如何在FastMM中禁用此行为?它甚至可能吗?我知道,如果我在没有FastMM或FastMM Release Mode的情况下发布程序,它将"浪费"适量的RAM.但是,根据需要禁用此行为,将帮助我(我们?)识别内存泄漏.实际上在我的第一篇文章中(见链接),很多人都认为我有泄漏.由于这种行为,显然造成了混乱.不,很明显没有泄漏.只是内存管理器拒绝释放大量内存.
它会释放额外的内存吗?什么时候?什么引发了这个?程序员可以触发吗?例如,当我知道我已经完成了RAM密集型任务并且用户可能暂时不使用该程序(最小化它)时,我可以将RAM刷回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?
我想让用户创建同一表单的多个实例(让我们称之为Form1,这是一个MDI子表单).所以我有两个这样的程序,我创建表单.
procedure MyProcedure1; // procedure 2 is similar. it also has a var called MyFrm
var MyFrm: TFrm1;
begin
...
MyFrm:= TFrm1.create(MainForm);
MyFrm.BringToFront;
MyFrm.LoadFromFile(someFile);
end;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,MyFrm是本地变量.这对我来说没问题,因为我创建它之后不需要以编程方式访问表单.没有其他名为Frm1的全局变量.在MyFrm的OnClose事件中,我有Action:= caFree;
什么可能导致上述错误?用户发送了该错误.它只发生一次,我无法重现它.
编辑:
该错误出现在"MyFrm:= TFrm1.create"行中.
有些人建议我需要以编程方式为动态创建的表单指定唯一的名称.我也想知道自己在创建表单时所采用的名称,因此我在调用MyProcedure1过程时进入了代码.
Delphi自动提供唯一的名称,如
MyFrm.name = MyFrm,然后是
MyFrm.name = MyFrm_1,
MyFrm.name = MyFrm_2,
MyFrm.name = MyFrm_3,依此类推.
LoadFromFile中未更改MyFrm.Name.我在程序MyProcedure1的末尾检查了(断点)'MyFrm.Name'的值; 在LoadFromFile之后.这个名字很独特.
正如一些人建议的那样,我重写了SetName过程并检查了TMyFrm的名称.确实,每个表格都有一个独特的名称
procedure TMyFrm.SetName(const Value:TComponentName);
开始
ShowMessage(Value);
遗传;
结束;
我在这个应用程序中有许多表单,但只有MainForm是自动创建的.
我不使用线程.无论如何,这是不相关的,因为表单是由用户创建的(因此多线程是无关紧要的,除非用户可以同时创建2个表单).
在安装Delphi XE后,我的旧版Delphi 7开始更频繁地崩溃.今天,我发现我的一个BPL仍然被D7加载,即使我从"c:\ Program Files\Borland\Delphi7\Projects\Bpl"中删除了它.在搜索完整个磁盘后,我在"c:\ Users\Public\Documents\RAD Studio\8.0\Bpl"中发现了该BPL的副本.
我的问题是:为什么Delphi 7会查看"c:\ Users\Public\Documents\RAD Studio\8.0\Bpl"?我怎么能说服它只查看"c:\ Program Files\Borland\Delphi7\Projects\Bpl"?
在我的应用程序中,我有时使用:ShowWindow(MyForm.Handle, SW_SHOW).
ShowWindow函数的文档有一节SW_SHOWNORMAL说明
"应用程序应在第一次显示窗口时指定此标志".
这是否意味着对于每个表单(我传递给ShowWindow),我需要保留一个布尔变量来查看表单是否显示,并根据我应该使用SW_SHOW或SW_SHOWNORMAL?
什么是深层含义SW_SHOWNORMAL?
一位朋友给我发了一个最近版本的Delphi和Java之间的比较(如果你需要,可以找到源代码).信不信由你(更好地相信)Java现在比Delphi快得多,因为Delphi编译器不会利用现代CPU指令!"慢"Java的重大突破.
我的问题是:如何在不使用ASM的情况下在Delphi中使用现代CPU指令?
该FastCode项目是一个部分回答上述问题,但它现在放弃了.还有其他类似FastCode的项目吗?
这是另一篇文章,显示Java和C#确实比Delphi快得多:http: //webandlife.blogspot.com/2011/12/c-performance-vs-delphi-performance.html
JAVA
import java.util.Date;
public class j
{
public static void xxx(int n, int m)
{
double t;
int i, j;
double d, r;
t = 0.0;
for (j = 1; j <= n; j++)
{
t = t / 1000.0;
for (i = 1; i <= m; i++)
{
t = t + i / 999999.0;
d = t * t + i;
r = (t + d) / …Run Code Online (Sandbox Code Playgroud) 在DUNIT,SetUp并且TearDown被前(和之后分别)称为每个测试方法被执行.
在SetUp,我创建一个从文件加载数据的对象.这很慢,特别是如果我有很多测试.在执行所有测试之前
有没有办法调用SetUp一次(显然是相同的TearDown)?
我有一个项目 (C:\Test\Test.dpr) 使用属于库 (MyLib.DPK) 的文件 (External.pas)。库中的所有文件都可以通过“搜索”路径访问,但我也直接在我的 DPR 文件中包含了 External.pas:
program Test;
uses
External in '..\Packages\MyLib\External.pas', <------ the 'external' file
FormMain in 'FormMain.pas' {frmMain};
Run Code Online (Sandbox Code Playgroud)
对于这个项目,我将“输出目录”和“输出 DCU 目录”设置为“.\$(Platform)_$(Config)”。
当我编译时,这个项目的所有DCU的exe文件都写在正确的输出文件夹中:c:\Test\Win64_Debug\
但是,External.dcu 生成在 ..\Packages\MyLib\External.dcu
而不是 c:\Test\Win64_Debug\
这是为什么?
让我换个方式问这个问题:如果我将一个位于不同文件夹中的 PAS 文件附加到 DPR 项目中,那么所有 DCU 文件(包括外部文件)不应该与 EXE 文件在同一文件夹中生成吗?
我正在尝试创建一个自定义组件,当鼠标移过它时显示一个图标.我正在加载这样的图标:
UNIT Test;
constructor TTestPath.Create(aOwner: TComponent);
VAR myIcon: TIcon;
begin
inherited Create(aOwner);
ImgList:= TImageList.Create(Self);
myicon := TIcon.Create;
TRY
myicon.LoadFromResourceName(HInstance, 'FOLDER'); <------ this becomes application's icon!
ImgList.AddIcon(myicon);
FINALLY
FreeAndNil(myicon);
end;
Run Code Online (Sandbox Code Playgroud)
问题是,只要我将Test.pas添加到我的测试应用程序的USES原因中,应用程序的图标(红色delphi头盔)就会被"FOLDER"图标替换.
更新:
EXE文件中的图标按以下顺序排列:'FOLDER',Default_Delphi_icon因此,TTestPath的图标将添加到exe BEFORE应用程序的图标中.
这里有什么问题:TTestPath的图标在EXE文件中以这种方式出现,或者它放在应用程序的(默认)图标之前?
控制代码如下:
UNIT test;
INTERFACE
USES
System.SysUtils, Winapi.Windows, System.Classes, Vcl.StdCtrls, Vcl.Controls, Vcl.Graphics, vcl.imglist, Vcl.ExtCtrls; {$WARN GARBAGE OFF} {Silent the: 'W1011 Text after final END' warning }
TYPE
TValidity= (vaNone, vaValid, vaInvalid); { Normal / Green / Red color }
TInputType= (itFile, itFolder); { What kind of path …Run Code Online (Sandbox Code Playgroud) delphi ×9
delphi-xe7 ×2
controls ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe2 ×1
dunit ×1
fastmm ×1
vcl ×1
win64 ×1
winapi ×1