标签: delphi-5

Delphi - 找不到类TListView

我们有一个Delphi 5应用程序,它是在没有运行时包,dll或外部资源(即单个可执行文件)的情况下构建的.当我们在客户端PC上安装它时,我们收到以下错误消息:

找不到类TListView

要么

未找到类TImage

我们已经将它安装在几十台PC上,没有发生任何事故,但这次最新安装存在问题.

目标PC是全新安装的Windows XP(Service Pack 3),没有安装其他软件.

它并没有抱怨所有的课程,只有一两个.例如TPanel/TForm/TEdit都可以.

任何人都可以认为是什么导致了这个

编辑

新PC上的exe是我知道的30多台其他PC,包括Windows XP Sp1,2,3,Windows Vista和嵌入式Windows.旧版和新版PC都安装了旧版本,然后使用最新版本进行更新.唯一的区别是最新安装的版本跳转更高.

delphi delphi-5

3
推荐指数
2
解决办法
8025
查看次数

任何陷阱将TServerSocket应用程序从D5移动到D2007?

我做了一个简短的谷歌,发现什么,但我觉得我应该问.我真的不希望有任何东西,但宁愿现在问一个没有答案的问题,而不是问问题何时出错,并发现每个人都知道'陷阱'......!

为了使整体支持/开发生活更轻松(并引入madExcept等),我将采用D5编写的半GUI应用程序(使用NativeDB连接到ASA6)并将其移植到D2007,最终将其转换为D2007进入控制台应用程序和/或服务.(目前的GUI只是一个荣耀的开始/停止按钮和活动日志).

它是一个经典的TServerSocket应用程序,在指定的端口上进行监听,并在客户端连接时执行各种操作.我并不期待NativeDB方面存在任何大问题,但我想知道,就TServerSocket而言,D5和D2007之间是否有任何变化(错误修复,改进)?

我们不使用阻塞套接字,Indy等 - 它只是来自scktcomp单元的TServerSocket,直接来自D5 Enterprise盒.除非在D2007下TServerSocket出现问题,否则我不打算大幅更改代码.:-)

delphi delphi-2007 delphi-5 winsockets

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

我应该做什么或不做什么来避免Delphi"推dword"错误.

我发现Delphi 5在特定情况下会生成无效的汇编代码.一般来说,我无法理解在什么情况下.以下示例产生访问冲突,因为发生了非常奇怪的优化.对于记录或数组中的一个字节,Delphi生成push dword [...],pop ebx,mov ..,bl如果在此字节后面有数据(我们至少需要三个正确推送dword)才能正常工作,但是失败了如果数据不可访问.我在这里使用win32 Virtual*函数模拟了严格的界限

具体而言,当在FeedBytesToClass过程中访问块的最后一个字节时,会发生错误.如果我尝试更改类似于使用数据数组而不是删除actionFlag变量的对象属性,Delphi会生成正确的汇编指令.

const
  BlockSize = 4096;

type
  TSomeClass = class
  private
    fBytes: PByteArray;
  public
    property Bytes: PByteArray read fBytes;
    constructor Create;
    destructor  Destroy;override;
  end;

constructor TSomeClass.Create;
begin
  inherited Create;
  GetMem(fBytes, BlockSize);
end;

destructor TSomeClass.Destroy;
begin
  FreeMem(fBytes);
  inherited;
end;

procedure FeedBytesToClass(SrcDataBytes: PByteArray; Count: integer);
var
  j: integer;
  Ofs: integer;
  actionFlag: boolean;
  AClass: TSomeClass;
begin
  AClass:=TSomeClass.Create;
  try
    actionFlag:=true;

    for j:=0 to Count-1 do
    begin
      Ofs:=j;
      if actionFlag then
      begin
        AClass.Bytes[Ofs]:=SrcDataBytes[j];
      end;
    end;
  finally
    AClass.Free;
  end;
end; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-5

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

Delphi:尽管在开始之后设置了返回值,但返回值可能是未定义的

任何人都可以告诉我为什么我得到"返回值......可能未定义"这里:

function TXMLAcceptorBCOLSubmission.createRecordsInBCFEEPAR(AXML: TRipXMLElement): String;
var
  ...
begin
  Result := '';
Run Code Online (Sandbox Code Playgroud)

delphi delphi-5

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

有没有办法在Delphi中使用TextRect(在GDI32中为ExtTextOut)时禁用字体抗锯齿?

我正在使用自定义仪表,基于Delphi(5 Enterprise)附带的示例.对于那些不知道的人,它就像一个平滑的进度条,但显示组件中心(垂直和水平)的百分比或值.

为了确保文本在填充仪表和空白时都可读,文本将使用反色显示.

使用字体消除锯齿时,这些反转的颜色会导致字体边缘显示为非常疯狂的颜色,从而破坏了组件的外观.

有没有办法只为这一个组件禁用字体平滑/抗锯齿,或禁用它,绘制文本,然后重新启用它?

我目前的解决方法是使用一种不能平滑的字体,如"MS Sans Serif",但我想使用与UI其余部分相同的字体来保持一致性.

delphi delphi-5

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

德尔福:如何将一个类移出一个单元;避免循环引用

问题:我想将两个类拆分为自己的文件,同时避免循环引用.

我有一个单元有一些类(和一些枚举和常量).任何人都会认出Click and Clack挺杆兄弟:

unit Cartalk;

interface

