我一直遇到错误,其中对象以某种方式被释放,但我们最终调用FreeMem.当然这会导致错误,因为内存已被释放并引发错误.
我知道try-catch块可能会修复它,但这是很多try-catch块.使用常规object.free避免这种情况的方法是FreeAndNil(object),但我找不到FreeMem的等价物.在释放之前测试是否分配的东西.
这里的最佳解决方案是易于阅读,可维护性和稳定性.
我正在处理具有两个列表框的应用程序.我使用值加载两个列表框,当我继续单击列表框中的项目时,我在调试时收到以下错误.

运行exe会导致应用程序关闭.有时我会收到"访问冲突"消息.
那么我该如何摆脱我的应用程序中的这个错误呢?
编辑
..
主窗体具有刷新所有控件的计时器timer_RefreshCOntrol(intervali 1).
当editBox_one被修改(值)时,调用此函数
Procedure TStringSetting.SetValue (const AValue : String);
Begin
...
If FValueControl <> Nil then
Begin
FValueControl.OnChange := VoidNotifyEvent;
FValueControl.Text := NewValue;
FValueControl.OnChange := EditChange; //<--here the stackoverflow error comes....
end;
end;
Procedure EditChange (Sender: TObject);
Begin
Value := FValueControl.Text;
If Not EditIsValid then FValueControl.Font.Color := clRed
else If Dirty then FValueControl.Font.Color := clBlue
else FValueControl.Font.Color := clWindowText;
If @OldCustomEditChange <> Nil then OldCustomEditChange(Sender);
end;`
the EditChange (Sender: TObject); <--keeps geting called and the …Run Code Online (Sandbox Code Playgroud) 众所周知,在需要在UI线程和工作线程之间进行通信的情况下,由于线程安全(句柄重建),必须创建隐藏窗口.
例如:
Form1有N个动态创建的TProgressBar实例,其背景名称与正在运行的背景相同.WM_REFRESH只会在任务线程内部调用.Form1有H : THandle property分配以下过程:
过程RefreshStat(var Message:TMessage); 消息WM_REFRESH;
在内部RefreshStat,如果只有一个后台线程我可以轻松使用L和W参数来映射任务ID和位置.
我不知道标题是否说明了我想知道的内容,但让我们想象一下,如果我们有一个运行多个后台任务的应用程序.
就我而言,我TProgressBar用来报告完成的进度.
是否AllocateHwnd保证所有消息在没有竞争条件的情况下到达隐藏窗口?
如果两个或多个任务同时发布消息会发生什么?
如果需要手动控制,我想知道除了在自定义消息中创建另一个消息循环系统之外是否还有其他事情要做.
我希望这个问题足够清楚.
我正在阅读这篇文章几乎解决了我的问题,因为没有人回答我的评论我决定提出一个问题:
我在那里问:
OnTerminate事件,那么它们也可以同时完成吗?OnTerminate方法的调用将由操作系统"排队"?换句话说,如果使用MainThread属性,代码是否可以避免重入?也许有一些我错过的东西,我无法想象这里发生了什么.
我正在尝试在TThread对象的多个实例中加载相同的DLL.
这是我的DLL代码:
library MyCalcFor32;
uses
SysUtils,
Classes,
uRunner in 'uRunner.pas';
Exports EVal;
{$R *.res}
begin
end.
Run Code Online (Sandbox Code Playgroud)
这是uRunner.pas:
unit uRunner;
interface
uses SysUtils,
Classes;
function EVal(Valor: WideString): WideString; stdcall; export;
implementation
function EVal(Value: WideString): WideString; stdcall; export;
begin
Result := Value+' xxx';
end;
initialization
finalization
end.
Run Code Online (Sandbox Code Playgroud)
这是加载DLL的程序:
procedure TfrmMain.FormCreate(Sender: TObject);
var I: Integer;
begin
SetLength(Threads, 10);
for I:= 0 to 9 do
begin
Threads[I] := TWorker.Create(Self.Handle, I+1, Memo1.Text, ExtractFilePath(ParamStr(0)));
end;
end;
procedure TfrmMain.btnExecuteThreadsClick(Sender: TObject);
var I: Integer;
begin
ClearMemos([MT1, MT2, …Run Code Online (Sandbox Code Playgroud) 我正在使用delphi6,它缺乏以下能力:
我该怎么找到这个东西?
我有一个DLL文件,我需要一个类过程的内存地址.我正在获取DLL文件的句柄,但是当我使用GetProcAddress时,我无法获取该过程的地址.我为进程名参数尝试了以下字符串:
"ProcName"
"ProcClass.ProcName"
"ProcClass::ProcName"
"ProcInterface::ProcName"
"ProcInterface.ProcName"
Run Code Online (Sandbox Code Playgroud)
在任何情况下我都没有得到程序的内存地址.我大多肯定该程序是公开的.
这样做的字符串格式是什么?声明一个指向外部过程的函数并稍后获取地址会更容易吗?像这样:
procedure ProcName(); stdcall; far; external 'Example.DLL';
Run Code Online (Sandbox Code Playgroud)
ProcPointer := @ProcName;
Run Code Online (Sandbox Code Playgroud) 我正在将二进制文件加载到内存流中,然后对数据进行编码,并将结果作为字符串返回,然后将结果写入另一个内存流,并将其保存到文件中,但是当它保存时文件比原始文件小得多来自400kb的25kb ...大声笑,我很确定这是因为我已达到字符串能够处理的极限.
它肯定地编码它正确保存在新文件中的数据,我解密它并将其与原始文件的开头进行比较.
我知道这是一个非常漫长的方法,并且可能有一些不必要的步骤,因此将其加载到bStream中将是一个非常有效的解决方案.我的问题是我怎样才能将数据返回到bStream而不是让它返回到字符串然后将字符串写入bStream,因为我相信它会解决我的问题,任何其他建议也将受到赞赏.我正在使用Delphi 6.
继承我的代码:
function B64Encode(pInput: pointer; pOutput: pointer; Size: longint): longint;
var
i, iptr, optr: integer;
Input, Output: PByteArray;
begin
Input := PByteArray(pInput);
Output := PByteArray(pOutput);
iptr := 0;
optr := 0;
for i := 1 to (Size div 3) do
begin
Output^[optr + 0] := B64[Input^[iptr] shr 2];
Output^[optr + 1] := B64[((Input^[iptr] and 3) shl 4) + (Input^[iptr + 1] shr 4)];
Output^[optr + 2] := B64[((Input^[iptr + 1] and 15) shl 2) + (Input^[iptr …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个线程池.我在线找到了几个例子,但他们在SyncObjs库中使用了TSemaphore.
我正在使用Delphi 6,而我的SyncObjs不包括TSemaphore.我环顾网络,找不到任何源代码.
是否有适用于包含TSemaphore的Delphi 6的库?
TIdIcmpClient我对 Delphi 6 和 Indy 的组件有疑问。
在编译以下代码时,我在标记行 (51) 中收到此消息:
FPing.OnReply := OnPingReply;
[错误] fire.pas(51):不兼容的类型:“TComponent”和“TIdIcmpClient”
我应该如何修复它?
unit fire;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,
IdIcmpClient;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TMyThread = class(TThread)
private
FIndex: Integer;
FPing: TIdIcmpClient;
FIP: string;
protected
procedure Execute; override; …Run Code Online (Sandbox Code Playgroud)