PDA

View Full Version : چند سوال در مورد چند کنترل



HosseinProgrammer
جمعه 02 شهریور 1386, 15:31 عصر
سلام. چند سوال داشتم.

1- یه برنامه دارم که وقتی روی یک Button کلیک کنیم، Enable = false میشه و یک سری دستورالعمل انجام میده و پس از اون دوباره فعال میشه. در حین اجرای دستورات که چند ثانیه ای طول میکشه، کاربر اگه باز هم روی Button که غیرفعال شده کلیک کنه، پس از اینکه فعال شد دوباره اون دستورالعمل ها (که در رویداد کلیک قرار دارد) اجرا میشه. من میخوام اون کلیک های اضافی در نظرگرفته نشه. چه کنم؟!

2- زمانی که در یک فرم قرار داریم، میخوام اگر کاربر دکمه Esc (یا هر دکمه خاص دیگه ای) مثلا فلان کار انجام بشه. من نمیتونم از رویداد کلید فرم استفاده کنم چون ممکنه کاربر در حال تایپ در یک TextBox باشه و این رویداد عمل نمیکنه. به عبارت دیگه میخوام هر وقت که کلید خاصی در برنامه زده شد، کاری انجام بشه.

3- در یک آرایه معمولی (و نه ArrayList) که یک طول فرضی تعیین کردیم (چون در ابتدا سایز آرایه مشخص نیست) و در انتها مثلا از 20 خانه ای که وجود داشت 15 خانه استفاده شد، آیا میشه Length آرایه رو به 15 تفییر داد تا در استفاده های بعدی مشکلی پیش نیاید؟

4- وقتی از روی PictureBox1 عبور میکنیم (رویداد Move) تغییر رنگ میکنه و PictureBox2 هم روی PictureBox1 قرار داره و میخوام رنگ اون هم وقتی روی PictureBox1 حرکت میکنیم، با زمینه اش همرنگ بشه! نگید که چه کار بیهوده ای! توی PictureBox2 یه دایره ای وجود داره از نوع gif که دورش خالیه. من میخوام اون فضای خالی همرنگ پس زمینه باشه حتی اگر در حین اجرا رنگ پس زمینه تغییر کنه. روشی وجود داره؟

5- من میخوام یک فایل صوتی همراه فایل EXE باشه یعنی در برنامه آدرس ندم. به عبارت دیگه فایل صوتی رو همراه فایل EXE به کاربر ندم. حالا نه فقط فایل صوتی، هر فایل دیگه ای. راهنمایی میکنید؟!

پیشاپیش از جوابهاتون ممنونم.

PC2st
جمعه 02 شهریور 1386, 18:00 عصر
1. باید از Message Filter ها استفاده کنید، مثلا در رویداد کلیک از button1 کدهای زیر رو بنویسید:


private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
Filt f = new Filt();
Application.AddMessageFilter(f);
Console.Beep();
System.Threading.Thread.Sleep(1000);
Application.DoEvents();
Application.RemoveMessageFilter(f);
button1.Enabled = true;
}

که کلاس Filt به شکل زیر تعریف شده:


public class Filt : IMessageFilter
{
public bool PreFilterMessage(ref Message m)
{
return false;
}
}

برای اطلاعات بیشتر به لینک زیر رجوع کنید:

http://barnamenevis.org/forum/showthread.php?t=75971



2. باید از Windows Hook استفاده کنید. Hook باعث میشه که هر جا و در هر مکانی یک کلیدی فشرده شد، برنامه شما مطلع بشه. یک نمونه برنامه از آن را میتوانید در پست 20 ام از لینک زیر پیدا کنید.
http://barnamenevis.org/forum/showthread.php?t=64210

3. بله، از متد Array.Resize استفاده کنید. (این متد از Generic Type ها استفاده میکنه)

4. روش بخصوصی نه، ولی رنگ زمینه شیئ PictureBox2 رو از طریق رویداد MouseMove در شیئ PictureBox1 تغییر بدید.

