View Full Version : نحوه خاص مقداردهی تابع Filter
systole
جمعه 16 فروردین 1392, 21:58 عصر
سلام
دوستان به کد زیر توجه کنید:
Dim TestStrings(2) As String
TestStrings(0) = "This"
TestStrings(1) = "Is"
TestStrings(2) = "It"
Dim subStrings() As String
' Returns ["This", "Is"].
subStrings = Filter(TestStrings, "is", True, vbTextCompare)
' Returns ["This"].
subStrings = Filter(TestStrings, "is", True, vbBinaryCompare)
' Returns ["Is", "It"].
subStrings = Filter(TestStrings, "is", False, vbBinaryCompare)
چطور تابع فیلتر آرایه subStrings رو مقدار دهی میکنه در صورتی که در حالت عادی نمیشه یه چنین کاری کرد؟
systole
شنبه 17 فروردین 1392, 09:48 صبح
از دوستان کسی نبود راهنمایی کنه؟
بدجوری ذهنم رو مشغول کرده...یعنی این حالت تنها مخصوص تابع filter و تابع split میشه که یک آرایه دینامیک رو به این شکل مقداردهی کنن؟یا اینکه خود کاربر هم میتونه همچین توابعی رو پیاده سازی کنه؟
SlowCode
شنبه 17 فروردین 1392, 10:10 صبح
سلام
از پست اولت چیزی نفهمیدم! خیلی گنگ بود.
بله میشه پیاده سازیش کرد ولی سرعت میاد پایین.
باید یه حلقه داشتی باشی به اندازه UBound آرایه، بعد میای با Instr تک تک اعضای ارایه رو جستجو میکنی اگه وجود داشت به ارایه substring اضافش میکنی.
systole
شنبه 17 فروردین 1392, 10:20 صبح
ممنون از پاسختون محسن جان...
حرف شما درست اما نگاه کنید...در حالت عادی اگه همچین کاری کنیم نمیشه:
Dim a() as string
a() = "systole"
در واقع سوال من ربطی به پیاده سازی مجدد دو تابع filter و split نداره نکته مهم برام نحوه مقداردهی به آرایه هست.
امیدوارم منظورم رو متوجه شده باشید.
SlowCode
شنبه 17 فروردین 1392, 10:53 صبح
آهان:لبخند:
خب شما باید عنصر ارایه رو مشخص کنی دیگه.
a(0)="systole"
systole
شنبه 17 فروردین 1392, 18:11 عصر
محسن جان...مسئله همین جاست!!!!
شما به کدی که در پست اول گذاشتم توجه بفرمایید...
در ابتدا یه آرایه دینامیک تعریف شده:
Dim subStrings() As String
و بعد از اون بدون اینکه اندیس آرایه مشخص بشه تابع فیلتر دو آرایه با اندیس صفر و یک رو مقداردهی میکنه!!!(با توجه به برنامه موجود در پست اول)...بدون اینکه خبری از اندیس باشه...شما تست کنید بعد از اینکه اولین تابع فیلتر اجرا شد و subStrings رو مقداردهی کرد دو تا msgbox بذار که برات subStrings با اندیس صفر و یک رو نشون بده....
subStrings = Filter(TestStrings, "is", True, vbTextCompare)
یعنی بعد از اجرای کد بالا در برنامه موجود در پست یک که یه آرایه رو بدون ذکر اندیس مقداردهی کرده...!!!!!
SlowCode
شنبه 17 فروردین 1392, 18:33 عصر
دااش دقت نکردی دیگه
اگه خط آخر پست سوم رو بخونی، نوشتم که اون تابع میاد ارایه رو جستجو میکنه و هرچندتا عنصر که پیدا میکنه به آرایه substring اضافه میکنه.
یعنی خودش از صفر شروع میکنه و یکی یکی اضافه میکنه.
اینکار رو خود تابع میکنه. این تابع رو برات نوشتم بفرما:
Private Sub Form_Load()
Dim TestStrings(3) As String
TestStrings(0) = "this"
TestStrings(1) = "is"
TestStrings(2) = "a book"
SubString = myFilter(TestStrings, "is")
MsgBox SubString(1)
End Sub
Private Function myFilter(SourceArray As Variant, MatchString As String) As Variant
Dim temp()
ReDim temp(UBound(SourceArray))
pos = 0
For i = 0 To UBound(SourceArray)
If InStr(1, SourceArray(i), MatchString, vbTextCompare) > 0 Then
temp(pos) = SourceArray(i)
pos = pos + 1
End If
Next
myFilter = temp()
End Function
vbhamed
شنبه 17 فروردین 1392, 19:07 عصر
سلام
Dim x() As String
ReDim x(10) As String
.
.
.
ReDim Preserve x(20) As String
.
.
.
ReDim Preserve x(5) As String
وقتي آرايه اي بدون تعداد عناصر تعريف بشه ميشه بعدا با Redim ابعادش رو تعيين كرد اما اينكار باعث ميشه اطلاعات قبلي آرايه پاك بشن كه براي جلوگيري از اين مورد كلمه كليدي Preserve بايد اضافه بشه
systole
شنبه 17 فروردین 1392, 20:28 عصر
ممنون محسن جان...کاملا متوجه شدم...
فقط یه نکته ای ؛ تو خط هفتم که دستور نمایش آرایه با اندیس 1 رو دادید ظاهرا فراموش کردید که دستور نمایش آرایه با اندیس صفر رو هم بدید...چون اونم مقدار گرفته.
به هر حال خیلی خیلی ممنون.
موفق باشید.
systole
شنبه 17 فروردین 1392, 20:56 عصر
سلام مجدد
عذر میخوام...
حین کار با کد به یه نکته ای برخوردم که بازم ذهنمو درگیر کرد.
اگه ما SourceArray رو از نوع string تعریف کنیم حتما باید پرانتز TestStrings که قراره به تابع ارسال بشه و همچنین پرانتز جلوی SourceArray هم باید ذکر بشه چرا؟
اما وقتی SourceArray از نوع variant تعریف شده باشه نیازی به ذکر پرانتز ها نیست و ویژوال بیسیک ایراد نمیگیره...
SlowCode
یک شنبه 18 فروردین 1392, 13:20 عصر
ممنون محسن جان...کاملا متوجه شدم...
فقط یه نکته ای ؛ تو خط هفتم که دستور نمایش آرایه با اندیس 1 رو دادید ظاهرا فراموش کردید که دستور نمایش آرایه با اندیس صفر رو هم بدید...چون اونم مقدار گرفته.
به هر حال خیلی خیلی ممنون.
موفق باشید.
نه ایندکس 1 رو واسه مثال نوشتم، اون دست خودته دیگه هر کدوم رو خواستی بنویس.
حین کار با کد به یه نکته ای برخوردم که بازم ذهنمو درگیر کرد.
اگه ما SourceArray رو از نوع string تعریف کنیم حتما باید پرانتز TestStrings که قراره به تابع ارسال بشه و همچنین پرانتز جلوی SourceArray هم باید ذکر بشه چرا؟
اما وقتی SourceArray از نوع variant تعریف شده باشه نیازی به ذکر پرانتز ها نیست و ویژوال بیسیک ایراد نمیگیره...
بله اینطوره ولی اگه از نوع string تعریف کنی فقط میتونی یه عنصر از آرایه رو به تابع بفرستی و این به درد ما نمیخوره!
ما میخواییم کل ارایه رو بهش بدیم تا بررسی کنه، پس از نوع variant انتخاب میکنیم چون همه داده های وی بی رو از جمله آرایه رو پشتیبانی میکنه.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.