在Delphi中将记录数据转换为类

use*_*392 2 delphi ms-access

我想我必须是密集的,我是Delphi的新手,我正在尝试将sql结果读入类中以便轻松访问它.我创建了一个虚拟类来测试这样:

type
test_class = class
 id:integer;
 job_number:string;
 cust_name :string ;
 procedure get_record_data;
end;
Run Code Online (Sandbox Code Playgroud)

然后我调用这样的程序:

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;
Run Code Online (Sandbox Code Playgroud)

然后我测试我的结果如下:

procedure TForm3.Button1Click(Sender: TObject);
begin
 showmessage('Id number is ' + inttostr(test_class.id));
end;
Run Code Online (Sandbox Code Playgroud)

showmessage行抛出一个编译器错误,表示预期的方法标识符.

以test_class.id :=,test_class.job_number:=和test_class.cust_name:= all开头的行给出了我预期的相同方法标识符以及缺少运算符或分号错误.

我究竟做错了什么?有没有更简单的方法来解决这个问题?完成后,null值会出现问题吗?

bum*_*mmi 8

您不能将类用作实例.您将不得不保留对创建的实例的引用,根据您的示例,它可能看起来像这样......

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;
Run Code Online (Sandbox Code Playgroud)

正如@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;
Run Code Online (Sandbox Code Playgroud)


eKe*_*ek0 6

test_class是一个类型而不是实例变量.要访问类型的对象,test_class您需要声明该类型的变量,创建一个实例,然后使用其字段,方法的属性.最后,您需要释放该对象的内存.

例如(不要混淆你我不会使用a 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;
Run Code Online (Sandbox Code Playgroud)

顺便说一句,按照惯例,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;
Run Code Online (Sandbox Code Playgroud)