PDA

View Full Version : caption به شکل چشمک زن



ali_abbasi22145
پنج شنبه 07 مهر 1384, 12:13 عصر
سلام

من می خواهم caption زیر به شکل چشمک زن نمایش داده شود یا نشد به شکل Mesage چشمک زن نمایش داده شود در کتابهای دلفی گشتم ولی راهی پیدا نکردم.

'Label1.Caption:='Please crop image with mouse double click after that press Ok

Touska
پنج شنبه 07 مهر 1384, 13:25 عصر
می تونی از کامپوننتهای رایگان JVC استفاده نمایید.

موفق باشید. :)

http://homepages.borland.com/jedi/jvcl

Keramatifar
جمعه 08 مهر 1384, 00:50 صبح
دوست عزیز فکر نمیکنم اینکار نیازی به استفاده از کامپوننتهای آماده و اضافی داشته باشه. با استفاده از دو تا Timer که در خود دلفی وجود داره و کمی کد نویسی میتونی به ساده ترین حالت ممکن اینکار رو انجام بدی.

از تب System در کامپوننت پلت دلفی 2 کامپوننت Timer در فرم خود قرار دهید، در ابتدا خاصیت Enabled هر دو تایمر را برابر False قرار داده و این کدها را در رویداد OnTimer کامپوننت ها بنویسید:

کد تایمر 1


timer1.Enabled:=false;
Label1.Visible:=false;
timer2.Enabled:=true;



کد تایمر 2



timer2.Enabled:=false;
Label1.Visible:=true;
timer1.Enabled:=true;


هر زمانی که مایل بودید چشمک زدن Label شروع شود خاصیت Enabled هر دو تایمر را برابر True قرار دهید، برای تایین سرعت چشمک زدن هم می توانید خاصیت Interval تایمر را که بر اساس میلی ثانیه است تغییر دهید.
در ضمن اینکار را به همین صورت می توانید با کلیه اجزای ویژوال انجام دهید ...

Mahdi_S_T
جمعه 08 مهر 1384, 07:36 صبح
دوست عزیز شما به روش زیر می تونید این کارو انجام بدهید به راحتی :
یه Timer رو فرم قرار دهید و کد زیر را داخل آن بنویسید :
[code]
Label1.visible:=not label1.visible;
[code/]

Developer Programmer
جمعه 08 مهر 1384, 20:07 عصر
دو کامپوننتی رو که بنده به تصحیح سالار نوشتیم آپلود میکنم
استفاده کننده محض نباش ... کدها رو بخون و سعی کن یاد بگیری

hr110
شنبه 09 مهر 1384, 07:15 صبح
سلام
دلم نیمومد روی حرف استادید ، حاشیه بزنم ولی هر کاری کردم حس خودخواهیم رو نتونستم آروم کنم، به هر حال :
اگه من باشم از تایمر استفاده نمیکنم، یک دلیل غیر مهم داره و اونهم اینه که اگه قرار باشه 20 تا از این لیبلها روی فرم بزارید برنامه به مد standby خواهد رفت ;) ضمناً معمولاً اساتید فن توصیه میکنند که کمتر از تایمر استفاده شود.

خوش باشید

Touska
شنبه 09 مهر 1384, 07:51 صبح
پس بهتر است از همان کامپوننت JVC استفاده کنید.

Kamyar.Kimiyabeigi
شنبه 09 مهر 1384, 08:24 صبح
Touska عزیز بهتره به جای اینکه مصرف کننده باشیم خودمون نیازهامونو برطرف کنیم مثلا برنامه نویسیم

Developer Programmer
شنبه 09 مهر 1384, 11:06 صبح
Touska عزیز بهتره به جای اینکه مصرف کننده باشیم خودمون نیازهامونو برطرف کنیم مثلا برنامه نویسیم

کاملا موافقم... کاملا!

اگه قرار باشه 20 تا از این لیبلها روی فرم بزارید برنامه به مد standby خواهد
فکر کنم بشه با کامپوننت که سالار نوشته بود (TThreadTimer) بشه حلش کرد!!! یعنی تایمر ها بصورت Thread باشن
اما به یه نکته توجه کنید که قرار نیست 20 تا از این لیبلها گذاشته بشه و البته همزمان هم فلاش بزنن

