ايران ويج

نسخه‌ی کامل: چند تا سوال درمورد object ها ...
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2 3 4 5
hamed_Arfaee نوشته است:خوب شما بیا با مختصات نقاط کار کن و با در دست داشتن یک ماتریس n*nمی تونی به هر گرهی دسترسی داشته باشی

چگونگي انجام اين کار مهمه که همين مورد سواله !
که البته دوستمون Darg فکر ميکنم راهش رو توضيح دادند...
تشکر
Darg نوشته است:spiderman برنامه خوبی نوشتی دستت درست (فقط ای کاش برای دکمه Exit خروج رو کد نویسی می کردیShy     )
یک راه اینه که به جای استفاده و پردازش ایندکس اشیاء از حافظه کمک بگیری یعنی آرایه ای تعریف کنی ساختارش یک ماتریس باشه همون طور که دوستان اشاره کردند
اما اگر من جای شما بودم (روش خودم) اصلا هیچ کار اضافی یا تعریف حافظه ای در نظر نمی گرفتم چرا که خود ایندکس ها جواب رو در هر فراخوانی به ما میدند فقط یکمی محاسبه ریاضی می خواهد
این هم بپستگی داره به ترتیب چیدمان اشیاء روی هر گره
فرض کنیم که اشیاء رو به شکل زیر بچینی

3     2     1     0
7     6     5     4
11   10    9    8
15   14   13   12

خوب حالا میخوای بفهمی شیء ایندکس 11 کجاست یعنی شماره ردیف و ستونش چیه
ستونش میشه:   I mod 4+1 ===> 11 mod 4=3+1=4
ردیفش:              I\4+1   ===>  11\4+1=3


NabiKAZ نوشته است:این TypeName که گفتید در ازای هر اندیسی مقدار Line رو برمیگردونه ، ولی من میخوام متوجه بشم شیء با اندیس خاص وجود دارد یا خیر .

یه مثلی هست که میگه شما اول برادری خودت رو ثابت کن (چه ربطی داشت)
شما اول بیا تایین کن که شیء وجود داره بعدا خیلی روش هست که میشه فهمید فلان ایندکش هم هست با نه
مثلا تله خطا : اگر بخوای یک شیء با یک ایندکس رو که وجود داررو دوباره ایجاد کنی خطلا میده (این فقط یه مثال بود مطمعنم راههای بهتری هم به ذهنت میرسه)
با اینکه برای چک کردن حداکثر ایندکس های یک شیء یا آرایه از فرمان
UBound
و برای مینیمم از فرمان
LBound
استفاده کن


راستی اگر تونستی شیء جدید ایندکسی ایجاد کنی روشش رو به ماهم بگو یاد بگیریم.


سلام
روش ریاضی که ارائه دادی فوق العاده جالب و زیرکانه بود. دستت درد نکنه .
فقط شماره اندیس های من از 1 شروع میشه ، یه تغییر کوچیک باید تو فرمول داد ، فکر کنم اینجوری میشه:
4 3 2 1
8 7 6 5
12 11 10 9
16 15 14 13
ستون: I mod 4
ردیف: I\4+1
مثلا در مورد اندیس 6 میشه:
ستونش میشه: I mod 4 ===> 6 mod 4 = 2
ردیفش میشه: I\4 ===> 6\4+1 = 2
البته عدد 4 در فرمول های بالا همان حدکثر ستونهاست!
که درسته.
ولی این فرمول برای ستون های انتهایی دچار خطا میشه !
مثلا برای 12 :
ستون میشه: 0
ردیف میشه: 4
آیا باید در مورد اعدادی که مضاربی از تعداد حداکثر ستونها (در این مثال 4) هستند مثل استثنا قائل شد و تصحیح لازم رو روی اونها اعمال کرد یا اینکه فرمول کلی و مناسب تری پیشنهاد میکنید.

