我注意到我在使用 Indy Client 的应用程序中的 XML 文件有无效字符(我实际上使用了 IdHttp 的默认参数)
这是我的代码:
ts := TStringList.Create;
try
ts.Add('XML=' + AXMLDoc.XML.Text));
HTTPString := IdHTTPClient.Post('http://' + FHost + ':' + IntToStr(FPort) + FHttpRoot, ts);
finally
ts.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我的 XML 文件是 UTF-8 编码的。
我必须做什么才能在我的服务器上获得良好的编码(我也使用 Indy 作为服务器)?
安装 Delphi XE4 消灭了(至少是同时发生的)我所有的 Delphi XE2 组件。从那以后我再次安装了软件包,大多数似乎又可以正常工作了。
但是,我对与 Delphi 捆绑在一起的 TChart /TeeChart 有一些问题。我试图添加我能找到的“teexxx”包,但显然没有一个下摆是设计时包。
然后我尝试下载“基于更新 4 的 TeeChart 标准版适用于 Delphi XE2、C++Builder XE2 和 RAD Studio XE2 注册用户”......似乎安装得很好没有错误,但组件在 Delphi 中仍然不可用集成开发环境。
无论如何,我想我一定是在尝试安装错误的 teexxx 包,所以,有谁知道我仍然尝试在 Delphi XE2 IDE 中添加哪个包?

