标签: delphi-6

在Delphi 6应用程序中使用StrToFloat()的EConvertError的其他原因?

我有一个奇怪的问题,至少影响了我的Delphi 6应用程序的一些国际用户.这是场景:

  • 我的程序定期从充当HTTP服务器的外部设备请求状态报告.
  • 设备将状态报告作为响应文档发回,该响应文档具有以名称值对格式(例如 - field1 = -0.437)的管道字符分隔的系列字段.
  • 我将报告字符串拆分为字段,然后再次获取每个字段名称和数值.
  • 我使用StrToFloat()以字符串格式转换浮点字段值,并将该函数的结果分配给Variant变量.

这在大多数PC上运行良好,但是当我尝试在数值上使用StrToFloat()时,我的一些国际用户正在获得EConvertError.这是我的日志中的错误消息的具体示例:

EConvertError:' - 0.685'不是有效的浮点值

正如您所看到的,-0.685 一个有效的浮点数,但我得到了EConvertError异常.通常情况下,我希望看到小数点所在的逗号或其他一些特定于区域设置的标点问题,但在这种情况下,数字看起来很好.此外,据我所知,外部设备甚至没有设置字符集的选项.

那么Delphi 6和国际字符集的细微差别可能会导致这个问题,可能与用户的Windows XP/Win7字符设置有关?注意,我在整个程序中使用标准的Delphi 6" 字符串 "强制转换字符串,因此我没有看到多字节字符集问题是如何成为根本原因的.有谁有这个问题,知道该怎么办吗?

delphi type-conversion internationalization delphi-6

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

如何调整任何类型的图像?

我的项目的目标是在Delphi 6中调整任何类型的图像(jpeg/gif/png).

我尝试了很多方法,但我无法得到理想的解决方案.任何有关如何做到这一点的线索?它可以是一个简单的命令行工具,一些代码或Delphi组件.

我试过imagemagick:那太重了:20兆me + dll +注册表.

我尝试了一些代码片段,但大部分内容仅适用于JPEG.我需要gif/jpeg/png

我试过了graphicEX但是没有加载我的GIF

delphi delphi-6 graphicex

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

为什么我不需要在COM线程内部创建的线程中调用CoInitialize?

为了学习多线程,我在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.OpenTADOQuery.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)

windows delphi com multithreading delphi-6

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

在 Delphi 中对备忘录进行排序

我必须在 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 memo delphi-6

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

TBitBtn仅使用旧版Windows主题显示

我为我的Delphi 6应用程序创建了清单文件,因此它可以根据Windows定义的主题(控件6.0)显示控件.一切看起来很好,除了TBitBtn组件,使用遗留主题显示:

遗产TBitBtn

无论当前主题如何,即使没有为TBitBtn组件分配图像,Windows XP和Windows 7上的行为也是相同的.

现在,当我TButton在表单上放置常规组件时,它会显示OK.如果我在运行时(使用SendMessage(Handle, BM_SETIMAGE, IMAGE_ICON, LPARAM(Icon)))以编程方式将图像设置为此按钮,它会立即将其样式恢复为旧样式.

有没有办法要么TBitBtn使用正确的样式,要么在常规上显示字形TButton而不恢复到Delphi 6中的遗留字体?

delphi user-interface manifest button delphi-6

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

如何对案例进行多种变体

我使用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)

我也尝试过搜索有关案例的问题,但我想我也没有找到找到此答案的正确方法。

delphi delphi-6

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

如何在Delphi 6中编码base64?

我需要在Delphi6中将pdf文档编码为base64.谁能帮我?

pdf delphi base64 encoding delphi-6

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

获取单例类实例多线程

要使用单例模式获取类的实例,我想使用以下函数:

这是草图

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)

delphi singleton multithreading synchronization delphi-6

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

用于测试位置 x 处存在的字符串的 Delphi 函数

在最近的一个涉及通过串行链接接收字符串的应用程序中,我发现自己编写了如下代码:

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 string delphi-6

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

Delphi 6可以升级到Indy 9或10吗?

Delphi 6附带的Indy版本不包括在打开TCP连接时指定超时的选项.我在另一个问题中被告知Indy 9和10可以做到这一点.

是否可以将Delphi 6升级到Indy 9或10?

到目前为止,我无法找到任何一个下载,同样也找不到升级说明.

任何人都可以帮我解决这个问题吗?

delphi indy delphi-6

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