در مورد روش "تله خطا" هم من تصمیم داشتم کاری کنم که از این روش استفاده نشه ! وگرنه به ذهنم رسیده بود. تابع UBound هم تنها در مورد آرایه ها کاربرد داره و روی اشیاء کار نمیکنه !
البته در اون مقطع که سوال رو پرسیدم ناچاراً با روش تله خطا مشکل رو مرتفع کردم ولی الان دیگه مهم نیست چون همون طور که گفتم تصمیم گرفتم برنامه رو روش متند Line سوئیچ کنم .

متشکرم
نبی
ستون رو بگیر ( I-1 مود 4 ) به اضافه یک (اینم شد ادیتور)
ردیف هم ( I-1 تقسیم بر 4) به اضافه 1
من همه رو نخوندم ولی هر چی هست فکرکنم وقتی یه پنجره ار رو برنامت رد بشه هر چی کشیدی پاک می شه یا با یه ماکزیمم مینیمم کردن بد نیست اینم چک کنی
سلام دوستان

من با Controls.Add .... چند وقت پیش یک
دکمه ساختم من چه طوری میتونم واسش رویداد کلیک تعریف کنم ؟
من به نتیجه نرسیدم ویخوام این دکمه که با این دستور ایجاد شد
وقتی روش کلیک شد یه پیغام بده یا . . .

ha_60 نوشته است:ستون رو بگیر ( I-1 مود 4 ) به اضافه یک (اینم شد ادیتور)
ردیف هم ( I-1 تقسیم بر 4) به اضافه 1
من همه رو نخوندم ولی هر چی هست فکرکنم وقتی یه پنجره ار رو برنامت رد بشه هر چی کشیدی پاک می شه یا با یه ماکزیمم مینیمم کردن بد نیست اینم چک کنی

سلام
ای ول ! درسته همینه !

در مورد مشکلی هم که ذکر کردی ، یا ست کردن خاصیت AutoRedraw به True خطوط رسم شده بر روی فرم حذف نمی شوند.

تشکر
نبی
vblove نوشته است:سلام دوستان

   من با Controls.Add ....   چند وقت پیش  یک
   دکمه ساختم من چه طوری میتونم واسش رویداد کلیک تعریف کنم ؟
   من به نتیجه نرسیدم ویخوام این دکمه که با این دستور ایجاد شد
   وقتی روش کلیک شد یه پیغام بده یا . . .

  

سلام
همون طوري که دوستمون Darg در بالا اشاره کردند در مورد CommandButton و امثالهم که رويداد پذير هستند بايد بصورت WithEvents تعريف بشوند. کد مربوط به صورت گرفتن کليک هم ميتواني دستي بنويسي اگر Button موجود بود ، رخ داد اون هم کار ميکنه در غير اين صورت مشکلي بوجود نمياد. کد زير مثال عملي مي باشد:
کد:
Dim WithEvents NewButton As VB.CommandButton

Private Sub Form_Load()
Set NewButton = Controls.Add("VB.CommandButton", "NewButton", Me)
NewButton.Visible = True
End Sub

Private Sub NewButton_Click()
MsgBox "click"
End Sub

نبي
من برنامه محمد حسین رو کاملترش کردم و فکر کنم سرعتش رو تا 10 برابر بیشتر کردم و یک کار بزرگ هم که کردم نوشتن کد دکمه خروج بود
در ضمن علت افزایش سرعت رو هم خودتون باید پیدا کنید
http://www.basic.persiangig.com/Archive/Grid.zip
دوباره برنامه رو بروز کردم و فکر کنم همونی که می خواهیش ولی این سرعتش خیلی کمه و اگر خواستی سرعتش یکم زیاد تر بشه اون کد نقطه
گذاری رو حذفش کن بازم روش کار می کنم

http://www.basic.persiangig.com/Archive/Grid2.zip
جالب شد. میگم می خواین کد اصلی رو هم بهتون بدم کاملش کنین. دست من پیشرفت نمیکنه !
درضمن اسم من محمد !
ScaleWidth , Step , Split
اینا چین ؟!! یکی توضیح بده
از کجا میارین اینا رو ! ؟ !!!
spiderman نوشته است:ScaleWidth , Step , Split
اینا چین ؟!! یکی توضیح بده
از کجا میارین اینا رو ! ؟ !!!