Touska
شنبه 09 مهر 1384, 18:43 عصر
ما که تولید کننده سیستم نیستم.

با این برنامه هایی که می نویسیم. کجا رو می خواهید تو ایران بگیرید.

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

یک کم هم بیزینسی فکر کنید.

Naficy
شنبه 09 مهر 1384, 19:19 عصر
من تا بحال نشنیده بودم کامپوننت تایمر مساله ای داشته باشه. (در واقع با اطلاعاتی که من از پشت صحنه این کامپوننت دارم کاملا و مطلقا بی آزاره) مطابق عادت حتی تست هم کردم و مشکلی ندیدم. حالا خوشحال می شم منبعتان (همان اساتید فن) را معرفی کنید.

لازم به ذکره که البته مشکلات دیگری در استفاده از تایمر وجود داره. مثلا، بد نیست بدونید اگر سر برنامه کمی شلوغ باشه صدا زدن رویداد این شی به عقب می یفته. (و بنابراین برای زمانهایی که "دقت" در فواصل زمانی مهمه، چیز خوبی نیست) اما این مساله دقیقا برعکس اون چیزیه که اینجا بیان شده.


-------------------------
من هم با بقیه موافقم.
به چند دلیل استفاده صرف از کامپوننتهای دیگران حتی از دیدگاه بیزینسی هم کار مطلوبی نیست:
1- شما هیچی یاد نمی گیرید، اگه فقط از این کامپوننت و آن کامپوننت استفاده کنید. اگه هیچی یاد نگیرید هم که تکلیفتون در بازار معلومه!
2- این کامپوننتها معمولا مقادیر معتنابهی باگ دارن (حتی بهترینهاشون) که به اندازه کافی سر کارتون می ذارن!
3- من به شخصه بسیار طرفدار کپی رایتم. اگه مجبور بودین پول این کامپوننت ها (البته غیر رایگانهاشونو) بدین یه دلیل محکم دیگه هم اضافه می شد.
4- استفاده از کامپوننتها کاری بسیار خوب و صرفه جویی عالی در زمان کدنویسی است. پس زمانهایی که سرعت پیشرفت کار مهمه (و نه یادگیری) به شرط برآورده شدن شرایط بند 3 کار پسندیده ایست!!!

Developer Programmer
شنبه 09 مهر 1384, 20:26 عصر
سلام

پس بهتر است از همان کامپوننت JVC استفاده کنید
معلوم نشد که این کامپوننت از تایمر استفاده میکنه یا نه... و اینکه راه حل بهینه ارائه کرده یا خیر!

ما که تولید کننده سیستم نیستم
نوشتن یه کامپوننت که به کمکش Caption چشمک بزنه ربطی به برنامه سیستم نداره! البته برنامه های سیستم رو هم به کمک همین برنامه های ساده نوشتن! ... برنامه سیستم اصولا برنامه ایه با سطح Kernel در تماس باشه

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

با کامپوننت سریعتر می تونید برنامه رو تحویل دهید. بتونید پول بگیرید.
استفاده از کامپوننتهای آماده ؛ شما رو مصرف کننده بار میآره و باعث میشه در خیلی از مباحث بی اطلاع بار بیاین.
فرق من(هر کسی) با یه برنامه نویسی که از کامپوننتهای آماده استفاده میکنه اینه که وقتی برنامه ای رو تحویل میگیره ساعتها در گوگل چرخ میزنه تا کامپوننتش(که گاها هم پولیه)رو گیر بیاره و البته فقط میتونه از امکاناتی که نویسنده کامپوننت در اختیارش گذاشته ؛ استفاده کنه
اما من خودم می نویسمش(یا قبلا نوشتمش) و در یه بحث برنامه نویسی همه رو سرکوب میکنم!! واگه هم بدلیل کمبود وقت مجبور شدم از کامپوننت آماده استفاده کنم؛ بسته به نیازم سورسش رو دستکاری میکنم و امکاناتش رو بیشتر میکنم ... باگهای احتمالیش رو میبندم و می تونم ورژنهای جدید و متفاوتی ازش بسازم
---
مصطفی جان اینجور طرز فکر باعث میشه که فقط استفاده کننده محض باشیم و واسه هرچیزی منتظر نوشته شدنش از سوی افراد دیگر باشیم و البته کلی هم پول خرج خریدنش بکنیم اینطوری کلی هم گیر دلالها می آد ..!؟

