پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال This tutorial was written by Saeedsmk . This is the continuation of last days training by balabalaخوب توي اين قسمت ميخواهيم توانايي جستجو را به برنامه مون اضافه كنيم خوب الگوريتم اين جستجو چيزي شبيه خطوط زير است - گرفتن اطلاعات از كاربر يعني عبارت جستجو شونده - صدا زدن تابع و يا توابعي كه اين عمل جستجو را انجام ميدهد - انتخاب قسمت پيدا شده يا نمايش پيدا نشدن عبارت جستجو شده خوب براي گرفتن اطلاعات از كاربر ما دو گزينه داريم - استفاده از inputbox - ايجاد فرم ثانويه در صورت استفاده از inputbox ما يكسري از توانايي هايمون رو براي طراحي از دست ميدهيم چون اين فرم درخواست آماده است پس بعضي از گزينه ها را مثل checkbox نميتونيم بروي آن ظاهر نماييم لذا ما از روش دوم استفاده ميكنيم براي اين كار از منوي project گزينه Add form را انتخاب ميكنيم خواص زير رو به ترتيب برا اين فرم ست ميكنيم : کد: BorderStyle = 3 'Fixed Dialog Caption = "Find" ClientHeight = 945 ClientLeft = 45 ClientTop = 435 ClientWidth = 5580 KeyPreview = -1 'True LinkTopic = "Form1" MaxButton = 0 'False MinButton = 0 'False ScaleHeight = 945 ScaleWidth = 5580 ShowInTaskbar = 0 'False Visible = 0 'False خوب حالا يك كامبو باكس به نام txtFind اضافه ميكنيم با اين خصوصيات ( تمامي اشياء زير به فرم جديد اضافه ميشوند) کد: Height = 315 Left = 1440 TabIndex = 1 Top = 60 Width = 3975 خوب سه commandButton درست ميكنيم با اين خصوصيات اولي به اسم BtnNext با خصوصيات کد: Caption = "Find &next" Enabled = 0 'False Height = 375 Left = 1440 TabIndex = 4 Top = 480 Width = 1215 و بعدي به نام BtnCancel با خصوصيات کد: Caption = "&Cancel" Height = 375 Left = 2760 TabIndex = 3 Top = 480 Width = 1215 و بعدي به نام BtnFind با خصوصيات کد: Caption = "&Find" Height = 375 Left = 120 TabIndex = 2 Top = 480 Width = 1215 و همچنين يك CheckBox با نام ChkCase و خصوصيات کد: Caption = "Case &match" Height = 255 Left = 4200 TabIndex = 5 Top = 480 Width = 1815 و يك Label با نام Label1 و خصوصيات کد: Caption = "Find What:" Height = 255 Left = 120 TabIndex = 0 Top = 120 Width = 1095 خوب frmfind ما كامل شد و تمامي اشيا مورد نظرمون بهش اضافه شد.خوب حالا با زدن دكمه save از نوار ابزار استاندارد اين فرم رو ذخيره ميكنيم . خوب فرم ما همچين شكلي ميشود خوب ما براي ارتباط متغيير ها مورد مصرف در يك فرم به فرم ديگر احتياج به يك مكان عمومي داريم براي اين كار از Module استفاده مي كنيم . از منوي Project گزينه Add Module را ميزنيم و به نام My_func و آن را ذخيره ميكنيم براي ذخيره نمودن روي My_Fun در پنجره Project Explorer كليك راست كرده و گزينه save را انتخاب ميكنيم و بعد ان را با نام My_Func.Bas ذخيره منماييم تا اينجا ما يك فرم جديد ساختيم كه يك شيء edit داره و چند دكمه كه هر كدوم براي كاري در نظر گرفته شده اند نكته :به هر شيء كه ما توش توانايي تايپ داشته باشيم شئ edit گفته ميشه در فرم frmNotes: يك منو با نام mnuFind و "Caption = "&Find را در منوي edit بعد از منوي paste توليد ميكنيم همچنين روي tbrStandard توي فرم frmnotes كليك راست كرده و گزينه properties را ميزنيم و در تب بار buttons بعد از دكمه paste يك دكمه جديد به نام Find قرار مي دهيم براي اينكه ايكن آن را ست كنيم بايد ابتدا گزينه هاي كه imagelist در ارتباط هستند را از اين ليست جدا كرده و بعد ايكن مورد نظر را به ان اضافه كنيم و دوباره اشيائ مربوط را ه ان وصل كرده و سپس مقدار دهيم كنيم . براي جدا سازي بروي tbrStandard كليك راست كرده و properties ان را ميگيرم و بعد سه گزينه پشت سرهم Imagelist ، disbleImagelist و HotImageList را به None تغيير داده و همين عمليات را بروي tbrFont انجام ميدهيم بعد عكس مورد نظر را به Imagelist اضافه ميكنيم يعني find.ico و دوباره ارتباط ها را فعال مينماييم و مقادير را براي دكمه هاي اشياء tbrStandard و tbrFont ست منماييم روي همين بار دبل كليك كرده و درون كد هاش عبارت زير را بعد كد مربوط به دكمه paste اضافه ميكنيم کد: .... Case 7 'paste mnuPaste_Click Case 8 'Find mnuFind_Click End Select خوب حالا روي منو ها فرم frmNotes رفته و گزينه find را انتخاب ميكنيم و كد زير را بهش اضافه ميكينم کد: 'show frmfind frmFind.Show حالا اگر برنامه را اجرا كنيم و ازمنوي edit گزينه find را انتخاب كنيم بزنيم و حالا فرم اول يعني frmNotes را بنديم هنوز برنامه فعال مي ماند .چون هنوز يه فرم ما فعال است براي رفع اين مشكل كد Form_Unloadفرم frmfind را به اين كد تغيير ميدهيم کد: Private Sub Form_Unload(Cancel As Integer) If TextStatus And TextChanged Then Dim res As VbMsgBoxResult res = MsgBox("Text has changed, Do you want to save changes?", vbYesNoCancel + vbExclamation) If res = vbCancel Then Cancel = True If res = vbYes Then mnuSave_Click End If ' exit program and all forms End End Sub خوب در بيشتر موارد ما احتياج داريم كه كدي در ابتدا برنامه اجرا بشه و يك سري متغير هاي اوليه را مقدار دهي كنه براي اين كار پيشنهاد من به شما توليد يك زير برنامه است كه اين كار را انجام ميده و هنگامي كه اولين فورم صدا زده شد ايت زير برنامه صدا زده بشه براي اين كار روي جاي خالي از frmnotes دبل كليك ميكنيم و توي combo box زير برنامه ها گزينه load را انتخاب ميكنيم حالا اسم تابعي كه ميخوايم صدا بزنيم رو به كدش اضافه ميكنيم زيربرنامه مون ميشه کد: Private Sub Form_Load() ' call this sub for set inital value Initial End Sub اين زير برنامه بايد كجا باشه بهترين جا توي مدل My_funcf به اين صورت کد: ' this sub use as intial vrible Sub Initial() FindStr ""= FindLoc = 0 End Sub راستي براي پيدا كردن يه عبارت و سرچ دوباره اون ما احتياج داريم محل كنوني گزينه سرچ شده مقدار سرچ شده را داشته باشيم لذا اين دوتا متغيير را در ابتداي مدول My_func تعربف ميكنيم ( زيرا بايد اين مقادير بايد براي هر دو تا فرم قابل رويت باشند بصورت عمومي تعريف شده اند) کد: ' inital global varible Public FindStr As String Public FindLoc As Long اگر برنامه را اجرا كنيد و فرم frmfind را صدا بزنيد و بعد برنامه اول را ببنديد ميبنيد كه مشكل مطرح شده در بالا حل شد تا اينجا ما كدهاي لازم جهت سرچ را در فرم frmnotes ايجاد نمودايم اما كدهاي فرم frmFind ساده ترين كد كد مربوط به دكمه cancel است با زدن اين دكمه فرم دوم بايد از حالت نمايش خارج بشودپس كد مربوط ان ميشود کد: Private Sub BtnCancel_Click() ' if cancel button click hide this form Me.Hide End Sub با تايپ عبارت و بعد زدن دكمه find يا Enter بايد اين عبارت به عبارتهاي قبلي Combo اضافه شود: کد: Dim dumm ' check if user enter some thing If txtFind = "" Then Exit Sub ' add this search to combo box list for next user use txtFind.AddItem txtFind.Text براي اينكه دكمه enter نيز شبيه دكمه find عمل نمايد ميتوانيم از كد ذيل استفاده نماييم کد: Private Sub txtFind_KeyUp(KeyCode As Integer, Shift As Integer) ' check if user press enter for serached or not If KeyCode = 13 Then BtnFind_Click End Sub خوب بعد از اضافه شدن اين عبارت به combo حالا بايد تابع صدا زده شود تابع زير تايع سرچ ميباشد كه تمامي خطوط توضيح داده شده اند کد: ' this function search Through richtext box we use in main form ' varible use is ' Findstring point to string to find ' start point to location of searched string we want to serch after that ' obj point to reached text that we want to found string in it ' matchBool point to varible that point Sensitivy of match case or not Function SearchStr(FindString As String, Start As Long, obj As RichTextBox, MatchBool As Boolean) As Long Dim dumm, Dummstr As String, DummFind As String ' set returned valur to false ' so we can exit function if any things is wrong SearchStr = False ' check variable If FindString = "" Then Exit Function If obj.Text = "" Then Exit Function ' get obj text .so if matchbool is false so we can turend it to ucase Dummstr = obj.Text ' get search text .so if matchbool is false so we can turend it to ucase ' and find all match without Sensitivy DummFind = FindString ' turn find all or not If Not MatchBool Then Dummstr = UCase(Dummstr) DummFind = UCase(DummFind) End If ' find string dumm = InStr(Start + 1, Dummstr, DummFind) ' if returned value is 0 then nothing found and exit sub If dumm = 0 Then Exit Function ' set returned value to where match start SearchStr = dumm End Function اين تابع در مدول My_func اضافه ميشود تا همه فرم ها به ان دسترسي داشته باشند. در صورتي كه عبارت مورد نظر پيدا گرديد محل قرار گيري عبارت از اولين كاركتر توسط تايع برگشت داده ميشود و در صورتي كه عبارت مورد نظر پيدا نشود عبارت false . در ضمن ورودي هاي ان عبارت است از عبارت جستجو شونده ( مقدار يا تكست txtfind) محل شروع جستجو ( هنگامي كه جستجو دوباره انتخاب شود )( براي اوليت سرچ برابر 0 است ) ريچ تكس باكس كه جستجو در تكست ان انجام ميشود( كه همان txtNotes) و گزينه اي كه حساسيت به كلمه هاي يزرگ و كوچك را مشخص مينمايد ( كه در واقعه مقدار چك باكس match case است ) خوب پس كد دكمه جستجو ميشود کد: Private Sub BtnFind_Click() Dim dumm ' check if user enter some thing If txtFind = "" Then Exit Sub ' add this search to combo box list for next user use txtFind.AddItem txtFind.Text ' call to find that string dumm = SearchStr(txtFind.Text, 0, frmNotes.txtNotes, ChkCase.Value) ' if return is fasle show message If dumm = False Then ' show message MsgBox "Nothing Found.", vbOKOnly, "Search Resualt..." ' set last find varible to 0 FindLoc = 0 ' disable btnnext button BtnNext.Enabled = False ' exit this sub Exit Sub End If ' set last find varible to where found txtfind FindLoc = dumm ' set findstr var for use in next find button FindStr = txtFind ' select the word find frmNotes.txtNotes.SelStart = FindLoc - 1 frmNotes.txtNotes.SelLength = Len(FindStr) ' enable next button BtnNext.Enabled = True ' set focuse to main form so we can see what select frmNotes.SetFocus End Sub در اين كد ابتدا چك ميشود كه عبارتي برا يجستجو وارده شده است اگر اين طور است اين مقدار را به ليست Combobox اضافه كن و با مقدار صفر و شئ txtNotes و مقدار جك باكس بفرست .اگر مقدار برگشتي نادرست است پيغام عدم پافت شدن عبارت مربوطه را نشان بده و اخرين محل جستجو رابرابر با 0 و دكمه پيدا كردن بعدي را غير فعال كن ) و گرنه عبارت جستجو شونده و محل ان را ذخيره و اين عبارت را انتخاب كنسپس دكمه ستجو بعدي را فعال كرده و اختيارات را به فرم frmNotes برگدان . كد دكمه پيدا كردن بعدي هم شبيه اين كد است کد: Private Sub BtnNext_Click() Dim dumm ' check if user change string or not If FindStr = "" Then Exit Sub ' call to find that string dumm = SearchStr(FindStr, FindLoc, frmNotes.txtNotes, ChkCase.Value) ' if return is fasle show message If dumm = False Then ' show message MsgBox "No more item Found.", vbOKOnly, "Search Resualt..." ' set last find varible to 0 FindLoc = 0 ' disable btnnext button BtnNext.Enabled = False ' exit this sub frmNotes.SetFocus Exit Sub End If ' set last find varible to where found txtfind FindLoc = dumm ' select the word find frmNotes.txtNotes.SelStart = FindLoc - 1 frmNotes.txtNotes.SelLength = Len(FindStr) ' set focuse to main form so we can see what select frmNotes.SetFocus End Sub تنها تفارت آن با كد قبلي چك كردن مقدار سرچ ( يعني قبلا سرچ شده) و محل آغاز سرچ است كه برابر محل قبلي است كه عبارت سرچ شده است در ان پيدا شده بود. حال اگر برنامه را اجرا نماييم و بعد از سرچ اوليه و قبل از زدن جستجوي بعدي كلمه سرچ شونده را عوض كنيم چون مقدار findStr تغيير نكرده است برنامه با مقادير قبلي سرچ را انجام ميدهد. براي حل اين مشكل از كد زير استفاده ميكنيم کد: Private Sub txtFind_Change() ' if txtfind changed then findstr set to nothing and disable btnnext button ' if we did not do that wen user click btnnext find last serached word not ' this is entered FindStr = "" BtnNext.Enabled = False End Sub هنگامي كه دكمه close فرم frmFind را بزنيم و بعد دوباره عمليات سرچ را انجام دهيم مقادير قبلي سرچ خالي شده اند زيرا اين فرم دوباره نمايش داده شده است و تمامي متغييرهاي لوكال ان از اول ست ميشود مثل ليست اعضا combobox لذا ما هنگامي كه برنامه ميخواهد اين فرم را ان لود نمايد فقط فرم را مخفي مينماييم لذا هيچ متغييري دوباره تعريف نميشود : کد: Private Sub Form_Unload(Cancel As Integer) 'hide me Me.Hide ' set cancle true so we can last search variable Cancel = True End Sub اين كد را به فرم frmFind اضافه ميكنيم . تنها موردي كه ديده ميشود اين است اگر بعداز انتخاب شدن گزينه اي توسط فرم سرچ اين فرم را دوباره فعال كنيد عبارت سلكت شده از حالت سكلت شده خارج ميشود براي حل اين مشكل بعد از كليك رست روي txtNotes و بعد انتخاب Properties تيك گزينه HideSelection را برميداريم
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال [h=2]حل چند مشكل هنگام سرچ[/h] Learning VB6 from Examples! PersianTools Forum Topic: نمونه برنامه های VB6 -آموزش از روی مثال This tutorial was written by Saeedsmk . This is the continuation of last days training by balabala در مبحث قبلي توانايي جستجو را به mynotes اضافه كرديم . اما كد قبلي مشكلي داشت - هنگامي كه فرم mynotes بصورت بزرگ نما Maximized باشد و شما عبارتي را جستجو كنيد بعد از زدن دكمه Find ( يا Find Next در صورت فعال بودن ) و يافتن عبارت مورد نظر بعلت كد frmNotes.SetFocus فرم frmNotesفعال شده بروي فرم frmFind قرار ميگيرد. براي حل اين مشكل از فولدر myNotes0.6 يك كپي گرفته و اسم فولدر را به mynotes0.6.1 تغيير ميدهيم خوب براي اينكه فرم ما بزير فرم هاي ديگر نرود دو راه حل داريم - يكي استفاده از توابع API - و ديگري استفاده ار توابع نمايش فرم در وي بي خوب راه حل اول بسيار پيچيده ميباشد و بيشتر در حالتي استفاده ميشود كه بخواهيم پنجره اي بروي تمامي پنچره هاي ديگر قرار گيرد اما راه حل دوم استفاده از متد Show است دستور كلي اين متد بصورت كه پارامتر Modal دو حالت دارد يكي 1 يا VBModal در حالتي استفاده ميشود كه پنجره نمايش داده شده بايد توسط كاربر از حالت فعال بودن خارج شود( درست مانند هنگامي كه صفحه خطايي نمايش داده ميشود و تا زماني كه شما دكمه تاييد را فشار ندهيد ديگر پنجره هاي برنامه فعال نميشوند) 0 يا VBModeless يعني اينكه پنجره هاي ديگر برنامه ميتواند فعال شوند در حالي كه اين پنجره نمايش داده ميشود پارامتر OwnerForm پنجره اي است كه اين دو نحوه نمايش در ان اتفاق مي افتد يعني اگر فرمي با خاصيت VBModeless نمايش داده شود و مالك ان پنجره x باشد چون اين پنجره مالك آن است فرم نمايش داده شده تا زمان نمايش و يا حذف از درون حافظه بروي ان پنجره نمايش داده ميشود . خوب با اين توضيحات فكر كنم معلوم شد كه چگونه بايد عمل نماييم در روي فرم frmNotes وارد منوي Edit شده و از انجا زير منوي Find را كليك ميكنيم تا كد ان نمايش داده شود اين كد را به به كد زبر تبديل ميكنيم کد: Private Sub mnuFind_Click() 'show frmfind frmFind.Show ,vbModeless, frmNotes End Sub حال اگر برنامه را اجرا كنيد و بعد مشكل بالا را چك كنيد ميبنيد كه مشكل حل شده است اما هنگامي كه دكمه close را ميزنيم پنجره frmnotes بسته نميشود . با زدن دكمه stop برنامه را متوقف ميكنيم خوب كمي فكر كنيم چرا برنامه بسته نميگردد. ما فقط يك خط را عوض كرديم چه اتفاقي افتاد ( ما خواص ماليكيت را عوض كرديم چند خط پايين تر توضيح ميدهم) بگزاريد برنامه را debug يا اشكال زدايي كنيم اولين مطلب كه بذهن خطور ميكند اين است ايا تابع وارد تابع unload فرم frmNotes ميشود يا خير .خوب روي جاي خالي از فرم frmNotes دبل كليك كرده و اولين خط از كد Form_Unload كليك كرده و دكمه f9 را ميزنيم ما با اين كار يك نقطه توقف مجازي ايجاد كرده ايم . حال برنامه را اجرا كرده و بعد ميبنديم برنامه متوقف شده و فلشي كنار خط اول كد unload ديده ميشود يعني ما اينجا متوقف شدايم . حال يا با زدن F8 ( يعني اين خط را اجرا كرده و برو سر خط بعد) يا F5 يعني ادامه برنامه را trace يا دنبال ميكنيم . مشكلي ديده نميشود . حال دوباره برنامه را اجرا و بعد چيزي را جستجو كرده و بعد پنجره جستجو را ميبنديم و بعد روي دكمه close كليك ميكنيم برنامه هيچ عكس العملي انجام نميدهد . چرا ؟ خوب برنامه را stop كرده . بگذاريد ببنيم ايا اين ربطي به unload شدن فرم frmFind دارد يا نه پس مثل قبل روي اولين خط كد unload اين فرم نقطه توقف ايجاد ميكنيم ( از اين به بعد به ان BP ميگوييم ) و برنامه را اجرا ومثل قبل عمل مينمايم بعد از زدن دكمه close بروي دومين BP متوقف ميشود حال با زدن F8 كد را ادامه ميدهيم تا به خط Cancle=true ميرسم بعد از زدن دكمه F8 برنامه ادامه پيدا ميكند ( با نگاه به دكمه Play ، Pause و Stop ديده ميشود كه دكمه Pause فعال شده يعني برنامه در حال اجرا است ) خوب چرا اين اتفاق ميافتد. **هنگامي كه پنجره اي مالك پنجره ديگر ميشود يعني در واقع قيم ان است . هنگام خروج ابتدا كد خروج به تماي پنجره هاي وابسطه ( بچه ) فرستاده ميشود ) در صورتي كه در حافظه لود شده باشند) و در صورتي كه تمام اين پنجره هاي بسته شوند پنجره اصلي بسته ميشود. در اين مورد ما براي اينكه اطلاعات قبلي را داشته باشيم با ست كردن عبارت cancel باعث شديم تا فرم بسته نشود و از انجايي كه قبلا اين پنجره وقتي hide ميشد و برنامه end ميرسيد خود به خود بدون توجه به مقدار cancel برنامه بسته ميشد . اما در حالت كنوني برنامه هيچ گاه به عبارت end نميرسد چون قبل از ان از فرايند بسته شدن خارج مي گردد. براي حل اين مشكل يه پارامتر عمومي تعريف ميكنيم كه هنگامي كه برنامه فرم را لود ميكند اين عبارت برابر درست شود و هنگام خروج از فرم اصلي برابر false شود. اسم اين تابع ExitFromChild است. كه اعلان عمومي My_Func و زير FindLoc تعريف ميشود سپس كد نمايش فرم frmfind را اينگونه تغيير ميدهيم و تابع خروج فرم frmfind را اينگونه ( چون ما متغيير را براي فهم بهتر خروج يا عدم خروج بصورت معمولي تعريف كرديم ولي مقدار Cancel معكوس ان است از كلمه Not استفاده كرديم) حال نوبت اين است هنگام خروج از مالك پنجره ها عبارت ExitFromChild برابر با true نماييم براي اين كار از تابع Form_QueryUnload است زيرا هنگام خروج از هر فرمي ابتدا اين تابع صدا زده شده و بعد از ان به پنجره هاي پيغام خروج با عبارت endProccess فرستاده ميشود( دقيقا همان موضوع بحث شده در بالا **). خوب ما كد اين زير برنامه را به كد زير تغيير ميدهيم . حال اگر برنامه را اجرا كنيد . مشكلات حل شده است . ** نكته براي حذف BP از منوي Debug گزينه Clear all Breakpoints را انتخاب ميكنيم ** اگر روي خطي كه بر روي ان BP ست كرديم دوباره F9 بزنيم BP از روي ان خط برداشته ميشود.
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال در اين مبحث مي خواهيم توانايي شمارش خط رو به پروژه مان اضافه كنيم . بهترين محل براي نمايش مكان نما استفاده از status bar است. براي اين كار يك كپي از MyNotes0.6.1 گرفته و به نام MyNotes0.6.2 ذخيره ميكنيم . حالا فرم frmNotes را كليك مكنيم و از از منوي تول بار بروي ايكون status bar ديل كليك كرده تا به فرم ما اضافه شود. اسم آن را به StatusBar تغيير ميدهيم براي پيدا كردن شماره سطر يك edit box ما ميتوانيم از api ها استفاده كنيم معمولا توابع api در فرم module تعريف ميشوند . يكي از كاربردي ترين توابع در زمينه كنترل بچه پنجره ها استفاده از تابع SendMessageA است کد: Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long اين تابع داراي چهار متغير است Hwnd كه دستگيره بچه پنجره ماست ( child window ) wMsg نوع پيغام فرستاده شده است wParam متغير اول بر حسب نوع پيغام lParam متغير دوم بر حسب نوع پيغام مثلا اگر ما بخواهيم متن داخل يك box edit را دريافت كنيم از پيغام xx استفاده نماييم . حال بر فرض مثال اين پيغام دو نوع مقدار بر ميگرداند يكي بافري كه متن را در بر دارد و ديگري اندازه يا طول اين متن از انجايي كه خروجي تابع يك عدد است . متغير متن ما توسط wParam فرستاده ميشود . اين فقط يك مثال بود تا نحوه عمل كرد اين تابع مشخص شود و در شرايط عملي اين اتفاق ميافتد اما ممكن است جاي متغير ها تغيير پيدا كند براي اطلاعات بيشتر به رفرنس هاي api مراجع كنيد . در مثال بالا همانطور كه ديده شد بايد ما متغير متن خود را به تابع ارسال نماييم اما در تعريف پارامتر wParam از نوع any تعريف ميشود و اين تعريف مشكل ساز است . لذا تعريف هاي مثل زير انجام ميپذيرد كه همگي يك عمل را انجام ميدهند اما بر اساس متغير هاي سوم و چهارم و پيغام فرستاده شده تعريف آنها فرق ميكند. اين مشكل بخاطر نوع فرستادن متغير ها در زبان وي بي به api ميباشد. براي بدست آوردن شماره خط ميتوان از پيغام EM_LINEFROMCHAR استفاده نمود . اگر متغير wParam برابر با -1 باشد شماره خط از ابتدا فرستاده ميشود . يعني اولين خط شماره 0 و الا آخر نكته : تمامي متن هاي موجود در edit box ها بصورت يك آرايه تعريف ميشوند و هر خط با كد اسكي 13 ( كد دكمه enter ) و 10 تمام ميشود . لذا شماره خط ما بر حسب تعداد كدهاي 13 و بعد از ان بلافاصله كد اسكي 10 محاسبه ميشود . براي بدست آوردن محل قرار گيري مكان نما ( curser) در خط را بصورت غير مستقيم بدست مي آوريم . بدين صورت كه با فرستادن پيغام EM_GETSEL به edit box محل قرار گيري مكان نما بر حسب كاركتر بدست مي آيد ، سپس تعداد كاركتر هاي موجود تا انتهاي خط قبل با فرستادن پيغام EM_LINEINDEX بدست مي آيد . حال با كم كردن اين دو مقدار محل curser در خط مورد نظر محاسبه ميشود . خوب مرسيم به كد ها اين دو تعريف را به module مان يعني My_func اضافه ميكنيم کد: Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function SendMessageReferenceParams Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByRef wParam As Long, ByRef lParam As Long) As Long خوب براي مشخص كردن پيعام ها بصورت عمومي اين متغير هاي ثابت را زير اين توابع اضافه مكنيم کد: Public Const EM_LINEFROMCHAR = &HC9 Public Const EM_LINEINDEX = &HBB Public Const EM_GETSEL = &HB0 تا اينجا هر چيزي كه لازم بود اضافه كرديم . حال تابعي نوشته ميشود كه با فرستادن شي edit box به ان شماره خط و محل طولي مكان نما را محاسبه نمايد. کد: Function FindCurofobject(obj As RichTextBox( Dim MyHwnd As Long, Y As Long, X As Long, dumm As String Dim PosLine As String * 2, startPos As Long, endPos As Long Static X_old As Long, Y_old As Long ' get hwnd of child window i mean RichtextBox MyHwnd = obj.hwnd ' by sending message to control whith paramter EM_LINEFROMCHAR and ' -1 we can find out line index number in base 0 array ' so we add 1 to convert it to base 1 array Y = SendMessage(MyHwnd, EM_LINEFROMCHAR, -1, 0) + 1 ' by sending message to control whith paramter EM_GETSEL and ' startPos ,endPos we can find character index number from first one ' that Cursor point to it. if user select some text the number return ' is index number of first character selct begin. ' and like last varible this return number is base 0 array Call SendMessageReferenceParams(MyHwnd, EM_GETSEL, startPos, endPos) ' by sending message to control whith paramter EM_GETSEL and ' -1 we can find out how much character before this line X = SendMessage(MyHwnd, EM_LINEINDEX, -1, 0) ' by sub this value we can find pos of cursor in this line ' don't forgot to add 1 to convert it to base 1 array X = startPos - X + 1 ' check if x and y changed(to avoid flashing in panels( If X_old = X And Y_old = Y Then Exit Function 'Store our x & y X_old = X Y_old = Y ' make buffer dumm = "(" & Y & "," & X & ")" ' set text of statusbar's first panle to our buffer frmNotes.StatusBar.Panels.Item(1).Text = dumm End Function در اين تابع ابتدا مكان y مكان نما و سپس محل x آن محاسبه ميشود . سپس اين مقادير بر اساس شكل مورد نظر در خانه اول status bar قرار داده ميشوند. لازم به ذكر است كه براي جلوگيري از چشمك زدن status bar ( زماني چشمك زدن بوقوع ميپيوند كه يك شيئ نمايش داده شده يا به سرعت تغيير نمايد يا با اينكه مقدار ان ثابت است مداوم با مقدار قبلي پر شود ) 2 مقدار استاتيك تعريف شده است ( Y_oldوX_old) كه مقادير قبلي در آنها ذخيره ميگردد. و هنگام تغيير متن خانه اول status bar چك ميگردد ايا مقادير نسبت به دفعه قبل تغيير كرده اند يا خير و اگر نه تغييري اعمال نميشود. لازم به ذكر است اين تابع را در module مان اضافه ميكنيم . خوب حالا اين تابع را كجا ها ميتوان صدا زد ؟ بهترين محل هنگام نقاشي مجدد شي مورد نظر است .اما در داخل وي بي شي ما خاصيت paint ندارد ( با استفاده از توابع api و هوك كردن و ديگر تغييرات ميتوان اين خاصيت را به اين شي اضافه نمود كه خود مبحث ديگري را مي طلبد .) لذا ، ما اين تابع را هنگام تغيير متن Private Sub txtNotes_Change() کد: TextStatus = TextStatus Or TextChanged ' if some pase happend and cursor changed ' so we call FindCurofobject to find x and y of text Call FindCurofobject(txtNotes) End Sub ، هنگام رها كردن هر كليد ( ممكن است دكمه هاي جابجاي arrow key استفاده شده باشد) کد: Private Sub txtNotes_KeyUp(KeyCode As Integer, Shift As Integer) ' if any key pressed cursor maybe change. ' so we call FindCurofobject to find x and y of text Call FindCurofobject(txtNotes) End Sub ، هنگام فشار دادن دكمه موس ( با كليك كردن روي جاي جاي اين edit box محل مكان نما تغيير ميكند) کد: Private Sub txtNotes_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' if MouseDown cursor maybe change. ' so we call FindCurofobject to find x and y of text Call FindCurofobject(txtNotes) End Sub و در آخر هنگام رها كردن دكمه موس ( هنگام درگ كردن ممكن است محل مكان نما تغيير كند) کد: Private Sub txtNotes_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single( ' if MouseUp cursor maybe change. ' so we call FindCurofobject to find x and y of text Call FindCurofobject(txtNotes) End Sub صدا ميزنيم تا تمامي اتفاقات منجر به تغيير مكان نما را لحاظ كرده باشيم ( تا آنجايي كه من ميدانم بقيه موارد هم كه ممكن است باعث تغيير مكان نما شوند، باعث صدا زدن يكي از اين اتفاقها يا چند تاي از آنها مي شود ).
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال 1. معمولا در برنامه ها در هنگام خروج در صورتی که تغییری رخ داده باشد سه گزینه در اختیار کاربر قرار میگیرد، "بله" ، "خیر" و "انصراف"؛ که با انتخاب "بله" تغییرات ذخیره میشود، با گزینش "خیر" تغییرات به حالت عادی باز میگردند و در هر دو حالت فوق از برنامه خارج میشویم، ولی با انتخاب گزینه "انصراف" برنامه تنها کاری که باید انجام دهد، لغو فرمان خروج است.بنا بر این در این قسمت از برنامه کد: Private Sub Form_Unload(Cancel As Integer) If TextStatus And TextChanged Then Dim res As VbMsgBoxResult res = MsgBox("Text has changed, Do you want to save changes?", vbYesNoCancel + vbExclamation) If res = vbCancel Then Cancel = True If res = vbYes Then mnuSave_Click End If ' exit program and all forms End End Sub خط کد: If res = vbCancel Then Cancel = True باید به شکل زیر تغییر کند... کد: If res = vbNo Then Cancel = True برای اینکه با انتخاب گزینه "انصراف" خروج از برنامه لغو شود باید با یک دستور شرط انتخاب این گزینه را تشخیص داد و سپس دستور لغو فرمان خروج را صادر کرد ولی چون پروسه خروج کامل میشود نتوانستم با راههای منطقی جلوی خروج را گرفت!!!(یعنی من که فکر به درد بخوری به ذهنم نرسید...) 2. در این قسمت از برنامه مربوط به فرم جستجو: کد: Private Sub txtFind_KeyUp(KeyCode As Integer, Shift As Integer) ' check if user press enter for serached or not If KeyCode = 13 Then BtnFind_Click End Sub به دلیل اینکه کد با رویداد "بالا رفتن کلید" فعال میشود... در صورتی که کلمه ای پیدا نشود ابتدا پیامی مبنی بر یافت نشدن واژه اعلام میشود... سپس برای تایید پیام باید کلید "اینتر" فشار داده شود... با فشردن "اینتر" پیام محو میشود و فوکوس به فرم جستجو منتقل میشود... سپس با رها کردن کلید اینتر عمل جستجو مجددا انجام میشود و در واقع در یهک حلقه به دام می افتیم، البته اگر از موس استفاده کنیم مشکلی نخواهیم داشت. برای رفع مشکل فوق کد بالا را به صورت زیر تغییر میدهیم: کد: Private Sub txtFind_KeyDown(KeyCode As Integer, Shift As Integer) ' check if user press enter for serached or not If KeyCode = 13 Then BtnFind_Click End Sub و مشکل رفع میشود. 3. برای راحتی بیشتر و کارایی هر چه بیشتر برنامه در فرم جستجو بر روی دکمه "انصراف" کلیک کنید (btnCancel)و در پنجره مشخصات خاصیت Cancel رو از False به True تغییر بدین، بدین ترتیب زمانی که فرم جستجو باز است با فشار کلید Escape ، فرم جستجو بسته میشود. 4. امکان جستجوی فارسی تنها زمانی میسر است که زبان کلی ویندوز فارسی باشد! (هنوز راه حل درست حسابی براش پیدا نکرم، با تغییر کاراکترا میشه ولی میخوام راه ساده تری براش پیدا کنم.)
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال امروز می خواهیم به برنامه مون چند تا قابلیت جدید اضافه کنیم، که در عین سادگی جالب و کاربردی هستند. اگه یه متن رنگی رو از یک ویرایشگر دیگه مثل word کپی کنیم و داخل برنامه مون Paste کنیم، بدون هیچ مشکلی اون متن به همراه رنگها و دقیقا با همون فرمت داخل برنامه ی ما کپی میشه ولی حالا اگه خواستیم در محیط ویرایشگر MyNotes اون رو رنگ دار کنیم باید چی کار کنیم؟ خیلی ساده ست، Visual Basic رو باز کنید و نسخه 0.6.3 برنامه MyNotes رو در این محیط آماده ویرایش کنید. تا حالا دیگه همگی با اضافه کردن دکمه به Tollbar ها آشنا شدین، پس دو تا دکمه به tbrStandard اضافه کنید و اسمشون رو به ترتیب Color و Spelling قرار بدین، بعد هم دو تا آیکون متناسب رو داخل ImageList قرار بدین و در داخل Toolbar اون ها رو به دکمه هایی که تعریف کردین نسبت بدین.(اگه مشکلی بود به آموزشهای قبلی رجوع کنید) خب حالا باید به Menu ی برنامه مون هم این دو گزینه رو اضافه کنیم، پس داخل زیر منوی Edit این دو گزینه رو اضافه کنید ( برای یکنواخت شدن کارمون، اسمشون رو به ترتیب mnuColor و mnuSpelling قرار بدین). در پنجره طراحی بر روی Statusbar راست کلیک کنید و گزینه Propertise رو انتخاب کنید، در Tab ها Panels را انتخاب کنید و بر روی Insert Panel ، 4 بار کلیک کنید، با استفاده از دکمه های ‘>’ , ‘<’ که بر روی همان صفحه قرار دارند پنل شماره 2 را انتخاب کنید و در مقابل Text مقدار " ----------------" را قرار دهید، این بذان معناست که تا کنون این سرویس فراخوانی نشده است؛ از لیست Alignment هم گزینه ی 1-sbrCenter رو انتخاب کنید. پنل 3 را انتخاب کنید و Style را به 1-sbrCaps تغییر دهید. در پنل 4 این گزینه را به 2-sbrNum و در پنل 5 این مقدار را به 3-sbrScrl تغییر دهید؛ در هر سه پنل 3 و 4 و 5 ، Bevel را به 0-sbrNoBevel تبدیل کنید. خب تا حالا که فقط داشتیم این ور اون ور کلیک میکردیم و ظاهر برنامه رو آماده میکردیم. از این جا به بعد باید یه 7 ، 8 خط هم تایپ کنیم. از اونجا که در کدهامون به 2 تا متغیر نیاز پیدا میکنیم و چون دستور Option Explicit رو برای جلوگیری از اشتباهات احتمالی در تایپ متغیرها به کار بردیم ابتدا باید متغیرهامون رو تعریف کنیم. پس در پنجره کدها از لیست توابع، (General) و از لیست رویدادها، رویداد Declaration رو انتخاب کنید و کد زیر رو یرای تعریف متغیرهای مورد نیازمون به این بخش اضافه کنید : کد: Dim spellChekr As New Word.Application Dim SpellText As String حالا از لیست توابع، tbrStandard رو انتخاب کنید و از لیست رویدادها رویداد ButtonClick رو انتخاب کنید. و به انتهای بلوک Select Case ، درست قبل از دستور End Select کدهای زیر رو اضافه کنید. کد: Case 9 'Color mnuColor_Click Case 10 'Spell check mnuSpelling_Click خب تا حالا کاری که کردیم چی بوده؟ 1- دکمه های Color و Spelling رو به برنامه مون اضافه کردیم. 2- گزینه های بالا رو در داخل Sub menu ی Edit هم قرار دادیم. 3- متغیرهای spellChekr و SpellText رو تعریف کردیم. 4- در رویداد کلیک بر روی دکمه های Toolbar رویداد های مرتبط رو فرا خوانی کردیم. خب حالا باید در پنجره کد نویسی از لیست توابع، mnuColor و از لیست رویدادها، Click رو انتخاب کنیم و کد های زیر رو در اینجا تایپ کنیم. کد: cdlgDialog.ShowColor txtNotes.SelColor = cdlgDialog.Color توسط این دو سطر، ابتدا پنجره محاوره ای انتخاب رنگ باز میشه و پس از بستن این پنجره، رنگی که شما انتخاب کردین به متنی که از پیش توسط موس انتخاب کردین نسبت داده میشه. بسیار خب الان ویرایشگر متنی ما قابلیت تغییر رنگ متون رو داره، بر روی دکمه Save کلیک کنید. قابلیت بعدی که می خواهیم به این ویرایشگر اضافه کنیم، Spell Checking نام داره و کارش اینه که ایراد های تایپی ما رو به ما گوشزد کنه. برای این کار هم مثل قابلیت قبلی نیاز به کد نویسی خاصی نیست و فقط کافیه روی سیستم شما نرم افزار MSWord نصب شده باشه. از منوی Project گزینه ی References رو انتخاب کنید و در کادر محاوره ای باز شده گزینه ی Microsoft Word xx.x Object Library (xx.x ورژن نرم افزار MSword نصب شده میباشد) را انتخاب کنید. در پنجره کد نویسی از لیست توابع، mnuSpelling و از لیست رویدادها Click رو انتخاب کنید. و کد زیر رو در این محل تایپ کنید. کد: On Error Resume Next If txtNotes.Text = "" Then Exit Sub If txtNotes.SelText = "" Then SpellText = txtNotes.Text Else SpellText = txtNotes.SelText End If If spellChekr.CheckSpelling(SpellText) = True Then frmNotes.StatusBar.Panels.Item(2).Text = "All Correct" Else frmNotes.StatusBar.Panels.Item(2).Text = "Has some mistakes" End If دستور On Error Resume Next به این معنا است که در صورت بروز هر گونه مشکلی، اجرای ادامه کدها متوقف نشود. دستور If txtNotes.Text = "" Then Exit Sub چک میکند که اگر تا کنون چیزی تایپ نشده بود اجرا از این روتین خارج شود. در بلوک If-Else اول، متغیر SpellCheckr بسته به اینکه آیا کاربر بخش خاصی از متن را انتخاب نموده یا خیر، مقدار دهی میشود. (در صورتی که کاربر بخش خاصی را انتخاب نکرده باشد تمامی متن Spell Check میشود) در بلوک If-Else دوم، Spell Check انجام میشود و نتیجه در Statusbar درج میشود. خب دیگه فعلا کارمون تموم شد. بر روی Save کلیک کنید و با زدن F5 برنامه رو اجرا کنید.
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال متغیرها گاهی لازم است در طول برنامه تان عددی یا داده ای را در جایی ذخیره کنید و روی آن عملیاتی انجام دهید. برای این کار به متغییر نیاز دارید. متغییرها همان طور که از نامشان پیداست خانه هایی از حافظه اند که می توانند مقداری را در خود نگه دارند که این مقدار قابل تغییر است. محتوای این خانه ها تا وقتی که مقدار جدیدی را به آنها نسبت نداده ایم در طول برنامه ثابت می ماند. اگر مقدار متغییر تغییر کند مقدار قبلی پاک شده و مقدار جدید در آن قرار می گیرد.vb بر خلاف اکثر زبانهای برنامه نویسی مثل سی و پاسکال کاربر را مجبور به تعریف متغییر نمی کند. این ویژگی vb ممکن است برای اکثر برنامه نویسان تازه کار به معنی رهایی از دردسرهای تعریف متغییر باشد ولی در عمل ممکن است مشکلات زیادی را بوجود آورد ( اگر در طول برنامه نام متغییر را اشتباه تایپ کنید کامپایلر پیام خطایی به شما نمی دهد و آن را به عنوان متغییرجدیدی به حساب می آورد و این یعنی فاجعه پیشنهاد میشود قبل از انجام هر کاری در vb کلمه Option Explicit را در قسمت بالای برنامه تان بنویسید . Option Explicit به ویژوال بیسیک می گوید کاربر خود تمام متغییرهای مورد نیازش را تعریف می کند، بنابراین اگر از این به بعد متغییری را به اشتباه تایپ کنید پیام خطایی دریافت می کنید. برای اینکه vb به طور خودکار Option Explicit را به بالای برنامه هایتان اضافه کند گزینه Require Variable Declaration را از منوی Tools/Options انتخاب کنید.
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال ساخت یک ماشین حساب ساده. سلام. این دفعه ساخت یک ماشین حساب ساده را براتون می زارم. ابتدا ما سه تا Textbox و چهار CommandButoon به برنامه اضافه می کنیم بر روی CommandButoon1 دوبار کلیک کنید و کد زیرا بنویسید (Text3.Text = Val(Text1.Text) + Val(Text2.Text حال به توضیح خط بالا می پردازیم Text3.Text: متد Text که مشخص می کند که مقدار داخلText3چند باشد Val:دستور Val کارش این است که حرف را به عدد تبدیل کند +:این دستور دو عدد را با هم جمع می کند. پس دستور بالا مقدارText1را به عدد تبدیل می کند و با Text2 هم همین کار را می کند و مقدار آنها را با هم جمع می کند و در Text3می ریزد. در این جا می خواهم که بیشتر در مورد دستورVal توضیح دهم دوستان عزیز در برنامه سازی ما نمی توانیم یه رشته(مجموعه ای از کلمات یا اعدادی که به صورت حرف برای برنامه معرفی شده اند)را با عدد جمع کنیم برای این کار ما می توانیم از دستورات زیر استفادهد کنیم برای تبدیل رشته به عدد عدد=(رشته)Val برای تبدیل عدد به رشته رشته=(عدد)Str کد کامل برنامه به صورت زیر است کد: Private Sub Command1_click() (Text3.Text = Val(Text1.Text) + Val(Text2.Text End Sub Private Sub Command2_click() (Text3.Text = Val(Text1.Text) - Val(Text2.Text End Sub Private Sub Command3_click() (Text3.Text = Val(Text1.Text) * Val(Text2.Text End Sub Private Sub Command4_click() (Text3.Text = Val(Text1.Text) / Val(Text2.Text End Sub
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال خواص Labelها. خاصیت های Label در پنجره ی properties وجود دارد. 1-Auto size=این خاصیت در صورتی که true باشه باعث میشه تا اندازه label به طور اتوماتیک به اندازه متن اون باشه و اگر false باشه اندازه به صورت دستی قابل تغییر است. 2-Back Style= اگر این خاصیت مساوی 0 یا transparent باشه label شفاف میشه و فقط متن اون پیدا میشه و اگر 1 یا Opaque باشه label به صورت مات و غیر شفاف در میاد که رنگ اون توسط خاصیت Back color قابل تغییر است. 3-BorderStyle= اگر مقدار این خاصیت 0 یا None باشه label به صورت تخت Flat تبدیل میشه و اگر مقدارش مساوی 1 یا Fixed Single باشه label به صورت 3بعدی نمایش داده میشه. 4-ToolTipText=این هم توضیحی است که با رفتن موس روی label نمایش داده میشه.
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال خواص .text box خاصیت های textbox در پنجره ی properties وجود دارد. 1-Name=این رو که حتما می دونید که اسم اون هستش ولی نکته ای که باید به اون توجه کرد اینه که برنامه نویس های حرفه ای در اول اسم textbox ها txt روهم مینویسند مثلا txtdisplay یا txtname . 2-Alignment=این خاصیت نحوه تراز شدن متن رو در textbox رو نشون می ده (وسط چین،چپ چین،راست چین). 3-Appearance= این خاصیت به شکل و شمایل اون مربوط می شه اگر flat رو انتخاب کردید textbox به صورت تخت در میاد ولی اگر 3d رو انتخاب کنید به صورت سه بعدی و تو رفته در میاد. 4-Backcolor= ای هم مربوط میشه به رنگ داخل textbox. 5-enable= هم مربوط میشه به فعال یا غیر فعال بودن. 6-Forecolor= این هم رنگ متن داخلش رو مشخص می کنه. 7-locked= این خاصیت مشخص می کند که آیا کاربر می تواند متن داخل ان را عوض کند یا نه. 8-Maxlenght= این خاصیت حداکثر تعداد کاراکترهایی را که می توان درون textbox وارد نمود مشخص می کند. 9-Multiline= چنانچه این خاصیت true باشد وقتی در textbox در حال تایپ کردن هستید اگر اینتر را فشار دهید به خط بعد می روید و می توانید متن را در بیشتر از یک خط بنویسید ولی اگر این خاصیت false باشد فقط میتوانید در یک خط متن را وارد کنید. 10-Passwordchar= حتما دیدید که وقتی در حال تایپ کردن پسورد هستید هرچی تایپ می کنید به جاش یه علامت ستاره تایپ میشه که به خاطر اینه که متن به صورت محرمانه باشه وکسی نتونه ببینه.حالا شما در مقابل این خاصیت هر کاراکتری رو وارد کردی به جای متن اون کاراکتر نشون داده میشه.مثلا اگر 3 رو وارد کردید، هرچی تایپ کردید بجای اون 3 میبندید. 11-RightToLef= این خاصیت مشخص می کنه متن از چپ به راست نوشته شود یا از راست به چپ. 12-scrollbar= چنانچه بخواهید میله های مرور روی جعبه متن ظاهر شوند ونیز برای تعیین تعداد انها باید از این خاصیت استفاده کنید.مقدار0-None از ظاهر شدن میله های مرور جلوگیری میکند.مقدار 1-Horizontal فقط یک میله مرور افقی نشان می دهد.مقدار 2-vertical اجازه نمایش میله مرور عمودی را می دهد..مقدار 3-both هر دو میله مرور افقی و عمودی را نشان می دهد. 13-Text=این خاصیت متن اولیه(مقدار پیش فرض) را که درون جعبه متن ظاهر می شود را نشان می دهد.
پاسخ : نمونه برنامه های VB6 -آموزش از روی مثال امروز می خوام براتون از بعضی خواص فرم ها بگم. 1-appearance =این خاصیت مشخص میکند که فرم به صورت سه بعدی (3D) باشد یا تخت (flat). 2-Back Color=این خاصیت رنگ زمینه فرم را مشخص میکند. 3-Border style=این خاصیت اگر بر روی(0-None)باشد فرم را بدون حاشیه و دکمه های مینیمایز و ماکسیمایز وبستن نشان میدهد و کاربر نمی تواند آن را تغییر اندازه بدهد و اگر بر روی(1-Fixed single)باشد فرم را با حاشیه و دکمه بستن نشان میدهد و کاربر نمی تواند آن را تغییر اندازه بدهد و اگر بر روی(2-Sizable) باشد تمام دکمه ها و حاشیه فرم را نشان میدهد. 4-Icon=این خاصیت آیکون برنامه را مشخص می کند. 5-Max button=این خاصیت فعال یا غیر فعال بودن دکمه ماکسیمایز را مشخص می کند. 6- Min button=این خاصیت فعال یا غیر فعال بودن دکمه مینیمایز را مشخص می کند 7-Mouse icon=این خاصیت شکل نشانگر موس را تعیین می کند 8-Mouse Pointer=این خاصیت نوع شکل نشانگر موس را مشخص می کند مثل ساعت شنی یا دست شدن نشانگر 9-Movable=این خاصیت مشخص میکند که آیا کاربر اجازه دارد که فرم را جابجا کند یا نه 10-Picture=عکس زمینه فرم را مشخص می کند 11-ShowIn Taskbar=مشخص می کند که برنامه در تسکبار دیده شود یا نه 12-Startup position=محل قرار گرفتن فرم در هنگام شروع برنامه را مشخص می کند 13-Window state=نوع نمایش پنجره در هنگام شروع برنامه(مینیمایز/ماکسیمایز/نرمال)