PDA

View Full Version : سوال: مشکل دستور if



Mahdi.21267
سه شنبه 23 اردیبهشت 1399, 13:21 عصر
سلام، وقتی این دستور رو تایپ میکنم
Imagelist1.images(0)
=If picture box1.Image
خطا میده و مینویسه که نباید بین دو تا image از =استفاده بشه.داخل Imagelist1 از قبل عکس گذاشتم

مشکل چیه؟

the king
سه شنبه 23 اردیبهشت 1399, 13:57 عصر
سلام، وقتی این دستور رو تایپ میکنم
Imagelist1.images(0)
=If picture box1.Image
خطا میده و مینویسه که نباید بین دو تا image از =استفاده بشه.داخل Imagelist1 از قبل عکس گذاشتم

مشکل چیه؟

انجمن مربوط به زبان مورد نظر رو باید انتخاب می کردید که احتمالا ویژوال بیسیک ئه.
بجای = می توانید ارجاع (Reference) اش رو مقایسه کنید :

If Object.ReferenceEquals(PictureBox1.Image, ImageList1.Images(0)) Then

End If

یا :

If PictureBox1.Image Is ImageList1.Images(0) Then

End If

Mahdi.21267
سه شنبه 23 اردیبهشت 1399, 14:16 عصر
بله، ممنون از شما
از is قبلا استفاده کردم، مشکل خطا برطرف میشه مثل object شما، ولی وقتی Start میکنی پروژه رو اصلا عملکرد نداره! هر چی کليک میکنی بی فایده است.

the king
سه شنبه 23 اردیبهشت 1399, 14:46 عصر
بله، ممنون از شما
از is قبلا استفاده کردم، مشکل خطا برطرف میشه مثل object شما، ولی وقتی Start میکنی پروژه رو اصلا عملکرد نداره! هر چی کليک میکنی بی فایده است.
کلیک روی چی؟ کدتون لابد عملکرد خاصی نداشته. صرفا یک if که نمیتونه باشه.

Mahdi.21267
چهارشنبه 24 اردیبهشت 1399, 21:28 عصر
کلیک روی picture box, در واقع میخوام وقتی عکس داخل picture box با عکسی که داخل Imagelist قرار دادم، برابر بود یا یکسان بود، یه سری دستورات اجرا کنه.

the king
پنج شنبه 25 اردیبهشت 1399, 00:41 صبح
کلیک روی picture box, در واقع میخوام وقتی عکس داخل picture box با عکسی که داخل Imagelist قرار دادم، برابر بود یا یکسان بود، یه سری دستورات اجرا کنه.
نمی توانید Image رو اینطوری مقایسه کنید، روال مقایسه ای که دارید می کنید برابر اساس مقایسه پیکسل های تصویر نیست، فقط مقایسه ارجاع انجام میشه.
مقایسه Is و Object.ReferenceEquals بررسی می کنند که آیا دو تا طرف دقیقا یک شیء هستند یا نه، نه اینکه دو تا شیء متفاوت با مقدار برابر باشند.
مثال ساده اش اینه که شما یک فایل تصویری JPEG رو در دو تا شیء Image فراخوانی کنید، تصاویر این دو شیء Image دقیقا برابر هستند، تفاوتی در تصویرشون نیست، ولی این دو تا شیء مجزا هستند، ارجاع شون برابر نیست.
Image اون مقایسه ظاهر تصویری که شما مد نظرتونه رو نداره. باید در کدتون تغییراتی بدید تا برای مقایسه از ملاک بهتری استفاده بشه.

Mahdi.21267
پنج شنبه 25 اردیبهشت 1399, 12:59 عصر
بله، حق با شماست لطف میکنید راهنمایی کنید چه تغییراتی بدم که بتونه مقایسه صحیح رو انجام بده.؟

the king
پنج شنبه 25 اردیبهشت 1399, 13:59 عصر
بله، حق با شماست لطف میکنید راهنمایی کنید چه تغییراتی بدم که بتونه مقایسه صحیح رو انجام بده.؟

از کدی که می نویسید اطلاعی ندارم. ولی فرضا وقتی تصویری رو در PictureBox قرار می دهید می توانید در جای دیگری مقداری ثبت کنید که مشخص بشه که منبع اش چیه.
مثلا اگر در PictureBox1.Image تصویری رو قرار می دهید، در مشخصه PictureBox1.Tag یک مقدار به عنوان نشانه بنویسید (رشته یا عدد یا هر مقدار دلخواه دیگری) که معلوم بشه این تصویر که قرار دادید منبعش چیه. بعدا موقع بررسی تصویر داخل PictureBox1 دیگه مشخصه Image رو بررسی نکنید، Tag رو بررسی کنید. مثلا :

