PDA

View Full Version : چگونه برنامه اي پلاگين دار بسازيم ؟



FiACKER
جمعه 28 فروردین 1388, 02:01 صبح
سلام

در اين پروژه ي خراب شده ي من نياز هست مثله برنامه هايه Pied, Pe Explorer, Photoshop , ... پلاگين بپذيره ! سوال ساده اي هست !

خودم يه همچين چيزي رو با كمك پروژه ي dllForm ه اقاي كشاورز ساختم . ولي موقع خروج از برنامه ام پييغام خطا مي داد ! فكر مي كنم به خاطره اين هست كه dll ها از حافظه خارج نشده اند. و اون چيزي كه من مي خواستم نشد كه نشد...

من چي خواستم :
مي خواستم dll هاي يك مسير رو دريافت و در ليستي قرار بده... اينو درست انجام دادم.
مي خواستم يه تابع از هر dll كه در ليست هست رو اجرا كنم و مشخصات و اسم پلاگين رو در ليسته ديگه اي قرار بدم...اين رو هم درست انجام دادم...اگر خدا قبول كنه...
مي خواستم اگه كاربر فلان پلاگين رو انتخاب و اجرا كرد فرم پلاگين ظاهر بشه. اخه كلا پلاگين هايي كه تويه برنامه ي من استفاده مي شه داراي فرم هستند! اين كار رو هم درست انجام داده بودم و شكره خدا اين كار هم از لطفه اقاي كشاورز و اون پروژه شون درست انجام مي شد. يعني فرمي كه در پلاگينم بود ظاهر مي شد و پارامتر هايي رو كه مي خواستم رو به راحتي به پلاگين مي فرستادم... مشكله خاصي نبود.
مي خواستم بعد از اينكه تمامي فرم هاي پلاگين هايي رو كه اجرا كردم رو ببندم و برنامه ي اصليم رو هم ببندم كه پيغام خطا مي داد ! نمي دونم چي بودن ... شايد فحش بودن.

همونطور كه در عكس زير مي بينيد در اين پروژه فرم ها خارج از محدوده ي فرم اصلي برنامه ي من هست و نمي خوام اون رو در فرم خودم محدود كنم. پس اينجا ديگه گزينه ي free كه در پروژه ي اقاي كشاورز بودن رو ديگه نداريم. و فقط از دكمه close فرم درون پلاگين استفاده مي شه.
http://barnamenevis.org/forum/attachment.php?attachmentid=30024&stc=1&d=1239918608

فكر مي كنم اين مشكل به اين صورت رفع مي شه كه :
تا زماني كه كاربر پنجره ي درون پلاگين رو نبسته (يعني اون پنجره كه اسمش dlform هست) برنامه ي اصلي enable نشه و همچنان در حالت waiting باقي بمونه ! و بعد اون تابع free كه در پروژه اقاي كشاورز بود رويه پلاگين اجرا بشه و از حافظه خارجش كنه... اين كار چطور ممكنه ؟

البته شايدم راه حله ديگه اي داره !

ايا مشكل از باقي موندن dll در حافظه هست ؟

vcldeveloper
جمعه 28 فروردین 1388, 18:27 عصر
ايا مشكل از باقي موندن dll در حافظه هست ؟
ما که پیام خطا را ندیدیم! من حتی نمیدونم شما دقیقا به کدومیک از کدهای من در این سایت اشاره کردید.

بطور کلی، فرمی که در برنامه ایجاد می کنید، باید پس از اتمام کارش، Free بشه. اگر فرم بصورت Modal فراخوانی بشه، مشکلی نیست، چون تا زمانی که آن فرم باز هست، فقط به آن فرم دسترسی دارید، و سایر بخش های برنامه غیرفعال هستند، پس میشه هر وقت مقدار Modal از فرم برگشت داده شد، فرم را Free کرد. همان کاری که با قالب زیر انجام میدیم:


with TMyForm.Create(nil) do
try
ShowModal;
finally
Free;
end;

اما اگر فرم Modal نباشه، میشه راه های مختلفی برای مدیریت حافظه اختصاص داده شده به آن داشت. راحترینش این هست که در کد مربوط به رویداد OnClose آن، به پارامتر Action مقدار caFree داده بشه، تا فرم بعد از بسته شدن بطور خودکار Free بشه.

