考虑:
{$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位数字的范围检查吗?
我在设计课程时遇到了一些麻烦.创建客户类看起来很简单:
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) 最近我遇到了以下代码:
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) 我工作的项目包括几百种表格.它们主要来自主体.应用程序名称位于所有表单中.
现在应用程序的另一个"版本"必须将表单标题更改为另一个应用程序名称.但这是有条件的.
我提出的是绑定
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在这里没有帮助.这是一种相当丑陋的做事方式.
我真正想要的是拦截子表单的创建而不是激活.我试图找到相关的资源,但没有成功.
什么是更好的做事方式?
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都会被计算得到.
最好的方法是什么?
我想知道是否存在异常/错误,这会使您的代码跳转到一个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) 在我的源代码中,我经常看到并使用如下构造:
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结束时是自动的?
很多时候,当我们查询数据库时,我们只需要一个带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)
我认为这是需要建立的东西.