PDA

View Full Version : چه تور برنامه ای بنویسیم که در یک زمان ، فقت یک نمونه از اون اجرا بشه.


Dokht Esmati
3 October 2005, 03:07 AM
این تاپیک رو در جوابِ آقای Programmer باز کردم . (سوالشون رو اینجا پرسیده بودن ([Only registered and activated users can see links])، اما سلاح دیدم چواب رو توی یه تاپیکِ جدا مترح کنم.)

سوال این بود :
«ميخوام يه برنامه وقتي در حال اجراست اگه دوباره فراخواني شد (روي فايل اجرايي کليک شد) دوباره اجرا نشه»

و من از این روش استفاده کردم :
«بسته به شرایط ، یا در یک فایل و یا در رجیستری اتلاآتِ مربوت به اجرای برنامه رو زخیره می کنم. و از این روش برای کنترلِ اجرای برنامه استفاده می کنم.»

به مسالِِ پیوست شده توجه کنید .
برای اینکه برنامه به صورتِ InterActive باشه ، من از یک Memo استفاده کردم. اما شما باید مستقیمن توی فایل بنویسید.

این برنامه به این سورت کار میکنه :
>> شما ممکنه که برنامتون چند هالتِ اجرایی داشته باشه : مسلن هالتِ Normal یا SafeModeو یا هر هالتِ دیگه. به هر هال برنامه ی شما در هر هالتی که اجرا بشه شما اون هالت رو توی فایلِ f.dat زخیره می کنید.؛ من این دو هالت رو در نزر گرفتم : 1)OK :یعنی اینکه برنامه بسته است و آماده برای اجرا شدن. و OPENED : یعنی اینکه برنامه در هالِ اجراست.
>> در ابتدای اجرای برنامه ، فایلِ f.dat رو می خونیم.اگه اِبارت OPENED در فایلِ f.dat زخیره شده باشه ، یه پیغام میدیم که برنامه در هالِ اجراست و از برنامه خارج میشیم. و اگه عبارتِ OK توی اون باشه ، برنامه اجرا میشه و عبارتِ درونِ فایل به OPENED تغییر میکنه.
>> هنگامِ خروج از برنامه هم عبارتِ درون برنامه رو به OK تغییر میدیم.

این روشیه که من استفاده میکنم. و نوشتن توی Registry رو ترجیح میدم.
برای باز کردنِ فایلِ پیوست شده ، باید پسوندِ اون رو به zip تغییر بدید.(اگه نتونستید استفاده کنید ، بگید تا یه جای دیگه آپلود کنم.)

GhAeM
3 October 2005, 11:57 AM
ا تشكر از آقاي دخت عصمتي
من هم اين روش رو پيشنهاد ميكنم
ابتدا در منو پروجكت view source رو انتخاب مي كنم در پنجره باز شده windows رو به uses اضافه ميكنم بعد از
{$R *.res}
اين دستورات رو مينويسم :

var Hmutex:THandle;
begin
HMutex:=createmutex(nil,false,'onecopymutex');
if waitforsingleobject(HMutex,0)<>wait_Timeout then
begin

البته چرخه if بايد متناسب با برنامه كامل بشه كه خود كامپايلر اين اخطار رو بشما ميده !
حالا اگه بخوايد برنامه كه در حال اجراست دوباره اجرا كنيد همون برنامه در حال اجرا رو اكتيو ميكنه

Foroud
4 October 2005, 10:10 AM
سلام

روش راحت تر اين است كه يك Key در داخل Registry ايجاد كنيد و هروقت برنامه اجرا شد مقدار آنرا تغيير دهيد و هر وقت برنامه پايان يافت آن مقدار را به مقدار پيش فرض برگردانيد

فايل كاملش را از اينجا مي توانيد دريافت كنيد

[Only registered and activated users can see links]

GhAeM
4 October 2005, 12:23 PM
ولي من فكر مبكنم كه راحتترين راه همين باشه كه من گفتم !
چون متكي به خود برنامه هست و كملا ميشه بهش اعتماد كرد!
مثلا ممكنه تو مورد اول طرف بره اون فيل رو در حال اجرا پاك كنه !
و در مورد دوم هم ميتونه key رو از ريجيستري پاك كنه!
البته اگه خيلي مهم باشه كه برنامه يكبار باز بشه ! مث بانكهاي اطلاعاتي كه فقط يك كاربر ميتونه بهش دسترسي داشه باشه!

Dokht Esmati
4 October 2005, 04:41 PM
آقای Foroud این همون روشیِ که من گفتم.

و آقای غفوری : شکی نیست که راهِ شما راحتترین و بهترین راهه. اما این راه یه عیب داره :
ممکنه برنامه هالت های مختلفی برای اجرا داشته باشه ؛ مسلن SafeMode و مدهای دیگه. برای متلع شدن از این که برنامه در هالِ Safe داره اجرا میشه ، یا باید در هالتِ SafeMode اجرا بشه ، استفاده از فایل یا رجیستری ، بهترین راهه. (همون کاری که میکروسافت برای Office کرده)

GhAeM
4 October 2005, 06:35 PM
البته اونم هست !
ولي فكر ميكنم ميشه اين رو تعميم داد!
يعني ميدونيد اون چيزي كه شما ميگيد مربوط به چند بار اجرا شدن برنامه نميشه بلكه مربوط به نوع اجراي اون يشه اگر درست متوجه شده باشم!
كه در جاي خودش بحثي تخصص و حرفه اي هستش
در هر صور ممنو از راهنماييتون

Dokht Esmati
5 October 2005, 02:28 AM
به زهنم رسیده که این دو نوع راهِ هل رو با هم استفاده کنم.
که هم چند بار اجرا شدن کامل پوشش داده بشه و هم نوعِ اجرا.
دارم روش کار می کنم.

GhAeM
5 October 2005, 01:49 PM
لطفا بنده رو هم در جريان بذاريد ممنون ميشم

Foroud
5 October 2005, 02:31 PM
سلام
اگر کامل شد من را هم مطلع کنید ممنون

Joe Satriani
5 October 2005, 04:48 PM
از Handle استفاده کنید

GhAeM
5 October 2005, 04:59 PM
از Handle استفاده کنید
جناب مدير از شما بعيده!
اگه يه سرچ تو همين تاپيك ميكرديد ميديد كه راه حلهاي زيادي ارائه شده كه يكيش همدن HANDLE هست !
پسا اولي كه بنده زدم.
به هر حال از راهنمايي شما تشكر ميكنم

eblis1981
5 October 2005, 05:25 PM
به غیر از روشهای فوق کامپوننت های زیادی وجود دارند که این عمل رو انجام میدهنداز جمله:
Raize , ABF, LMD و خیلی کامپوننتهای دیگه فقط کافیه مولفه رو بندازین رو فرم اصلی

GhAeM
5 October 2005, 05:35 PM
به غیر از روشهای فوق کامپوننت های زیادی وجود دارند که این عمل رو انجام میدهنداز جمله:
Raize , ABF, LMD و خیلی کامپوننتهای دیگه فقط کافیه مولفه رو بندازین رو فرم اصلی

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

و در آخر كامپوننت BILENIUM EFFECT رو هيچوقت فرموش نكنيد.

eblis1981
5 October 2005, 08:34 PM
اون که صد درصد من خودم هم از همون روش شما استفاده میکنم ولی بهر حال گاهی اوقات بد نیست یه گریزی به کامپوننتها هم زد.
در ضمن همه اونهایی که اسم بردم کرک شدش هم هست...