PDA

View Full Version : چگونه متونیم از طریق dll آبجکت و یا شی از قبیل Button و Edit تولید کرد



mehdirayaneh
چهارشنبه 27 دی 1385, 13:10 عصر
اگر کسی در این مورد چیزی مدونه به من کمک کنه
سوال: چگونه می توان از طرق DLL تمام آبجکت ها Form و Button و Edit وغیره را فراخوانی کرد
سوال2:چگونه برنامه طراحی کنیم که تمام تغییرات روی برنامه یا Form ذخیره شود و دوبار لود شود

MNosouhi
چهارشنبه 27 دی 1385, 14:18 عصر
چگونه می توان از طرق DLL تمام آبجکت ها Form و Button و Edit وغیره را فراخوانی کرد
منظورتون رو نفهمیدم .

سوال2:چگونه برنامه طراحی کنیم که تمام تغییرات روی برنامه یا Form ذخیره شود و دوبار لود شود
راههای زیادی داره مثل استفاده ازفایل های Ini یا استفاده از رجیستری . در هر دو مورد مطالب زیادی در همین سایت وجود داره.

vesal
چهارشنبه 27 دی 1385, 17:57 عصر
اگر کسی در این مورد چیزی مدونه به من کمک کنه
سوال: چگونه می توان از طرق DLL تمام آبجکت ها Form و Button و Edit وغیره را فراخوانی کرد
سوال2:چگونه برنامه طراحی کنیم که تمام تغییرات روی برنامه یا Form ذخیره شود و دوبار لود شود

والا سوال اول رو که منم نفهمیدم. ولی برای سوال دوم یه بار یه کامپوننتی دیدم. اما اگه بدون کامپوننت بخوای انجام بدی قاعدش ایجوری میشه که اول تمام کامپوننت های روی فرم رو لیست کنی بعد خواصشون رو دربیاری بعد تو یه چیزی مثل فایلهای XML ذخیره بکنی

mehdirayaneh
چهارشنبه 27 دی 1385, 18:16 عصر
منظور ام این بود که یک فرم (Form)در برنامه داریم و می خوام که این فرم تمام Button ها Edit ها از طریق کد یا از طرق dll روی فرم قرار بگیرد می خوام که برنامه بصورت پویا ابزار روی فرم (Form) قرار بگیرد مثلا اگر کاربر برنامه خواست که 5 یا 1 Edit روی فرم داشته باشد قابل تغییر باشد

vesal
چهارشنبه 27 دی 1385, 18:23 عصر
منظور ام این بود که یک فرم (Form)در برنامه داریم و می خوام که این فرم تمام Button ها Edit ها از طریق کد یا از طرق dll روی فرم قرار بگیرد می خوام که برنامه بصورت پویا ابزار روی فرم (Form) قرار بگیرد مثلا اگر کاربر برنامه خواست که 5 یا 1 Edit روی فرم داشته باشد قابل تغییر باشد

خوب برای این کار به اون صورت احتیاج به DLL نداری. کافی یونیت هایی رو کنترل های مورد نظرت توی اونها هستن در برنامه اصلی Use کنی تا بتشه به کلاس هاشون دسترسی داشته باشی. مثلا
Tbutton کلاسش تو یونیت StdCtrls تعریف شده. حالا زمانی که شما تونیت StdCtrls تو پروژه اصلی Use کنی به راحتی میشه یه Object جدید از نوع Tbutton به صورت داینامیک بسازی.

در مورد ذخیره فرم هم باید به یه ساختاری مثل این برسی




object Form1: TForm1
Left = 192
Top = 107
Width = 870
Height = 640
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 208
Top = 88
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
end

mehdirayaneh
چهارشنبه 27 دی 1385, 19:08 عصر
اگر که یک مثال کامل بزنید متشکر میشم فقط اینکه اگر کاربر تعداد Edit وغیره انتخاب کرد این تنضیمات ذخیره شود و Events های آنها ایجاد شود و داخل Events کد مورد نظر تولید شود

vesal
چهارشنبه 27 دی 1385, 23:22 عصر
اگر که یک مثال کامل بزنید متشکر میشم فقط اینکه اگر کاربر تعداد Edit وغیره انتخاب کرد این تنضیمات ذخیره شود و Events های آنها ایجاد شود و داخل Events کد مورد نظر تولید شود

