在我的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一个参数包含一个空格(比如使用大括号或其他东西).
什么是最佳做法?
设置subversion以使用供应商分支时的最佳做法是什么?我们的存储库是针对单个项目构建的 我们使用的是subversion 1.6.2和tortoiseSVN 1.6.3.
示例文件夹结构:
Project1
/tags
/branches
/trunk
Project2
/tags
/branches
/trunk
Run Code Online (Sandbox Code Playgroud)
我正在使用Firebird,但最近数据库变得非常认真.实际上有很多delete语句在运行,以及更新/插入,并且数据库文件大小增长得非常快.在大量删除记录之后,数据库大小不会减少,更糟糕的是,我感觉实际上查询速度有所降低.为了解决这个问题,我们已经涉及了每日备份/恢复过程,但由于是时候完成了 - 我可以说使用Firebird真的很令人沮丧.
任何有关变通方法或解决方案的想法都将受到欢迎.
同时,我正在考虑转换到Interbase,因为我从朋友那里听说它没有这个问题 - 是这样的吗?
假设在开始时创建具有某些表单且仅一个数据模块的应用程序.在这种情况DM1.OnCreate下,TStringList创建a以在运行时使用.我们知道,当应用程序被终止时,所有内容都将被销毁,内存将自动释放.释放某些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏.例如,请参阅Barry Kelly的回答或Raymond Chen的这篇文章.
在那旁边,FastMM报告内存泄漏,如果我不添加TStringList.Free到DM1.OnDestroy.在搜索我真正担心的任何其他内存泄漏时,这会成为一个问题.
所以基本上我问是否/为什么/何时我应该释放将被应用程序或操作系统释放的对象实例(在这种特定情况下为Windows).有没有其他有效的案例不是在寻找内存泄漏时?
注意:在此特定情况下,不会创建或重新创建数据模块多次.除了那个之外,根本不会有任何内存泄漏.数据模块废料来源:
unit UDM1;
interface
uses SysUtils, Classes, ...;
type
TDM1 = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
procedure DataModuleDestroy(Sender: TObject);
procedure DoStuffWithStringList1(Sender: TObject);
private
internalStL: TStringList;
end;
var
DM1: TDM1;
implementation
procedure TDMInterfacePAFECF.DataModuleCreate(Sender: TObject);
begin
internalStL := TStringList.Create();
end;
procedure TDMInterfacePAFECF.DataModuleDestroy(Sender: TObject);
begin
internalStL.Free; //<-- IS THIS NECESSARY OR ADVISED?
end;
procedure DoStuffWithStringList(Sender: TObject);
begin
//Place some code using internalStL here...
end;
Run Code Online (Sandbox Code Playgroud) 我试图向另一个人展示一些代码,当我巧妙地察觉到,当没有使用声明的变量时,有编译器提示消息,当没有使用声明的常量时没有提示或消息.以下代码是一个例子:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;
const
intM: Integer = 1000;
var
valorDouble, notusedvar: Double;
begin
try
valorDouble := 0.001;
Writeln('--- Codigo atual --');
Writeln('Double -> ', Trunc(valorDouble * 1000));
Writeln('--- Correcao?? --');
Writeln('Trunc(1.0000001) -> ', Trunc(1.0000001));
Writeln('Trunc(0.001 * 1000.0) -> ', Trunc(0.001 * 1000.0));
Writeln('Trunc(0.0010 * 1000.0) -> ', Trunc(0.0010 * 1000.0));
Writeln('Trunc(0.00100 * 1000.0) -> ', Trunc(0.00100 * 1000.0));
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud)
为什么没有关于未使用的常量的提示?关于这种差异有任何合理的解释吗?
我们有一个充满了定制组件的项目,现在在Lazarus和Delphi中工作.
我正在考虑代码接口,但我对它们并不熟悉.我想知道的是:Delphi和Lazarus接口的实现细微差别是什么?有什么我应该特别注意的吗?我需要编写真正不同的代码吗?
背景说明:我认为组件可以从接口中受益,或者至少,我将从中学到更多.例如,其中一个组件使用串行端口与许多不同的硬件进行通信.但是用户应该只使用我们的组件来创建应用程序.因此,我们为每个从基类继承的硬件提供了组件和一个类.在运行时,我们在组件内创建特定的类.
不确定最后的解释是否需要,但如果你们有人需要,我可以写更多.
所以我想在特定的API或Windows消息中放置一个断点.如果不在任何Delphi版本中编写代码,我找不到任何简单的方法.有没有办法做到这一点,因为我可以在内存访问中设置断点?
delphi debugging winapi conditional-breakpoint windows-messages
我试图衡量效果FILE_FLAG_WRITE_THROUGH和FILE_FLAG_NO_BUFFERING对写入的文件中的序列,如要求另一个问题.但我发现我不能用FILE_FLAG_NO_BUFFERINGset 写一个文件.
当我使用它时,Delphi返回EWriteError消息stream read error.
使用的代码如下:
procedure TForm1.btn1Click(Sender: TObject);
var
fsFSArquivoAAC: TFileStream;
L, lastErr: Cardinal;
R: WideString;
hn: THandle;
begin
hn := Windows.CreateFile( PChar('TesteAAC.AAC2'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH or FILE_FLAG_NO_BUFFERING, 0);
lastErr := GetLastError();
if (lastErr <> ERROR_SUCCESS) then
begin
if (lastErr <> ERROR_ALREADY_EXISTS ) then
begin
MessageDlg('Whoops, something went wrong with CreateFile!',
mtError, [mbOK], 0);
end
else
begin
SetLastError(ERROR_SUCCESS);
end; …Run Code Online (Sandbox Code Playgroud) 我有一些我以前从未见过的东西.调试时未在"局部变量"窗口中显示的局部变量.我正在附上一张图片.
如您所见,我在代码中使用变量,并在调试时禁用优化.但我也使用泛型和匿名方法,我不是专家.有问题的过程的代码是这样的(该过程的作用是按顺序排列第一个数组ArrayNomes,ArrayValores按第一个数组中字符串的长度排序):
procedure OrdenarArrays(var ArrayNomes, ArrayValores: array of string; var ArrayIndices: array of Integer);
var
Comparer: IComparer<Integer>;
I: Integer;
tmpNomesCampos, tmpValoresCampos: array of String;
begin
SetLength(tmpNomesCampos, cdsCadastro.FieldCount);
SetLength(tmpValoresCampos, cdsCadastro.FieldCount);
//Carregar os NomesCampos para serem usados na comparação
for I := 0 to High(arrayIndices) do
begin
tmpNomesCampos[I] := ArrayNomes[I];
end;
{ Cria novo delegatedcomparer. Ele permite o uso de um callback para comparar os arrays}
Comparer := TDelegatedComparer<Integer>.Create(
{ TComparison<Integer> }
function(const Left, Right: Integer): Integer
begin
{colocar em ordem decrescente …Run Code Online (Sandbox Code Playgroud) 我有一个Form总是在FormStyle - > fsStayOnTop上保持最佳状态,我使用相同的设置做了另一个Form.但是当我展示这个其他表格时,它总是在后面显示,而不是在第一个表格前面.那么,我如何对第二张表格显示在第一张表格的前面?