Bagaimana cara mengubah nama kelas sebagai string menjadi kelas?

Saya memiliki nama kelas dalam daftar string. Misalnya bisa berupa 'TPlanEvent', 'TParcel', 'TCountry' dll.

Sekarang saya ingin mengetahui ukurannya dengan mengulang daftarnya.

Ia berfungsi untuk memiliki:

Size := TCountry.InstanceSize;

Tapi saya inginnya seperti ini:

for i := 0 to ClassList.Count - 1 do
  Size := StringToClass(ClassList[i]).InstanceSize;

Jelas pertanyaan saya adalah apa yang harus ditulis alih-alih metode StringToClass untuk mengubah string menjadi kelas.


person Roland Bengtsson    schedule 28.04.2010    source sumber


Jawaban (4)


Karena Anda menggunakan stringlist, Anda juga dapat menyimpan kelas di sana:

var
  C: TClass;

  StringList.AddObject(C.ClassName, TObject(C));

...

for I := 0 to StringList.Count - 1 do
  Size := TClass(StringList.Objects[I]).InstanceSize;

...

person Ondrej Kelle    schedule 28.04.2010
comment
ini tentu saja hanya berfungsi, jika PL mengisi daftarnya sendiri, bukan jika daftar itu misalnya dibaca dari file atau semacamnya... - person Oliver Giesen; 28.04.2010

Jika kelas Anda berasal dari TPersistent, Anda dapat menggunakan RegisterClass dan FindClass atau GetClass . Kalau tidak, Anda bisa menulis semacam mekanisme pendaftaran sendiri.

person Uli Gerhardt    schedule 28.04.2010

Di Delphi 2010 Anda dapat menggunakan:

function StringToClass(AName: string): TClass;
var
  LCtx: TRttiContext;
  LTp: TRttiType;
begin
  Result := nil;

  try
    LTp := LCtx.FindType(AClassName);
  except
    Exit;
  end;

  if (LTp <> nil) and (LTp is TRttiInstanceType) then
    Result := TRttiInstanceType(LTp).Metaclass;
end;

Satu catatan. Karena Anda hanya menyimpan nama kelas dalam daftar, metode ini tidak akan berfungsi karena TRttiContext.FindType mengharapkan nama tipe yang sepenuhnya memenuhi syarat (mis. uMyUnit.TMyClass). Cara mengatasinya adalah dengan melampirkan unit tempat Anda menyimpan kelas-kelas ini di loop atau di daftar.

person alex    schedule 28.04.2010
comment
Sayangnya saya menggunakan Delphi 2007 - person Roland Bengtsson; 28.04.2010

  1. Anda harus menggunakan FindClass untuk menemukan referensi kelas berdasarkan namanya. Jika kelas tidak ditemukan, maka pengecualian akan dimunculkan.
  2. Secara opsional, Anda harus memanggil RegisterClass untuk kelas Anda, jika kelas tersebut tidak direferensikan secara eksplisit dalam kode.
person da-soft    schedule 28.04.2010