Touska
شنبه 09 مهر 1384, 22:35 عصر
من چی بگم.

hr110
یک شنبه 10 مهر 1384, 06:59 صبح
استفاده از کامپوننتهای آماده ؛ شما رو مصرف کننده بار میآره و باعث میشه در خیلی از مباحث بی اطلاع بار بیاین.
با شما موافقم، ولی بسیاری از قراردادهایی که بسته میشود زمان محدودی دارند و وقت برای نوشتن کامپوننت یا تغییرشون وجود نداره، من ترجیح میدم این جور وقتها یا از کامپوننتهای آماده استفاده کنم /که زحمتش رو کرامتی میکشه/ و یا به دوستان دیگه واگذار میکنم. به عنوان مثال نوشتن ابزاری همانند DBISAM ، FastReport و یا VCLSkin ماهها وقت آدم رو میگیره و در صورتی که شما با یک مبلغ ناچیز میتونید اونو از فروشگاه برنامه نویس تهیه کنید.

موفق باشید.

Touska
یک شنبه 10 مهر 1384, 08:05 صبح
من چیزی غیر از این گفتم. :)

Kamyar.Kimiyabeigi
یک شنبه 10 مهر 1384, 11:01 صبح
به عنوان مثال نوشتن ابزاری همانند DBISAM ، FastReport و یا VCLSkin ماهها وقت آدم رو میگیره و در صورتی که شما با یک مبلغ ناچیز میتونید اونو از فروشگاه برنامه نویس تهیه کنید.
با شما موافقم ولی نه برای یک Caption ایی که قراره چشمک بزنه اگه قرار باشه برای این کار هم از Component آماده استفاده کنیم که میشیم مصرف کننده صرف :متعجب:

Naficy
دوشنبه 11 مهر 1384, 18:03 عصر
خوب، با نظرات همه راجع به کامپوننت نویسی آشنا شدیم. و فکر هم نمی کنم با این صحبتها هیچکدوممون رویه مون رو عوض کنیم!

--------------------------------------------------------------------

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

--------------------------------------------------------------------

من کامپوننت های آقای Afshin_Zavar رو دانلود کردم و دیدم. انصافا روی کد کار شده بود.
اگه اجازه بدهند دو نکته را که در نگاه کلی به کد کامپوننت به نظرم رسید رو می نویسم:

1 - رفع باگ: متغیر TempBool که به صورت Global تعریف شده رو قاعدتا باید بصورت قیلدی از کلاس تعریف کرد.

توضیح: تصور کنین دو کامپوننت FlashingLabel روی فرم قرار دادین. هردو ظرف 100 میلی ثانیه چشمک می زنن. حالا رویداد تایمر لیبل اول رخ می ده. TempBool مقدار true می گیره و caption نمایش داده می شه. سپس رویداد تایمر دوم اتفاق میفته. حالا TempBool مقدار false می گیره و caption نمایش داده نمیشه. دوباره رویداد لیبل اول رخ می ده و tempbool برابر true می شهو caption نمایش داده می شه. و...
همونطور که می بینین، کپشن لیبل اول همواره نمایش داده می شه، اما کپشن لیبل دوم هرگز نمایش داده نمی شه.
تمام این مسایل بخاطر اینه که tempbool بین هردو لیبل مشترکه.

2 - پیشنهاد: به جای تغییر دادن caption ؛ به کمک رونویسی روی متد Paint خودتون لیبل رو بکشین. به این ترتیب بمقدار زیادی از سربار سیستم کم می شه. (بخصوص اگر خصوصیت Autosize مقدار true داشته باشه)
همچنین دیگر نیازی به متغیری که بجای caption تعریف کردین نخواهید داشت. خود caption کافی خواهد بود.

Developer Programmer
سه شنبه 12 مهر 1384, 09:22 صبح
سلام
متوجه این قسمت نشدم
بصورت قیلدی از کلاس تعریف کرد.

از وقتی که گذاشتین تشکر میکنم. حتما اصلاحش میکنم

Naficy
سه شنبه 12 مهر 1384, 13:49 عصر
متوجه این قسمت نشدم

بصورت فیلدی از کلاس تعریف کرد.

منظورم همون اینجاس دیگه:


type
MyClass = class
...
FTempBool: Boolean; // <--- اینجا
...
end;

