小编EMB*_*osa的帖子

有关如何定义命令行参数的建议

在我的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一个参数包含一个空格(比如使用大括号或其他东西).

什么是最佳做法?

delphi paramstr

18
推荐指数
3
解决办法
4088
查看次数

Subversion供应商分支机构

设置subversion以使用供应商分支时的最佳做法是什么?我们的存储库是针对单个项目构建的 我们使用的是subversion 1.6.2和tortoiseSVN 1.6.3.

示例文件夹结构:

Project1
 /tags
 /branches
 /trunk

Project2
 /tags
 /branches
 /trunk
Run Code Online (Sandbox Code Playgroud)
  1. 我在哪里放置供应商文件夹以及它应该具有哪些结构?
  2. 是否有使用tortoisesvn客户端的示例?

svn vendor-branch

10
推荐指数
1
解决办法
6300
查看次数

Firebird备份恢复令人沮丧,有没有办法避免它?

我正在使用Firebird,但最近数据库变得非常认真.实际上有很多delete语句在运行,以及更新/插入,并且数据库文件大小增长得非常快.在大量删除记录之后,数据库大小不会减少,更糟糕的是,我感觉实际上查询速度有所降低.为了解决这个问题,我们已经涉及了每日备份/恢复过程,但由于是时候完成了 - 我可以说使用Firebird真的很令人沮丧.

  • 任何有关变通方法或解决方案的想法都将受到欢迎.

  • 同时,我正在考虑转换到Interbase,因为我从朋友那里听说它没有这个问题 - 是这样的吗?

sql database backup firebird interbase

8
推荐指数
3
解决办法
4291
查看次数

除了寻找内存泄漏之外,还有其他情况我应该在销毁应用程序时释放所有对象吗?

假设在开始时创建具有某些表单且仅一个数据模块的应用程序.在这种情况DM1.OnCreate下,TStringList创建a以在运行时使用.我们知道,当应用程序被终止时,所有内容都将被销毁,内存将自动释放.释放某些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏.例如,请参阅Barry Kelly的回答或Raymond Chen的这篇文章.

在那旁边,FastMM报告内存泄漏,如果我不添加TStringList.FreeDM1.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)

delphi free memory-leaks fastmm

8
推荐指数
3
解决办法
900
查看次数

调整列宽DBGrid

我有一个TDBGrid.它有效,但显示的列非常大.

如何设置"自动修复列宽"?

delphi dbgrid

8
推荐指数
1
解决办法
2万
查看次数

为什么没有使用常量时没有警告或提示?

我试图向另一个人展示一些代码,当我巧妙地察觉到,当没有使用声明的变量时,有编译器提示消息,当没有使用声明的常量时没有提示或消息.以下代码是一个例子:

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)

为什么没有关于未使用的常量的提示?关于这种差异有任何合理的解释吗?

delphi compiler-construction constants compiler-warnings

8
推荐指数
1
解决办法
416
查看次数

在Delphi和Lazarus(FPC)中实现接口有什么区别?

我们有一个充满了定制组件的项目,现在在Lazarus和Delphi中工作.

我正在考虑代码接口,但我对它们并不熟悉.我想知道的是:Delphi和Lazarus接口的实现细微差别是什么?有什么我应该特别注意的吗?我需要编写真正不同的代码吗?

背景说明:我认为组件可以从接口中受益,或者至少,我将从中学到更多.例如,其中一个组件使用串行端口与许多不同的硬件进行通信.但是用户应该只使用我们的组件来创建应用程序.因此,我们为每个从基类继承的硬件提供了组件和一个类.在运行时,我们在组件内创建特定的类.

不确定最后的解释是否需要,但如果你们有人需要,我可以写更多.

delphi interface freepascal lazarus

7
推荐指数
1
解决办法
2449
查看次数

在调试时,有什么快捷方法可以停止在特定的Windows消息或API上?

所以我想在特定的API或Windows消息中放置一个断点.如果不在任何Delphi版本中编写代码,我找不到任何简单的方法.有没有办法做到这一点,因为我可以在内存访问中设置断点?

delphi debugging winapi conditional-breakpoint windows-messages

6
推荐指数
1
解决办法
469
查看次数

有什么替代svn_load_dirs.pl的吗?

我们有一个大型供应商分支(1200多个文件),最近经历了一些非平凡的变化,我想将它们集成到主干中.它会相当频繁地更新,我们需要经常更新,所以手工操作会浪费太多时间.

这就是svn_load_dirs.pl的用途,只是我没有perl解释器,并且根据过去的经验,通过官僚层次来安装一个将需要更长时间并且比每次手动合并更多的痛苦.

我们有一个python解释器,svn_load可以很好地完成这项工作.仅使用SVN CLI而不是直接使用pysvn,未安装.见上文:不通过去,不收200英镑.

我意识到这不太可能,但是有人知道其他任何选择吗?

svn vendor-branch

3
推荐指数
1
解决办法
2298
查看次数

使用FILE_FLAG_NO_BUFFERING打开时,为什么写入文件会失败?

我试图衡量效果FILE_FLAG_WRITE_THROUGHFILE_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)

delphi file-io winapi

2
推荐指数
1
解决办法
1137
查看次数

动态数组变量未显示在"局部变量"调试窗口中

我有一些我以前从未见过的东西.调试时未在"局部变量"窗口中显示的局部变量.我正在附上一张图片.为什么你不在那里?

如您所见,我在代码中使用变量,并在调试时禁用优化.但我也使用泛型和匿名方法,我不是专家.有问题的过程的代码是这样的(该过程的作用是按顺序排列第一个数组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)

delphi debugging delphi-xe

2
推荐指数
1
解决办法
757
查看次数

在另一个始终位于顶部的表单前显示一个表单

我有一个Form总是在FormStyle - > fsStayOnTop上保持最佳状态,我使用相同的设置做了另一个Form.但是当我展示这个其他表格时,它总是在后面显示,而不是在第一个表格前面.那么,我如何对第二张表格显示在第一张表格的前面?

forms delphi

1
推荐指数
1
解决办法
740
查看次数