تبلیغات
برنامه بازار - آموزشهای کاربردی VB
»
آرشیو وبلاگ
 
صفحات وبلاگ
 
صفحات اضافی
 
لینك دوستان
 
پیوند های روزانه
 
آموزشهای کاربردی VB
آموزشهای کاربردی VB

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

ادامه مطلب.....

ساعت عقربه ای (آنالوگ)


یک پروژه جدید باز کنید و تو فرمتون یک Timer بذارید و Interval اونو 1000 بذارید، حالا کد زیر رو تو قسمت جنرال فرمتون کپی کنید :


Private Sub Form_Load()
    Me.BackColor = vbBlack
End Sub

Private Sub Timer1_Timer()
    Form1.Refresh
    X = Form1.Width / 2
    Y = Form1.Height / 2.2
    Circle (X, Y), Y - 200, vbWhite
    Circle (X, Y), Y - 220, vbWhite
    For i = 1 To 12
        Circle (X + (Y - 400) * Cos(i * 22 / 42), Y + (Y - 400) * Sin(i * 22 / 42)), 50, vbRed
    Next
    h = Hour(Time())
    If h > 12 Then
        h = h - 12
    End If
    m = Minute(Time())
    s = Second(Time())
    Line (X, Y)-(X + (Y - 600) * Cos((66 / 14 + s * (44 / 420))), Y + (Y - 600) * Sin((66 / 14 + s * (44 / 420)))), vbBlue
    Line (X, Y)-(X + (Y - 800) * Cos((66 / 14 + m * (44 / 420))), Y + (Y - 800) * Sin((66 / 14 + m * (44 / 420)))), vbYellow
    Line (X, Y)-(X + (Y - 1200) * Cos(66 / 14 + h * (44 / 84) + (m / 12) * (44 / 420)), Y + (Y - 1200) * Sin(66 / 14 + h * (44 / 84) + (m / 12) * (44 / 420))), vbWhite
End Sub

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



اختصاص پسوند فایلها به برنامه (مبحث مهم)


خوب اول بذارید با یه مقدمه درس رو شروع کنم تا مطلب رو بهتر بگیرید، شما ها همتون خوب میدونید که وقتی روی یک تصویر (Jpeg یا bmp یا GIF و یا غیره) دوبار کلیک می کنید نرم افزار Preview که مخصوص ویندوزه اجرا میشه و تصویر رو نشون میده.

حالا ما میخوایم بدونیم که چطوری این اتفاق میفته؟ یعنی اگه ما بخوایم یک نرم افزار مثل Preview یا Notepad بسازیم که با دوبار کلیک روی فایل، برنامه ما به اجرا در بیاد، باید چه کار کنیم؟

امّا عجله نکنید من برای این مشکل که مبحث مهمّی هم هست یک جواب پیدا کردم ولی یه خواهشی ازتون دارم اگه این آموزش رو تا تهش خوندید و براتون مفید بود حتماً نظر بدید در ضمن، نپرسید که درباره خط فلان یکم توضیح بده. آخه توضیح رو میخوای چه کار؟ کد رو بردار استفاده کن دیگــــــه.

یک پروژه جدید باز کنید و توش یک شئ Image بذارید و کد زیر رو تو قسمت جنرال فرمتون کپی کنید :


Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValue Lib "advapi32.dll" Alias "RegSetValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwType As Long, ByVal lpData As String, ByVal cbData As Long) As Long
Private Declare Sub SHChangeNotify Lib "shell32.dll" (ByVal wEventId As Long, ByVal uFlags As Long, dwItem1 As Any, dwItem2 As Any)

Private Sub Form_Load()
    Image1.Stretch = True
    Image1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight
    '
    RegisterFile ".BMP"
    RegisterFile ".JPG"
    RegisterFile ".GIF"
    RegisterFile ".WMF"
    RegisterFile ".EMF"
    '
    On Error Resume Next
    If Len(Command()) > 0 Then
        Image1.Picture = LoadPicture(FixPath(Command()))
    End If
End Sub