:چشمک: دیگه طور دیگه ای نمی شد توضیح بدم!! :قهقهه: :قهقهه:

SalarSoft
سه شنبه 12 مهر 1384, 18:30 عصر
من همچنان مشکلی را که در استفاده از کامپوننت تایمر ذکر کردید نمی یابم. لطفا حداقل منبع صحبتتان را مشخص کنید.
چند تا دلیل است که باعث میشه من هیچ وقت از تایمر به جز در مواردی که نیاز هست زمان در فرم نمایش داده بشه استفاده نکنم
اول اینکه تایمر سرباز اضافی رو به برنامه تحمیل می کنه. اگه قرار باشه چندین فرم همزمان با هم باز باشه و کار های مختلفی انجام بدن، حتی وجود یک تایمر هم باعث کندی خواهد شد.(نباید فراموش کنیم که همه کامپیوتر ها قوی نیستند.)
دوم تایمر باعث ناخوانی برنامه می شه و نگه داشت برنامه رو در طولانی مدت مشکل می کنه. در مواقع اجبار سعی می کنم داخل یه کامپوننت دیگه ازش استفاده کنم.

Developer Programmer
سه شنبه 12 مهر 1384, 19:15 عصر
دیگه طور دیگه ای نمی شد توضیح بدم!!

حاجی جون منظورم آن بود که چطور متغییری از نوع کلاس تعریف کنم

Naficy
سه شنبه 12 مهر 1384, 19:55 عصر
حاج? جون منظورم آن بود که چطور متغ??ر? از نوع کلاس تعر?ف کنممن اصلا نگفتم متغیری از نوع کلاس تعریف کنید. گفتم فیلدی درون کلاس تعریف کنید. و فکر می کنم در پست قبلی دقیقا کدی که نوشتم منظور رو می رسونه.



چند تا دلیل است که باعث میشه من هیچ وقت از تایمر به جز در مواردی که نیاز هست زمان در فرم نما?ش داده بشه استفاده نکنم
اول اینکه تایمر سرباز اضافی رو به برنامه تحمیل می کنه. اگه قرار باشه چندین فرم همزمان با هم باز باشه و کار های مختلفی انجام بدن، حتی وجود یک تایمر هم باعث کندی خواهد شد.(نباید فراموش کنیم که همه کامپیوتر ها قوی نیستند.)
دوم تایمر باعث ناخوانی برنامه می شه و نگه داشت برنامه رو در طولانی مدت مشکل می کنه. در مواقع اجبار سعی می کنم داخل یه کامپوننت دیگه ازش استفاده کنم.
از پاسختان متشکر.
بهتره بپرسم به نظر شما پیاده سازی کامپوننت تایمر ایرادی داره که باعث سربار می شه؟ (و یعنی راه بهتری برای اجرای یه کد هر ) یا کلا اینجور برنامه نوشتن ایراد داره؟
من 20 عدد تایمر روی یه فرم قرار دادم و برای تمامشون کدی نوشتم که caption یه label رو تغییر بدن. هیچ مشکلی بروز نکرد. و باید بگم که کامپیوتر من، الان کامپیوتر قویی محسوب نمی شه. یه پنتیوم 2ه.
ضمن اینکه تاکید می کنم: اجرای رویداد تایمر هیچ تاثیری در سرعت برنامه نداره. اگر برنامه کار دیگه ای داشته باشه، انجام اون کار دراولویت قرار می گیره.

با تشکر

SalarSoft
چهارشنبه 13 مهر 1384, 12:45 عصر
من 20 عدد تایمر روی یه فرم قرار دادم و برای تمامشون کدی نوشتم که caption یه label رو تغییر بدن. هیچ مشکلی بروز نکرد. و باید بگم که کامپیوتر من، الان کامپیوتر قویی محسوب نمی شه. یه پنتیوم 2ه.
نباید انظار اتفاقی رو بکشید. چون احتمالا فرمتان خالی است و تایمر ها کار زیادی نمی کنند.

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


