我使用此函数将文件读取到字符串
function LoadFile(const FileName: TFileName): string;
begin
with TFileStream.Create(FileName,
fmOpenRead or fmShareDenyWrite) do begin
try
SetLength(Result, Size);
Read(Pointer(Result)^, Size);
except
Result := '';
Free;
raise;
end;
Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这是文件的文字:
version
Run Code Online (Sandbox Code Playgroud)
这是LoadFile的返回值:
'ÿþv'#0'e'#0'r'#0's'#0'i'#0'o'#0'n'#0
Run Code Online (Sandbox Code Playgroud)
我想创建一个包含"verabc"的新文件.问题是我仍然有问题用"abc"替换"sion".我正在使用D2007.如果我删除所有#0,那么结果将成为中文字符.
GetFileVersionInfoSize为0(零)并且GetFileVersionInfo不返回任何内容
我正在使用它像这样:
function FileVersion(const FileName: TFileName): String;
var
VerInfoSize: Cardinal;
VerValueSize: Cardinal;
Dummy: Cardinal;
PVerInfo: Pointer;
PVerValue: PVSFixedFileInfo;
begin
Result := '';
VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
GetMem(PVerInfo, VerInfoSize);
try
if GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, PVerInfo) then
if VerQueryValue(PVerInfo, '\', Pointer(PVerValue), VerValueSize) then
with PVerValue^ do
Result := Format('v%d.%d.%d build %d', [
HiWord(dwFileVersionMS), //Major
LoWord(dwFileVersionMS), //Minor
HiWord(dwFileVersionLS), //Release
LoWord(dwFileVersionLS)]); //Build
finally
FreeMem(PVerInfo, VerInfoSize);
end;
end;
Run Code Online (Sandbox Code Playgroud)
基于堆栈回复Get FileVersion with Build
它适用于大多数情况.
谢谢
如果我将 TRichedit 放在表单上,我将无法在控件中粘贴带有图像的 RTF。据我了解,这是由于 Delphi 2007 使用旧版本的 Richedit 控件所致。有没有一种简单的方法可以在 Delphi 2007 的窗体上使用最新的 Richedit 控件?
我已经检查过,当我将整数转换为十六进制时,它们分别变为4C52和524C000000000000,因此看起来好像字节是反转的.
客户端运行在Delphi XE7 for android上,服务器运行在Delphi 2007上.
我怎样才能解决这个问题?
推送客户代码: Client.IOHandler.Write(19538);
拉服务器代码: AContext.Connection.IOHandler.ReadInt64; //receives 5930114809340100608
在多屏幕系统上,我希望我的一些应用程序能够记住它们最后运行的屏幕并再次在同一屏幕上运行.
如何确定当前屏幕/显示器是什么,请记住屏幕可能具有不同的分辨率?这些程序是用Delphi 2007编写的.
我正在开发一个最近从Delphi 2007升级到XE7的应用程序.有一种特殊情况,即TMemoryStream到PChar的转换失败.这是代码:
procedure TCReport.CopyToClipboard;
var
CTextStream: TMemoryStream;
PValue: PChar;
begin
CTextStream := TMemoryStream.Create;
//Assume that this code is saving a report column to CTextStream
//Verified that the value in CTextStream is correct
Self.SaveToTextStream(CTextStream);
//The value stored in PValue below is corrupt
PValue := StrAlloc(CTextStream.Size + 1);
CTextStream.Read(PValue^, CTextStream.Size + 1);
PValue[CTextStream.Size] := #0;
{ Copy text stream to clipboard }
Clipboard.Clear;
Clipboard.SetTextBuf(PValue);
CTextStream.Free;
StrDispose(PValue);
end;
Run Code Online (Sandbox Code Playgroud)
添加SaveToTextStream的代码:
procedure TCReport.SaveToTextStream(CTextStream: TStream);
var
CBinaryMemoryStream: TMemoryStream;
CWriter: TWriter;
begin
CBinaryMemoryStream := TMemoryStream.Create;
CWriter := …Run Code Online (Sandbox Code Playgroud) 我想只允许我的应用程序的一个实例运行.我正在使用下面的代码关闭我的应用程序的其他实例,但问题是它也会终止当前会话.如何编辑此代码以关闭其他实例,但不能编辑当前实例?
function killDuplicates: integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
pna : string;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
while Integer(ContinueLoop) <> 0 do
begin
pna := lowercase(ExtractFileName(FProcessEntry32.szExeFile));
if pna = 'myapp.exe' then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Run Code Online (Sandbox Code Playgroud) 我正在努力完成标题所说的内容,在Delphi 2007中将表情符号插入到字符串中,就像下面的例子一样:
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
begin
s := 'This is my original string (y)';
s := ansireplacestr(s,'(y)','');
showmessage(s);
end;
Run Code Online (Sandbox Code Playgroud)
我甚至可以将表情符号粘贴到IDE的代码中,但在运行时showmessage结果如下:
这是我原来的字符串????
有没有办法在Delphi 2007中实现这个任务?由于几个原因我现在无法升级Delphi.
有人说我的问题在这个主题上得到了解决:
但是这个主题只是说使用第三方组件,而没有确切知道如何去做.
编辑:建议后,我尝试使用函数pos,删除和插入以及宽带var:
function addEmoji(mystring : widestring) : widestring;
var r, aux : widestring;
p : integer;
begin
r := mystring;
while pos('(y)',r) > 0 do
begin
aux := r;
p := pos('(y)',aux);
Insert('',aux,p);
delete(aux,pos('(y)',aux),3);
r := aux;
end;
result := r;
end;
Run Code Online (Sandbox Code Playgroud)
但结果是'(y)'被'????'取代.
我试图用来image1.Picture.LoadFromFile(MyTiffFile)加载tiff文件Timage,但不支持tiff.
有没有办法在不使用任何第三方库的情况下实现这一目标?
我承认我没有直接在Delphi中使用SQL的经验.但我现在尝试了一个小项目.它执行这个SQL
SELECT [Type], [Sum] = Count(*)
FROM exceptionrow
WHERE LogDate >= :FromDate
AND LOGDATE <= :ToDate
GROUP BY [type]
ORDER BY [sum] DESC
Run Code Online (Sandbox Code Playgroud)
其中FromDate和ToDate是TDateTime的参数.这是要执行的事件.
procedure TLogsStats.CollectTopExceptions(aFromDate, aToDate: TDateTime);
begin
qryTopExceptions.ParamByName('FromDate').AsDate := aFromDate;
qryTopExceptions.ParamByName('ToDate').AsDate := aToDate;
cdsTopExceptions.Close;
cdsTopExceptions.Open;
end;
Run Code Online (Sandbox Code Playgroud)
我在DBGrid中获得结果,但与在具有静态日期的SQL Studio中直接运行时不一样.行太少了.我复制了这个项目的设置.我认为只需运行一个SQL查询就需要5个组件,这很奇怪.见图.

可以简化吗?这是我对组件的声明.
SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dspTopExceptions: TDataSetProvider;
cdsTopExceptions: TClientDataSet;
dsTopExceptions: TDataSource;
Run Code Online (Sandbox Code Playgroud)
编辑: 最后我发现它不起作用的原因.我怀疑有错误的司机等但这是一个简单的愚蠢错误.我连接到一个小型测试数据库而不是更大的数据库.现在它可以正常使用3个组件和参数.抱歉你的时间:)
SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dsTopExceptions: TDataSource;
Run Code Online (Sandbox Code Playgroud)
问候
简单问题:如何使用Delphi 2007以可靠的方式检测Windows版本?有没有办法在没有API的情况下这样做,即只检查系统目录中的某些文件夹或文件?
提前致谢 !
delphi ×11
delphi-2007 ×11
delphi-xe7 ×2
unicode ×2
winapi ×2
windows ×2
indy ×1
multiscreen ×1
richedit ×1
sql ×1
sql-server ×1
string ×1
tiff ×1
utf-16 ×1