小编WeG*_*ars的帖子

"无法创建表单.当前没有MDI表单处于活动状态"错误

我有一个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)时它才会失败.如果我评论那条线它完美无缺.

知道为什么它在我实际关闭应用程序时尝试创建一个表单?????????

delphi

5
推荐指数
1
解决办法
9045
查看次数

如何找到TScrollBox的实际大小("逻辑区域")

我需要找到TScrollBox的整个大小(也称为"逻辑区域") - 与通过Width和Height属性(或ClientWidth ClientHeight)获得的可见区域相反.

我想在TScrollBox中创建一些控件.其中一个(称为TViewer)需要与TScrollBox本身一样高.问题是在创建过程中,TScrollBox向下滚动以显示上次创建的控件.因此,使用Top = 1将不起作用,因为我的控件将具有top = 1,这不是逻辑区域的顶部.


德尔福7

delphi

5
推荐指数
1
解决办法
6240
查看次数

如何说服内存管理器释放未使用的内存

在最近的帖子中(我的程序永远不会释放内存.为什么?)我表明在使用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刷回系统吗?当用户打开我的程序的多个实例时会发生什么?他们不会争夺内存吗?

delphi fastmm

5
推荐指数
3
解决办法
3423
查看次数

奇怪的是"名为TFrm1的组件已存在"错误


我想让用户创建同一表单的多个实例(让我们称之为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;

什么可能导致上述错误?用户发送了该错误.它只发生一次,我无法重现它.


编辑:

  1. 该错误出现在"MyFrm:= TFrm1.create"行中.

  2. 有些人建议我需要以编程方式为动态创建的表单指定唯一的名称.我也想知道自己在创建表单时所采用的名称,因此我在调用MyProcedure1过程时进入了代码.
    Delphi自动提供唯一的名称,如
    MyFrm.name = MyFrm,然后是
    MyFrm.name = MyFrm_1,
    MyFrm.name = MyFrm_2,
    MyFrm.name = MyFrm_3,依此类推.

  3. LoadFromFile中未更改MyFrm.Name.我在程序MyProcedure1的末尾检查了(断点)'MyFrm.Name'的值; 在LoadFromFile之后.这个名字很独特.

  4. 正如一些人建议的那样,我重写了SetName过程并检查了TMyFrm的名称.确实,每个表格都有一个独特的名称

    procedure TMyFrm.SetName(const Value:TComponentName);
    开始
    ShowMessage(Value);
    遗传;
    结束;

  5. 我在这个应用程序中有许多表单,但只有MainForm是自动创建的.

  6. 我不使用线程.无论如何,这是不相关的,因为表单是由用户创建的(因此多线程是无关紧要的,除非用户可以同时创建2个表单).

delphi

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

安装Delphi XE(BPL混合路径)后Delphi 7崩溃

在安装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"?

delphi

5
推荐指数
1
解决办法
918
查看次数

SW_SHOW和SW_SHOWNORMAL的含义

在我的应用程序中,我有时使用:ShowWindow(MyForm.Handle, SW_SHOW).

ShowWindow函数的文档有一节SW_SHOWNORMAL说明

"应用程序应在第一次显示窗口时指定此标志".

这是否意味着对于每个表单(我传递给ShowWindow),我需要保留一个布尔变量来查看表单是否显示,并根据我应该使用SW_SHOWSW_SHOWNORMAL

什么是深层含义SW_SHOWNORMAL

winapi

5
推荐指数
2
解决办法
9296
查看次数

如何在Delphi中使用现代CPU指令?(Java比Delphi快?)

一位朋友给我发了一个最近版本的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)

delphi delphi-2010 delphi-xe2

5
推荐指数
3
解决办法
2485
查看次数

DUnit:'全球'SetUp和TearDown

在DUNIT,SetUp并且TearDown被前(和之后分别)称为每个测试方法被执行.
SetUp,我创建一个从文件加载数据的对象.这很慢,特别是如果我有很多测试.在执行所有测试之前
有没有办法调用SetUp一次(显然是相同的TearDown)?

delphi dunit delphi-xe

5
推荐指数
1
解决办法
943
查看次数

为什么Delphi没有在正确的文件夹中输出DCU文件?

我有一个项目 (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 文件在同一文件夹中生成吗?

delphi win64 delphi-xe7

5
推荐指数
1
解决办法
4564
查看次数

从RES文件加载图标后,错误的图标用作默认图标

我正在尝试创建一个自定义组件,当鼠标移过它时显示一个图标.我正在加载这样的图标:

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 controls vcl delphi-xe7

5
推荐指数
1
解决办法
669
查看次数