ايران ويج

نسخه‌ی کامل: ارسال و خوندن یک آرایه به یک کلاس
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام ،

خوشحالم که اینجا دوباره راه افتاد.
آقا اشکان دست شما درد نکنه.

یه سوال ؛

در ویژوال بیسیک اگر این کلاس رو داشته باشیم:
کد:
Dim X As Single

Property Get pt_X() As Single
    pt_X = X
End Property

Property Let pt_X(tx As Single)
    X = tx
End Property

براحتی میشه بدین ترتیب :
کد:
Dim myClass As Class1
Set myClass = New Class1

myClass.pt_X = 1
MsgBox myClass.pt_X

میشه متغییر X رو در سطح کلاس مقدار دهی کرد و مقادرش رو خوند.
حالا اگر X به صورت آرایه باشه چطور میشه اون رو در سطح کلاس مقدار دهی کرد .
به عبارتی یه آرایه رو به یه Property از کلاس نسبت داد و یا اون رو خوند ؟



تشکر
نبی
این کد رو الان نوشتم ببین به کارت میاد:
سلام
از کدی که نوشتید ممنونم.
جالب بود.
اما در مورد آرایه های دو بعدی چیکار باید کرد؟ باید دو تا پارامتر index تعریف کرد؟ ولی unbound فقط بعد اول رو برمیگردونه ! در مورد بعد دوم آرایه چطور میشه ماکزیمم آندیس رو برگردوند.
اگر کد بزارید ممنونمیشم.
راستی اگر میشه در مورد آندیس فانکشن ها هم یه توضیح بدید که چطوری پارامتر اول رو به صورت آندیس آرایه میگیره ولی پارامتر آخر رو نمیگیره ...

ممنون
نبی
NabiKAZ نوشته است:اما در مورد آرایه های دو بعدی چیکار باید کرد؟ باید دو تا پارامتر index تعریف کرد؟
درسته باید همین کار رو کرد. ولی با افزایش بُعد آرایه کارها خیلی مشکل میشه. کدی که قبلا برات گذاشتم انعطاف زیادی داشت یعنی می شد از اون کد ها به سادگی بدون تغییر خاصی درون هر برنامه دیگه ای هم استفاده کرد.
اما برنامه ضمیمه جدید خاصیت قبلی رو نداره تا نیاز های جدید برنامه ساز رو برآورده کنه. یعنی اینکه سفارش برای مربعی کردن بُعد باند این نوع کد ها رو ایجاب می کنه!
NabiKAZ نوشته است:ولی unbound فقط بعد اول رو برمیگردونه ! در مورد بعد دوم آرایه چطور میشه ماکزیمم آندیس رو برگردوند.
این سوال جواب ظریفی داره.
من هم وقتی بهش احتیاج پیدا کردم سر پروژه کنترل مبدل تاریخ بودم که آرایه های موجود در صفحه تاریخ (همون روزه ها) تشکیل بُعد مربعی رو میدادند. برای جوابش خیلی جستجو کردم و تقریبا همه مستندات رو زیر رو کردم و کلی کد رو مطالعه کردم, اما جواب رو پیدا نکردم.
در واقع جواب خیلی ساده تر از اینه که فکرش رو کنی. به طور تصادفی به فکرم رسید و وقتی امتحانش کردم دیدم خوشه!
جواب در خود Ubound هست به طور پیش فرض برای آرایه های تک بُعدی هر دو کد زیر یک نتیجه ای داره:
کد:
Dim A(5) as String  <Code
Debug.Print Ubound(A)  <Code
_______________________
Dim A(5) as String  <Code
Debug.Print Ubound(A,1)  <Code
_______________________
جواب در هر دو حالت: 5

باید شماره بُعدی که می خوای بدونی چقدر پهنای باند داره رو به عنوان ورودی دوم به تابع Ubound وارد کنی. مثال:

کد:
Dim A(5,10,2,7)   <Code
Ubound(A,1)=5
Ubound(A,2)=10
Ubound(A,3)=2
Ubound(A,4)=7
NabiKAZ نوشته است:راستی اگر میشه در مورد آندیس فانکشن ها هم یه توضیح بدید که چطوری پارامتر اول رو به صورت آندیس آرایه میگیره ولی پارامتر آخر رو نمیگیره ...
متوجه این سوالت نشدم. لطفا یک کمی بیشتر توضیح بده.
سلام
بازم از توضیحات و کد خوبت ممنونم دارگ عزیز. روی کدت کار میکنم ...


در مورد Ubound هم نکته جالبی بود...


در مورد سوال آخرم هم :
منظورم اینه مثلا وقتی نوشته میشه:
NCTest.Arrays (0)
یه مقدار رو (در اینجا 0) به عنوان ورودی دریافت میکنه. در صورتی که در اینجا اینگونه تعریف شده:
Public Property Let Arrays(Index As Integer, NewNumber As Single)

آیا به خاطر خط زیره که میفهمه فقط پارامتر اول رو باید از بیرون به داخل کلاس پاس داده بشه:
Public Property Get Arrays(Index As Integer) As Single

سوالم ابتدایی تر از اون چیزیه که فکر میکنید. مشکل در تفهیم و روش استفاده از کلاس هاست که من باشون کم کار کردم.


تشکر
نبی
نه از Property Get نیست. همون طور که خودت هم می دونی این زیر برنامه فقط برای دریافت مقدار خصوصیت از خارج کلاس, ایجاد شده.
اگر هم می بینی شکل Property Let به صورت زیر هست:
Property Let Arrays(Index As Integer, NewNumber As Single
علتش تنها اینه که این قالب دستور زبانه و نه چیز دیگه ای.
اما اونجایی که پرسیدی درباره "آندیس فانکشن ها" من تعجب کردم چون این ها خصوصیت Property هستند و دستور زبان (گرامر) وی بی در موردشون فرق می کنه. فقط همین و همون طور که خودت اشاره کردی "سوالت ابتدایی تر از اون چیزیه که فکر میکنید".
سلام
ببخشید دیر جواب میدم.
راستش همون موقع ها یه جواب مفصل و بلند بالا آماده کرده بودم که حذف شد، دیگه سرد شدم ...
فقط یه چیزیش یادمه....

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

بازم ممنون
نبی