PDA

View Full Version : استفاده از bpl ها در برنامه



AliReza Vafakhah
چهارشنبه 20 خرداد 1388, 15:15 عصر
سلام

چند وقتی که نرم افزار Tune Up رو تحلیل می کنم (چه طور نوشته شده و از چه ابزارهایی استفاده کردن)

در این نرم افزار از کامپوننت های زیادی استفاده کردن به خصوص DevExpress و سوال من این است که در این نرم افزار از فایل های bpl جهت این که حجم فایل های exe زیاد نشود و در تمام فایل ها اشتراک گذاشته شوند استفاده شده و این طور به نظر میرسه که از یونیت های کامپوننت ها استفاده نشده و به نظر من کار خیلی خوبیه (البته در پروژهای بزرگ)

حالا من دنبال این رفتم که این کار رو انجام بدم و از منوی Project | Options |Packages
حالا در قسمت Runtime packages فایل های bpl هایی که کامپوننت های مربوطه نیاز دارند رو معرفی می کنم و در آخر یونیت های اضافه شده رو حذف می کنم (چون می خوام که از bpl های استفاده کنم ) اما برنامه در هنگام کامپایل یونیت را خود اضافه می کنه

حالا چگونه می توان این کار رو انجام بدم واز اضافه کردن یونیت ها هم جلوگیری کنم ؟

tdkhakpur
چهارشنبه 20 خرداد 1388, 15:24 عصر
سلام
شما برای این کار باید bpl مخصوص به خودتون رو طراحی کنید ار هم قرار باشه که اbp های آماده استفاده کنید باید آنها رو به همراه برنامه حمل کنید تا برنامه کار کند.

AliReza Vafakhah
چهارشنبه 20 خرداد 1388, 16:05 عصر
دوست عزیز ممنون ولی چه طوری از اونا استفاده کنم

هر چند که یه جا آقای کشاورز گفته بودند استفاده از فایل ها bpl شبیه به dll ها هست

Saeed_m_Farid
چهارشنبه 20 خرداد 1388, 17:56 عصر
دوست عزیز ممنون ولی چه طوری از اونا استفاده کنم

هر چند که یه جا آقای کشاورز گفته بودند استفاده از فایل ها bpl شبیه به dll ها هست
خوب آقای کشاورز تو همون تاپیکی که میگید، نحوه استفاده اش رو هم توضیح دادن فکر میکنم :
برای اضافه کردن Runtime پکیج های bpl از LoadPackage باید استفاده کنید، برای استفاده از کلاسهای اون هم از GetClass استفاده می کنید، فرض کنیم شما یه bpl درست کردین که یه فرم Form2 داره؛ و تو Form1 خودتون میخواهید ازش استفاده کنید. اونوقت میشه کدی شبیه کد زیر :

procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
AClass: TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
AClass := GetClass('TForm2');

if AClass <> nil then
with TComponentClass(AClass).Create(Application)
as TCustomForm do
begin
ShowModal;
Free;
end;

UnloadPackage(PackageModule);
end;
end;اگه تو نحوه درست کردن bpl مشکل دارید که اون توضیحش جداست؛ بفرمایید تا اگه خواستین یه توضیح مختصر در مورد اون هم بدم ...

موفق باشید.

vcldeveloper
چهارشنبه 20 خرداد 1388, 18:55 عصر
حالا در قسمت Runtime packages فایل های bpl هایی که کامپوننت های مربوطه نیاز دارند رو معرفی می کنم و در آخر یونیت های اضافه شده رو حذف می کنم (چون می خوام که از bpl های استفاده کنم )
کی گفته که اگر از BPL استفاده کنید، باید نام یونیت را از لیست uses حذف کنید؟!!!

AliReza Vafakhah
پنج شنبه 21 خرداد 1388, 15:04 عصر
کی گفته که اگر از BPL استفاده کنید، باید نام یونیت را از لیست uses حذف کنید؟!!!

درسته

اما من تو این موندم که Tune Up از چه روشی استفاده کرده که حجم فایل های exe نسبت به کامپوننت های استفاده شده خیلی خیلی کمه ، همچنین من این رو از کامپوونت های DevExpress تجربه دارم که حجم فایل exe رو بالا می برن (البته در صورت استفاده از skin که در Tune Up استفاده شد)


حالا خودتون قضاوت کنید

seyed_farid
جمعه 22 خرداد 1388, 11:59 صبح
اين يه مثال براي اين كار است.

vcldeveloper
جمعه 22 خرداد 1388, 20:15 عصر
اما من تو این موندم که Tune Up از چه روشی استفاده کرده که حجم فایل های exe نسبت به کامپوننت های استفاده شده خیلی خیلی کمه ، همچنین من این رو از کامپوونت های DevExpress تجربه دارم که حجم فایل exe رو بالا می برن (البته در صورت استفاده از skin که در Tune Up استفاده شد)
خب این چه ربطی به حذف کردن نام یونیت ها از uses داره؟! شما وقتی برنامه را با runtime packages کامپایل می کنید، حجم فایل EXE کاهش پیدا میکنه.

AliReza Vafakhah
شنبه 23 خرداد 1388, 00:36 صبح
خب این چه ربطی به حذف کردن نام یونیت ها از uses داره؟! شما وقتی برنامه را با runtime packages کامپایل می کنید، حجم فایل EXE کاهش پیدا میکنه.

خیلی عذر می خوام اشتباه من از این بود که فکر می کردم وقتی یونیت uses هست از فایل های pas یا dcu استفاده می کنه و نهایتا با خودم می گفتم که این چه کاری باز هم حجم فایل زیاد میشه