我已经在上面显示了导航器TcxGrid.我想在不隐藏它的情况下禁用整个导航器.我怎样才能做到这一点?
我有一些使用Delphi 2010和XE4构建的应用程序,它们在一个线程中使用Synchronize.我认为在Delphi 2010中将Synchronize引入了Delphi.我的线程运行得很好,所以这不是问题.
我的问题是:有没有办法在Delphi 2010之前与Delphi版本"同步"或者以不同的方式询问它,如何在没有Synchronize的情况下更新这些早期版本的Delphi中的GUI控件?
下面显示的代码是实际代码的子集,以减少此帖子的长度.
type
{ A TThread descendent for loading Images from a folder }
TFolderLoadingThread = class(TThread)
private
{ Private declarations }
AspectRatio: double;
protected
{ Protected declarations }
procedure Execute; override;
public
{ Public declarations }
constructor Create(CreateSuspended: Boolean);
end;
procedure TFolderLoadingThread.Execute;
{ Load images ImageEnView in the thread. }
begin
inherited;
{ Free the thread onTerminate }
FreeOnTerminate := True;
if not Terminated then
begin
{ Set the Progressbar.Max Value }
**Synchronize**(
procedure
begin …Run Code Online (Sandbox Code Playgroud) 我在以下场景中收到“灾难性故障”错误。
type
TGetDoubleValue = function (var ID: Integer): Double; safecall;
....
....
var
GetDoubleValue: TGetDoubleValue;
.....
.....
LibHandle := LoadLibrary('GetDoubleValue.dll');
@GetDoubleValue := GetProcAddress(LibHandle, 'getDoubleValue');
if not (@GetDoubleValue = nil) then
begin
myDouble := GetDoubleValue(ID);
end
else
RaiseLastOSError;
Run Code Online (Sandbox Code Playgroud)
myDouble := GetDoubleValue(ID);调用此函数时,我在“”行上收到错误。
我在64位XE4中发送SMTP消息遇到了一些问题,而且它似乎发生在Indy代码的深处.
这是XE4附带的标准Indy代码,但是当我查看每个文件顶部的标题时,它们似乎自2005年以来一直没有更新!显然这里有一些棘手的问题.
XE4附带的Indy版本多大了,从那时起Win64兼容性有了显着的改进?
使用VCL,您可以使用CreateMessageDialog自定义按钮标题生成消息对话框.
随着FMX CreateMessageDialog似乎不再存在(自XE3以来).
除了从头开始重建消息对话框之外,有没有办法使用FireMonkey自定义按钮标题?
我希望能够调用这里描述的函数:
MessageDlg(
'Really quit application ?', mtWarning,
[ButtonInfo(mbNo, 'Do&n''t save'),
ButtonInfo(mbCancel, '&Cancel'),
ButtonInfo(mbYes,'&Save')],
mbYes
);
Run Code Online (Sandbox Code Playgroud) 我仍然使用Delphi XE4(我使用多个Delphi编译器的最新编译器),并且需要一个特定的解决方法,因为他们在此版本中完全隐藏了TBasicAction中的FClients.我在设置启用/禁用时连接/断开客户端运行时(以避免使用~100 + actions和ui元素闪烁)因此XE4的此解决方法:
这是我天真的尝试,只是简单地回到了这个领域.
TmscBasicActionCrack = class(TBasicAction)
end;
{$IFDEF mymsDELPHIXE4}
TmscBasicActionHelper = class helper for TBasicAction
public
function Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
end;
{$ENDIF}
{$IFDEF mymsDELPHIXE4}
//------------------------------------------------------------------------------
function TmscBasicActionHelper.Helper_Get_Private_FClients: TList<System.Classes.TBasicActionLink>;
begin
Result := Self.FClients;
end;
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误
E2003未声明的标识符:TList <>
我必须承认,自从我最初听说稳定性问题+我需要保持与Lazarus/FreePascal的兼容性时,我永远不会使用Delphi中的泛型.
我知道最近的版本Delphi再次改变了类助手,但我现在最感兴趣的是让它与Delphi XE4一起使用
我目前正在尝试在我的example.exe程序旁边添加一个example.manifest文件,因此GetVersionEx会返回正确的信息.
然而 - 它似乎没有任何差别 - 我仍然只有6.2
这是我打算用于所有32/64位Windows可执行文件的清单文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
Run Code Online (Sandbox Code Playgroud) 在我的程序中,我实际上使用此代码:
if IdFTP1.Connect = True then
begin
//makes some stuff
end
else
begin
ShowMessage('you got the move like jagger.');
end;
Run Code Online (Sandbox Code Playgroud)
如果我没有连接,我会看到一个错误
套接字错误#11001
主机未找到
为了避免这种情况,我认为我可以使用您在上面看到的代码,但我在使用时遇到错误IdFTP1.Connect = True.
我能做什么?
我的查询,运行大约需要7秒才能完成应该的操作.但是,由于它插入了大约30条记录,我认为它太慢了.现在,要么我运行的查询写得不好,要么实际需要这么多时间.但那会很奇怪.底层数据库是SQLite,查询如下所示:
procedure TForm1.cxButton1Click(Sender: TObject);
begin
with UNIquery2 do begin
Close;
SQL.Clear;
UNIQuery1.First;
while Uniquery1.EOF = false do begin
SQL.Text:= 'INSERT INTO MYTABLE (FIELD1,FIELD2,FIELD3,FIELD4) VALUES (:a1,:a2,:a3,:a4)';
ParamByName('a1').asString := AdvOfficeStatusBar1.Panels[0].Text;
ParamByName('a2').asString := UniTable1.FieldByName('FIELD2').asString;
ParamByName('a3').asString := Uniquery1.FieldByName(',FIELD3').asString;
ParamByName('a4').Value := Uniquery1.FieldByName('FIELD4').Value;//boolean field true/false
Uniquery1.Next;
ExecSQL;
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
那么有人可以告诉我这是否正常或我错过了什么?所有字段都是文本,除了'a4',它是布尔值(true/false).
答案,修改(基于来自LS_dev的提取):
procedure TForm1.cxButton1Click(Sender: TObject);
begin
with UNIquery2 do begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO MYTABLE (FIELD1,FIELD2,FIELD3,FIELD4) VALUES (:a1,:a2,:a3,:a4)');
SQL.Prepare;
UniTransaction.AddConnection(UniConnection2);
UniTransaction.StartTransaction;
try
UNIQuery1.First;
while Uniquery1.EOF = false do begin
Params[0].asString := AdvOfficeStatusBar1.Panels[0].Text;
Params[1].asString := UniTable1.FieldByName('FIELD2').asString;
Params[2].asString …Run Code Online (Sandbox Code Playgroud) 这是尝试将文件名添加到字符串列表.如果向列表中添加重复的文件名,则引发异常并从列表中删除原始文件.我从帮助文件中了解到,如果找到重复文件,将返回现有条目的索引,然后可以使用该索引删除现有条目.
此代码的问题是,当找到重复时,不执行EListError异常中的代码.
我的问题是,如果存在重复的文件名,你如何从列表中删除原始文件名?实质上,如果在添加副本时检测到重复,我想从列表中删除原始文件.不幸的是,当将重复文件添加到列表时,异常陷阱中的代码不会执行.
{ Create a list of files to delete }
iListOfImagesToDelete := TStringList.Create;
try
{ Get a ListOfFiles in each collection }
iCollectionList := TStringList.Create;
try
iListOfImagesToDelete.Duplicates := dupError;
iListOfImagesToDelete.Sorted := True;
{ Add filenames to a stringlist with Duplicates set to dupError and Sorted set to True }
iFileCount := iCollectionList.Count;
for j := 0 to iFileCount - 1 do
begin
iFilename := iCollectionList[j];
if FileExists(iFilename) then
begin
try
iFileIndex := iListOfImagesToDelete.Add(iFilename);
except
{ file exists in …Run Code Online (Sandbox Code Playgroud) 想要将名称值对加载到TStringList中.
有一个包含数据的文本文件:
a=ant
a=animal
b=bob
d=darn
Run Code Online (Sandbox Code Playgroud)
加载它的功能:
LoadData(argPath: string): TStringList;
var
data: TStringList;
begin
data := TStringList.Create(true);
data.Delimiter := '=';
try
data.LoadFromFile(argPath);
except on E : Exception do
begin
Application.MessageBox(PWideChar(E.Message),
'Unable to Load Data', MB_OK or MB_ICONERROR);
Application.Terminate;
end;
end;
Result := data;
end;
Run Code Online (Sandbox Code Playgroud)
结果目前是:
a=ant
a=animal
b=bob
d=darn
Run Code Online (Sandbox Code Playgroud)
希望结果的字符串是:
ant
animal
bob
darn
Run Code Online (Sandbox Code Playgroud)
和结果的TObjects
a
a
b
d
Run Code Online (Sandbox Code Playgroud)
在此之后,我希望能够在TComboBox中显示它.
delphi ×13
delphi-xe4 ×13
delphi-xe2 ×2
indy ×2
delphi-2010 ×1
devexpress ×1
firemonkey ×1
generics ×1
idhttp ×1
indy10 ×1
manifest ×1
sql ×1
sqlite ×1
tcxgrid ×1
teechart ×1
tstringlist ×1
txmldocument ×1
unidac ×1
vcl ×1
windows-10 ×1