PDA

View Full Version : مشکل عجیب در کار با توابع



mazy12
دوشنبه 14 بهمن 1387, 19:26 عصر
سلام دوستان ،
من یک مشکل عجیب بر خوردم! یک تابع تعریف کردم که از روی لیست باکسی که شامل آدرس چند تا فایله بهش ورودی میدم تا اون تابع اطلاعات اون فایل ها رو برام بخونه
حالا مشکل این جاست وقتی این کارو انجام میدم فقط رو آخرین فایل کار می کنه و وقتی یک msgbox قرار میدم همه فایل ها رو میخونه؟

به نظر شما دلیلش چیه؟



For k = 1 To List4.ListCount - 1
FileAdr = List4.List(k)
'MsgBox FileAdr
Call ReadFilz(ّFileAdr)
Next k

xxxxx_xxxxx
دوشنبه 14 بهمن 1387, 19:52 عصر
متغيرهاي استفاده شده تو تابع رو بايد reset كنيد
به private يا public بودن متغيرها توجه كنيد

reza_mn
دوشنبه 14 بهمن 1387, 22:18 عصر
خروجی تابع چیست ؟
کد مربوط به قسمت خروجی تابع را بذارید دوستان بیشتر میتونن راهنمایی بکنن

mazy12
سه شنبه 15 بهمن 1387, 15:29 عصر
متغيرهاي استفاده شده تو تابع رو بايد reset كنيد
به private يا public بودن متغيرها توجه كنيد

منظورتون رو از reset کردن متغییرهای تابع متوجه نشدم میشه بیشتر توضیح بدید؟
همه متغییرها private و داخل تابع است.

reza_mn
سه شنبه 15 بهمن 1387, 15:48 عصر
نظر دادن بدون مشاهده کد و نحوه استفاده از متغیرها ، ممکنه اشتباه باشه ، شما کد مربوط به خروجی تابع را قرار دهید . چرا که ممکن است شما مقداری را مثلا به یک متغیر تعریف کنید و با هر بار ارسال درخواست ، مقدار متغیر به آخرین جواب درخواست تغییر یابد.

mazy12
چهارشنبه 16 بهمن 1387, 00:04 صبح
این هم تابع است، نکته جالب اینجاست وقتی msgbox قبل از ارسال به تابع fileadr رو چاپ میکنم کار میکنه اما وقتی بر میدارم خیر !




Function ReadFilz (ByVal FileAdr As String)


Dim URL As String
Dim Flags As Long
Dim TargetFrame As String
Dim PostData() As Byte
Dim Headers As String


URL = "http://localhost/fileadress.php"
Flags = 0
TargetFrame = ""

PostData = "subject=" & "Test" & "&Body=" & FileAdr

' VB creates a Unicode string by default so we need to
' ' convert it back to Single byte character set.
PostData = StrConv(PostData, vbFromUnicode)

Headers = "Content-Type: application/x-www-form-urlencoded" & _
vbCrLf
WebBrowser1.Navigate URL, Flags, TargetFrame, PostData, Headers

End Function

vbhamed
چهارشنبه 16 بهمن 1387, 08:42 صبح
سلام

مشكل شما واقعا عجيبه و اين مشكل مربوط به اديتور ويژوال بيسيك مي شود

در دستور Call ReadFilz(ّFileAdr) قبل از حرف F كلمه FileAdr يك كاراكتر نامرئي درج شده كه فضايي هم اشغال نمي كنه اما اگر با كليدهاي جهتي حركت كنيد مي بينيد به اون نقطه كه مي رسيد كليد جهتي رو مي زنيد ولي مكان نما حركت نمي كنه
ويژوال بيسيك هم فكر مي كنه متغير جديد تعريف كرديد و مقدارش پوچ هست
براي ديدن اون كاراكتر اين خط رو تو Run ويندوز Paste كنيد

واسه رفع مشكل هم با يك Delete ساده اون كاراكتر رو پاك كنيد يا اينكه اين خط رو پاك كنيد و دوباره بنويسيد

اما واسه اينكه اين مشكل ديگه پيش نياد بايد به ويژوال بيسيك بگيد كه تعريف كردن متغيرها رو ازتون بخواد
براي اين كار بالاترين قسمت كد فرم دستور زير رو بنويسيد
Option Explicit

البته از اينجا هم ميشه
Tools->Option->Editor->Require Variable Declaration رو تيك بزنيد
با انجام اين كار عبارت Option Explicit بالاي فرمهايي كه از اين به بعد به پروژه اضافه مي كنيد اتوماتيك اضافه مي شه و براي فرمهاي جاري هم بايد خودتون بنويسيد

