是否有可能(如果是这样,我如何)使用Delphi 2007将单个程序作为控制台应用程序和GUI版本工作?
我所追求的是,如果程序使用适当的命令行选项运行,它应该用作控制台程序,使用WRITELN将输出打印到控制台,但如果没有给出命令行参数,它应该作为普通Delphi运行GUI应用程序?
问题是当作为控制台应用程序运行时,命令行解释程序在允许您输入新命令之前等待应用程序终止,而从命令行启动的GUI应用程序会立即返回到命令行和GUI应用程序在分离的过程中启动.我希望保留这种行为.
我不介意这样的事情:
如果GUI那么StartApplicationAsGUI(ParamStr(0))
即.我不介意我必须使用某种形式的EXECUTE调用重新启动应用程序,以便在GUI模式下启动它(如果需要),只要命令行界面在GUI版本启动时返回到命令行输入即可.
我更喜欢一个解决方案/建议:
<Parse Comnand Line>
IF ConsoleMode THEN
RunConsole(参数)
ELSE BEGIN
Application.Initialize;
Application.CreateForm(...)
Application.Run;
结束
(反之亦然,即如果GUI模式以特殊方式做事)
这样我在制作GUI界面时仍然可以使用Delphi的IDE和VCL ......
为了在我的应用程序中正确处理 DPI 更改,我使用以下代码读取当前的缩放因子:
TYPE TZoom = BYTE;
FUNCTION OldStyleGetDpiForSystem : TZoom; cdecl;
VAR
DC : HDC;
X,Y,Z : LongWord;
BEGIN
DC:=GetDC(0);
TRY
X:=GetDeviceCaps(DC,LOGPIXELSX);
Y:=GetDeviceCaps(DC,LOGPIXELSY)
FINALLY
ReleaseDC(0,DC)
END;
IF X>Y THEN Result:=X ELSE Result:=Y
END;
FUNCTION GetDpiForSystem : TZoom;
TYPE
GetDpiForSystemFunc = FUNCTION : TZoom; cdecl;
CONST
GetDpiForSystem : GetDpiForSystemFunc = NIL;
BEGIN
IF NOT Assigned(GetDpiForSystem) THEN BEGIN
// Try to use official method (available from Windows 10, version 1607 [desktop apps only] and on)
GetDpiForSystem:=GetProcAddress(LoadLibrary('USER32.DLL'),'GetDpiForSystem');
// If not found, then …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Delphi XE5的Android开发路径,并且我正在尝试构建一个简单的应用程序,它需要能够持久保存一些输入的信息(配置).
我已经想到,Android类SharedPreferences可能是最简单的方法,但我无法弄清楚如何从Delphi XE5 FMX Mobile访问这个类.
我试过在帮助中搜索"SharedPreferences",但它什么也没有返回.另一方面,搜索"共享偏好"给了我太多.
首先 - 我是Android和FireMonkey编程的初学者,所以请记住这一点:-).
我已经制作了一个FireMonkey/Android应用程序,可以根据屏幕大小和方向调整其控件的大小/重排,但是当用户旋转屏幕时,我无法弄清楚如何设置我的应用程序.如果我在其中运行Firemonkey/Win32并显示执行以下操作的按钮:
PROCEDURE TMainForm.FlipForm;
VAR
W,H : INTEGER;
BEGIN
W:=Width; H:=Height; Width:=H; Height:=W
END;
Run Code Online (Sandbox Code Playgroud)
然后陷阱FormResize事件,我的表单调整大小/回流它应该.我想在Android上运行时也这样做,但似乎在屏幕旋转时不会调用FormResize事件,因此我的按钮等不会重排并最终在屏幕外.
所以我的问题是,如何检测屏幕已旋转,以便我可以让我的应用程序在横向和纵向模式下工作?
我需要一个像下面的代码这样的函数(不起作用!这只是一个例子)
type
TCallBack = procedure( x:String) of object;
procedur procA(CallBack : TCallBack);
begin
CallBack('hello world')
end;
Run Code Online (Sandbox Code Playgroud)
然后触发 procA 并将过程作为参数传递:
procA( procedure (res : string)
begin
ShowMessage(res);
end);
Run Code Online (Sandbox Code Playgroud) 您如何(编译时)检测 Alexandria 11.2 和 11.3 之间的差异(或者更确切地说,您如何检测您处于 11.3 或更高版本?)
两者的 CompilerVersion 和 RTLVersion 值为 35。