نقل قول: من برای اینکه تو هر خط فقط میخوام 8 تا دونه از 0و1 ها رو ذخیره کنم چی کارباید کنم؟
یعنی چی؟
کلا میخوای توی صفحه هر سطرت 8 ستون داشته باشه؟ اینجوری که کیفیت خیلی پایین میاد. سؤالت رو بیشتر شرح بده.
تابلوهای روان یادم نیست ابعادشون چند بود ولی یه عدد 96 تو کار بود فکر کنم. مثلا 16*6 . کسی اگه میدونه بگه.
نقل قول: اگر خواستم رو shp ها کلیک کنم و رنگ اونا رو عوض کنم باید چه دستوری بنویسم ؟
رویداد کلیک نداره؟
رویداد کلیک نداره. آخه آبجکت نیستند که. نقاشی هستند و فقط رنگ اون قسمت از فرم رو که روش قرار گرفتن، تغییر میدن.
نقل قول: چه دستوری بنویسم
دو راه داره. کمی صبر کنی کدش رو میذارم.
نقل قول: بد نیست دوستانی که در باره Handle و DC اطلاعاتی دارند بگن تا ما هم استفاده کنیم.
چه انجمن خواب آلودی. کسی نیست جواب ما رو بده. از اینجا میرم تا چند وقت دیگه. تو این انجمن یه زمانی اینقدر جواب میگرفتم که همش در حال تقدیر و تشکر از اساتید بودم ولی الان همه رفتن تو بخش آزاد فعالیت می کنن.
کد:
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Counter As Integer, Index As Integer
For Counter = 1 To shp.UBound
If X > shp(Counter).Left And X < (shp(Counter).Left + shp(Counter).Width) And Y > shp(Counter).Top And Y < (shp(Counter).Top + shp(Counter).Height) Then
Index = Counter
Exit For
End If
Next
If shp(Index).FillColor = vbRed Then shp(Index).FillColor = vbButtonFace Else shp(Index).FillColor = vbRed
End Sub
این راه اول درکش راحت تره ولی رو Shape آخر کلیک کنی حلقه باید تا آخره بره و سرعت برنامه پایین میاد (هر چند که محسوس نیست ولی ما میگیم حلقه هر چی طولانی تر باشه سرعت برنامه پایین میاد)
تو روش دوم باید طول و عرض دایره ها رو داشته باشیم. پس متغیرهای W و H رو به بخش General منقل می کنیم.
کد:
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Row As Long, Col As Long
Dim Rows As Long, Cols As Long
Dim Index As Long
Rows = Picture1.ScaleHeight \ (H - 1)
Cols = Picture1.ScaleWidth \ (W - 1)
Col = X \ (W - 1)
Row = Y \ (H - 1)
If X Mod (W - 1) > 0 Then Col = Col + 1
If Y Mod (H - 1) > 0 Then Row = Row + 1
Index = (Row - 1) * Cols + Col
If shp(Index).FillColor = vbRed Then shp(Index).FillColor = vbButtonFace Else shp(Index).FillColor = vbRed
End Sub
به این دو تا خط توجه کنید:
کد:
Col = X \ (W - 1)
Row = Y \ (H - 1)
از (W-1) و (H-1) استفاده شده چون لبه Shape ها روی هم هستند و کنار هم نیستند.
حالا این دو تا خط:
کد:
If X Mod (W - 1) > 0 Then Col = Col + 1
If Y Mod (H - 1) > 0 Then Row = Row + 1
در آخر مقادیر به اضافه یک شدند. چرا؟
فرض کنید ارتفاع دایره ها 10 پیکسل باشه (H=10)
وقتی که Y ماوس 10 باشه ما تو سطر اول هستیم. تقسیم صحیح 10 بر 10 میشه یک (همون چیزی که انتظار میرفت). اما اگه Y کمتر از 10 بود مثلا 6، اونوقت تقسیم صحیح 10 بر 6 میشد صفر (یک واحد کمتر از چیزی که انتظار میرفت)
باقیمانده تقسیم 10 بر 10 میشه صفر و سطر درست محاسبه میشه
باقیمانده تقسیم 6 بر 10 میشه 6 و سطر یکی کمتر مقدار مورد نظر محاسبه میشه
نتیجه: زمانی که باقیمانده بزرگتر از صفر باشه باید یکی به حاصل اضافه کنیم.
راه دوم خیلی بهتره. هر چندتا دایره که داشته باشی با همین چند خط کد مکانش پیدا میشه