ضمن اینکه تاکید می کنم: اجرای رویداد تایمر هیچ تاثیری در سرعت برنامه نداره. اگر برنامه کار دیگه ای داشته باشه، انجام اون کار دراولویت قرار می گیره.
این حرف همیشه صحیح نیست. کامپوننت تایمر single thread است و با برنامه به صورت همزمان اجرا می شود. پس اگر کدهای تایمر در حال اجرا باشند برنامه تا پایان آن متوقف خواهد بود و اگر کار تایمر زیاد از حد طول بکشد، فرمان اجرای تایمر دوباره به لیست انتظار اجرا خواهد رفت. در این موقع است که مجالی به برنامه نمیرسه و کار اصلی مختل می شه.

Naficy
جمعه 15 مهر 1384, 13:40 عصر
نباید انظار اتفاقی رو بکشید. چون احتمالا فرمتان خالی است و تایمر ها کار زیادی نمی کنند.
توجه داشته باشید که این در جواب دوستمان بود که گفتند اگر بیست تا تایمر بذاریم برنامه هنگ می کنه. شما هرجور دوست دارین تست کنین.


برای اینکه یتونیم یه برنامه نویس خوب باشیم باید همیشه به آینده فکر کنیم. و فرض کنیم که همه برنامه های ما قرار است که تبدیل به یک پروژه بزرگ بشوند. از آنجایی که در پروژه های بزرگ کوچکترین اخلالی می تونه باعث ایجاد مشکل در برنامه باشه . وجود تایمر که استفاده ناصحیح از آن شده مشا مشکل خواهد بود. در کل کامپوننت تایمر باعث عدم همبستگی برنامه خواهد شد
اتفاقا با شما موافق نیستم. هر برنامه ای رو که آدم برای خودش می نویسه نباید بزرگ تلقی کرد. بلکه به نظر من برنامه نویس خوب کاری که می کنه اینه که برنامه رو طوری به ابزارها می شکنه و می نویسه، که در آینده هنگام نوشتن پروژه بزرگ، بتونه براحتی از قسمتهایی از کدی که قبلا نوشته استفاده کنه. (مثلا تا حد امکان برای هرکار کلاس، یونیت و تابع هایی می نویسه که بشه بعدن از اونها استفاده کرد)
یه پروژه بزرگ باید از اول به دید یک پروژه بزرگ و با در نظر گرفتن نکاتش تحلیل بشه. نمی شه یه برنامه ساده و خودمونی رو با فرض بزرگ بودن بنویسیم بدون اینکه بدونیم پروژه بزرگمون قراره چه کارهایی بکنه.

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


این حرف همیشه صحیح نیست. کامپوننت تایمر single thread است و با برنامه به صورت همزمان اجرا می شود. پس اگر کدهای تایمر در حال اجرا باشند برنامه تا پایان آن متوقف خواهد بود و اگر کار تایمر زیاد از حد طول بکشد، فرمان اجرای تایمر دوباره به لیست انتظار اجرا خواهد رفت. در این موقع است که مجالی به برنامه نمیرسه و کار اصلی مختل می شه.
هااان. مساله همین جاست: هرگز کار اصلی برنامه مختل نخواهد شد.
البته صحیحه که تا اجرای رویداد تایمر تموم نشه، برنامه ادامه پیدا نمی کنه. انتظار دیگه ای هم نیست. هر جایی تو هر رویدادی و برای هر کامپوننتی، اگر کد دراز بنویسین مسلما همه برنامه منتظر اجراش می مونن. این مساله راه حلهایی داره و اصلا ربطی به نوع کامپوننت نداره. این اصلا مهم نیست اما مهم اینه که:
رویداد کامپوننت تایمر "فقط" یکبار در (به قول شما) لیست انتظار قرار می گیره. و "همیشه" هم در آخر لیست قرار داره. هر رویداد دیگه ای که به لیست اضافه بشه، بازهم رویداد تایمر در آخر لیست خواهد بود. بنابراین هر چیزی در برنامه شما، اولویت داره تا رویداد تایمر. به عبارتی تا همه کارای برنامه تموم نشده، رویداد تایمر صدا زده نمی شه. این همون چیزیه که من از اول می گم و از اول بخاطرش بحث رو شروع کردم.


برخلاف سایر دوستان، من منبع صحبتمو می گم: به راهنمای ویندوز (موجود در دلفی) ذیل WM_Timer مراجعه کنید. برای اطمینان هم می تونین به سورس کامپوننت تایمر مراجعه کنین تا ببینین از همین پیام WM_Timer استفاده شده یا نه. البته برای درک مطلب، احتیاج به اطلاعات کافی در زمینه پیامها خواهید داشت.