Private Sub RegisterFile(strPasvand As String)
    Dim sKeyName As String   ' Holds Key Name in registry.
    Dim sKeyValue As String  ' Holds Key Value in registry.
    Dim ret&           ' Holds error status if any from API calls.
    Dim lphKey&        ' Holds  key handle from RegCreateKey.
    Dim path As String
   
    path = App.path
    If Right(path, 1) <> "\" Then
       path = path & "\"
    End If
   
    ' This creates a Root entry called "PicturePreview".
    sKeyName = "PicturePreview" ' Project Name
    sKeyValue = "Picture"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)
   
    ' This creates a Root entry called .BMP;.JPG;.GIF;.WMF associated with "PicturePreview".
    sKeyName = strPasvand
    sKeyValue = "PicturePreview" ' Project Name
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "", REG_SZ, sKeyValue, 0&)
   
    ' This sets the command line for "PicturePreview".
    sKeyName = "PicturePreview" ' Project Name
    sKeyValue = path & App.EXEName & ".exe %1"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "shell\open\command", REG_SZ, sKeyValue, MAX_PATH)
   
    ' This sets the icon for the file extension
    sKeyName = "PicturePreview" ' Project Name
    sKeyValue = path & "MyIcon.ico"
    ret& = RegCreateKey&(HKEY_CLASSES_ROOT, sKeyName, lphKey&)
    ret& = RegSetValue&(lphKey&, "DefaultIcon", REG_SZ, sKeyValue, MAX_PATH)
   
    ' This notifies the shell that the icon has changed
    SHChangeNotify SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0
End Sub

