PDA

View Full Version : مبتدی: ساخت شی از روی نمونه؟؟



Majid.Ebru
سه شنبه 25 خرداد 1395, 18:07 عصر
سلام و وقت بخیر
من چون نمی دونم این کاری که می خوام انجام بدم اسمش چیه یا چطوریه ، در نتیجه هیچ جستجوی نکردم.
لطفن اگه امکان داره اولش رو بگید ، من بقیش رو سرچ می کنم
شرمنده


من می خوام از یه المان الگو مثلن : Button یا Shape یا Memo و یا ..... که ویژگیهاش رو تغیر دادم ، در زمان اجرا یهکی دیگه ازش بسازم؟؟
فرض کنید که یه Shape ساختم و چندتا رویداد بهش اختصاص دادم.مثلن وقتی موس وارد شد ، رنگش سبز بشه ویا هر وقت روش کلیک شد ، شکلش عوض بشه و.....
حالا در زمان اجرا می خوام عین همین رو بسازم؟؟؟

من چون بلد نیستم ، فقط یه راه به ذهنم رسید و اون این بود که بعد از ساختن شی ، تک تک خصوصیاتش رو برابر با شی الگو قرار می دم؟


Shape_Olgo_IF_1_Create := TShape.Create(Form_Main);
with Shape_Olgo_IF_1_Create do begin
Name := str_Name ;
Name_Temp := str_Name ;
Caption:= str_Caption;
Parent := Form_Main.ScrollBox1;
Left := Left_Click;
Top := Top_Click;
Width := Element_Width;
ShowHint:= True;
Hint:= 'Empty';
Brush.Style := Style_Leave_Element ;
//Pen.Color:= Brush.Color ;
Bool_New_Old_Element:= True;


مثلن اینجا دارم رویداد ها رو بهش اختصاص می دم


OnMouseDown := Form_Main.Shape_Olgo.onMouseDown;
OnMouseEnter:= Form_Main.Shape_Olgo.onMouseEnter;
OnMouseLeave:= Form_Main.Shape_Olgo.onMouseLeave;
OnPaint:= Form_Main.Shape_Olgo.OnPaint;
if Bool_Draw_Popup then Target_Componnet_2 := Shape_Olgo_IF_1_Create;
end; // with .... do



و در حالت بعدی می خوام از یه Frame که توش چندتا شی هست ، در زمان اجرا ازش بسازم

ممنون

Mahmood_M
سه شنبه 25 خرداد 1395, 22:17 عصر
یک کلاس جدید تعریف کنید که از کلاس مورد نظرتون مشتق شده باشه، در Private کلاس جدید Event ها رو تعریف کنید و متد Create کلاس پایه رو بازنویسی کنید و در متد Create جدید، Event ها و مقادیر رو اختصاص بدید، مثال :


type
TMyButton = class(TButton)
private
procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
public
constructor Create(AOwner: TComponent); override;
end;

procedure TMyButton.MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Caption := 'Down';
end;

procedure TMyButton.MyMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Caption := 'Move';
end;

constructor TMyButton.Create(AOwner: TComponent);
begin
inherited Create(AOwner);

OnMouseMove := MyMouseMove;
OnMouseDown := MyMouseDown;

Left := 10;
Top := 10;
end;


اگر قصد دارید مقداری رو از خارج از بدنه کلاس بهش اختصاص بدید، مثلا در زمان اجرا مقدار Left رو تعیین کنید، می تونید Constructor جدید رو به صورت زیر بنویسید :


type
TMyButton = class(TButton)
private
procedure MyMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
public
constructor MyCreate(AOwner: TComponent; MyLeftValue : Integer);
end;

...

constructor TMyButton.MyCreate(AOwner: TComponent; MyLeftValue : Integer);
begin
inherited Create(AOwner);

OnMouseMove := MyMouseMove;
OnMouseDown := MyMouseDown;

Left := MyLeftValue;
Top := 10;
end;


و درنهایت مثالی از ساخت کلاس جدید :


var
B : TMyButton;
begin
B := TMyButton.MyCreate(nil, 50);
B.Parent := Form1;
end;


برای ساخت یک فرم یا فریم که تعدادی کامپوننت داخلش باشه، می تونید کامپوننت های زیر مجموعه رو در کلاس Form تعریف کنید و در Constructor ای که باز نویسی می کنید اونها رو Create کنید، مثال :


type
TMyForm = class(TForm)
private
FMyButton : TMyButton;
{ Private declarations }
public
constructor MyCreate(AOwner: TComponent; MyLeftValue : Integer);
{ Public declarations }
end;

...

constructor TMyForm.MyCreate(AOwner: TComponent; MyLeftValue : Integer);
begin
inherited CreateNew(AOwner);

FMyButton := TMyButton.MyCreate(Self, MyLeftValue);
FMyButton.Parent := Self;
end;


و در نهایت ساخت و نمایش فرم :


var
F : TMyForm;
begin
F := TMyForm.MyCreate(nil, 20);
try
F.ShowModal;
finally
F.Free;
end;
end;


برای فرم هایی که فایل DFM شون وجود نداره و کاملا در RunTime ساخته میشن، نمی تونید از متد Create کلاس پایه استفاده کنید، اگر دقت کنید از متد CreateNew در ابتدای Constructor استفاده شده