EasyDelphi Q&A
+2 تصويتات
54 مشاهدات
أقوم ببناء مكون Component

اريد عندما اقوم بمحاولة تغير property أثناء تصميم الواجهة ان يظهر لي Form قد قمت بتصميمه لاستطيع من خلال هذا الفورم التعديل على فيلدات هذا الكومبونينت.

في حال لم يتم فهم طلبي بشكل صحيح..
اريد برمجة في مكوني شيء يشبه هذا:

عند الضغط على Font الخاص بمكون من نوع TForm في Object Inspector يضهر فورم لاختيار الخط.
سُئل في تصنيف vcl بواسطة (2,080 نقاط) | 54 مشاهدات

1 إجابة واحدة

+3 تصويتات
أفضل إجابة

عليك اضافة Package  خاصة بالتصميم منفصلة عن ال Package الخاصة بال RunTime

ضمن ال Packge الجديدة، انقل اليها تسجيل العناصر الخاصة بك، على ملف unit خاص بها، ضمن هذا الملف، سنضيف ال Property Editor

يوجد نوعين منها، واحد على مستوى العنصر ككل، وواحد على مستوى الخاصية نفسها

النوع الاول قم باشتقاق TDefaultEditor

الثاني وهو ما تريده قم باشتقاق TPropertyEditor

و فيالاجراء Register اضف هاذين الكلاسين

المثال التالي يحوي الاثنين معا، طبعا لم اجربهم قد يحتويان على اخطاء بسيطة، لكنك ببساطة يمكن بحث عن امثلة حقيقية ضمن المصدر الدلفي، ابحث عن TColor مثلا، او Memo.Lines ايضا لها شاشة خاصة

 

 

{
  TMyComponentEditor
}

TMyEditor = class(TDefaultEditor)
protected
public
    constructor Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner);  override;
    procedure Edit; override;
    procedure ExecuteVerb(Index: integer); override;
    function GetVerb(Index: integer): string; override;
    function GetVerbCount: integer; override;
    procedure PrepareItem(Index: integer; const AnItem: TMenuItem); override;
end;

constructor TMyEditor.Create(AComponent: TComponent; ADesigner: TComponentEditorDesigner);
begin
  inherited Create(AComponent, ADesigner);
  BestEditEvent := 'MyProp'; //Property if clicked do the same
end;

procedure TMyEditor.Edit;
begin
  ///....
end;

procedure TMyEditor.ExecuteVerb(Index: integer);
begin
  case Index of
    0: Edit;
    1: Anotheraction;
  end;
end;

function TMyEditor.GetVerb(Index: integer): string;
begin
  case Index of
    0: Result := 'Action';
    1: Result := 'Another Action';
  end;
end;

function TMyEditor.GetVerbCount: integer;
begin
  Result := 2;
end;

procedure TMyEditor.PrepareItem(Index: integer; const AnItem: TMenuItem);
begin
  inherited;
end;

{
		TMyPropertyEditor
}

TMyPropertyEditor = class(TPropertyEditor)
public
  procedure Edit; override;
  function GetAttributes: TPropertyAttributes; override;
  function GetValue:string; override;
end;


procedure TAutoCorrectionProperty.Edit;
var
	MyComponent : TMyComponent;
begin
  MyComponent := TMyComponent(GetComponent(0)); //yes it is a list , you can take all component not just one, but here we will take one
  MyShowForm(MyComponent);
  Designer.Modified;
end;

function TAutoCorrectionProperty.GetAttributes: TPropertyAttributes;
begin
  GetAttributes := [paDialog, paReadOnly]; //
end;

function TAutoCorrectionProperty.GetValue: string;
begin
  GetValue := '(myvalue)'; //sepical show value
end;

procedure Register;
begin
  RegisterComponentEditor(TMyComponent, TMyEditor);
  RegisterPropertyEditor(TypeInfo(TMyType), TMyComponent, 'MyProp', TMyPropertyEditor);
end;

 

 

تم الرد عليه بواسطة (15,110 نقاط)
مختارة بواسطة
شكرا الك استاذ زاهر

اسئلة متعلقة

+3 تصويتات
1 إجابة
0 تصويتات
1 إجابة
+2 تصويتات
1 إجابة
+3 تصويتات
3 إجابة
ادعُ اصدقائك في الفايسبوك لمشاركتك
Comodo SSL

مرحبًا بك إلى EasyDelphi Q&A، حيث يمكنك طرح الأسئلة والحصول على الإجابة عليها من المستخدمين الآخرين.

لا يسمح بطلب او السؤال عن كراك او تفعيل او كسر او فك او اي شيء يخالف اتفاقيات الترخيص  مهما كان السبب ومهما كان البرنامج ونوعه. ولا حتى نشر روابط تحتوي على مثل هذه الاشياء لا في الاسئلة ولا في الاجابات ولا التعليقات . نهائيا

396 سؤال
634 إجابة
1,130 تعليق
237 مستخدم