با معذرت از دوستان بخاطر طول دراز مطلب.

Kamyar.Kimiyabeigi
شنبه 16 مهر 1384, 07:26 صبح
بلکه به نظر من برنامه نویس خوب کاری که می کنه اینه که برنامه رو طوری به ابزارها می شکنه و می نویسه، که در آینده هنگام نوشتن پروژه بزرگ، بتونه براحتی از قسمتهایی از کدی که قبلا نوشته استفاده کنه. (مثلا تا حد امکان برای هرکار کلاس، یونیت و تابع هایی می نویسه که بشه بعدن از اونها استفاده کرد)

کاملا موافقم یعنی همون Module نویسی که کنترل پروژه رو هم آسون میکنه

SalarSoft
پنج شنبه 21 مهر 1384, 15:42 عصر
اتفاقا با شما موافق نیستم. هر برنامه ای رو که آدم برای خودش می نویسه نباید بزرگ تلقی کرد. بلکه به نظر من برنامه نویس خوب کاری که می کنه اینه که برنامه رو طوری به ابزارها می شکنه و می نویسه، که در آینده هنگام نوشتن پروژه بزرگ، بتونه براحتی از قسمتهایی از کدی که قبلا نوشته استفاده کنه. (مثلا تا حد امکان برای هرکار کلاس، یونیت و تابع هایی می نویسه که بشه بعدن از اونها استفاده کرد) یه پروژه بزرگ باید از اول به دید یک پروژه بزرگ و با در نظر گرفتن نکاتش تحلیل بشه. نمی شه یه برنامه ساده و خودمونی رو با فرض بزرگ بودن بنویسیم بدون اینکه بدونیم پروژه بزرگمون قراره چه کارهایی بکنه.
شما در درک منظورم دچار سوء تفاهم شده اید (شاید به این علت که من عادت به خلاصه نویسی دارم!!). این مثالی بود برای نشان دادن اینکه وجود تایمر در یک پروژه باعث که استفاده ناصحیح از آن شده منشا مشکل خواهد شد.
به علت ما پروژه رو بزرگ در نظر می گیریم که باید تمام اجزای برنامه ما با هم هماهنگ و یکپارچه عمل کند. که این مستلزم به کارگیری روش های برنامه نویسی ساخت یافته است. البته شما به آنها اشاراتی کردید. پس نتیجه میگیرم که این قسمت از صحبتها فقط سوء تفاهم است و جای بحث دیگری نداره.

اما برگردیم بر سر موضوع اصلی
البته صحیحه که تا اجرای رویداد تایمر تموم نشه، برنامه ادامه پیدا نمی کنه. انتظار دیگه ای هم نیست. هر جایی تو هر رویدادی و برای هر کامپوننتی، اگر کد دراز بنویسین مسلما همه برنامه منتظر اجراش می مونن.
این که درست، اما:

این مساله راه حلهایی داره و اصلا ربطی به نوع کامپوننت نداره.
رویداد کامپوننت تایمر "فقط" یکبار در (به قول شما) لیست انتظار قرار می گیره. و "همیشه" هم در آخر لیست قرار داره. هر رویداد دیگه ای که به لیست اضافه بشه، بازهم رویداد تایمر در آخر لیست خواهد بود. بنابراین هر چیزی در برنامه شما، اولویت داره تا رویداد تایمر. به عبارتی تا همه کارای برنامه تموم نشده، رویداد تایمر صدا زده نمی شه. این همون چیزیه که من از اول می گم و از اول بخاطرش بحث رو شروع کردم.
شما تکراری را که تایمر انجام میدهد نادیده می گیرید. مساله اصلی همین تکرار شدن دستورات تایمر است. این درست که رویداد مربوط به تایمر در آخر لیست همیشه بعد از سایر پیغام ها قرارم میگیره؛ اما این بدان معنی که اجرا شدن دستورات به عنوان قسمتی از زمان ide برنامه خواهد بود. در صورتی که تایمر بیش از حد زمان ide را مصرف کند (یا با دستورات زیاد یا با تعداد تایمر زیاد) که این مسئله خوش آیندی نخواهد بود. و همین تکرار باعث می شه که همیشه وقت ide پر باشه.