راستش این چیزی که میخوای پروژه ای که من چیزی حدود سه ماهه که دارم روش کار میکنم و البته شدیدا هم پیچیدست. یعنی چیزی که میخوای یه جورایی میشه یه نیمچه IDE البته من به نتیجه هم رسیدم ولی به خاطر تجاری بودن پروژه نمی تونم سورس رو در اختیارت بزارم. ولی در مورد ایجاد داینامیک اشیاء یه توضیحاتی میدم خدمتت.

برای ایجاد اشیاء در RunTime اول از همه باید یه از نوع کلاس شئی مورد نظر تعریف کنی
مثلا




var
RuntimeBtn:TButton;



حالا برای ایجاد کردنش متد Create را فراخوانی کنیم



RuntimeBtn:=TButton.Create(Self);



خوب RunTimeBtn ایجاد شد. حالا باید خواص رو Set کنیم

یه مثالی از Set کردن خواص



RuntimeBtn.BiDiMode:=bdRightToLeft;
RuntimeBtn.Caption:='Run-Time Button';
RuntimeBtn.Enabled:=True;
RuntimeBtn.Width:=100;
RuntimeBtn.Top:=30;
RuntimeBtn.Left:=30;


حالا یک خاصیت مهم هست اونم خاصیت Parent

خاصیت Parent پنجره ای که قراره این کنترل توش نمایش داده بشه مثلا اگه قرار باشه فرم باشه
اسم فرم را می نویسیم یا اگه یه Panel باشه اسم Panel رو می نویسیم. به هر صورت باید کلاسی باشه که از TwinControl مشتق شده باشه



RuntimeBtn.Parent:=Panel1;


یا



RuntimeBtn.Parent:=Form1;


تا اینجا کنترل مورد نظر ساخته شد و نمایش داده می شه. بعد از این طبیعتا ما میخواهیم که بر اساس یه رویداد خاص یه کدی اجرا بشه

برای این کار یه Procedure تعریف می کنی مثل شکل زیر که البته اول تو قسمت Public معرفیش می کنیم



public
Procedure BtnClick(Sender:TObject);


برای معرفی پروسیجر هم این کد رو می نویسیم




Procedure Tform1.BtnClick(Sender:TObject);
begin

end;


حالا بر می گردیم به جایی که خواص RuntimeBtn را Set کردیم.

این خط کد را اضافه می کنیم



RuntimeBtn.Tag:=5;
RuntimeBtn.OnClick:=BtnClick;


با خط اول ما خاصیت Tag را Set کردیم که برای تشخیص کنترل از سایر کنترل ها استفاده می شه. مثلا اگه 10 تا Button ایجاد کنیم. می تونیم از 1 تا 10 مقدار دهی کنیم و بعد از طریق یک شرط متوجه بشیم که کدوم کنترل یک رویداد را فراخوانی کرده.

و اما خط دوم پروسیجر BtnClick را که قبلا معرفی کردیم به رویداد OnClick کنترل RuntimeBtn نسبت دادیم. یعنی هر زمانی که رویداد Onclick کنترل RuntimeBtn فراخوانی شد پروسیجر BtnClick اجرا می شه.

حالا بر می گریم تا کدهای پروسیجر BtnClick را بنویسم

برای مثال من این کد را نوشتم



Procedure TForm1.BtnClick(Sender:TObject);
var
i:Integer;
begin
i:=TButton(Sender).Tag;
ShowMessage(IntToStr(i));
end;


حالا برنامه را اجرا کن و نتیجه را ببین. اینم Source مثال

mehdirayaneh
پنج شنبه 28 دی 1385, 01:33 صبح
متشکر حالا ایجاد کردی ایم اما اگر کاربر تغییرات بدهد و دکمه جدید ایجاد کرد این فرم دوبار به حالت قبل بر می گرد چگونه حالت تغییرات آن حفظ شود از چه روشی برای ذخیره و لود کردن کد تولید اشیا تا بی نهایت داشته باشیم اگر متوجه نشدید با یک تصویر سوال را دوباره مطرح کنم

vesal
پنج شنبه 28 دی 1385, 01:49 صبح
حالا اونم یه کاریش میکنم برات :چشمک:

vesal
پنج شنبه 28 دی 1385, 02:19 صبح
اینم Save و Load فرم