5. از قسمت Solution Explorer گزینه (شاخه) Properties را باز کنید و روی Resources.resx دابل کلیک کنید، صفحه ای باز میشود، هر فایلی رو که میخواید از داخل اون صفحه بکشید، و برای استفاده از آن فایلها که در پروژه قرار دارند، از فضای نام Properties.Resources استفاده کنید.

HosseinProgrammer
شنبه 03 شهریور 1386, 21:00 عصر
سلام.
ممنون از جوابهاتون.
ولی سوال اول هنوز حل نشده!



privatevoid Read_Number_Button_Click(object sender, EventArgs e)
{
Reset_Button.Enabled = false;
Read_Number_Button.Enabled = false;
Filt R = newFilt();
Application.AddMessageFilter(R);
SoundPlayer Player = newSoundPlayer();
foreach (string FileAddress in Speaking_Address_Array)
{
if (FileAddress == null)
break;
Player.SoundLocation = FileAddress;
Player.PlaySync();
}
Application.RemoveMessageFilter(R);
Reset_Button.Enabled = true;
Read_Number_Button.Enabled = true;
}


قسمت foreach مهم نیست. مشکل اینه که کاربر اگر روی کلید در حین پخش کلیک کنه هم پس از اینکه کل صدا پخش شد، مجددا پخش میشه. نمیدونم مشکل چیه. اون لینک هم دیدم چیزی دستگیرم نشد.
حالا چه کار کنم مشکل حل بشه؟
اون کلاس چه کار میکنه؟ مفهومش چیه؟
منظور آقا مهدی از نوشته زیر چیه؟ منظور ار this



Application.RemoveMessageFilter(this);

منظورم از this کلاسی هستش که IIMessageFilter رو پیاده سازی میکنه.

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

سوال دیگه ام اینه که پروپرتیه Handled وظیفش چیه؟

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

و سوال آخر اینکه میشه کاری کرد که برنامه با Alt+F4 بسته نشه؟

ممنون
یا علی...

PC2st
شنبه 03 شهریور 1386, 22:38 عصر
قسمت foreach مهم نیست. مشکل اینه که کاربر اگر روی کلید در حین پخش کلیک کنه هم پس از اینکه کل صدا پخش شد، مجددا پخش میشه. نمیدونم مشکل چیه. اون لینک هم دیدم چیزی دستگیرم نشد.
به شکل زیر:


private void Read_Number_Button_Click(object sender, EventArgs e)
{
string[] Speaking_Address_Array = new string[] { "windaVinciSysExit.wav", "winSpaceSysStart.wav" };
Read_Number_Button.Enabled = false;
Filt R = new Filt();
Application.AddMessageFilter(R);
SoundPlayer Player = new SoundPlayer();
foreach (string FileAddress in Speaking_Address_Array)
{
if (FileAddress == null)
break;
Player.SoundLocation = FileAddress;
Player.PlaySync();
Application.DoEvents();
}
Application.RemoveMessageFilter(R);
Read_Number_Button.Enabled = true;
}




منظور آقا مهدی از نوشته زیر چیه؟ منظور ار this
منظور شیئ R در کدهای خودت هست.





سوال دیگه ام اینه که پروپرتیه Handled وظیفش چیه؟
اگر مقدار این خاصیت رو برابر True بگذاریم، یعنی اینکه رویداد رو Handle کردیم و لازم نیست که کار دیگری انجام بشه. مثلا اگر در رویداد KeyPress از یک TextBox، خاصیت e.Handled رو برابر True بگذاریم، دیگه کاراکتری که کاربر تایپ کرده، وارد نمیشه.


و سوال آخر اینکه میشه کاری کرد که برنامه با Alt+F4 بسته نشه؟
در رویداد FormClosing از فرم، اگر خاصیت e.CloseReason برابر UserClosing بود، یعنی اینکه کاربر با Alt+F4 یا کلیک روی ضربدر، میخواد فرم رو ببنده، پس اگر مقدار خاصیت e.Cancel رو برابر True بگذاریم، مانع از بسته شدن فرم میشیم.