标签: delphi-6

在调用FreeMem之前检查内存是否已分配(Delphi 32)

我一直遇到错误,其中对象以某种方式被释放,但我们最终调用FreeMem.当然这会导致错误,因为内存已被释放并引发错误.

我知道try-catch块可能会修复它,但这是很多try-catch块.使用常规object.free避免这种情况的方法是FreeAndNil(object),但我找不到FreeMem的等价物.在释放之前测试是否分配的东西.

这里的最佳解决方案是易于阅读,可维护性和稳定性.

memory delphi free try-catch delphi-6

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

由于事件处理中的循环,Delphi堆栈溢出

我正在处理具有两个列表框的应用程序.我使用值加载两个列表框,当我继续单击列表框中的项目时,我在调试时收到以下错误.

在此输入图像描述

运行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)

stack-overflow delphi delphi-6

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

安全和良好的设计AllocateHWND能够响应多个线程吗?

众所周知,在需要在UI线程和工作线程之间进行通信的情况下,由于线程安全(句柄重建),必须创建隐藏窗口.

例如:

  • Form1有N个动态创建的TProgressBar实例,其背景名称与正在运行的背景相同.
  • 总是保证WM_REFRESH只会在任务线程内部调用.
  • Form1H : THandle property分配以下过程:

    过程RefreshStat(var Message:TMessage); 消息WM_REFRESH;

  • 在内部RefreshStat,如果只有一个后台线程我可以轻松使用LW参数来映射任务ID和位置.

我不知道标题是否说明了我想知道的内容,但让我们想象一下,如果我们有一个运行多个后台任务的应用程序.
就我而言,我TProgressBar用来报告完成的进度.

是否AllocateHwnd保证所有消息在没有竞争条件的情况下到达隐藏窗口?
如果两个或多个任务同时发布消息会发生什么?

如果需要手动控制,我想知道除了在自定义消息中创建另一个消息循环系统之外是否还有其他事情要做.

我希望这个问题足够清楚.

delphi winapi multithreading delphi-6

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

使用常见的OnTerminate行为进行TThread

我正在阅读这篇文章几乎解决了我的问题,因为没有人回答我的评论我决定提出一个问题:

原帖几乎回答了我的问题

我在那里问:

  • 既然多线程可以共享同一个OnTerminate事件,那么它们也可以同时完成吗?
  • 如果是这样,会发生什么?对OnTerminate方法的调用将由操作系统"排队"?换句话说,如果使用MainThread属性,代码是否可以避免重入?

windows delphi multithreading delphi-6

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

如何在Delphi中的多个线程中加载DLL?

也许有一些我错过的东西,我无法想象这里发生了什么.

我正在尝试在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)

windows delphi dll multithreading delphi-6

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

我在哪里可以找到一个好的delphi库?

我正在使用delphi6,它缺乏以下能力:

  • 一个库对象,
  • 列表对象(看起来像TList,TStringList足够好吗?)
  • 算法库(如排序)
  • 模板库就像STL一样
  • 动态语言功能或GC.
  • 等等.

我该怎么找到这个东西?

delphi delphi-6

0
推荐指数
1
解决办法
1041
查看次数

在Delphi中获取DLL类过程地址

我有一个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)

delphi getprocaddress delphi-6

0
推荐指数
1
解决办法
1815
查看次数

Delphi加密文件比原来小很多?

我正在将二进制文件加载到内存流中,然后对数据进行编码,并将结果作为字符串返回,然后将结果写入另一个内存流,并将其保存到文件中,但是当它保存时文件比原始文件小得多来自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)

delphi base64 delphi-6

0
推荐指数
1
解决办法
533
查看次数

Delphi TSemaphore源代码

我正在寻找一个线程池.我在线找到了几个例子,但他们在SyncObjs库中使用了TSemaphore.

我正在使用Delphi 6,而我的SyncObjs不包括TSemaphore.我环顾网络,找不到任何源代码.

是否有适用于包含TSemaphore的Delphi 6的库?

delphi semaphore delphi-6

0
推荐指数
1
解决办法
1670
查看次数

我怎样才能PING线程,读取Delphi 6中的OnReply事件?

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)

delphi indy delphi-6

0
推荐指数
1
解决办法
116
查看次数