FiACKER
شنبه 29 فروردین 1388, 20:06 عصر
سلام

سورسي كه در موردش صحبت كردم رو پيوست كردم...

اقاي كشاورز ايا سورسي داريد كه برنامه هاي پلاگين دار رو نشون بده !؟

FiACKER
شنبه 29 فروردین 1388, 21:08 عصر
اقاي كشاورز خواستم از نمونه كدي كه شما گذاشتيد استفاده كنم كه پيغام Cannot make a visible window modal رو مي داد. از اين كد كه استفاده مي كنم پيغام مي ده :

with TDllForm.Create(nil) do
try
ShowModal;
finally
Free;
end;

vcldeveloper
شنبه 29 فروردین 1388, 23:50 عصر
اقاي كشاورز خواستم از نمونه كدي كه شما گذاشتيد استفاده كنم كه پيغام Cannot make a visible window modal رو مي داد. از اين كد كه استفاده مي كنم پيغام مي ده
اون نمونه کد که به خودی خودش منجر به نمایش پیامی که گفتید نمیشه، شما احتمالا کدهای دیگه ایی هم بهش اضافه کردید. پیغام داره خودش میگه که مشکل از چی هست؛ شما فرم را نمایش دادید، بعد میخواید آن را مجددا با ShowModal نمایش بدید. برنامه هم پیغام میده که پنجره ایی که باز هست رو نمیشه بصورت Modal باز کرد. شما می بایست قبل از فراخوانی ShowModal فرم را باز نکنید.

FiACKER
یک شنبه 30 فروردین 1388, 01:35 صبح
با تشكر از جوابتون.

خب بزاريد يه توضيحي بدم:
فايله dll ه من داراي يه فرم هست و در يونيت فرم هم يه تابع هست به نام DoJob كه از داخل اين تابع هست كه با كده زير فرم رو نمايش مي ده :


function DoJob(AppHandle: THandle ; strFileForSend : string): LongInt;stdcall;
var
DllForm: TDllForm;
begin
Result := 0;
try
Application.Handle := AppHandle;
DllForm := TDllForm.Create(Application.MainForm);
if Assigned(DllForm) then
with DllForm do
begin
Show;
Result := LongInt(DllForm);
end;
except
on E: Exception do
MessageDlg(E.Message,mtError,[mbOK],0);
end;
end;



حالا بايد چيكار كرد ؟ اقاي كشاورز لطف كنيد كد رو يه نيگاه بندازين ... اين گره فقط به دسته شما باز مي شه.

ايا مي شه بر اساس هندل يك پنجره ، حالت مودال رو بوجود اورد ؟
مثلا هندل پنجره ي برنامه ي اصلي رو به پلاگين بفرستيم و در موقع نمايش فرمه درون پلاگين ، براساس اون هندله برنامه ي اصليمون يه حالت مثله مودال رو (پنجره ي اصلي قفل و فرم پلاگين در رو) بوجود بياريم ؟

FiACKER
یک شنبه 30 فروردین 1388, 22:25 عصر
اين كدي كه شما گذاشتي خودش فرم رو مي سازه :

with TDllForm.Create(nil) do
try
ShowModal;
finally
Free;
end;

بعد وقتي showmodal اجرا مي شه پيغام از قبل visable بودن مي ده !
براي حل اين مشكل مجبور شدم يه خط كد به اين برنامه اضاف كنم . متده هايد رو خط بالاي ShowModal اضاف كردم! الان كار ميده و مشكلي هم نداره فقط يه دفه فرم ظاهر مي شه - هايد مي شه - دوباره به صورت مودال ظاهر مي شه !

ولي اي كاش مي شد به صورت استاندارد اين كار رو كرد !

كسي راه حلي داره ؟

