จะแปลงชื่อคลาสเป็นสตริงเป็นคลาสได้อย่างไร?

ฉันมีชื่อคลาสในรายการสตริง ตัวอย่างเช่น อาจเป็น 'TPlanEvent', 'TParcel', 'TCountry' เป็นต้น

ตอนนี้ฉันต้องการค้นหาขนาดโดยการวนซ้ำรายการ

มันใช้งานได้ที่จะมี:

Size := TCountry.InstanceSize;

แต่ฉันต้องการแบบนี้:

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

แน่นอนว่าคำถามของฉันคือจะเขียนอะไรแทนวิธี StringToClass เพื่อแปลงสตริงเป็นคลาส


person Roland Bengtsson    schedule 28.04.2010    source แหล่งที่มา


คำตอบ (4)


เนื่องจากคุณใช้ stringlist คุณจึงสามารถจัดเก็บคลาสไว้ที่นั่นได้เช่นกัน:

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
แน่นอนว่าสิ่งนี้ใช้ได้เฉพาะถ้า OT เติมรายการด้วยตัวเอง ไม่ใช่ว่ารายการนั้นอ่านจากไฟล์หรืออะไรทำนองนั้น... - person Oliver Giesen; 28.04.2010

หากคลาสของคุณมาจาก TPersistent คุณสามารถใช้ RegisterClass และ FindClass หรือ GetClass มิฉะนั้นคุณสามารถเขียนกลไกการลงทะเบียนบางอย่างได้ด้วยตัวเอง

person Uli Gerhardt    schedule 28.04.2010

ใน Delphi 2010 คุณสามารถใช้:

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;

หมายเหตุหนึ่ง เนื่องจากคุณเก็บเฉพาะชื่อคลาสไว้ในรายการ วิธีการนี้จึงไม่ทำงานเนื่องจาก TRttiContext.FindType คาดหวังชื่อประเภทแบบเต็ม (เช่น uMyUnit.TMyClass) การแก้ไขคือการแนบหน่วยที่คุณจัดเก็บคลาสเหล่านี้ไว้ในลูปหรือในรายการ

person alex    schedule 28.04.2010
comment
น่าเสียดายที่ฉันใช้ Delphi 2007 - person Roland Bengtsson; 28.04.2010

  1. คุณต้องใช้ FindClass เพื่อค้นหาการอ้างอิงคลาสตามชื่อ หากไม่พบคลาส ข้อยกเว้นจะเกิดขึ้น
  2. อีกทางเลือกหนึ่ง คุณต้องเรียก RegisterClass สำหรับชั้นเรียนของคุณ หากไม่ได้อ้างอิงอย่างชัดเจนในโค้ด
person da-soft    schedule 28.04.2010