منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : كلام في استخدام الدوال والروتينات function and sub
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

كلكم تعرفون الدوال Functions و الروتينات Subs العادية.

الفرق بينهما(من واقع تجربتي) شيء واحد :
. الدالة ترجع قيمة والروتين لايرجع قيمة .
في المثال "الناسخ الديناميكي" استخدمت الاثنين.


مثلا اردت سحب محتوى صفحة مثلا من عنوان :
PHP كود :
http://vb4arb.com/vb/thread-205.html 
وتعلمون اننا نحتاج عملية السحب عدة مرات مثلا لسحب روابط الصور والمرفقات والسكريبتات والستايل.
فنحتاج هنا الى دالة واحدة نسحب من خلالها المحتوى مرة واحدة مثلا
PHP كود :
dim url as string="http://vb4arb.com/vb/thread-205.html



الان لنجهز دالة تقوم بالمطلوب
لنسميها
getpagestrings
PHP كود :
Private Function getpagestrings(ByVal url As String) As String
        Dim html 
As String ""
        
Dim wc As New WebClient
        wc
.Encoding Encoding.UTF8

aa
:
        If 
My.Computer.Network.IsAvailable Then
            
If My.Computer.Network.Ping(justdo.Trim) = False Then
                
' fil_frmstate("تم فقد الاتصال .. تفقد الاسلاك بينما نعاود المحاولة")
                fil_lblstate("تم فقد الاتصال .. تفقد الاسلاك بينما نعاود المحاولة")
                GoTo aa
            End If
        Else

            '  
fil_frmstate("تم فقد الاتصال .. تفقد سلك الايثرنت بينما نعاود المحاولة")
            
fil_lblstate("تم فقد الاتصال .. تفقد سلك الايثرنت بينما نعاود المحاولة")

            GoTo 
aa
        End 
If
        Try
            
html wc.DownloadString(url)

        Catch 
ex As Exception
            