PictureBox1.Image = ImageList1.Images(0)
PictureBox1.Tag = 0


PictureBox1.Image = ImageList1.Images(1)
PictureBox1.Tag = 1


PictureBox1.Image = ImageList1.Images(2)
PictureBox1.Tag = 2


If PictureBox1.Tag IsNot Nothing Then
Select Case PictureBox1.Tag
Case 0: ' PictureBox1.Image = ImageList1.Images(0)
MessageBox.Show ("Index 0")
Case 1: ' PictureBox1.Image = ImageList1.Images(1)
MessageBox.Show ("Index 1")
Case 2: ' PictureBox1.Image = ImageList1.Images(2)
MessageBox.Show ("Index 2")
End Select
End If

Mahdi.21267
جمعه 26 اردیبهشت 1399, 13:34 عصر
از کدی که می نویسید اطلاعی ندارم. ولی فرضا وقتی تصویری رو در PictureBox قرار می دهید می توانید در جای دیگری مقداری ثبت کنید که مشخص بشه که منبع اش چیه.
مثلا اگر در PictureBox1.Image تصویری رو قرار می دهید، در مشخصه PictureBox1.Tag یک مقدار به عنوان نشانه بنویسید (رشته یا عدد یا هر مقدار دلخواه دیگری) که معلوم بشه این تصویر که قرار دادید منبعش چیه. بعدا موقع بررسی تصویر داخل PictureBox1 دیگه مشخصه Image رو بررسی نکنید، Tag رو بررسی کنید. مثلا :

PictureBox1.Image = ImageList1.Images(0)
PictureBox1.Tag = 0


PictureBox1.Image = ImageList1.Images(1)
PictureBox1.Tag = 1


PictureBox1.Image = ImageList1.Images(2)
PictureBox1.Tag = 2


If PictureBox1.Tag IsNot Nothing Then
Select Case PictureBox1.Tag
Case 0: ' PictureBox1.Image = ImageList1.Images(0)
MessageBox.Show ("Index 0")
Case 1: ' PictureBox1.Image = ImageList1.Images(1)
MessageBox.Show ("Index 1")
Case 2: ' PictureBox1.Image = ImageList1.Images(2)
MessageBox.Show ("Index 2")
End Select
End If

تشکر از شما، این کار رو کردم درست شد.
فقط جسارتا دو سه تا سؤال دیگه هم داشتم.
1- با چه کدی میتونم با کلیک روی یه باتن فرم رو مجدد Load کنم
2-من با یه کد تصاویر داخل picture box رو با کمک تایمر عوض میکنم، ولی برای چند تا picture box باید چند تا تایمر بذارم که مطلوب نیست، چطور میتونم تمام picture box ها رو با به تایمر بصورت جدا جدا به کار بندازم.
3- با چه کدی میتونم وقتی در قسمت بالای فرم، تب کنترل ایجاد میکنم، اسکرول بار فرم اصلی از زیر تب کنترل ایجاد بشه، و نیاز نباشه که تب کنترل رو به به طریقی ببندی.
خیلی خیلی از جواب های شما و وقتی که میذارید تشکر میکنم.

the king
جمعه 26 اردیبهشت 1399, 14:42 عصر
تشکر از شما، این کار رو کردم درست شد.
فقط جسارتا دو سه تا سؤال دیگه هم داشتم.
1- با چه کدی میتونم با کلیک روی یه باتن فرم رو مجدد Load کنم

واقعا نمی توانید فرم رو از نو Load کنید، مگر اینکه فرم بسته بشه و همونطور که قبلا باز شده بود مجددا باز بشه.
اما معمولا هدف اینه که همون فرمی که هست بمونه و فقط یکسری نمایش ها داخلش تکرار بشه.
بستگی داره که موقع Load چه کدی اجرا می کنید که میخواهید مجددا اجرا بشه. اگر صرفا هدف اینه کد داخل Form1_Load مجددا اجرا بشه، Form1_Load رو فراخوانی می کنید :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Form1_Load(Me,EventArgs.Empty)
End Sub




2-من با یه کد تصاویر داخل picture box رو با کمک تایمر عوض میکنم، ولی برای چند تا picture box باید چند تا تایمر بذارم که مطلوب نیست، چطور میتونم تمام picture box ها رو با به تایمر بصورت جدا جدا به کار بندازم.

