小编Pie*_*r B的帖子

为什么不"i:= i + 1"给出整数和更大类型的范围检查错误?

考虑:

{$R+}
i:= 1;
While i > 0 do
  i:= i + 1;
ShowMessage(IntToStr(i));
Run Code Online (Sandbox Code Playgroud)

如果我声明i为Byte,Word,Shortint或TinyInt,我会得到范围检查错误,如预期的那样.如果我声明i为LongWord,Cardinal,Integer,LongInt或Int64,它只是通过while循环并显示负值或0值,i当你通过上限时得到.

Delphi 7不支持32位和64位数字的范围检查吗?

delphi range-checking

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

如何构造具有大量属性的对象?

我在设计课程时遇到了一些麻烦.创建客户类看起来很简单:

TCustomer = Class
  private
    FIdNumber: String;
    FName: String;
    procedure SetName(const Value: String);
    procedure SetNumber(const Value: String);
  public
    Property Name : String read FName;
    Property IdNumber : String read FIdNumber;
    Constructor Create(Number, Name  : String);
end;

constructor TCustomer.Create(ANumber, AName: String);
begin
   SetName(AName);
   SetNumber(ANumber);
end;

MyCustomer := TCustomer.Create('1', 'John Doe');
Run Code Online (Sandbox Code Playgroud)

但我的客户有更多的财产:他住的地方,出生日期等.

TCustomer = Class
  private
    {..snip snip..}
  public
    Property Name : String read FName;
    Property IdNumber : String read FIdNumber;
    Property Street : String read FStreet;
    Property HouseNumber : Integer : …
Run Code Online (Sandbox Code Playgroud)

delphi

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

为什么只用一个静态函数创建一个类?

最近我遇到了以下代码:

interface

TSomeClass=Class
public
  class function SomeFunction(sMyString: string) : ISomeInterface;
end;

implementation

TSomeClass.SomeFunction(sMyString: string) : ISomeInterface;
begin
  ...Get some dependency.
end;
Run Code Online (Sandbox Code Playgroud)

基本上是一个具有1个类函数的类.

这个结构的好处是什么,而不仅仅是一个单元中的函数而不是它的一部分?

喜欢:

interface
function SomeFunction(sMyString: string) : ISomeInterface;

implementation

SomeFunction(sMyString: string) : ISomeInterface;
begin
  ...Get some dependency.
end;
Run Code Online (Sandbox Code Playgroud)

delphi

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

试图抓住表单的创建

我工作的项目包括几百种表格.它们主要来自主体.应用程序名称位于所有表单中.

现在应用程序的另一个"版本"必须将表单标题更改为另一个应用程序名称.但这是有条件的.

我提出的是绑定

Screen.OnActiveFormChange := ScreenOnActiveFormChange;
Run Code Online (Sandbox Code Playgroud)

在formcreate中并为此制定程序.

procedure TFormMAIN.ScreenOnActiveFormChange(Sender: TObject);
begin
  if Newversion then begin
    if assigned(screen.activeform) then begin
      Screen.ActiveForm.Caption := SwapFormCaption(Screen.ActiveForm.Caption);
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这在95%的案例中运作良好.但是在那些5%中,表格显示得太快了.在更新标题之前绘制窗口,窗口将其保留在那里.但标题已经有了新的价值.有效的补救措施是增加和减少1个像素的表格高度然后它会显示正确.form.repaint在这里没有帮助.这是一种相当丑陋的做事方式.

我真正想要的是拦截子表单的创建而不是激活.我试图找到相关的资源,但没有成功.

delphi delphi-7

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

使用big if子句或堆叠它们?

什么是更好的做事方式?

if f1() and f2() then...
Run Code Online (Sandbox Code Playgroud)

要么

if f1() then
  if f2() then
Run Code Online (Sandbox Code Playgroud)

要么:

fBoolean1 := f1()
fBoolean2 := f2()

if fboolean1 and fboolean2 then...
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,我不确定这两个函数中的哪一个被评估.在第二个示例中,仅当f1计算为true时才会计算f2,而在第三个示例中,f1和f2都会被计算得到.

最好的方法是什么?

delphi if-statement

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

是否存在一般性E未捕获的异常:异常?

我想知道是否存在异常/错误,这会使您的代码跳转到一个except块但不会被E:exception处理.

 try
   i := StrToInt(s);
   {...do a lot more...}
 except
   on E : EConvertError do begin
     ShowMessage('You need to input a valid number.');
   end;
   on E : Exception do begin
     ShowMessage('Something went wrong.');
     Raise; 
   end;
 end;
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以让一个程序错误地忽略这个除了块之外的两个语句?或者我应该这样做:

 try
   i := StrToInt(s);
   {...do a lot more...}
 except
   on E : EConvertError do begin
     ShowMessage('You need to input a valid number.');
   end;
   else begin  // swapped on e : Exception with else
     ShowMessage('Something went wrong.');
     Raise; 
   end;
 end;
Run Code Online (Sandbox Code Playgroud)

delphi exception-handling exception

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

如果我在"with"子句中创建一个对象,我还需要释放它吗?

在我的源代码中,我经常看到并使用如下构造:

with TSQLDataSet.Create(nil) do try
  //Dosomething, get a result from a query.    
finally
  Free;
end;
Run Code Online (Sandbox Code Playgroud)

但我也经常看到这个结构:

with TSQLDataSet.Create(nil) do begin
  //Dosomething, get a result from a query.    
end;
Run Code Online (Sandbox Code Playgroud)

如果我创建带有contruction的对象,我是否需要释放它们,或者在with-block结束时是自动的?

delphi pascal delphi-7 with-statement

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

数据库结果的变量结构

很多时候,当我们查询数据库时,我们只需要一个带varchar的列.所以我做了一个很好的函数来查询数据库并将结果放在一个字符串列表中:

function Getdatatostringlist(sqlcomponent, sqlquery: string): TStringlist;
Run Code Online (Sandbox Code Playgroud)

我现在正在寻找的基本上是相同的功能,但对于具有多列的结果,您事先不知道数据的类型,无论是varchar,int,datetime.

什么样的数据结构在这里很好用.

我想要的原因是我尝试不使用开放数据集.我更喜欢将所有结果提取到临时结构中,关闭数据集并处理结果.


在Kobiks回复关于在内存数据集中使用后,我想出了以下内容,它可以快速组合起来测试这个概念:

procedure TForm1.Button2Click(Sender: TObject);
var
  MyDataSet : TAdoDataSet;
begin
 MyDataSet := GetDataToDataSet('SELECT naam FROM user WHERE userid = 1', ADOConnection1);
 try
   Form1.Caption := MyDataSet.FieldByName('naam').AsString;
 finally
   MyDataSet.free;
 end;
end;

function TForm1.GetDataToDataSet(sSql: string; AdoConnection: TADOConnection): TAdoDataSet;
begin
  Result := TAdoDataSet.Create(nil);
  Result.LockType := ltBatchOptimistic;
  Result.Connection := AdoConnection;
  Result.CommandText :=  sSql;
  Result.Open;
  Result.Connection := nil;
end;
Run Code Online (Sandbox Code Playgroud)

我认为这是需要建立的东西.

sql delphi

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