دلفي: كيف أعرف ما الذي يقوم به محرر العقارات الخاص بي؟

StackOverflow https://stackoverflow.com/questions/1997387

  •  22-09-2019
  •  | 
  •  

سؤال

لدي محرر عقارات (سليل TpropertyEditor) الذي يستخدم لتحرير خاصية.

عندما يحين الوقت لتحرير الممتلكات الخاصة بي ، كيف أعرف ما هي خاصية الكائن الذي أقوم بتحريره؟ إذا كنت سأقوم بتحرير خاصية ، فيجب أن أعرف ما هي الممتلكات التي أقوم بتحريرها.

لقد تم سحب شعري ، وأغرب من خلال مساعدة Delphi ، والمساعدة عبر الإنترنت ، ورمز المصدر TpropertyEditor ، ولا يمكنني العثور على الإجابة.

كنت أتوقع شيئًا مثل:

TPropertyEditor = class(...)
public
    procedure Initialize(TheObject: TObject; ThePropertyName: string);
end;

بقدر ما أستطيع أن أقول ، يتم إنشاء محرر العقار الخاص بي ، وسيُطلب مني "تحرير" ، وعلي فقط أن أؤدي إلى إلهية الممتلكات التي أرادوا تحريرها.


من المساعدة:

تحرير العقار ككل

يمكنك اختياريًا تقديم مربع حوار يمكن للمستخدم فيه تحرير خاصية بصريًا. الاستخدام الأكثر شيوعًا لمحرري العقارات هو للممتلكات التي هي نفسها فصول. مثال على ذلك الخط الخاصية ، التي يمكن للمستخدم فتح مربع حوار الخط لاختيار جميع سمات الخط في وقت واحد.

لتوفير مربع حوار محرر محرر كامل ، تجاوز فئة محرر العقارات تعديل طريقة.

تعديل تستخدم الأساليب نفس الأساليب والتعيين المستخدمة في الكتابة الحصول على قيمة و setValue أساليب. في الواقع ، تعديل الطريقة تستدعي كل من طريقة الحصول على طريقة وطريقة محددة. نظرًا لأن المحرر خاص بالأنواع ، فعادة ما لا توجد حاجة لتحويل قيم الخصائص إلى السلاسل. يتعامل المحرر عمومًا مع القيمة "كما تم استردادها".

عندما ينقر المستخدم على زر "..." بجوار الخاصية أو ينقر نقرًا مزدوجًا على عمود القيمة ، يقوم مفتش الكائن باستدعاء محرر الخصائص تعديلطريقة.

ضمن تنفيذك من تعديل الطريقة ، اتبع هذه الخطوات:

  1. قم ببناء المحرر الذي تستخدمه للخاصية.
  2. اقرأ القيمة الحالية وتعيينها إلى الخاصية باستخدام طريقة GET.
  3. عندما يحدد المستخدم قيمة جديدة ، قم بتعيين هذه القيمة إلى الخاصية باستخدام طريقة SET.
  4. تدمير المحرر.

إجابه

لقد تم وضعه بعيدًا ، ولم يتم توثيقه ، لكنني اكتشفت كيف. الخاصية التي أقوم بتحريرها: أقوم بتحريرها:

TheCurrentValue := TMyPropertyThing(Pointer(GetOrdValue));

الآن بعد أن حصلت على القيمة ، يمكنني تعديلها. إذا كنت أرغب في استبدال الخاصية ببعض الأشياء الأخرى:

SetOrdValue(Longint(TheNewValue));

الرمز الكامل:

إنشاء محرر عقارات ينحدر من tclassproperty:

TMyPropertyEditor = class(TClassProperty)
public
   procedure Edit; override;
   function GetAttributes: TPropertyAttributes; override;
end;

الأول هو التدبير المنزلي ، يخبر مفتش كائن Delphi أن محرر الممتلكات الخاص بي سيعرض مربع حوار ، سيؤدي ذلك إلى ظهور "..." بجوار العقار:

function TMyPropertyEditor.GetAttributes: TPropertyAttributes;
begin
   //We show a dialog, make Object Inspector show "..."
   Result := [paDialog];
end;

التالي هو العمل الفعلي. عندما ينقر المستخدم على زر "..." ، يتصل مفتش الكائن تعديل طريقة. الحيلة التي كنت أفتقدها هي أن أتصل بي getordvalue طريقة. على الرغم من أن ممتلكاتي ليست ترتيبي, ، لا تزال تستخدمه ، وتلقي الشيء الناتج على كائن:

procedure TMyPropertyEditor.Edit;
var
   OldThing: TMyPersistentThing;
   NewThing: TMyPersistentThing;
