在 Delphi 10.4 中,我尝试使用以下代码将 a 转换TStream
为 a string
:
function MyStreamToString(aStream: TStream): string;
var
SS: TStringStream;
begin
if aStream <> nil then
begin
SS := TStringStream.Create('');
try
SS.CopyFrom(aStream, 0); // Exception: TStream.Seek not implemented
Result := SS.DataString;
finally
SS.Free;
end;
end else
begin
Result := '';
end;
end;
Run Code Online (Sandbox Code Playgroud)
但在此代码行中,我收到一个异常“TStream.Seek 未实现”: SS.CopyFrom(aStream, 0);
为什么?我怎样才能“治愈”这个代码?
我的 Delphi 项目从未使用过实际的 sqlite3.dll,而是使用了嵌入式库。
我用 10.4 重新编译了项目并将其发送给看到此错误的测试人员:
007C6FDC 处的 ChessOpeningsWizardProfessional2016.exe 模块中的异常 EFDException。[FireDAC][物理][SQLite]-314。无法加载供应商库 [sqlite3.dll 或 libdb_sql51.dll]。找不到指定的模块 提示:检查它是否在 PATH 或应用程序 EXE 目录中,并且具有 x86 位。
它在我的机器上运行良好,没有任何 Dll。
FireDac 中关于 Delphi 10.4 Sydney 中的 Sqlite3 有什么改变吗?
我正在尝试为示例 TControl、TWinControl 等查找内置类的大小。尝试使用 InstanceSize(),这反过来可能不会添加将它们视为引用的少数类型的大小。
发现一个有趣的堆栈溢出线程谈论 TMemoryStream 以找出类大小:以与文件大小相同的格式获取类或对象的大小?无法获得有关如何使用 TMemoryStream 确定班级大小的太多信息,我可以就此获得帮助吗?
我得到了这个有问题的 SVG 图像:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" version="1.1" id="Layer_1" x="0px" y="0px" width="16px" height="16px" viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve" sodipodi:docname="tool-eye-dropper.svg" inkscape:version="1.0.2 (e86c870879, 2021-01-15, custom)">
<metadata id="metadata12">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>
image/svg+xml
</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs id="defs10" />
<sodipodi:namedview pagecolor="#ffffff" bordercolor="#666666" borderopacity="1" objecttolerance="10" gridtolerance="10" guidetolerance="10" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-width="1213" inkscape:window-height="942" id="namedview8" showgrid="false" inkscape:zoom="31.5" inkscape:cx="8" inkscape:cy="9.4708995" inkscape:window-x="347" inkscape:window-y="176" inkscape:window-maximized="0" inkscape:current-layer="icon" />
<g id="icon">
<path d="M12.828,7.837c-0.307,0,-0.596,-0.118,-0.813,-0.332l-3.737,-3.68c-0.448,-0.442,-0.448,-1.16,0,-1.602c0.217,-0.214,0.506,-0.332,0.813,-0.332c0.307,0,0.596,0.118,0.813,0.332l0.231,0.227c0.045,-0.158,0.13,-0.302,0.251,-0.421c0.01,-0.01,1.02,-1.002,1.084,-1.06C12.177,0.336,12.956,0,13.722,0c0.917,0,1.712,0.494,2.075,1.29c0.436,0.956,0.161,2.122,-0.738,3.119c-0.075,0.083,-1.112,1.108,-1.123,1.118c-0.121,0.119,-0.267,0.203,-0.427,0.247l0.132,0.13c0.448,0.442,0.448,1.16,0,1.602C13.424,7.72,13.135,7.837,12.828,7.837z" fill-rule="evenodd" fill="#3E79B4" …
Run Code Online (Sandbox Code Playgroud)我试图在 TFlowPanel 上使用多个 TSpeedButton 来显示用户可以选择的选项列表。这就是我创建这些按钮的方式:
procedure FillOptions(ButtonPanel: TFlowPanel; Options: TStrings; Action: TNotifyEvent);
var Option: string;
Button: TSpeedButton;
begin
for Option in Options do begin
Button:= TSpeedButton.Create(ButtonPanel);
Button.Caption := Option;
Button.Width := Canvas.TextWidth(Option) + 20;
Button.GroupIndex := 99;
Button.AllowAllUp := True;
Button.OnClick := Action;
Button.Parent := ButtonPanel;
end;
end;
Run Code Online (Sandbox Code Playgroud)
问题是我无法选择多个选项。当我单击一个按钮时,它会下降,但之前选择的按钮会上升。
我忘记设置什么以便可以同时按下多个按钮?
谢谢。
在与 Windows 10 中的图形文件格式关联的 Delphi 10.4.2 win-32 VCL 应用程序中,我在 Windows 文件资源管理器中选择了参数文件。在这里,我立即观察传递给我的应用程序的文件Application.Initialize;
:
CodeSite.Send('AppInstances: ParamCount', ParamCount);
Run Code Online (Sandbox Code Playgroud)
当我在资源管理器中选择一个文件然后按下ENTER
键时,这个文件就会加载到我的应用程序中。到现在为止还挺好。
但是当我在资源管理器中选择三个文件然后按下ENTER
键时,我的应用程序每次使用 3 个文件参数之一启动三次:
当我按下 Enter 键时,Explorer 是否可能只启动我的应用程序一次并一次将 3 个选定的文件传递给我的应用程序?
我开始使用其他应用程序的新实例,CreateProcess
从实例和我结束了保存PID,这样我可以在以后检查如果进程仍在运行。
我正在使用以下方法来检查它是否正在运行:
procedure TfrmRSM.Button1Click(Sender: TObject);
begin
var
ahandle := OpenProcess(PROCESS_ALL_ACCESS, true, aPID);
if ahandle = 0 then
ShowMessage('is not running')
else
ShowMessage('is running');
CloseHandle(ahandle);
end;
Run Code Online (Sandbox Code Playgroud)
0
当进程不再运行时,上面的代码应该返回,但它仍然返回一个大于0
使用 CreateProcess 后我正在关闭句柄
如果我使用的方法不正确,有什么正确的方法可以检查 PID 是否正在运行?我只能找到使用应用程序名称的方法。
在一个非常复杂的 Delphi 10.4.2 VCL 应用程序中,一个未知的控件或组件似乎“窃取”了CTRL+A
快捷方式。为了检测窃取快捷方式的对象,我尝试使用TApplicationEvents.OnShortCut
事件处理程序:
procedure TformMain.ApplicationEvents1ShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
case Msg.CharCode of
VK_A:
begin
//CodeSite.Send('TformMain.ApplicationEvents1ShortCut: ', ???);
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
这个事件处理程序可以用来检测“小偷”,或者你会建议哪种方法?
我正在使用 Delphi 10.4.2,我正在尝试找到一种缩放图像的方法,以保持图像质量并且不需要外部库。
这是我尝试过的,您可以在以下位置找到这两个测试{$REGION}
:
procedure TFrmTestGenImg.Test;
var
LOldWidth, LOldHeight, LNewWidth, LNewHeight: integer;
LImageNameIn, LImageNameOut, LExt: string;
LClass: TGraphicClass;
LImageIn, LImageOut: TGraphic;
LBitmap, LResized: TBitmap;
begin
// Original image: 1366 x 768
LOldWidth := 1366;
LOldHeight := 768;
LNewWidth := 800;
LNewHeight := 449;
LImageNameIn := 'C:\temp\Input.png';
LImageNameOut := 'C:\temp\Output_' + FormatDateTime('yyyy.mm.dd hh.nn.ss.zzz', Now) + '.png';
LExt := TPath.GetExtension(LImageNameIn);
Delete(LExt, 1, 1);
if (CompareText(LExt, 'bmp') = 0) then
LClass := TBitmap
else if (CompareText(LExt, 'gif') …
Run Code Online (Sandbox Code Playgroud) 在我的(Windows)程序中,用户可以输入文本,该文本可以是文件或目录。
现在我想修复文本大小写,以便输入文本与文件系统大小写匹配。例如,如果用户输入:
C:\程序文件\FOO\BAR
并且该目录存在以下文本情况:
C:\Program Files\Foo\Bar
我想用后面的(正确的)文本大小写返回它。
在德尔福我该怎么做?我尝试使用FindFirst
and FindNext
,但我没有完整路径TSearchRec
(当然我可以拆分字符串并FindFirst
为每个级别执行多个操作,但必须有更好的方法)。
如果 Delphi 10.4 发生了一些变化,我会使用它。