小编EPr*_*und的帖子

具有非ANSI文件的TStringList行为

在我的应用程序中,当我想导入文件时,我使用TStringList.

但是,当有人从Excel导出数据时,文件编码是UCS-2 Little Endian,而TStringList无法读取数据.

有什么方法可以验证这种情况,识别文本编码并向用户发送提示文本不兼容的警告?

为了清楚起见,用户将只提供纯文本..通讯和数字,否则,我必须发送警告.

没有BOM的Unicode文件很好.(TStringList可以读取它!)
ANSI文件也是.(TStringList可以读取它!)
如果有一种方法可以删除它,即使带有BOM的Unicode也会很好.(TStringList可以读取它!,但是带有"i"">>"和"reverse?"字符,属于BOM字节)

delphi encoding file tstringlist delphi-6

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

在IF语句中对OR和AND运算符的中断条件

If语句和任何其他布尔比较是智能的,在评估时应首先停止FALSE值,A and B and C and D并在评估时首先停止TRUE值A or B or C or D.

这种行为的名称是什么?
这是编译器优化吗?如果是这样,有一种方法可以用一些编译器指令禁用它吗?

delphi if-statement compiler-optimization boolean-operations

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

DVCLAL的所有可能值列表是什么?

当我遇到这个功能时,我正在阅读SysUtils:

function ALR: Pointer;
var
  LibModule: PLibModule;
begin
  if MainInstance <> 0 then
    Result := Pointer(LoadResource(MainInstance, FindResource(MainInstance, 'DVCLAL',
      RT_RCDATA)))
  else
  begin
Run Code Online (Sandbox Code Playgroud)

之后,我搜索了什么是DVCLAL,我发现了这个问题.

Delphi编译器发送给DVCLAL资源的所有可能签名是什么?

delphi compiler-construction portable-executable delphi-xe3

4
推荐指数
2
解决办法
1473
查看次数

如何解释CPU窗口的反汇编窗格的列?

有一个名为CPU窗口的工具,我按下Ctrl+ Alt+ C,显示我的代码的反汇编.

内存地址左侧的绿色箭头表示当前执行点的位置,然后是内存地址,但第二列的含义是什么,为什么编译器有时会在指令后跳转多个地址?

例如:

|first column|second column|assembly|
004520F4 55             push ebp      //continuous 
004520F5 8BEC           mov ebp, esp  //jumps to F7
004520F7 6A00           push $00      //jumps to F9
004520F9 53             push ebx      //continuous
004520FA 33D2           xor edx,edx
Run Code Online (Sandbox Code Playgroud)

delphi compiler-construction assembly cpu-registers

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

为什么我不需要在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
查看次数

Unicode版本的ShortString

在旧的Delphi版本(ANSI字符串)中,ShortStrings:

var Str: String[30];
Run Code Online (Sandbox Code Playgroud)

可以用来减少内存成本,并且仍具有ANSI编码。

在当前的Unicode版本中,是否像上面的ShortString那样别名为某些Unicode编码版本?
这种做法的优点是否仍然存在以减少内存成本?

delphi string unicode delphi-unicode

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

Delphi - '日期编码的参数无效',因为Value ['Expires'] = - 1

我一直在使用delphi的应用程序,其中应用程序需要连接像"example.example.ex"这样的URL.

当我调用该函数IdHTTP1.Post时,日期enconding过程中发生错误.

发生的情况是,当应用程序获得某些连接头的值时,"Expires"为-1,而function RawStrInternetToDateTime(var Value: string): TDateTime;内部使用的函数EncodeDate(Year, Month, Day);不能使用值"-1".

我是否需要直接将"exemple.exemple.ex","expires"值更改为其他某个日期时间值?

delphi indy http-headers

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

是否记录了Set类型的Asterisk运算符?

我无法理解这段代码在做什么,我找不到有关它的文档.

if FComponentState * [csDesigning, csInline] = [csDesigning, csInline] then
Run Code Online (Sandbox Code Playgroud)

delphi syntax vcl

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

Delphi中这些Windows API签名之间有什么区别?

在Delphi中查看Windows.pas,我发现LoadLibrary (A) or (W)加载特定模块有几个签名.它们之间有什么区别,我是否可以信任为所有类型的Windows平台调用LoadLibrary?

windows delphi winapi

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

将Java代码转换为delphi的问题

我有一个必须返回通用接口的方法.试图在delphi中制作该方法.但是不确定它应该如何写?有没有人可以帮助我?这是我用Java制作的一个例子:

public < T  extends StandardDataProvider<?>> T GetDataProvider(String dataProviderName) {
    if (dataproviders == null)
        buildDataProviderMap();
    if (dataproviders.containsKey(dataProviderName)) {
        return (T) dataproviders.get(dataProviderName);
    } else
        return null;
}
Run Code Online (Sandbox Code Playgroud)

然后尝试在delphi中做同样的事情..但是不能让它工作?

function TLocalDataProviderFactory. GetDataProvider(DataProviderName: string): IStandardDataProvider;  // Shows errors here? 
begin
  if not Assigned(DataProvider) then
    BuildDataProviderMap;
  if DataProvider.ContainsKey(DataProviderName) then
  begin
    Result := DataProvider.Items[DataProviderName];
  end
  else
  begin
    Result:= nil;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

java delphi delphi-xe4

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