راه حل سوم: هیچ کس از تنوع بدش نمی آید!!!!
تا این جا توانستیم یک فهرست (البته با کپی فایل ها در یک پوشه و نام گذاری آنها با یک فرمت خاص) از تصاویر Bitmap ایجاد و این تصاویر را به ترتیب نمایش دهیم.اما تنوع هم چیز بدی نیست!کاش بتوانیم کاری کنیم که یک تصویر به تصادف از فهرست ما انتخاب شود.پس دست به کار شوید تا «برنامه ای بنویسید که با دریافت یک فهرست از تصاویر ،یکی از آنها را به تصادف انتخاب و به عنوان WallPaper نمایش دهد».
برای اینکه خروجی این بخش را ببینید،مراحل زیر را به دقت دنبال کنید:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايلهای MyCW2.bat و MyCW2.vbs را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند و از فرمت Bitmap باشد،را انتخاب کنيد و در پوشه عمليات کپي کنيد.اگر عکس Bitmap نداريد،مي توانيد توسط Paintويندوز،عکسهاي فرمت هاي ديگر را باز کرده و به به نوع Bitmap ذخيره (Save as) کنيد.در ضمن هيچ تفاوتي بين انواع Bitmap (دو رنگ،هشت رنگ يا ...) نمي باشد.
5) عکس هاي مرحله قبل (Bitmap هاي کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم).به شکل «WP*.bmp» نامگذاري کنيد که در آن به جای ستاره،یک عبارت قرار دهید (مهم نیست چه عبارتی،فقط طوری باشد که فرمت مورد نظر حفظ شود و شامل فضای خالی نباشد).مثلا:
کد:
کد PHP:
WP1.bmp , WP2.bmp , WPaa.bmp , WP1250.bmp , ....
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW2.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW2.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.
اما قبل از توضیح این کدها،باید یک نکته ظریف روشن شود.ما در خط دستور شاید بتوانیم کارهای زیادی انجام دهیم،ولی همه کار نمی توانیم بکنیم! مثلا تولید یک عدد تصادفی!غیر ممکن است.به همین دلیل مجبور به استفاده از یک زبان جانبی هستیم.من از VB Script استفاده کردم که دو مزیت دارد:
1) در تمام ویندوز ها به شکل پیشفرض نصب است
2) خیلی از توابع و قابلیت ها در آن (به خاطر انعطاف پذیر کردن آن) وجود دارد که شما در خط دستور ندارید.مثلا تولید عدد تصادفی! یا ارتباط با یک شی COM و ...
البته باید یاد آور شوم که به جای استفاده از VB Script می توان از JScript هم استفاده کرد.در ضمن خیلی از کارها که در برنامه های قبل در خط دستور انجام دادیم،می توان به VB Script محول کرد.
در برنامه این پست ،ما دو فایل داریم.یک فایل MyCW2.bat است.این فایل خود به دو بخش تقسیم می شود.
بخش اول با کد:
کد:
کد PHP:
dir WP*.bmp /b | SORT > Dir.txt
MyCW2.vbs
FOR /F %%i in (Dir.txt) do call :Section2 %%i
del Dir.txt
goto :EOF
ابتدا یک فایل با نام Dir.txt با ایجاد فهرستی مرتب از فایل های با فرمت «WP*.bmp» ایجاد کرده و سپس با فراخوانی MyCW2.vbs،عملا یک فایل از این فهرست (محتویات Dir.txt )انتخاب شده و باز گردانده می شود.توجه کنید که منظور از باز گرداندن ذخیره دوباره در فایل Dir.txt می باشد.به عبارت دیگر قیل از اجرای MyCW2.vbs، فایل Dir.txt حاوی فهرستی از فایل های منتظر برای انتخاب شدن هستند ولی پس از اجرای فایل مذکور،فایل Dir.txt حاوی فقط یک خط است! و آن هم فایل انتخاب شده است.در نهایت هم همان یک خط Dir.txt خوانده شده و به بخش دوم MyCW2.bat،برای تخصیص به عنوان WallPaper ارجاع می شود.
در بخش دوم نیز فایل مورد نظر که در تنها ورودی این بخش ذخیره شده است، به عنوان WallPaper تخصیص یافته و کار این بخش پایان یافته است.
اما فایل MyCW2.vbs نیز حاوی کد مکمل است.این برنامه،محتویات فایل Dir.txt را خوانده و یک خط به شکل تصافی از بین خطوط آن انتخاب و تمام خطوط دیگر فایل Dir.txt به استثنای خط مورد نظر،حذف می شود.در نتیجه خروجی این برنامه نیز تنها خط باقیمانده در فایل Dir.txt خواهد بود.
در این کد فایل،بعد از معرفی متغیر ها و ثوابت لازم،خطوط زیر:
کد:
کد PHP:
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Open file for reading.
Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForReading)
Count = 0
Do While objTextFile.AtEndOfStream <> True
sRead = objTextFile.ReadLine
Count = Count + 1
Loop
objTextFile.Close
با ایجاد یک شی فایل و باز کردن فایل Dir.txt تعداد خطوط آن را شمارش کرده و در متغیر Count ذخیره می کند.در نهایت هم فایل مورد نظر را می بندد.سپس در دو خط بعدی،یعنی:
کد:
Randomize ' Initialize random-number generator.
Rand = Int((Count * Rnd) + 1)
با ایجاد یک فرایند واقعا تصادفی،عددی تصادفی بین یک تا Count تولید و در Rand ذخیره می نماید.سپس در قسمت بعدی کد یعنی:
کد:
کد PHP:
Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForReading)
Count = 0
Do While Count < Rand
sRead = objTextFile.ReadLine
Count = Count + 1
Loop
objTextFile.Close
یک بار دیگر فایل Dir.txt را باز و خط «Rand ام» را خوانده و محتویات آن را در متغیر sRead ذخیره می کند.توجه کنید که در انتهای کار خود،فایل مورد نظر را می بندد.در پایان نیز باید فایل Dir.txt را ،این بار برای رونویسی،باز کرده و تنها خط مورد نظر (خط انتخاب شده به شکل تصادفی) را در آن بنویسید (فایل برای نوشتن باز شده است به طوری که تمام محتویات آن نابود شود).این فرایند در خطوط زیر رخ می دهد:
کد:
کد PHP:
Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForWriting, True)
objTextFile.WriteLine(sRead)
objTextFile.Close
همانطور که می بینید، برنامه MyCW2.bat با فراخوانی مناسب،برخی وظایف را به MyCW2.vbs محول می کند و این دو به کمک هم،فرایند ایجاد یک Wallpaper تصادفی را انجام می دهند.
سئوال 1: آیا واقعا نیاز به دو فایل برای این کار بود و نمی شود همه را در یک فایل تجمیع کرد؟
جواب: همانطور که توضیح داده شد،تولید عدد تصادفی در خط دستور امکان پذیر نیست،پس نیاز به فایل اجرایی غیر از Batch فایل (در اینجا VB Script) وجود دارد.ولی با کمی تلاش، می شود تمام وظایف فایل MyCW2.bat را به MyCW2.vbs منتقل کرد و کلا برنامه را تحت یک فایل آن هم از نوع VB Script نوشت (با این حال کد تولید در VB Script از کد سرراست Batch،پیچیده تر خواهد بود).
سئوال 2: من چند بار Logg off کردم ولی هر بار یک عکس انتخاب می شود (در کل یک عکس را بیشتر از بقیه نشان می دهد)؟
جواب: انتخاب یک عکس از فهرست عکس ها تصادفی انجام می شود و در این تصادف از بین تمام عکس ها انتخاب می شود و احتمال اینکه در چند بار Log off یا Restart ،عکس واحدی انتخاب شود،صفر نیست!توجه کنید که این فرایند تصادفی است و ممکن است خروجی هر بار مثل بار قبل هم باشد.
علاقه مندی ها (Bookmarks)