我有一个奇怪的问题,至少影响了我的Delphi 6应用程序的一些国际用户.这是场景:
这在大多数PC上运行良好,但是当我尝试在数值上使用StrToFloat()时,我的一些国际用户正在获得EConvertError.这是我的日志中的错误消息的具体示例:
EConvertError:' - 0.685'不是有效的浮点值
正如您所看到的,-0.685 是一个有效的浮点数,但我得到了EConvertError异常.通常情况下,我希望看到小数点所在的逗号或其他一些特定于区域设置的标点问题,但在这种情况下,数字看起来很好.此外,据我所知,外部设备甚至没有设置字符集的选项.
那么Delphi 6和国际字符集的细微差别可能会导致这个问题,可能与用户的Windows XP/Win7字符设置有关?注意,我在整个程序中使用标准的Delphi 6" 字符串 "强制转换字符串,因此我没有看到多字节字符集问题是如何成为根本原因的.有谁有这个问题,知道该怎么办吗?
我的项目的目标是在Delphi 6中调整任何类型的图像(jpeg/gif/png).
我尝试了很多方法,但我无法得到理想的解决方案.任何有关如何做到这一点的线索?它可以是一个简单的命令行工具,一些代码或Delphi组件.
我试过imagemagick:那太重了:20兆me + dll +注册表.
我尝试了一些代码片段,但大部分内容仅适用于JPEG.我需要gif/jpeg/png
我试过了graphicEX但是没有加载我的GIF
为了学习多线程,我在COM Thread(TRemoteDataModule)中创建了一个线程。
这是我的组件工厂:
TComponentFactory.Create(ComServer, TServerConn2, Class_ServerConn2, ciMultiInstance, tmApartment);
Run Code Online (Sandbox Code Playgroud)
在线程内部,我不需要调用CoInitialize即可使用TADOQuery.Create,.Open....Exec
我了解到,在调用除CoGetMalloc之外的任何库函数之前,需要在线程上初始化COM库,以获取指向标准分配器的指针以及内存分配函数。
但是在这种情况下,缺少CoInitialize并没有给我带来任何麻烦。
这和线程模型有关吗?在哪里可以找到关于该主题的解释?
更新:
当我说INSIDE时,它意味着在COM方法上下文中:
interface
type
TWorker = class(TThread);
TServerConn2 = class(TRemoteDataModule, IServerConn2)
public
procedure Method(); safecall;
end;
implementation
procedure TServerConn2.Method();
var W: TWorker;
begin
W := TWorkerTread.Create(Self);
end;
Run Code Online (Sandbox Code Playgroud)
更新2:
当前TADOConnection用于连接数据库的是在COM Thread上下文(TThread.Create constructor)中创建的。虽然TADOConnection.Open和TADOQuery.Create/.Open都在内部执行TThread.Execute。
更新3-Simulacrum
接口:
type
TServerConn2 = class;
TWorker = class(TThread)
private
FDB: TADOConnection;
FOwner: TServerConn2;
protected
procedure Execute; …Run Code Online (Sandbox Code Playgroud) 我必须在 Delphi 6 中为我的学校制作一份高分备忘录。有没有办法按数字或字母对备忘录行进行排序?
我使用 4 个 Tedit 和 1 个 TMemo。如果游戏结束,我的代码将检查谁获得了最高分。这是检查玩家 1 是否比玩家 2 获得更高分数的方法:
if in1>p2in1 then begin
highscore.naammemo.Lines.Add(Speler1.Caption);
highscore.saldomemo.Lines.Add(Saldo1.Text);
end;
Run Code Online (Sandbox Code Playgroud)
如何为 TMemo 创建代码来对每场比赛的最高分进行排序?
我为我的Delphi 6应用程序创建了清单文件,因此它可以根据Windows定义的主题(控件6.0)显示控件.一切看起来很好,除了TBitBtn组件,使用遗留主题显示:

无论当前主题如何,即使没有为TBitBtn组件分配图像,Windows XP和Windows 7上的行为也是相同的.
现在,当我TButton在表单上放置常规组件时,它会显示OK.如果我在运行时(使用SendMessage(Handle, BM_SETIMAGE, IMAGE_ICON, LPARAM(Icon)))以编程方式将图像设置为此按钮,它会立即将其样式恢复为旧样式.
有没有办法要么TBitBtn使用正确的样式,要么在常规上显示字形TButton而不恢复到Delphi 6中的遗留字体?
我使用delphi运行以下代码:
if (number> 8) and (number< 10) then
message:= 'first option'
else if (number> 11) and (number< 17) then
message:= 'second option'
else if (number> 18) then
message:= 'third option';
Run Code Online (Sandbox Code Playgroud)
我需要执行确切的代码,但使用case,我正在尝试,但没有找到任何解释如何执行此操作的内容:
case idade of
(case > 8 and case< 10) : message:= 'first option';
(case > 11 and case< 17) : message:= 'second option';
(case > 18) : message:= 'third option';
end;
Run Code Online (Sandbox Code Playgroud)
我也尝试过搜索有关案例的问题,但我想我也没有找到找到此答案的正确方法。
我需要在Delphi6中将pdf文档编码为base64.谁能帮我?
要使用单例模式获取类的实例,我想使用以下函数:
这是草图
interface
uses SyncObjs;
type
TMCriticalSection = class(TCriticalSection)
private
Dummy : array [0..95] of Byte;
end;
var
InstanceNumber : Integer;
AObject: TObject;
CriticalSection: TMCriticalSection;
function getInstance: TObject;
implementation
uses Windows;
function getInstance: TObject;
begin
//I Want somehow use InterlockedCompareExchange instead of CriticalSession, for example
if InterlockedCompareExchange(InstanceNumber, 1, 0) > 0 then
begin
Result := AObject;
end
else
begin
CriticalSection.Enter;
try
AObject := TObject.Create;
finally
CriticalSection.Leave;
end;
InterlockedIncrement(InstanceNumber);
Result := AObject
end;
end;
initialization
CriticalSection := TMCriticalSection.Create;
InstanceNumber := 0; …Run Code Online (Sandbox Code Playgroud) 在最近的一个涉及通过串行链接接收字符串的应用程序中,我发现自己编写了如下代码:
if (pos('needle', haystack) = 1) then ...
Run Code Online (Sandbox Code Playgroud)
为了检查特定的子字符串是否位于字符串的开头。
让我惊讶的是 pos 函数对此并不理想,因为它不知道我要在哪个位置查找子字符串。
有没有一个好的功能可以做到这一点?
有没有更通用的函数,例如IsSubStringAt(needle, haystack, position)?
我确实考虑过使用这样的东西:
function IsSubstrAt(const needle, haystack: string; position: Integer): Boolean;
var
ii: integer;
begin
result := true;
for ii := 1 to length(needle) de begin
if (haystack[poition + ii -1] <> needle[ii]) then begin
result := false;
break;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
进行一些错误检查。
我希望找到一个现成的答案。
Delphi 6附带的Indy版本不包括在打开TCP连接时指定超时的选项.我在另一个问题中被告知Indy 9和10可以做到这一点.
是否可以将Delphi 6升级到Indy 9或10?
到目前为止,我无法找到任何一个下载,同样也找不到升级说明.
任何人都可以帮我解决这个问题吗?