vcldeveloper
دوشنبه 31 فروردین 1388, 00:04 صبح
فايله dll ه من داراي يه فرم هست و در يونيت فرم هم يه تابع هست به نام DoJob كه از داخل اين تابع هست كه با كده زير فرم رو نمايش مي ده
شما یا فرم را Show می کنید، یا ShowModal، نه اینکه فرم را هم Show کنید، هم ShowModal!
الان کد شما داره یک بار Show رو فراخوانی میکنه، بعد رفتید اون تکه کد را هم بهش اضافه کردید، که فرم را ShowModal میکنه! مسلم هست که کار به مشکل برمیخوره.
شما اول باید تکلیف فرمتان را مشخص کنید که قرار هست چه کاری انجام بده، بعد تصمیم بگیرید که آن را Show کنید، یا ShowModal. کدی که برای ShowModal گذاشته شده، فرم را نمایش میده، و بعد از بستن فرم، آن را آزاد میکنه. کدی که شما نوشتید، فرم را Show میکنه، بعد شی ساخته شده از فرم را به عنوان خروجی برمیگردونه، و آزاد کرد فرم را برعهده برنامه فراخوان تابع میذاره. حالا شما اومدید این دو تا را با هم ترکیب کردید، نتیجه اش شده خطا!

شما نیازی به فراخوانی Show ندارید.

khoshblagh
دوشنبه 31 فروردین 1388, 07:21 صبح
با سلام خدمت دوستان
احتراما کسی میتواند توضیحی در باره پلاگين بدهد. با تشکر

FiACKER
دوشنبه 31 فروردین 1388, 18:24 عصر
شما اول باید تکلیف فرمتان را مشخص کنید که قرار هست چه کاری انجام بده، بعد تصمیم بگیرید که آن را Show کنید، یا ShowModal. کدی که برای ShowModal گذاشته شده، فرم را نمایش میده، و بعد از بستن فرم، آن را آزاد میکنه. کدی که شما نوشتید، فرم را Show میکنه، بعد شی ساخته شده از فرم را به عنوان خروجی برمیگردونه، و آزاد کرد فرم را برعهده برنامه فراخوان تابع میذاره. حالا شما اومدید این دو تا را با هم ترکیب کردید، نتیجه اش شده خطا!

شما نیازی به فراخوانی Show ندارید.

من چه متد show رو به كار ببرم چه نبرم فرم مورد نظر خودش ساخته مي شه !! چه از كدي كه شما گذاشتي استفاده كنم چه از كده خودم ، فرم ساخته مي شه !
بعد كه مي يام و يه باره ديگه متد SHOWMODAL رو به كار مي برم پيغامه خطايه ديگه اي مي ده !
من اين كارو امتحان كرده بودم كه فرم رو CREATE كنم ، بعد longint اش رو برگردونم و از برنامه ي اصليم ظاهرش كنم ! ولي بازم جواب نداد ! فرم خودش بعد از create شدن ظاهر مي شد.

چيكار مي شه كرد كه بعد از CREATE شدن فرم خودش ظاهر نشه ؟

vcldeveloper
دوشنبه 31 فروردین 1388, 20:08 عصر
چيكار مي شه كرد كه بعد از CREATE شدن فرم خودش ظاهر نشه ؟
فرم خودش بعد از Create شدن ظاهر نمیشه، مگر اینکه شما کدی نوشته باشید که این کار را بکنه.
امتحانش هم ساده هست؛ یک پروژه جدید درست کنید، به آن یک فرم جدید اضافه کنیم، و آن فرم را Create کنید، ببینید اصلا نمایش داده میشه یا نه.

FiACKER
سه شنبه 01 اردیبهشت 1388, 21:14 عصر
به پير به پيغمبر من كده ديگه اي بهش اضاف نكردم !
:متعجب:
كدي كه شما داديد رو تست كردم ديگه. ولي حتي اگه showmodal رو هم برميدارم فايده اي نداره.

به زودي نمونه ي برنامه رو بهتون ميدم...بايد اماده اش كنم... خودتون ببينيد كه واقع من كدي بكار نبردم.

Ahmad Chehreghani
سه شنبه 01 اردیبهشت 1388, 21:31 عصر
به پير به پيغمبر من كده ديگه اي بهش اضاف نكردم !

كدي كه شما داديد رو تست كردم ديگه. ولي حتي اگه showmodal رو هم برميدارم فايده اي نداره.

به زودي نمونه ي برنامه رو بهتون ميدم...بايد اماده اش كنم... خودتون ببينيد كه واقع من كدي بكار نبردم.


منم قديما به همين مشکل برخوردم اما چون حدود 2 يا 3 سال پيش بود چيز زيادي ازش يادم نيست چطور نميزاشتم فرمم بعد ساخت نمايش داده نشه.

يه نمونه برنامه بزاريد