طی همین پاسخ ها یاد این کامپوننت FFVCL - Delphi FFmpeg VCL Component افتادم که از
Runtime packages استفاده می کرد

صابر طهماسبی
پنج شنبه 16 اردیبهشت 1389, 19:12 عصر
خوب آقای کشاورز تو همون تاپیکی که میگید، نحوه استفاده اش رو هم توضیح دادن فکر میکنم :
برای اضافه کردن Runtime پکیج های bpl از LoadPackage باید استفاده کنید، برای استفاده از کلاسهای اون هم از GetClass استفاده می کنید، فرض کنیم شما یه bpl درست کردین که یه فرم Form2 داره؛ و تو Form1 خودتون میخواهید ازش استفاده کنید. اونوقت میشه کدی شبیه کد زیر :

procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
AClass: TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
AClass := GetClass('TForm2');

if AClass <> nil then
with TComponentClass(AClass).Create(Application)
as TCustomForm do
begin
ShowModal;
Free;
end;

UnloadPackage(PackageModule);
end;
end;اگه تو نحوه درست کردن bpl مشکل دارید که اون توضیحش جداست؛ بفرمایید تا اگه خواستین یه توضیح مختصر در مورد اون هم بدم ...

موفق باشید.

ببخشید من به مشکل برخوردم
کد شما رو تست کردم جواب نداد یعنی تابع GetClass کار نمی کنه کد من به شکل زیر است قانونا باید پیغام ok را نمایش بده اما نمی ده(پکیج لود میشه فقط کلاس nil است):

procedure TForm1.Button1Click(Sender: TObject);
var
PackageModule: HModule;
AClass: TPersistentClass;
begin
PackageModule := LoadPackage('Package1.bpl');
if PackageModule <> 0 then
begin
ShowMessage('load ok');
AClass := GetClass('TForm2');

if AClass <> nil then
ShowMessage('ok');
end;
UnloadPackage(PackageModule);

end;
کلاس TForm2 هم داخل فرمی در پکیج وجود داره
البته می دونم ایراد از کار منه اما نمی دونم کجاست!

zbastani
دوشنبه 10 آبان 1389, 08:48 صبح
با سلام
من هم همان تیکه برنامه را نوشتم ولی مثل آقای طهماسبی ok نمایش داده نمی شود .اشکال از کجاست

mzjahromi
یک شنبه 28 آذر 1389, 07:53 صبح
توی فرم داخل bpl قبل از End. این خطها رو اضافه کنید


initialization
RegisterClass(TForm2);
finalization
UnRegisterClass(TForm2);


و توجه داشته باشید که در منوی project->Options-> packages عبارت Build with Runtime Packages تیک خورده باشه

AA1381
شنبه 19 آذر 1390, 08:27 صبح
با سلام
1 - من تازه عضو سایت شده ام . برای ایجاد تاپیک جدید مشکل دارم و نمیتوانم از گزینه تاپیک جدید استفاده کنم . علت چیست ؟
2 - من دو فرم ( Form1 , Form2) دارم که داخل یک پکیج قرار دارد . از فایل Exe آنها را صدا میکنم و مشکلی ندارم. اگر بخواهم از داخل Form1 به Form2 دسترسی پیدا کنم چه باید کرد . هنگام فراخوانی Form2.showmodal با پیام Access violation مواجه میشم . در ضمن Form2 در Unit1 در قسمت Uses اضافه شده است .

با تشکر

gbg
شنبه 19 آذر 1390, 11:31 صبح
سلام
باید خود یونیت رو اضافه کنی

AA1381
شنبه 19 آذر 1390, 12:54 عصر
سلام
با تشکر از شما دوست عزیز
من همونطور که گفتم Unit2 را داخل Unit1 اضافه کردم (قسمت Uses) .
اگه منظورتون اضافه کردن به Package اون هم اضافه کردم
ممنون میشم اگر راهنمایی کنید .

MohsenB
شنبه 19 آذر 1390, 13:49 عصر
با سلام به دوستان


من یه راه دیگه بهتون پیشنهاد میکنم که امیدوارم بدردتون بخوره :

شرکت تولید کننده کامپوننت های TMS ، محصولی داره به نام TMS Plugin Framework که از همین روش استفاده میکنه . فکر کنم نمیخواد چرخ رو اختراع کنید دیگه .

حتی نسخه همراه با کد منبع این مجموعه هم قابل دسترس هست .


موفق باشید

AA1381
یک شنبه 20 آذر 1390, 10:21 صبح
سلام
من کامپوننت TMS Plugin Framework رو از سایتش دانلود کردم و طبق دستور نصبی که گفته بود انجام دادم . موقع نصب 2 تا از پکیج ها ایراد میگیره .

Package ...\upfCore7.bpl can't be installed because it is not a design time package.
Package ...\upf6070.bpl can't be installed because it is not a design time package.



در ضمن اگر ممکنه به این سوال هم پاسخ دهید .
من دو فرم ( Form1 , Form2) دارم که داخل یک پکیج قرار دارد . از فایل Exe آنها را صدا میکنم و مشکلی ندارم. اگر بخواهم از داخل Form1 به Form2 دسترسی پیدا کنم چه باید کرد . هنگام فراخوانی Form2.showmodal با پیام Access violation مواجه میشم . در ضمن Form2 در Unit1 در قسمت Uses اضافه شده است .

با تشکر

gbg
دوشنبه 21 آذر 1390, 08:41 صبح
خب اگه فرم رو نساختی یا خود دلفی به صورت اتوماتیک نساخته باید اون فرم رو create کنی
بهتر بود کدت رو میزاشتی