If url.Contains(justdoThen
                
' fil_frmstate("تم فقد الاتصال .. تفقد سلك الايثرنت بينما نعاود المحاولة")
                fil_lblstate("تم فقد الاتصال .. تفقد سلك الايثرنت بينما نعاود المحاولة")
                GoTo aa
            End If
        End Try
        Return html
    End Function 
الان الدالة جاهزة ولاحظ كيفية صياغتها
PHP كود :
Private Function getpagestrings(  ByVal url As String     ) As String 
انظر للملون (مدري ليه عجزت الون جزء معين بالمحرر الحاليSad ) هذا هو الذي يهمنا وهو نفس الروتين العادي الا اننا هنا نستطيع معرفة المحتوى لذلك انظر لاخر الدالة لكلمة:
PHP كود :
Return html 

الان لنعود الى الخطوة السابقة وهي رغبتنا بسحب محتوى صفحة
عرفنا سابقا رابط url واسندنا له رابط لموضوع احد الاخوة الفضلاء sooriaty03 وهو رابط
http://vb4arb.com/vb/thread-205.html
الان لنقم بالتجربة
PHP كود :
dim html as string=getpagestrings(url
هل رايتم؟
اسندنا رابط للدالة والدالة اعادت لنا محتوى الصفحة وهكذا لن نضطر للقراءة لمحتوى صفحة كل ما اردنا معرفة المحتوى بل المحتوى جاهز بالمتغير المحلي html

الان نحتاج لامر سحب روابط الصور من المحتوى html الذي جهزناه فما هو هذا الامر؟
1-دالة.
2-روتين عادي sub
؟
------
الجواب بما اننا نحتاج قيمة معادة فنحن نضظر لاستخدام الدالة Function
لذلك فلنجهز دالة سحب روابط الصور
PHP كود :
Private Function getpicslinks(ByVal content As String) As List(Of String)
        
'<img src="http://im80.gulfup.com/306wzE.png?dateline=1395740337"

        Dim piclink As New List(Of String)
        Dim str As String = "(<img src="").*\.(gif|png|jpg|jpeg|bmp)"
        Dim reg As New Regex(str)
        Dim coll As MatchCollection = reg.Matches(content)
        For Each ma As Match In coll

            ' 
MsgBox(ma.Value)
            
piclink.Add(ma.Value)
        
Next
        
Return piclink
    End 
Function 

انظر لصياغة الدالة جيدا وقارنها بما قبلها
PHP كود :
Private Function getpicslinks(ByVal content As String) As List(Of String
لاحظ كلمة content وذلك نعني ان المحتوى جاهز ونريد البحث ضمنه
ثم دقق في النوع القيمة المعادة وهو مبين اخر السطر
PHP كود :
As List(Of String
ثم انظر الى جملة التعريف التالية:
كود :
Dim piclink As New List(Of String)
نفس نوع الدالة اي نقوم بتجميع كل الروابط ضمن قائمة ونعيدها الى المستفسر بالجملة التالية:
PHP كود :
Return piclink 

الان لنرجع للخطوة السابقة وهي رغبتنا بسحب روابط الصور بواسطة هذه الدالة
PHP كود :
'=======تحميل الصور
            For Each pic In getpicslinks(html)
                fil_lblstate("سرد الصور لحفظها")
                If thbgw.CancellationPending Then
                    Exit For
                    Exit Sub
                End If
                fil_lblstate("استبدال روابط الصور")
                html = html.Replace(pic.Split("""")(1), "images\" & IO.Path.GetFileName(pic.Split("""")(1)))
                If IO.File.Exists("mybb\images\" & IO.Path.GetFileName(pic.Split("""")(1))) = False Then
                    fil_lblstate("تحميل الصورة: " & pic.Split("""")(1))
                    downloadpic(pic.Split("""")(1))
                End If
            Next 

لاحظ جيدا هذه الجملة
PHP كود :
For Each pic In getpicslinks(html

لان الدالة ستعيد قائمة بالروابط لذلك ناسب ان نستخدم حلقة لتمر على كل بنود هذه القائمة
انظر للعمل كيف يكون من استبدال لروابط الصور في المحتوى html لكن دقق في الخطوة التالية:

وهي اننا حصلنا على روابط عدة ونريد امر لتحميل اي رابط بشكل فوري فماهو الامر؟
1- دالة.
2-روتين عادي
؟
الان نحن لا نحتاج قيم معادة لذلك سنستخدم روتين عادي Sub
لنقم بتجهيزه بحيث يحتاج وسيطة رابط للصورة او اي ملف لتحميله
PHP كود :
Private Sub downloadpic(ByVal url As String)
        
url url.Replace("./""")
        If 
url.StartsWith("http") = False Then
            url 
url.Insert(0bade justdo "/" foru "/")
        
End If
        
Dim wc As New WebClient
        wc
.Encoding Encoding.UTF8
aa
:
        If 
My.Computer.Network.IsAvailable Then
            
If My.Computer.Network.Ping(justdo) = False Then
                fil_lblstate
("تم فقد الاتصال ..تاكد مما لديك بينما نحاول مرة اخرى")
                
Threading.Thread.Sleep(200)
                GoTo 
aa
            End 
If
        Else
            
fil_lblstate("تم فقد الاتصال ..تاكد من تركيب كبل الايثرنت")
            
Threading.Thread.Sleep(200)

            GoTo 
aa
        End 
If
        
fil_lblstate("تحميل الملف: " IO.Path.GetFileName(url))
        
On Error Resume Next
        wc
.DownloadFile(urlApplication.StartupPath "/mybb/images/" IO.Path.GetFileName(url))
    
End Sub 

انظر للسطور الاولى ضمن الروتين
PHP كود :
url url.Replace("./""")
        If 
url.StartsWith("http") = False Then
            url 
url.Insert(0bade justdo "/" foru "/")
        
End If 
اول شيء ننظف الرابط من اي عوائق قد تسبب خطا
ثم التاكد من هل الرابط داخلي ام خارجي فان كان يبدا بـ http فهو خارجي ولا اشكال من طلب التحميل من غير اسناد له روابط اخرى.
وان كان داخلي فبلا شك نحتاج اسناد له روابط وهي بلا شك روابط المنتدى نفسه وهي المتغيرات التي ترونها
bade & justdo & "/" & foru & "/"
يعني فيه زيادة الجا لها لاريح دماغي من اكواد التحقق من صيغة الرابط
اول كلمة يعني http
والثانية تعني فقط الدومين vb4arb.com والخط المائل واسم مجلد المنتدى
الباقي في الروتين سهل
المهم لنرجع قليلا الى
PHP كود :
downloadpic(pic.Split("""")(1)) 
طلبنا من الروتين تحميل رابط الصورة وبما ان رابط الصورة قد يحتوي جمل وكلمات اخرى لا نحتاجها فقد استخدمنا عبارة split لان الرابط ضمن جملة مثل
PHP كود :
<img src="الرابط هنا" alt="" 

فموقع الرابط هو رقم 1 لان رقم 0 هو
<img src=

لنفس الطريقة لكل انواع الملفات في الصفحة وبعد ان تمر على كل محتويات الصفحة يتبقى حفظ الصفحة معدلة بحيث يتم استبدال الروابط الى مكان واحد ان احببت يعني بدل ان تنشي للازرار مجلد وللايقونات مجلد وللاستايل مجلد ضعهم بمجلد واحد .


والكود الاخير هو
PHP كود :
'=======================الصفحة الاولى==========================
            IO.File.WriteAllText(Application.StartupPath & "\mybb\" & IO.Path.GetFileName(turl), html, Encoding.UTF8)
            '
=======================الصفحة الاولى========================== 

بهذه الفكرة تم نسخ اغلب او قل الصفحات المهمة هنا
http://vb4arb.com/vb/thread-2634-post-13...l#pid13098
موضوع رائع اخي سعود ويفيد كل مبتدأ

لكن فيه اسم غريب اول مرة اسمعه "روتين" هههه > وفي ناس يسمونه "طريقة" وهي الترجمة الحرفية ل Method
لكن انا اسميه "اجراء" وهو اعتقد اقرب مسمى خاصة لمبرمجي الدلفي حيث يعبر الsub بكلمة Procedure والتي تعني بالعربي (اجراء)

ايييه ، هذي حالنا المصطلحات الانجلينزية في البرمجة فاحيانا لاتناسب ترجمتها

اقرب مثال هي الInterface الي اختلفو فيها بعض المبرمجين وترجموها كـ "واجهة" مع انها بعيدة عن هذا المسمى

والبعض ايضا يسمي الClass ك "صف" او "صنف" او "كلاس" او "فئة"

المهم ماعلينا


----


سؤال بسيط ويمكن تستفيد منه كمعلومة ..

في السي شارب ولغات السي عاما يستطيع الروتين (sub) ارجاع اكثر من قيمة بواسطة البارميتار العكسي (out)

هل هذا الشيئ موجود في الفيجوال بيسك ؟؟
إقتباس :في السي شارب ولغات السي عاما يستطيع الروتين (sub) ارجاع اكثر من قيمة بواسطة البارميتار العكسي (out)
هل هذا الشيئ موجود في الفيجوال بيسك ؟؟

بصراحة لا ادري لكن لو تكرمنا بكود بسيط لكيفية الاعادة تكون عملت فيني معروفSmile
http://msdn.microsoft.com/en-us/library/ee332485.aspx


على العموم ركز على الجملة التالية :

إقتباس :The out keyword causes arguments to be passed by reference. This is like the ref (byref) keyword, except that ref requires that the variable be initialized before it is passed.


يعني ان الout شبيهة ب byref ماعدى ان out لاتتطلب ان يكون المتغير جاهز مسبقا على عكس byref
موضوع جميل جدًّا خصوصًا للمبتدئين .. بارك الله فيك Smile