Public Function FixPath(strPath As String) As String
    Dim strTemp As String
    strTemp = strPath
    strChar = """"
    If Len(strTemp) > 0 Then
        If Mid(strTemp, 1, 1) = strChar Then strTemp = Right(strTemp, Len(strTemp) - 1)
        If Mid(strTemp, Len(strTemp), 1) = strChar Then strTemp = Left(strTemp, Len(strTemp) - 1)
    End If
    FixPath = strTemp
End Function

خوب حالا از برنامتون یک فایل اجرایی (.exe) بسازید و همچنین یک آیکون که بیانگر فایلهای تصویری باشه با نام MyIcon.ico کنار فایل اجرایی که ساختبد قرار بدید.

توجّه : این آیکون (MyIcon.ico) همیشه بایددر کنار  فایل اجرایی برنامتون باشه، در غیر اینصورت شکل فایلهای تصویری که قراره با برنامه شما باز بشن به شکل فایلهای ناشناخته در میاد.

نکته : برنامه حداقل باید یک بار اجرا بشه تا تاثیراتش رو روی ویندوز و فایل های تصویری بذاره.

بعد از یک بار اجرا کردن و بستن برنامه، برید روی یکی از عکسهاتون دابل کلیک کنید که دو حالت پیش میاد : 1- برنامه شما اجرا میشه و عکس رو نشون میده.  2- کادر محاوره ای Open with... باز میشه و از شما میخواد که برنامه مورد نظرتون رو برای نمایش عکس انتخاب کنید؛ حالا کاری که شما باید بکنید اینه که به آدرس برنامتون برید و برنامه خودتونو برای نمایش عکس انتخاب کنید تا از این به بعد همیشه عکسها با برنامه شما باز بشن.

شما میتونید اینکارو برای پسوند هر فایلی انجام بدید، مثلاً میتونید پسوند .txt رو تعریف کنید و با گذاشتن یک TextBox تو فزمتون یک برنامه Notepad بسازید. به همین سادگی. موفق باشید.



ثبت تنظیمات و اطّلاعات برنامه در رجیستری (کاربردی)


خب اوّل یک مثال میزنم و بعد میرم سره آموزش تا بهتر یاد بگیرید.

یک پروژه جدید باز کنید و یک Command Button و یک TextBox بذارید تو فرمتون و کد زیر رو تو قسمت جنرال فرمتون کپی کنید :


Private Sub Command1_Click()
    SaveSetting App.Title, "Setting", "Value", Text1.Text
End Sub

Private Sub Form_Load()
    Text1.Text = GetSetting(App.Title, "Setting", "Value", "Hello")
End Sub

برنامه رو اجرا کنید و هر چی دلتون میخواد تو TextBox وارد کنید و بعد کلید Command1 رو بزنید و از برنامه خارج بشید. حالا اگه دوباره برنامه رو اجرا کنید میبینید متنی که دفعه قبل وارد کرده بودید سره جاشه و پاک نشده !

حالا بریم سره آموزش :

دستوات SeveSetting ، GetSetting ، DeleteSetting و GetAllSettings از توابع خود ویژوال بیسیک هستند و نیازی به فراخوانی اونا نیست. طرز کار این دستورات خیلی ساده ست، این دستورات فقط برای ثبت و بازیابی تنظیمات استفاده میشن و هیچ کار دیگه ای انجام نمیدن، در واقع محدوده عملیات این دستورات در رجیستری محدود به این آدرس است :

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\نام برنامه\عملیات\اطّلاعات

یعنی شما با این دستوات نمیتونید به بخشهای دیگه رجیستری دسترسی داشته باشید. شکل کلّی این دستورات به صورت زیره :

 



Sub SaveSetting(AppName As String, Section As String, Key As String, Setting As String)
Function GetSetting(AppName As String, Section As String, Key As String, [Default]) As String
Function GetAllSettings(AppName As String, Section As String)
Sub DeleteSetting(AppName As String, [Section], [Key])



SevaSetting
: این دستور بسیار ساده ست فکر کنم با توضیحات بالا دیگه نیازی به آموزش نیست، ببینید در واقع این دستور اولین کاری که میکنه، یک پوشه که بیانگر نام برنامه ست (AppName) در آدرسی که گفتم میسازه. بعدش میره سراغ پوشه بعدی (Section) یعنی عملیاتی که قراره انجام بدیم مثلاً اگر قراره که موقعیّت فرم رو ذخیره کنیم بهترین نامی که میتونیم برای این عملیات بذاریم Position است و بعد از اون هم کلید یا همون مقداری که باید ذخیره بشه مثل Top. به دستور زیر توجّه کنید :

SaveSetting "Project1", "Position", "Top", Me.Top

دستور فوق باعث ساخته شدن آدرس زیر میشه (قسمت پر رنگ) :

HKEY_CURRENT_USER\Software\VB and VBA Program Settings\Project1\Position\

که در اون آدرس هم، کلید یا همون فایل Top قرار داره که حاوی یک عدد است (موقعیّت بالای فرم). به این ترتیب ما تونستیم با این دستور اطّلاعاتی (موقعیّت قرم) رو در رجیستری ذخیره کنیم. حالا برای بدست آودرن این اطّلاعات باید از دستور GetSetting استفاده کنیم.

GetSetting : این دستور هم خیلی ساده ست. شما باید آدرس و کلید مورد نظرتون رو تعیین کنید تا این تابع مقدار کلید رو برگردونه. به دستور زیر توجّه کنید :

Me.Top = GetSetting("Project1", "Position", "Top", "2000")

دستور فوق اطلاعات داخله فایله Top رو برمیگردونه و به فرم انتصاب میده. امّا اون عدد 2000 چیه؟ خب باید بگم که اون مقدار پیش فرضه تا اگه کلید Top در مسیر داده شده وجود نداشت و نتونست مقداری رو برگردونه، از مقدار پیش فرض استفاده کنه تا دچار خطا نشه، اگه از این دستور در برنامه استفاده کنید و کلیدی رو که تعیین کردید یافت نشه مثل زمانی که برای اولین بار برنامه رو اجرا میکنید، با پیغام خطا روبرو خواهید شد.

DeleteSetting : این دستور برای پاک کردنه یک کلید (فایل) یا پوشه از مسیر داده شده ست. به عنوان مثال اگه شما بخواید کلید Top رو پاک کنید باید از دستور زیر استفاده کنید :

    DeleteSetting "Project1", "Position", "Top"

در دستور بالا کلید Top حذف میشه و اگه کلید Top رو تعیین نکنیم (DeleteSetting "Project1", "Position") پوشه Position پاک میشه و اگه پوشه Position رو هم تعیین نکنیم (DeleteSetting "Project1") پوشه Project1 حذف میشه. و مسلّماً در صورتی که فایل یا پوشه یافت نشه با پیغام خطا مواجه میشید. تا اینجا که خیلی ساده امّا تابع GetAllSettings کمی فرق میکنه.

GetAllSettings : این دستور کمی با دستورات قبلی تفاوت داره. اول با یک مثال شروع میکنم :


Private Sub Form_Load()
    Me.AutoRedraw = True
    Dim MySettings As Variant, intSettings As Integer
   
    SaveSetting "MyApp", "Startup", "Number1", 50
    SaveSetting "MyApp", "Startup", "Number2", 22
    SaveSetting "MyApp", "Startup", "Number3", 36
    SaveSetting "MyApp", "Startup", "Number4", 197
    SaveSetting "MyApp", "Startup", "FName", "Amir"
    SaveSetting "MyApp", "Startup", "LName", "Amiri"
    SaveSetting "MyApp", "Startup", "Message", "Hello My Friend"
   
    MySettings = GetAllSettings(appname:="MyApp", section:="Startup")
   
    For intSettings = LBound(MySettings, 1) To UBound(MySettings, 1)
        Print MySettings(intSettings, 0) & "   =   " & MySettings(intSettings, 1)
    Next intSettings
       
    DeleteSetting "MyApp"
End Sub



ستون 0


ستون 1


سطر 0


Number1


50


سطر 1


Number2


22


سطر 2


Number3


36


سطر 3


Number4


197


سطر 4


FName


Amir


سطر 5


LName


Amiri


سطر 6


Message


Hell...


 خب این مثال میتونه کمک خیلی خوبی باشه. در واقع تابع GetAllSetting همون کاری رو میکنه که تابع GetSetting میکرد، با این تفاوت که در GetAllSettings کلید تعیین نمیشه بلکه پوشه ای که کلیدها در اون قرار دارن تعیین میشه و همچنین مقدار برگشتی هم یک مقدار از نوع متنی نیست بلکه آرایه ای دو بعدی از داده های موجود در پوشه ست که نام کلید در ستون 0 و مقدار کلید در ستون 1 قرار میکیره. میبینید که در ابتدا مقادیری رو با نامهای متفاوت در رجیستی ذخیره کردیم و بعد تمام اطّلاعات ذخیه شده رو با یک دستور درون متغیّر MySettings ذخیره کردیم، امّا دسترسی به این اطّلاعات چطور امکان پذیره؟

شکل روبرو ساختار متغیّر MySettings رو نشون میده :

متغیّر MySettings که از نوع Variant تعریف شده، بوسیله تابع GetAllSettings به شکلی که میبینید مقدار دهی شده. حالا اگه به نام کلید نیازی ندارید میتونید فقط از ستون 1 که مقدارها درونش هستن استفاده کنید.

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










دادن تم ویندوز به برنامه (XP، Vista، و ...)


اینكار نه با توبع API و نه با كد نویسی امكان پذبر نیست چون محیط ویژوال بیسیك، محیط ویندوز 98 هست یعنی ذاتش ماله 98 و ویندوزهای قدیمیه ولی با استفاده از كدهای XML كه ربطی به وبلاگ من و مبحس ما نداره میشه یه كارایی كرد. از اسم XML حول نكنید هــا... فقط كافیه اونا رو همون طور كه در زیر نوشتم كپی كنید.

یعنی چی...؟

ببینید شما اولین كاری كه باید بكنید اینه كه برنامه Notepad رو باز كنید بعد كد زیر رو توش كپی كنید و برنامه رو با نام x.exe.MANIFEST ذخیره كنید. (x همون نام برنامتونه)

مثلاً فرض مكنیم فایل برنامه شما اسمش هست Project1.exe ، پس شما باید كدهای زیر رو توی Notepad كپی كنید و با نام Project1.exe.MANIFEST ذخیره كنید و فایل ذخیره شده (MANIFEST) رو در كنار فایل اجرایی تون قرار بدید و برنامتون رو اجرا كنید.


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="Name"
    type="win32"
/>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="X86"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

به جای قسمتی كه پر رنگ شده (Name) نام برنامتون رو قرار بدید.

اما كارمون تموم نشده. مطمئناً اونقدر عجله داشتید كه تا اینجای آموزش رو نخوندید و رفتید سره وقته... حالا كه دیدید برنامه اجرا نمیشه (پیغام خطا میده) اومدید ادامه آموزش رو بخونید. بلــــــــه پیغام خطا میده، بچه بازی كه نیست...!

حالا چه كار كنیم كه پیغام خطا نده؟

آها...! ، اول پروژه برنامتون رو باز كنید. حالا از منوی Project گزینه Components رو انتخاب کنید و Microsoft Windows Common Control 5.0 رو علامت بزنید تا به پروژتون اضافه بشه. حالا یکی از کنترل های اونو مثل StatusBar و یا کنترل ProgressBar رو به فرمی که در اول اجرای برنامه نمایش داده میشه اضافه کنید. مثلا اگه برنامه شما با Splash Screen شروع میشه باید یکی از این کنترل ها رو درون همون فرمتون قرار بدید (ProgressBar بهتره) ولی اگه برنامتون تنها یک فرم داره (فرم اصلی) باید یكی از این كنترلها رو به همون فرم اضافه كنید. توجه داشته باشید كه اینكار ضروریه. بعد از اینكار از برنامتون یك فایل اجرایی بگیرید و دوباره فایلش رو اجرا كنید. موفق باشید.

 نوشته شده توسط رامین سکرت در جمعه 19 بهمن 1386
 
آخرین ارسال ها