سؤال

أنا أميل إلى استخدام TStringList في دلفي لمعالجة النص، لذلك أكتب الكثير من الإجراءات/الوظائف مثل:

var
  TempList: TStringList;
begin
  TempList:= TStringList.Create;
  try
    // blah blah blah do stuff with TempList   


  finally
    TempList.Free;
  end;
end;

سيكون من الجيد قطع الإنشاء والتحرير لمثل هذه الفئة العامة من المرافق.

نظرًا لأن لدينا الآن سجلات ذات أساليب ، فهل من الممكن أن نلف فصلًا مثل TstringList في سجل حتى أتمكن من الحصول على:

var
  TempList: TRecordStringList;
begin
  // blah blah blah do stuff with TempList   


end;
هل كانت مفيدة؟

المحلول

وانها ممكن. إنشاء واجهة الذي يعرض الطرق / الأشياء التي تريدها:

type
  IStringList = interface
    procedure Add(const s: string); // etc.
    property StringList: TStringList read GetStringList; // etc.
  end;

وتنفيذ واجهة، وأنها التفاف TStringList الحقيقي:

type
  TStringListImpl = class(TInterfacedObject, IStringList)
  private
    FStringList: TStringList; // create in constructor, destroy in destructor
    // implementation etc.
  end;

وثم تنفيذ السجل:

type
  TStringListRecord = record
  private
    FImpl: IStringList;
    function GetImpl: IStringList; // creates TStringListImpl if FImpl is nil
                                   // returns value of FImpl otherwise
  public
    procedure Add(const s: string); // forward to GetImpl.Add
    property StringList: TStringList read GetStringList; // forward to
                                                         // GetImpl.StringList
    // etc.
  end;

والحقيقة أن هناك واجهة داخل السجل يعني أن المترجم التعامل مع إشارة العد تلقائيا، داعيا _AddRef و_Release عن نسخ الحصول على خلق وتدمير، لذلك إدارة عمر هو تلقائي. هذا يعمل للكائنات التي سوف تحتوي أبدا إشارة إلى أنفسهم (وخلق حلقة) - إشارة العد يحتاج الحيل المختلفة للحصول على دورات في الرسم البياني إشارة

نصائح أخرى

إذا كنت محظوظًا بما يكفي للترقية إلى دلفي 2009، فقم بالتحقق عمل باري بمؤشرات ذكية.

TSmartPointer<T: class> = record
strict private
  FValue: T;
  FLifetime: IInterface;
public
  constructor Create(const AValue: T); overload;
  class operator Implicit(const AValue: T): TSmartPointer<T>;
  property Value: T read FValue;
end;

إنها رائعة حقًا، ولكنها تتطلب أساليب عامة ومجهولة.إذا لم تقم بالترقية إلى دلفي 2009, ، ثم افعل ذلك الآن!خاصة عندما يقدمون ما لديهم بوجو خاص.يمكنك أيضا الحصول على ماركو دليل مطور دلفي حر فقط لاجل تنزيل المحاكمة.لقد قمت بالفعل بشراء نسخة منه أيضًا.

وهناك مثال آخر بالفعل تنفيذها في CC .

<اقتباس فقرة>   

وStringList هو نفس TStringList إلا أنه هو قيمة   اكتب. لم يكن لديك ليتم إنشاؤه، ودمرت أو وضعت في   حاول / في نهاية المطاف. يتم ذلك عن طريق المترجم بالنسبة لك. هناك   عمليا أي عقوبات الأداء خاصة لهذه للعمل:

var 
  strings: StringList;
  astr: string;
begin
  strings.Add('test1');
  strings.Add('test2');
  aStr := string(strings);
  RichEdit.Lines.AddStrings(strings);
end;
     

ويمكن استخدام التعليمات البرمجية كقالب لالتفاف أي TObject كنوع قيمة الدرجة.

وانها بالفعل كل شيء لTStringList يتعرض لك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top