type
   TSolution = (solTransmission, solBrakes, solGremlins);

   TTappetBrother = class(TObject)
   public
      function GetSolution: TSolution; virtual; abstract;
   end;

   TClick = class(TTappetBrother)
   public      
      function GetSolution: TSolution; override;
   end;

   TClack = class(TTapperBrother)
   public
      function GetSolution: TSolution; override;
   end;

implementation

function TClick.GetSolution: TSolution;
begin
   Result := solTransmission;
end;

function TClack.GetSoltution: TSolution;
begin
   Result := solGremlins;
end;

end.
Run Code Online (Sandbox Code Playgroud)

现在显然是我的两个班级TClick并且TClick相当复杂.对于管理,我想分裂TClickTClack出自己的单位而没有违反任何现有的外部代码.

我的第一个问题是:

unit Cartalk;

interface

uses
   Cartalk_Click, Cartalk_Clack; …
Run Code Online (Sandbox Code Playgroud)

delphi refactoring circular-dependency delphi-5 circular-reference

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

Delphi 5和浮点乘法和数学

我使用Delphi 5进行偶尔的编程工作,包括我的电子商务的一个不错的商业应用程序.多年来我用它完成了一些图形,数据库和其他一些东西.

今天,我正在制作一个模拟,其中我想基于一些物理移动像素,细节在应用程序上并不重要,但我一直在寻找整个早上和一些昨天找出如何使用Square Root和Square函数没有得到奇怪的答案.通过检查分配给扩展变量类型"vector_length"的简单计算,我在计算时得到类似的结果(数字是固定的,但是任何浮点类型表示这些数字的结果相同):

vector_length := Sqrt(Sqr(3.4) + Sqr(3)) 
Run Code Online (Sandbox Code Playgroud)

从理论上讲,这给了我大约4.53.使用计算器足够合理.

Delphi的调试器给我看了这样的事情:

2.9134839203548e-322
Run Code Online (Sandbox Code Playgroud)

这显然是一个毫无意义的浮点表示.

代码不能像预期的那样工作,所以我只能认为数学是错误的,或者我在做什么错误,期望函数给我一些合理的结果?

感谢您的任何意见.

delphi math delphi-5

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

如何忽略TQuery中的一些参数

如果我有一个如下所示的SQL语句

SELECT * FROM myTable WHERE CID = :vCID AND DataType = :vDataType
Run Code Online (Sandbox Code Playgroud)

通常我使用TQuery来获取如下的数据

aQuery.ParamByName('vCID').Value := '0025';
aQuery.ParamByName('vDataType').AsInteger := 1;
Run Code Online (Sandbox Code Playgroud)

但是我怎么能忽略"CID"键才能得到类似SQL的东西

SELECT * FROM myTable WHERE DataType = :vDataType
Run Code Online (Sandbox Code Playgroud)

我尝试了下面的synctax,但失败了

aQuery.ParamByName('vCID').Value := '%';
aQuery.ParamByName('vDataType').AsInteger := 1;
Run Code Online (Sandbox Code Playgroud)

请帮帮我,谢谢.

delphi sql-server-2000 tquery bde delphi-5

3
推荐指数
2
解决办法
597
查看次数

这个内存泄漏的来源是什么(使用TCollection时)

我有一些代码,我没有写,但有一个内存泄漏.真正的奇怪之处在于,如果我在返回结构之前将结构归零,则内存只会泄漏.

可重复的最小代码

泄漏在Delphi 5和Delphi 7中是可重现的.

首先我们有一个结构:

type
   TLocalFile = packed record
      FileName: AnsiString;
   end;
Run Code Online (Sandbox Code Playgroud)

此结构是CollectionItem对象的私有成员:

TEntry = class(TCollectionItem)
private
   FLocalFile: TLocalFile;
end;
Run Code Online (Sandbox Code Playgroud)

然后我们拥有拥有的集合,它具有可以返回填充结构的函数:

TEntries = class(TCollection)
protected
    function GetLocalFile: TLocalFile;
public
    procedure DoStuff;
end;
Run Code Online (Sandbox Code Playgroud)

由于功能中的怪异GetLocalFile:

function TEntries.GetLocalFile: TLocalFile;
var
    s: AnsiString;
begin
    //Only leaks if i initialize the returned structure
//  FillChar(Result, SizeOf(Result), 0);
    ZeroMemory(@Result, SizeOf(Result));

    s := 'Testing Leak';
    Result.Filename := s; //'Testing leak';  only leaks if i set the string through a …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7 delphi-5 fastmm

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

为什么在Delphi中不用逗号分隔参数就可以调用函数?

我在Delphi 5中创建了一些函数,并且偶然地我尝试在不使用逗号分隔参数列表的情况下进行编译,而且奇怪的是,它完全正常地工作。

我尝试如下隔离问题:

program Project1;
{$APPTYPE CONSOLE}

procedure foo(i : integer; s : string; di : integer = -1);
begin
  WriteLn(s);
end;

var
  str: string;
  int: integer;
begin
  str := 'aaa';
  int := 1000;
  foo(int str int);
  ReadLn;
end.
Run Code Online (Sandbox Code Playgroud)

它可以编译,不会引发异常,并且参数表完全可以按预期达到功能。

我注意到的是,如果最后删除默认参数,它将开始引发编译错误 Not enough actual parameters

为什么德尔福会有这种行为?这是某种编译器错误还是怪异的机制?

delphi delphi-5

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