PDA

View Full Version : سوال: دکمه ی سه حالته



E power
جمعه 20 بهمن 1391, 20:12 عصر
سلام
من توی انجمن جستجو کردم و این رو پیدا کردم
http://barnamenevis.org/showthread.php?235126-make-button&highlight=%D8%AF%DA%A9%D9%85%D9%87+%D8%B3%D9%87+%D 8%AD%D8%A7%D9%84%D8%AA%D9%87
تقریبا همونی بود که می خواستم اما یکی از دوستان یه کامپوننت رو معرفی کرده که من نتونستم پیداش کنم
می خوام یه دکمه داشته باشم که سه یا چهار حالتش رو خودم با فتوشاپ طراحی کنم و به عنوان دکمه استفاده کنم...
به نظرتون بهترین راهش چیه ؟ یه راه ساده و خوب...

gbg
شنبه 21 بهمن 1391, 09:58 صبح
من قبلا یه کامپوننت دو حالته درست کرده بودم
که هر حالت رویداد onclick جدا داشت

سعید صابری
شنبه 21 بهمن 1391, 11:06 صبح
advglowbuttonو AdvGlassButton از TMS چنین امکانی داره

BORHAN TEC
شنبه 21 بهمن 1391, 11:07 صبح
این کارتون رو راه میاندازه:
http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A&p=1471487&viewfull=1#post1471487

E power
شنبه 21 بهمن 1391, 14:15 عصر
این کارتون رو راه میاندازه:
http://barnamenevis.org/showthread.php?209792-%D8%B3%D9%88%D8%B1%D8%B3%D9%87%D8%A7%D9%8A-%D9%86%D9%85%D9%88%D9%86%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%D9%8A&p=1471487&viewfull=1#post1471487
خیلی ممنون .. فقط من نمی دونم چطوری باید ازش استفاده کنم:ناراحت: یعنی بلد نیستم!
میشه یه مثال درست کنید؟

MohsenB
شنبه 21 بهمن 1391, 14:50 عصر
سلام

شاید لازم به کار زیادی نباشه ، یک روش ساده و بدون محدودیت حالات ، یک کد نیتیو و سریع میتونه این باشه :

اگر دکمه عکس لازم داره و باید اون تغییر کنه میتونید از روش ساده زیر استفاده کنید :
من از دکمه استاندارد خود دلفی استفاده کردم ( البته ویرایش XE3 ) ، این دکمه میتونه به یک ایمیج لیست متصل بشه و با خاصیت ImageIndex شماره ایمیج داخل لیست براش انتخاب بشه .
خوب ، کافیه این کد رو به رویداد کلیک دکمه اضافه کنید :

procedure TForm1.btn1Click(Sender: TObject);
begin
case TButton(Sender).ImageIndex of
0:{State1};
1:{State2};
2:{State3};
end;
//
with TButton(Sender) do if ImageIndex < Images.Count-1 then ImageIndex:= ImageIndex+1 else ImageIndex:= 0;
end;
کد خیلی واضحه شما هر تعداد وضعیت میتونید به اون اضافه کنید ، تنها کافیه عکساتون رو تو ایمیج لیست بزارید و شرایط دستور Case رو اضافه کنید . همین!


ویا اگر از ایمیج استفاده نمیکنید می تونید از روش زیر استفاده نمایید :

procedure TForm1.btn2Click(Sender: TObject);
const SMAX = 3;
begin
case TButton(Sender).Tag of
0:{State1};
1:{State2};
2:{State3};
end;
//
with TButton(Sender) do begin
if Tag < SMAX-1 then Tag:= Tag+1 else Tag:= 0;
ImageIndex:= Tag; //or other code
end;
end;


یه تست هوش : کسی میتونه خط نهم کد اول رو ساده تر کنه ؟؟ ( خیلی بخش دلفی سوت و کور شده !!؟؟ محض سرگرمی )

موفق باشید

E power
شنبه 21 بهمن 1391, 18:11 عصر
اگه ممکنه یه مثال هر چند کوچیک بزارید ... من چون مبتدی هستم با مثال کامل یاد میگیرم.
خیلی ممنون از لطفتون

E power
دوشنبه 23 بهمن 1391, 20:37 عصر
ببینید من اینا رو با فتوشاپ طراحی کردم .. میخوام به جای دکمه استفاده کنم
منظور من اینه .. نه این که یه عکس به دکمه اضافه کنم
توی نرم افزار هایی مث مولتی مدیا بیلدر خیلی راحت این سه حالت رو میدیم بهش و یه دکمه تحویلمون میده
البته به صورت جدا...
پوسته و اسکین برنامه رو نمی خوام تغییر بدم...
99925

BORHAN TEC
دوشنبه 23 بهمن 1391, 21:25 عصر
کامپوننت های ذاتی دلفی این قابلیت رو ندارند ولی با کامپوننت های شخص ثالث میشه این کار رو انجام داد. مثلاً اگر از مجموعه Raize Component استفاده می کنید باید از کامپوننت TrzBmpButton و اگر از مجموعه JVCL استفاده می کنید باید از کامپوننت TJvBitmapButton استفاده کنید.

MohsenB
سه شنبه 24 بهمن 1391, 12:23 عصر
سلام

یه راه دیگه براتون پیشنهاد میکنم :


نیازی به هیچ کامپوننتی نداره
میتونید از تعداد دکمه توی اون استفاده کنید
همه دکمه ها میتونن از یک منبع تغذیه بشن
...


مثل قبل یک کنترل لیست نصویر ( ImageList ) روی فرمتون قرار بدید و طول و عرض تصاویر رو براش تنظیم کنید ، عکساتونم براش انتخاب کنید .

حالا بجای استفاده از دکمه روی فرمتون از کنترل ایمیج استفاده کنید .
بعد از اضافه کردن امیج ( ها ) ، بعد از انتخاب به رویداد OnMouseUp برید و کد زیر رو باش بنویسید :

procedure TForm1.img1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
const SMAX = 3;
begin
with TImage(Sender) do begin
Tag:= Tag mod SMAX + 1;
Picture.Bitmap:= nil;
MyImageList.GetBitmap(Tag-1, Picture.Bitmap);
end;
end;

این رویداد یک رویداد عمومیه و برای هر تعداد دکمه که دارید رویداد برداشتن موسش رو به همین کد نسبت بدید . اگر هم چند تا دکمه نمیخواید میتونید این کد رو به ادامه کد زیر مثل کدهای بالا اضافه کنید .

بعد از اون برای رویداد کلیک هر دکمه ( ایمیج ) این کد رو بنویسید :

procedure TForm1.img1Click(Sender: TObject);
begin
case TImage(Sender).Tag of
1: Left := Left + 10;
2: begin
Left := Left - 10;
Top := Top - 10;
end;
3: Top := Top + 10;
end;
end;


براتون مثال هم نوشتم از هر نوعش . اگه یکم کئ رو تغییر بدید میتونید برای رویداد MouseOver هر دکمه هم بصورت جداگانه کد بنویسید .
نکته ای که میمونه اینه که تگ هر ایمیج میتونه بعنوان تعیین کننده حالت پیش فرض باشه . و اینکه الان شما باید عکس پیش فرض رو خودتون تو حالت طراحی انتخاب کنید و یا میتونید یک کدی براش بنویسید که موقع اجرای برنامه عکسها رو تنظیم کنه .

جواب اون تست هوش هم داخل این کد هست . مثل اینکه کسی نتونست جواب بده .


موفق باشید