vcldeveloper
پنج شنبه 28 دی 1385, 07:44 صبح
چگونه برنامه طراحی کنیم که تمام تغییرات روی برنامه یا Form ذخیره شود و دوبار لود شود
دلفی از روشی مثل این برای ذخیره فرم و محتویاتش استفاده می کنه:


var
FStream,SStream : TStream;
FileName : string;
begin
FileName := ExtractFilePath(Application.ExeName) + '\FormCfg1.txt';

FStream := TMemoryStream.Create;
SStream := TFileStream.Create(FileName,fmCreate);
try
FStream.WriteComponent(Form1);
FStream.Position := 0;
ObjectBinaryToText(FStream, SStream);
finally
SStream.Free;
FStream.Free;
end;
end;


برای لود کردن هم عکس مراحل فوق اتفاق میافته:


var
FStream,SStream : TStream;
FileName : string;
begin
FileName := ExtractFilePath(Application.ExeName) + '\FormCfg1.txt';
if not FileExists(FileName) then
Exit;

FStream := TFileStream.Create(FileName,fmOpenRead);
SStream := TMemoryStream.Create;
try
ObjectTextToBinary(FStream, SStream);
SStream.Position := 0;
SStream.ReadComponent(Form1);
finally
SStream.Free;
FStream.Free;
end;
end;

hoomaniraji
پنج شنبه 28 دی 1385, 09:23 صبح
1-برای تولید DLL میتوانید از ویزارد موجود در دلفی استفاده کنید. سپس داخل متد های Export شده کلیه کتابخانه های دلفی قابل استفاده هستند.دقیقا همانگونه که در دلفی کد مینویسید آنجا نیز بنویسید.
2-از متد های ReadState ,WriteStateبرای ذخیره و بازیابی هر نمونه از کلاسهای مشتق شده از TComponent میتوانید استفاده کنید.این کار همانکاری است که محیط دلفی در زمان DesignTimeبرای ذخیره سازی وضعیت اشیا مورد استفاده در فرم انجام میدهد و آن را در یک فایل از نوع Dfm ذخیره میسازد.

mehdirayaneh
پنج شنبه 28 دی 1385, 15:13 عصر
آقای از پروژه ات متشکر فقط هر کاری کردام بتوانم از طرق فرم FormShow لود شود نتونستم و سه تا چند فرم ایجاد شده داخل برنامه را لود کنم نشود اگر می شه روی Edit و Button مثال بزنی متشکر می شم

mehdirayaneh
پنج شنبه 28 دی 1385, 15:14 عصر
آقای vesal (http://www.barnamenevis.org/forum/member.php?u=9232) از پروژه ات متشکر فقط هر کاری کردام بتوانم از طرق فرم FormShow لود شود نتونستم و سه تا چند فرم ایجاد شده داخل برنامه را لود کنم نشود اگر می شه روی Edit و Button مثال بزنی متشکر می شم

mehdirayaneh
پنج شنبه 28 دی 1385, 15:19 عصر
آقای hoomaniraji (http://www.barnamenevis.org/forum/member.php?u=33493) شما متونی دربارهReadState ,WriteState وتولید یا ایجاد TComponent از طریق DLLتوضیح بدهی

vesal
پنج شنبه 28 دی 1385, 17:25 عصر
آقای vesal (http://www.barnamenevis.org/forum/member.php?u=9232) از پروژه ات متشکر فقط هر کاری کردام بتوانم از طرق فرم FormShow لود شود نتونستم و سه تا چند فرم ایجاد شده داخل برنامه را لود کنم نشود اگر می شه روی Edit و Button مثال بزنی متشکر می شم

متوجه نشدم!!! چی شد؟

Hamid_PaK
جمعه 29 دی 1385, 07:10 صبح
بطور کل برای ایجاد اشیاء از کتابخانه نیز همانند یک پروژه می توانید استفاده کنید ...
تنها کافیست روابط بین کتابخانه و برنامه اصلی برقرار شود.

یا حق ...

mehdirayaneh
جمعه 29 دی 1385, 12:17 عصر
آقا اکر کسی میتواند با DLLو یاResourceو غیره که اشیا مثل Button و غیره از خارج برنامه را لود کرد و یا با تغییرات ذخیره کرد