我们有一个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都安装了旧版本,然后使用最新版本进行更新.唯一的区别是最新安装的版本跳转更高.
我做了一个简短的谷歌,发现什么,但我觉得我应该问.我真的不希望有任何东西,但宁愿现在问一个没有答案的问题,而不是问问题何时出错,并发现每个人都知道'陷阱'......!
为了使整体支持/开发生活更轻松(并引入madExcept等),我将采用D5编写的半GUI应用程序(使用NativeDB连接到ASA6)并将其移植到D2007,最终将其转换为D2007进入控制台应用程序和/或服务.(目前的GUI只是一个荣耀的开始/停止按钮和活动日志).
它是一个经典的TServerSocket应用程序,在指定的端口上进行监听,并在客户端连接时执行各种操作.我并不期待NativeDB方面存在任何大问题,但我想知道,就TServerSocket而言,D5和D2007之间是否有任何变化(错误修复,改进)?
我们不使用阻塞套接字,Indy等 - 它只是来自scktcomp单元的TServerSocket,直接来自D5 Enterprise盒.除非在D2007下TServerSocket出现问题,否则我不打算大幅更改代码.:-)
我发现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) 任何人都可以告诉我为什么我得到"返回值......可能未定义"这里:
function TXMLAcceptorBCOLSubmission.createRecordsInBCFEEPAR(AXML: TRipXMLElement): String;
var
...
begin
Result := '';
Run Code Online (Sandbox Code Playgroud) 我正在使用自定义仪表,基于Delphi(5 Enterprise)附带的示例.对于那些不知道的人,它就像一个平滑的进度条,但显示组件中心(垂直和水平)的百分比或值.
为了确保文本在填充仪表和空白时都可读,文本将使用反色显示.
使用字体消除锯齿时,这些反转的颜色会导致字体边缘显示为非常疯狂的颜色,从而破坏了组件的外观.
有没有办法只为这一个组件禁用字体平滑/抗锯齿,或禁用它,绘制文本,然后重新启用它?
我目前的解决方法是使用一种不能平滑的字体,如"MS Sans Serif",但我想使用与UI其余部分相同的字体来保持一致性.
问题:我想将两个类拆分为自己的文件,同时避免循环引用.
我有一个单元有一些类(和一些枚举和常量).任何人都会认出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相当复杂.对于管理,我想分裂TClick和TClack出自己的单位而没有违反任何现有的外部代码.
我的第一个问题是:
unit Cartalk;
interface
uses
Cartalk_Click, Cartalk_Clack; …Run Code Online (Sandbox Code Playgroud) delphi refactoring circular-dependency delphi-5 circular-reference
我使用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)
这显然是一个毫无意义的浮点表示.
代码不能像预期的那样工作,所以我只能认为数学是错误的,或者我在做什么错误,期望函数给我一些合理的结果?
感谢您的任何意见.
如果我有一个如下所示的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 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 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 ×10
delphi-5 ×10
bde ×1
delphi-2007 ×1
delphi-7 ×1
fastmm ×1
math ×1
refactoring ×1
tquery ×1
winsockets ×1