在我的Delphi应用程序中,我想添加命令行参数以在登录屏幕中自动设置一些参数.
目前我有一个登录界面,用户可以在其中设置一些信息(如服务器,数据库,用户,密码,AuthenticationType,AUtoLogin等).
我使用MRU来填充字段.无论如何,在大型组织中,不需要让用户选择任何信息.为此,我在我的场景中可以做的最简单的事情是使用命令行参数.
我的问题是你如何建议选择命令行参数?我的意思是,我应该采用"位置"方法还是某种"标记"方法,例如:
MyProject.exe -s:MYSERVER -d:DATABASE
Run Code Online (Sandbox Code Playgroud)
要么
MyProject.exe MYSERVER DATABASE
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我需要循环使用所有参数ParamStr并"解码"它们的内容.如果他们以"-s:"开头,我知道接下来是服务器名称.第二种是更快速和更脏,但可能更有效.
如何管理包含"空格"的参数?是否可以使用ParamStr自动拦截它们,还是应该手动处理所有?(我的意思是有一种方法可以自动告诉ParamStr一个参数包含一个空格(比如使用大括号或其他东西).
什么是最佳做法?
我的程序接受输入文件名作为命令行参数或在拖放操作中,或通过单击与我的程序关联的扩展名的文件名接受输入文件名.
命令行和拖放工作正常,但它点击资源管理器中的文件名,当单击文件的文件路径中有空格时会导致问题,例如:
c:\temp\file one.txt
c:\my directory\filetwo.txt
c:\my directory\file three.txt
Run Code Online (Sandbox Code Playgroud)
然后,ParamStr函数给了我回复:
ParamStr(1): c:\temp\file
ParamStr(2): one.txt
ParamStr(3): c:\my
ParamStr(4): directory\filetwo.txt
ParamStr(5): c:\my
ParamStr(6): directory\file
ParamStr(7): three.txt
Run Code Online (Sandbox Code Playgroud)
我怎样才能最好地将这些重新组合成我需要的三个文件名?
当您阅读时ParamStr(),它由每个参数之间的空格所限定。但是,我已经看到许多命令行参数,它们接受参数名称及其配对值之间的空格,同时也接受等号=,甚至不包含任何分隔符(仅以param名称作为前缀)或不包含任何值。
以下是一些可能的参数字符串的示例:
-name value
/name value
-name=value
/name=value
-namevalue
/namevalue
-name -nextname
/name /nextname
-name="value with spaces"
/name="value with spaces"
Run Code Online (Sandbox Code Playgroud)
...等等。
我想做的是两件事都相关...检查参数名称是否存在,并读取参数的值。例如...
if ParamExists('ParamName') then
SomeString:= ParamValue('ParamName')
else
SomeString:= 'SomeOtherString';
Run Code Online (Sandbox Code Playgroud)
Delphi中有什么可以做到的吗?如果没有,我该怎么做?我在搜索时发现的所有内容都将我引到相同的基本示例:
for i := 0 to ParamCount do
ShowMessage(ParamStr(i));
Run Code Online (Sandbox Code Playgroud)
它还需要区分大小写。我正在寻找特别喜欢的东西,OSQL并且类似的命令行工具使用的“ -s”可能不同于“ -S”。
问题是,如果我使用空格作为分隔符,那么我将不知道如何识别它何时是前一个参数的一部分,因为它将空格分隔。我该如何解决?
我敢肯定,这也是一个标准术语,它是命令行参数的常见格式。但我不知道如何使用just正确阅读它们ParamStr。似乎ParamStr没有达到通常的用途。
需要明确的是,我并不一定需要支持上面的每个示例-这些只是我以前见过的示例。
我已将".file_5"扩展名与我的应用程序相关联,并使用Delphi中的ParamStr(1)函数显示一个消息框,其中包含使用下面的代码在资源管理器中双击它时文件的路径和文件名.
procedure TForm1.FormCreate(Sender: TObject);
var
TheFile : string;
begin
TheFile := ParamStr(1); //filename for the file that was loaded
ShowMessage(TheFile);
end;
Run Code Online (Sandbox Code Playgroud)
这有效,但如果我将文件移动到另一个位置,然后将其移动到最初的位置,则显示的消息不正确.
示例:(使用test.file_5)
该文件的原始位置位于C:\驱动器中,当我双击它时,我的应用程序启动并显示一个消息框,其中显示:
C:\ test.file_5
这是对的.如果我将同一个文件移动到包含空格的目录(例如程序文件夹),则显示的Messagbox不是
C:\ Program Files\test.file_5
就像我期望的那样
C:\ PROGRA〜1.FILE_
这显然不是我追求的信息所以我的问题是如何使用ParamStr()函数来考虑其中包含空格的目录,或者是否有一个更好的函数,我应该使用它与包含空格的目录一起使用他们.