似乎设置ReportMemoryLeaksOnShutdown := true对使用Delphi 10.2 Tokyo创建的程序没有任何影响(我在Windows和Linux程序中尝试过).即使有明显的内存泄漏,也没有任何报告.
有人能证实吗?还有一种方法可以检查Linux程序中的内存泄漏吗?在Windows上,我可以使用madExcept.
------------------编辑2 ------------------
在Delphi 10.2中,ReportMemoryLeaksOnShutdown := true似乎只适用于未标记为控制台应用程序的程序.一旦我注释掉该行,{$APPTYPE CONSOLE}我收到了所需的错误消息(当我在Windows上运行程序时).
------------------编辑1 ------------------
这是请求的示例:
program WeakRefTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
type
TParent = class;
TChild = class
private
{$IFDEF AUTOREFCOUNT} [Weak] {$ENDIF}
Parent: TParent;
public
constructor Create (const Parent: TParent);
destructor Destroy; override;
end; { TChild }
TParent = class
private
Child : TChild;
public
constructor Create;
destructor Destroy; override;
end; { TParent }
constructor TChild.Create(const Parent: TParent);
begin
inherited …Run Code Online (Sandbox Code Playgroud) 我做了:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
DataTable.qOrders.Next;
end;
Run Code Online (Sandbox Code Playgroud)
它的工作原理,但问题是当我点击按钮到达最后一条记录时,按钮没有被禁用,就像在a TDBNavigator.
我是如何进行TSpeedButton禁用并自动启用的TDBNavigator?
根据可能未更新的DocWiki,以下内容应该是.pas文件中的有效指令:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
但是它会导致此dcc32错误:
[dcc32 Error] Project1.dpr(13): E2003 Undeclared identifier:
'IMAGE_FILE_LARGE_ADDRESS_AWARE'
这种能力是否已经丢失,或者它现在一直在使用?
我正在阅读"德尔福高性能",并且有一些我缺少的东西.鉴于此代码作为测试:
type TTest = class(TThread)
private
amemo: TMemo;
public
constructor Create(ss: boolean; memo: TMemo);
protected
procedure Execute; override;
end;
constructor TTest.Create(ss: boolean; memo: TMemo);
begin
inherited Create(ss);
FreeOnTerminate := true;
amemo := memo;
end;
procedure TTest.Execute;
var i: uint32;
begin
inherited;
i := 0;
while not Terminated do
begin
Inc(i);
Synchronize(procedure
begin amemo.Lines.Add(i.ToString) end);
Sleep(1000);
end;
end;
Run Code Online (Sandbox Code Playgroud)
很简单,这个线程在备忘录中打印一些数字.我启动线程暂停,所以我必须调用这段代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
thread := TTest.Create(true, Memo1);
thread.Start;
end;
Run Code Online (Sandbox Code Playgroud)
我一直停止调用线程,thread.Terminate;但读完书后我看到Primoz停止这样的线程:
procedure TForm1.Button2Click(Sender: TObject);
begin
thread.Terminate;
thread.WaitFor; //he adds this …Run Code Online (Sandbox Code Playgroud) 我已经开始编写组件了,我想编写一个程序来为我生成DCR文件.组件的图片必须是24x24位图,因此我需要创建一个资源文件,然后用于brcc32创建DCR.
脚步:
所以,我想编写一个程序来为我制作所有这些东西,这就是表格.在编辑字段中,我写了他们的Name属性.
这是代码:
unit uBmp2rc;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.IOUtils,
Vcl.ExtDlgs, Vcl.ExtCtrls, ShellApi;
type
TBitmapConverter = class(TForm)
Label1: TLabel;
edtClassName: TEdit;
Label2: TLabel;
edtSource: TEdit;
Label3: TLabel;
Label4: TLabel;
edtDirectory: TEdit;
OpenPicture: TOpenPictureDialog;
Label5: TLabel;
edtBitmap: TEdit;
Button1: TButton;
Button2: TButton;
Label6: TLabel;
Preview: TImage;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
path: string;
public …Run Code Online (Sandbox Code Playgroud) 我在做什么:
FileUpload组件(对话框)将启动,他可以从他的PC浏览并加载文件.因此,无论文件在用户加载时的名称如何,它都会以他的Firstname和来保存到磁盘中LastName,这是我从一些字符串变量中获得的.
UniMainModule.foldername =包含保存文件的文件夹的路径.
UniMainModule.FirstName =包含用户的FirstName
UniMainModule.LastName =包含用户的LastName
因此,文件将保存FirstName_LastName.pdf在磁盘上由foldername字符串提供的位置.
这是我正在使用的代码:
procedure TsomeForm.UniFileUpload1Completed(Sender: TObject; AStream: TFileStream);
var
DestName : string;
DestFolder : string;
begin
DestFolder:=UniServerModule.StartPath+'files\'+UniMainModule.foldername+'\';
DestName:=DestFolder+UniMainModule.FirstName+'_'+UniMainModule.LastName+'.pdf';
CopyFile(PChar(AStream.FileName), PChar(DestName), False);
ModalResult:= mrOk;
end;
Run Code Online (Sandbox Code Playgroud)
据我了解,阅读一些关于后CopyFile上msdn通过False,这意味着应该,将覆盖现有文件.
如果该文件在该位置尚未出现该名称,则可以保存.
但是,如果用户决定再次使用fileupload并上传新文件,则新文件将覆盖前一个文件.因为他们被保存为同名.
那么如何确保如果文件已经存在(位置中存在具有该确切名称的文件),它不会被覆盖,但是,我不知道,在名称或其他内容中被分配了(1),保留两个文件?
使用此代码我得到一个AV:
uses
Winapi.ShlObj;
function GetUserAppDataPath: string;
var
ThisPath: PWideChar;
begin
if Winapi.ShlObj.SHGetFolderPath(0, CSIDL_APPDATA, 0, SHGFP_TYPE_CURRENT, ThisPath) = S_OK then
Result := string(ThisPath)
else
Result := '';
end;
Run Code Online (Sandbox Code Playgroud)
在Delphi 10.2 Tokyo中,如果我两次调用此函数,第二次获得AV.
是什么导致这个错误?