begin
   //Call the property's getter, and return the "object" i'm editing:
   OldThing:= TMyPersistentThing(Pointer(GetOrdValue));

   //now that i have the thing i'm editing, do stuff to "edit" it
   DoSomeEditing(OldThing);


   //i don't have to, but if i want to replace the property with a new object
   //i can call the setter:
   NewThing := SomeVariant(OldThing);
   SetOrdValue(Longint(NewThing));
end;
هل كانت مفيدة؟

المحلول

إذا فهمت سؤالك بشكل صحيح ، فأنت تتساءل كيف من المفترض أن تجد بالفعل القيمة التي تحتاجها لتحريرها ، خاصة إذا كان الكائن المعني يحتوي على أكثر من واحد منهم. الجواب هو أن IDE يحدد ذلك لك ويأتي محرر الممتلكات "التحميل مسبقًا" بحلول الوقت الذي يُطلق عليه التحرير. يأتي TpropertyEditor مع مجموعة من طرق getValue التي يمكن أن تستخدمها وظيفة التحرير لاسترداد القيمة. أو إذا لم تكن واحدة من هذه الأنواع ، (إذا كان كائنًا ينحدر من tperSentive ، على سبيل المثال ،) ، فيمكنك استدعاء getordvalue وإلقاء النتيجة على tpersenteration.

أيضًا ، قد ترغب في الاطلاع على TJVPersistraftPropertyEditor في وحدة JVDSGNEDITORS في JVCL لاستخدامها كفئة أساسية. يوفر بعض الوظائف لك.

راجع للشغل إذا كنت بحاجة إليها حقًا ، فيمكنك استخدام طريقة GetName ، والتي ستمنحك اسم العقار ، ولكن عادة لا يتعين عليك ذلك. وكن حذرًا إذا كنت ترث من شيء آخر غير tpropertyeDitor نفسه ، كما هو GetName افتراضية ويمكن تجاوزها.

نصائح أخرى

يحتفظ محرر العقارات بالمعلومات حول الكائنات والخصائص التي يتم تحريرها في القطاع الخاص FPropList عامل. تملأ IDE ذلك من خلال الاتصال بمحررك SetPropEntry طريقة. من المفترض أن تتصل بشكل عام بالطرق المختلفة TPropertyEditor لمعرفة قيم الخصائص.

ليس من المفترض حقًا أن تهم الممتلكات التي طُلب منك تحريرها. يقوم محرر الممتلكات بتحرير خصائص نوع معين. للتحرير في مكانه ، يوفر محررك تنفيذًا SetValue هذا يترجم السلسلة من مفتش الكائن إلى قيمة من النوع الصحيح للخاصية ، ثم تتصل بالذات المناسبة Set الوظيفة ، مثل SetOrdValue أو SetIntfValue. لتحرير الممتلك الكامل ، لن يتصل IDE SetValue. بدلاً من ذلك ، سوف يتصل Edit, ، ومن المتوقع أن تتصل GetOrdValue أو GetIntfValue (على سبيل المثال) نفسك ، لأن محررك يعرف بالفعل نوع الممتلكات التي صمم لتحريرها.

تذكر أن محرري العقارات ، بشكل عام ، يمكنهم تحرير خصائص متعددة في وقت واحد. ال اسم من بين العقار سيكون هو نفسه بالنسبة لهم جميعًا ، لكن نوع المكون الذي ينتمون إليه قد يختلف ، وبالتالي قد يختلف المتجولون والمقاطعون. اتصل بمحرر الممتلكات الخاص بك GetName طريقة لمعرفة الاسم. للحصول على الكائنات ، اتصل GetComponent لكل فهرس من 0 إلى PropCount - 1. (كن حذرًا ؛ لا يوجد مجموعة من التحقق من هؤلاء Get وظائف.) يمكنك أيضًا التحقق مما إذا كان هناك كائن معين في القائمة عن طريق الاتصال HasInstance. ال GetPropInfo ستخبرك الطريقة PPropInfo مؤشر ل أول الممتلكات ، لكنني لا أعتقد أن هذا سيكون بالضرورة مساواة مع مؤشرات جميع الخصائص الأخرى. بصرف النظر عن ذلك ، لا يمكنك الوصول المباشر إلى PPropInfo البيانات ، ولكن مرة أخرى ، لا ينبغي أن يهم حقًا. إذا كنت تعتقد أنك بحاجة إلى ذلك لمحررك ، فأنت من المحتمل فعل شيء خاطئ انشر سؤالًا جديدًا مع معلومات أكثر تحديدًا حول مهمتك الأساسية.

يحمل محرري العقارات فقط (ويتم تسجيلهم) يكتب من الممتلكات ، وليس الخاصية المحددة نفسها.

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