علاوه بر این ها یه مسئله است که بررسی نشد و اون مشکلات مربوط به single thread بودن تایمر است. فرض کنید که بخوام یک دستور همیشه و سر موقع اجرا بشه و نباید وقفه ای در اجرای اون ایجاد بشه. در این حالت کامپوننت تایمر جوابگوی ما نخواهد بود.
یه راه حل برای این می تونه استفاده ازthread باشه که در اون از کامپوننت تایمر استفاده شده و یا اینکه از خود thread به عنوان تایمر استفاده شده که مورد دوم می توانید یک کامپوننت نمونه را از سایتم دانلود کنید.

نتیجه ای که من از این مباحث میگیرم اینه که تایمر رو فقط مواقعی که واقعا نیاز است استفاده کنیم و حداقل سعی کنیم آن در یک کامپوننت دیگر به کار بریم. به هرحال تایمر هم یکی از ابزار های مورد نیاز برنامه نویسان است و اگر بی استفاده بود که به وجود نمی امد!!

پوزش به خاطر سردردی که تحمیل کردم!!

Naficy
جمعه 22 مهر 1384, 04:57 صبح
با تشکر.
اولا که شما سردردی رو تجمیل نکردین. این شما نبودین که بحث رو شروع کردین و ضمنا من هم خیلی خوشجال شدم که بالاخره یک نفر حاضر به بحث شد.


به علت ما پروژه رو بزرگ در نظر م? گ?ر?م که با?د تمام اجزا? برنامه ما با هم هماهنگ و ?کپارچه عمل کند. که ا?ن مستلزم به کارگ?ر? روش ها? برنامه نو?س? ساخت ?افته است. البته شما به آنها اشارات? کرد?د. پس نت?جه م?گ?رم که ا?ن قسمت از صحبتها فقط سوء تفاهم است و جا? بحث د?گر? نداره.
درسته، من هم با نتیجه گیریتون موافقم.

در صورت? که تا?مر ب?ش از حد زمان ide را مصرف کند (?ا با دستورات ز?اد ?ا با تعداد تا?مر ز?اد) که ا?ن مسئله خوش آ?ند? نخواهد بود. و هم?ن تکرار باعث م? شه که هم?شه وقت ide پر باشه.
درسته. اما صحبت من این بود که پر شدن زمان idle چیز مهمی نیست. چون اسمش می گه idle. بنابراین اگر کاربر کاری داشته باشه معطل نمی مونه. (مگر هنگامی که دستورات بسیار زیادی برای یکبار اجرای تایمر نوشته باشین، که گفتم اینم تقصیر تایمر نیست. برای هیچکدام از رویدادهای هیج کامپوننتی نباید چنین عملی را انجام داد، مگر با حفظ جوانب)


علاوه بر ا?ن ها ?ه مسئله است که بررس? نشد و اون مشکلات مربوط به single thread بودن تا?مر است. فرض کن?د که بخوام ?ک دستور هم?شه و سر موقع اجرا بشه و نبا?د وقفه ا? در اجرا? اون ا?جاد بشه. در ا?ن حالت کامپوننت تا?مر جوابگو? ما نخواهد بود.
در این مورد یه نقل قول از پستهای فبلیم می ذارم: (از صفحه دوم همین مبحث)

لازم به ذکره که البته مشکلات دیگری در استفاده از تایمر وجود داره. مثلا، بد نیست بدونید اگر سر برنامه کمی شلوغ باشه صدا زدن رویداد این شی به عقب می یفته. (و بنابراین برای زمانهایی که "دقت" در فواصل زمانی مهمه، چیز خوبی نیست) اما این مساله دقیقا برعکس اون چیزیه که اینجا بیان شده.

vcldeveloper
شنبه 23 مهر 1384, 05:06 صبح
لازم به ذکره که البته مشکلات دیگری در استفاده از تایمر وجود داره. مثلا، بد نیست بدونید اگر سر برنامه کمی شلوغ باشه صدا زدن رویداد این شی به عقب می یفته. (و بنابراین برای زمانهایی که "دقت" در فواصل زمانی مهمه، چیز خوبی نیست)
در تکمیل فرمایش شما، دوستان می تونند در مواردی که به دقت بیشتری نیاز دارند، از Multimedia Timer در یونیت MMSystem استفاده کنند، این تایمر در thread مربوط به خودش فعالیت میکنه.