在我的应用程序中,当我想导入文件时,我使用TStringList.
但是,当有人从Excel导出数据时,文件编码是UCS-2 Little Endian,而TStringList无法读取数据.
有什么方法可以验证这种情况,识别文本编码并向用户发送提示文本不兼容的警告?
为了清楚起见,用户将只提供纯文本..通讯和数字,否则,我必须发送警告.
没有BOM的Unicode文件很好.(TStringList可以读取它!)
ANSI文件也是.(TStringList可以读取它!)
如果有一种方法可以删除它,即使带有BOM的Unicode也会很好.(TStringList可以读取它!,但是带有"i"">>"和"reverse?"字符,属于BOM字节)
If语句和任何其他布尔比较是智能的,在评估时应首先停止FALSE值,A and B and C and D并在评估时首先停止TRUE值A or B or C or D.
这种行为的名称是什么?
这是编译器优化吗?如果是这样,有一种方法可以用一些编译器指令禁用它吗?
delphi if-statement compiler-optimization boolean-operations
当我遇到这个功能时,我正在阅读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资源的所有可能签名是什么?
有一个名为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) 为了学习多线程,我在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版本(ANSI字符串)中,ShortStrings:
var Str: String[30];
Run Code Online (Sandbox Code Playgroud)
可以用来减少内存成本,并且仍具有ANSI编码。
在当前的Unicode版本中,是否像上面的ShortString那样别名为某些Unicode编码版本?
这种做法的优点是否仍然存在以减少内存成本?
我一直在使用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"值更改为其他某个日期时间值?
我无法理解这段代码在做什么,我找不到有关它的文档.
if FComponentState * [csDesigning, csInline] = [csDesigning, csInline] then
Run Code Online (Sandbox Code Playgroud) 在Delphi中查看Windows.pas,我发现LoadLibrary (A) or (W)加载特定模块有几个签名.它们之间有什么区别,我是否可以信任为所有类型的Windows平台调用LoadLibrary?
我有一个必须返回通用接口的方法.试图在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) delphi ×10
delphi-6 ×2
windows ×2
assembly ×1
com ×1
delphi-xe3 ×1
delphi-xe4 ×1
encoding ×1
file ×1
http-headers ×1
if-statement ×1
indy ×1
java ×1
string ×1
syntax ×1
tstringlist ×1
unicode ×1
vcl ×1
winapi ×1