تصوری از اینکه به کار بیاندازید چطور کدی است ندارم، اما می توانید یک مجموعه از PictureBox ها رو داخل حلقه پیمایش کنید و یک کار مشابه رو برای همه شون انجام بدهید :

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
For Each pic As PictureBox In {PictureBox1, PictureBox2, PictureBox3, PictureBox4}
pic.Image = Nothing
pic.BackColor = Color.LightBlue
.
.
.
Next
End Sub



3- با چه کدی میتونم وقتی در قسمت بالای فرم، تب کنترل ایجاد میکنم، اسکرول بار فرم اصلی از زیر تب کنترل ایجاد بشه، و نیاز نباشه که تب کنترل رو به به طریقی ببندی.

متوجه نشدم این توصیفی که می کنید چه ظاهری داره.

Mahdi.21267
جمعه 26 اردیبهشت 1399, 15:03 عصر
از کدی که می نویسید اطلاعی ندارم. ولی فرضا وقتی تصویری رو در PictureBox قرار می دهید می توانید در جای دیگری مقداری ثبت کنید که مشخص بشه که منبع اش چیه.
مثلا اگر در PictureBox1.Image تصویری رو قرار می دهید، در مشخصه PictureBox1.Tag یک مقدار به عنوان نشانه بنویسید (رشته یا عدد یا هر مقدار دلخواه دیگری) که معلوم بشه این تصویر که قرار دادید منبعش چیه. بعدا موقع بررسی تصویر داخل PictureBox1 دیگه مشخصه Image رو بررسی نکنید، Tag رو بررسی کنید. مثلا :

PictureBox1.Image = ImageList1.Images(0)
PictureBox1.Tag = 0


PictureBox1.Image = ImageList1.Images(1)
PictureBox1.Tag = 1


PictureBox1.Image = ImageList1.Images(2)
PictureBox1.Tag = 2


If PictureBox1.Tag IsNot Nothing Then
Select Case PictureBox1.Tag
Case 0: ' PictureBox1.Image = ImageList1.Images(0)
MessageBox.Show ("Index 0")
Case 1: ' PictureBox1.Image = ImageList1.Images(1)
MessageBox.Show ("Index 1")
Case 2: ' PictureBox1.Image = ImageList1.Images(2)
MessageBox.Show ("Index 2")
End Select
End If

تشکر از شما، این کار رو کردم درست شد.
فقط جسارتا دو سه تا سؤال دیگه هم داشتم.
1- با چه کدی میتونم با کلیک روی یه باتن فرم رو مجدد Load کنم
2-من با یه کد تصاویر داخل picture box رو با کمک تایمر عوض میکنم، ولی برای چند تا picture box باید چند تا تایمر بذارم که مطلوب نیست، چطور میتونم picture box ها رو با به تایمر بصورت جدا جدا به کار بندازم.
3- با چه کدی میتونم وقتی در قسمت بالای فرم، تب کنترل ایجاد میکنم، اسکرول بار فرم اصلی از زیر تب کنترل ایجاد بشه، و نیاز نباشه که تب کنترل رو به به طریقی ببندی.
خیلی خیلی از جواب های شما و وقتی که میذارید تشکر میکنم.

Mahdi.21267
یک شنبه 28 اردیبهشت 1399, 13:08 عصر
واقعا نمی توانید فرم رو از نو Load کنید، مگر اینکه فرم بسته بشه و همونطور که قبلا باز شده بود مجددا باز بشه.
اما معمولا هدف اینه که همون فرمی که هست بمونه و فقط یکسری نمایش ها داخلش تکرار بشه.
بستگی داره که موقع Load چه کدی اجرا می کنید که میخواهید مجددا اجرا بشه. اگر صرفا هدف اینه کد داخل Form1_Load مجددا اجرا بشه، Form1_Load رو فراخوانی می کنید :

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Form1_Load(Me,EventArgs.Empty)
End Sub



تصوری از اینکه به کار بیاندازید چطور کدی است ندارم، اما می توانید یک مجموعه از PictureBox ها رو داخل حلقه پیمایش کنید و یک کار مشابه رو برای همه شون انجام بدهید :

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
For Each pic As PictureBox In {PictureBox1, PictureBox2, PictureBox3, PictureBox4}
pic.Image = Nothing
pic.BackColor = Color.LightBlue
.
.
.
Next
End Sub


متوجه نشدم این توصیفی که می کنید چه ظاهری داره.

تشکر از شما، خیلی لطف کردید. 🌹