我想我一定很密集,我是Delphi的新手,正在尝试将sql结果读取到类中以轻松访问它。我创建了一个虚拟类来测试,如下所示:
type
test_class = class
id:integer;
job_number:string;
cust_name :string ;
procedure get_record_data;
end;
然后我把这个过程称为:
procedure test_class.get_record_data;
begin
test_class.Create;
test_class.id := tform3.adoQuery1.FieldByName('id').AsInteger;
test_class.job_number := tform3.adoQuery1.FieldByName('job number').AsString;
test_class.cust_name := tform3.adoQuery1.FieldByName('customer name').AsString;
end;
然后我这样测试我的结果:
procedure TForm3.Button1Click(Sender: TObject);
begin
showmessage('Id number is ' + inttostr(test_class.id));
end;
showmessage行抛出一个编译器错误,上面写着Method Identifier Expected。
以test_class.id:=、test_class.job_number:=和test_class.cust_name:=开头的行所有这些都给了我相同的方法标识符预期以及一个缺少运算符或分号的错误。
我做错了什么?有没有更简单的方法?一旦我完成了这项工作,空值会不会出现问题?
不能将类用作实例。您必须保留对已创建实例的引用,根据您的示例,它可能看起来像这样。。。
type
Ttest_class=class
id:integer;
job_number:string;
cust_name :string ;
Class Function get_record_data(ADS:TCustomAdodataset):Ttest_class;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TC:Ttest_class;
begin
TC := Ttest_class.get_record_data(AdoQuery1);
try
showmessage('Id number is ' + inttostr(TC.id));
finally
TC.Free
end;
end;
class function Ttest_class.get_record_data(ADS: TCustomAdodataset): Ttest_class;
begin
Result := Ttest_class.Create;
Result.id:=ADS.FieldByName('id').AsInteger;
Result.job_number:= ADS.FieldByName('job number').AsString;
Result.cust_name:= ADS.FieldByName('customer name').AsString;
end;
根据@MarjanVenema的建议和评论要求,优选版本:
type
Ttest_class = class
id: integer;
job_number: string;
cust_name: string;
Constructor Create(ADS: TCustomAdodataset);
end;
Constructor Ttest_class.Create(ADS: TCustomAdodataset);
begin
id := ADS.FieldByName('id').AsInteger;
job_number := ADS.FieldByName('job number').AsString;
cust_name := ADS.FieldByName('customer name').AsString;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TC: Ttest_class;
begin
TC := Ttest_class.Create(ADOQuery1);
try
showmessage('Id number is ' + inttostr(TC.id));
finally
TC.Free
end;
end;
test_class
是一个类型,而不是实例变量。要访问test_class
类型的对象,您需要声明该类型的变量,创建一个实例,然后使用它的字段和方法的属性。最后,您需要释放该对象的内存。
例如(为了不让你困惑,我不会使用try...finally
):
procedure TForm3.Button1Click(Sender: TObject);
var tc: test_class; //instance variable declaration
begin
tc := test.class.Create; //creation of the object
tc.get_record_data; //call a method to fill the class fields
ShowMessage('Id number is ' + inttostr(tc.id)); //use of the object
tc.Free; //freeing the memory object
end;
顺便说一句,按照惯例,Delphi中的用户定义类型以T
开头,后面是不带下划线的驼色大小写,就像TTestClass
而不是test_class
一样。
我想你不知道类、对象和实例变量的概念。谷歌对他们的定义,有很多关于这方面的信息,例如本教程。
在get_record_data method
中,如果您想填充它们所属实例的变量,则如下所示:
procedure test_class.get_record_data ;
begin
id := tform3.adoQuery1.FieldByName('id').AsInteger;
job_number := tform3.adoQuery1.FieldByName('job number').AsString;
cust_name := tform3.adoQuery1.FieldByName('customer name').AsString;
end;
Test_Class
需要知道它从什么中填充数据。您试图引用Form3.ADOQuery1
,但TForm3几乎肯定是Class,而不是对象。
如果你使用的是Delphi自动生成的代码,那么应该有一行类似的内容
var
Form3: TForm3
在你单位的顶部。如果是这种情况,那么您可以通过在该过程中将所有TForm3替换为Form3来更正代码。
一个更好的解决方案是为您的get_record_data
过程提供要从填写的查询
procedure test_class.get_record_data (const aQuery: TADOQuery);
begin
id := aQuery.FieldByName('id').AsInteger;
job_number := aQuery.FieldByName('job number').AsString;
cust_name := aQuery.FieldByName('customer name').AsString;
end;
对于这样一个小对象来说,更好的方法是直接传入3个变量:
procedure test_class.set_object_data(const aID: integer; const aJob_Number, aCust_Name: string