با اين كار ويژوال بيسيك شما رو مجبور مي كنه متغيرهاتون رو تعريف كنيد كه اين يك كار بسيار اصولي هست و باعث ميشه اگر چنين خطاهايي پيش اومد خودش به شما هشدار بده كه اين متغير رو نمي شناسه

e601
چهارشنبه 16 بهمن 1387, 21:49 عصر
سلام

مشكل شما واقعا عجيبه و اين مشكل مربوط به اديتور ويژوال بيسيك مي شود

در دستور Call ReadFilz(ّFileAdr) قبل از حرف F كلمه FileAdr يك كاراكتر نامرئي درج شده كه فضايي هم اشغال نمي كنه اما اگر با كليدهاي جهتي حركت كنيد مي بينيد به اون نقطه كه مي رسيد كليد جهتي رو مي زنيد ولي مكان نما حركت نمي كنه
ويژوال بيسيك هم فكر مي كنه متغير جديد تعريف كرديد و مقدارش پوچ هست
براي ديدن اون كاراكتر اين خط رو تو Run ويندوز Paste كنيد

واسه رفع مشكل هم با يك Delete ساده اون كاراكتر رو پاك كنيد يا اينكه اين خط رو پاك كنيد و دوباره بنويسيد

اما واسه اينكه اين مشكل ديگه پيش نياد بايد به ويژوال بيسيك بگيد كه تعريف كردن متغيرها رو ازتون بخواد
براي اين كار بالاترين قسمت كد فرم دستور زير رو بنويسيد
Option Explicit

البته از اينجا هم ميشه
Tools->Option->Editor->Require Variable Declaration رو تيك بزنيد
با انجام اين كار عبارت Option Explicit بالاي فرمهايي كه از اين به بعد به پروژه اضافه مي كنيد اتوماتيك اضافه مي شه و براي فرمهاي جاري هم بايد خودتون بنويسيد

با اين كار ويژوال بيسيك شما رو مجبور مي كنه متغيرهاتون رو تعريف كنيد كه اين يك كار بسيار اصولي هست و باعث ميشه اگر چنين خطاهايي پيش اومد خودش به شما هشدار بده كه اين متغير رو نمي شناسه

با سلام

به نظر من اگه قرار باشه اشکال کار این تابع از نام متغیر پاس شده باشه برای یک مورد هم نباید این اتفاق بیفته
همونطوری که دوستمون گفتن در حالت معمولی و بدون قرار دادن دستور msgbox قبل از دستور ReadFilz حداقل یکبار و اونم برای آخرین آدرس فایل پاس شده تابع کار میکنه

mazy12 عزیز به 2 نکته بیشتر دقت کن:
1. لیست ایندکسهای یک ListBox از صفر شروع میشه یعنی برای اینکه حلقه روی اولین آیتم لیست عمل کنه باید کد بصورت زیر تصحیح بشه:


For k = 0 To List4.ListCount - 1
FileAdr = List4.List(k)
'MsgBox FileAdr
Call ReadFilz(ّFileAdr)
Next k

2. در بعضی مواقع که گاهی برای خود منم مشکل ساز شده سرعت بیش از حد حلقه ها از جمله ساختار For...Next هست
پیشنهادمیکنم قبل و یا بعد از خط Call ReadFilz(ّFileAdr) دستور DoEvents رو امتحان کنید ببینید مشکل حل میشه با نه

موفق باشید...

vbhamed
پنج شنبه 17 بهمن 1387, 15:54 عصر
به نظر من اگه قرار باشه اشکال کار این تابع از نام متغیر پاس شده باشه برای یک مورد هم نباید این اتفاق بیفته
همونطوری که دوستمون گفتن در حالت معمولی و بدون قرار دادن دستور msgbox قبل از دستور ReadFilz حداقل یکبار و اونم برای آخرین آدرس فایل پاس شده تابع کار میکنه


سلام
دوست عزيزم

من برنامه ايشون رو تست كردم و به روشي كه گفتم مشكلشون حل ميشه
شما خودتون اون خط رو توي Run ويندوز يا Notepad كپي و Paste كنيد تا كاراكتر نامرئي رو ببينيد

mazy12
پنج شنبه 17 بهمن 1387, 18:45 عصر
دوستای عزیز از کمکتون ممنونم ، این کاراکتری که vbhamed عزیز اشاره کردند فکر میکنم زمان paste کردن تو ادیتور وبسایت بوجود اومده ایراد از نبودن DoEvents بود بعد از ارسال به تابع ، یعنی سرعت حلقه انقدر زیاده که قبل این که کنترل browser اطلاعات رو ارسال کنه اطلاعات بعدی میومده.