یه سوالی ازت دارم, تاحالا VB خوندی ؟Shy

split= تکه کردن- لغمه, لغکه کردن-از هم جدا کزدن-شکافتن
کارش: تبدیل یک رشته به چند واحد
فرمتش:
Split(Expression As String, [Delimiter], [Limit As Long = -1], [Compare As VbCompareMethod = vbBinaryCompare])

توضیح بیشتر: خیلی از مواقع لازم میشه چندین داده با فرمت مشخص رو درون حافظه نگه داری بنابراین میایی و به تعداد مورد نیاز آرایه در حافظه تعریف میکنی اما من اصلا از این کار خوشم نمی آید (بگو مگه حافظه مال باباته)
به جای این کار میام و تمام داده ها رو درون یک رشته قرار میدهم و در مواقع لزوم داده مورد نظرم رو از اون رشتهه استخراج میکنم !
مثلا فرض کنیم میخواهیم اعداد 10, 20, 30, 400, 500 و 600 رو ذخیره کنیم. باید رشته ای تشکیل بدم که تکتک عناصر داده ای در اون با کاراکتر خاصی (در ایجا از کاما استفاده میکنم چون هیچ کدوم از اعداد این کاراکتر رو ندارند) از هم جدا بشوند
رشته="10,20,30,400,500,600"

حالا اگر بخوام همه داده ها رو درون یک آرایه داشته باشم از کد زیر استفاده می کنم:
نقل قول: MemoStr$="10,20,30,400,500,600"
Dim JH() as integer
JH=Split(MemoStr$,",")

خروجی زیر حاصل کد بالاست:
JH(0)=10
JH(1)=20
JH(2)=30
JH(3)=400
JH(4)=500
JH(5)=600

اما اگر نخواهیم از یک آرایه استفاده کنیم یا مثلا فقط با داده عنصر 4 ام کار داشته باشیم میشه از روش زیر هم استفاده کرد:

نقل قول: IntNumber=Split(MemoStr$,",")(4)

برای کامل کردن این بحث هم بگم که فرمان Join دقیقا عکس Split کار می کنه یعنی مثلا اگر آرایه مقدار دار JH که در بالا عنوان شد رو وارد Join کنی عناصرش به هم ملحق میشند ورشته MemoStr بالا رو به خروجی می فرسته.
-------------------------------------------------
Step=گام, رتبه, پرش, قدم زدن
در حلقه For به طور پیش فرض به آرایه ایندکس شما فقط یک واحد در هر گردش اضافه میشه یعنی فرمان به شکل زیره:

نقل قول: For ISum=0 to 100
Print ISum
Next ISum

معادل کد بالا:

نقل قول: For ISum=0 to 100 Step 1
Print ISum
Next ISum

یعنی عدد بعد از لفظی Step که تعیین می کنه چه مقدار به آرایه اضافه بشه
حالت بسیار عالی کاربرد Step زمانیه که بخواهیم از آرایه مقداری کم بشه که در این حالت عدد بعد از اون رو منفی میزایم (قیب گفتم مگه نه)

-------------------------------------------
ScaleWidth= اندازه پهنای واقعی (استنباط رایانه ایشه)

اگر می خواهید اندازه واقعی یک شئ مانند یک فرم (اندازه بدون تیتل بار و حاشیه اطراف) رو داشته باشید از خصوصیت ScaleWidth , ScaleHeight اون شئ استفاده کنید. این دو خصوصیت با تغییر خصوصیت ScaleMode شئ به طور اتوماتیک به روز میشند و دیگه لازم نیست چند ده خط کد برای محاسبه اندازه ها بنویسید.
مثل من سعی کنید که عادت کنید به جای Width , Height از معادل های Scale شون استفاده کنید تا مکان اشیاء مورد نظرتون همیشه دقیق باشه !
صفحه‌ها: 1 2 3 4 5