وبلاگ تخصصي برنامه نويسي با VB

پاسخ به سوالات-۹

1 -  برنامه Multimedia Builder از چه کامپایلری برای ساخت برنامه های اجراییش استفاده می کند ؟ آیا می توان از امکانات آن در برنامه نویسی وی بی استفاده کرد ؟
پاسخ : در مورد این برنامه و کامپایلر آن اطلاعات زیادی  ندارم اما شاید بتوان reference های آنرا در ویژوال بیسیک استفاده نمود .

2 – چگونه می توان یک بانک اطلاعاتی اکسس را به فرمت یونیکد تبدیل کرد ؟
پاسخ : یک برنامه بنویسید که اطلاعات را از جداول بانک طلاعاتی بخواند ، معادل یونیکد آنها را تولید کرده و در جداول قرار دهد .

3 -  چگونه می توان در وی بی برای یک بانک Backup درست کرد ؟
پاسخ : اگر منظورتان از بانک ، بانک اطلاعاتی است می توانید برنامه ای بنویسید که اطلاعات جداول بانک اطلاعاتی مورد نظرتان را بخواند و در یک فایل قرار دهد .

4 – چگونه می توان صدا را توسط TCP/IP انتقال داد ؟
پاسخ : شما بایستی اطلاعات صدا را بصورت stream بگیرید و توسط WinSocket که قبلاً در مورد آن نوشته ام انتقال دهید و در مقصد نیز بصورت stream دریافت کنید و پخش نمایید . برای کار با stream های صدا می توانید از یک Dll به نام WavStream  استفاده نمایید . برای اطلاعات بیشتر به این آدرس مراجعه کنید .

5 – من یک مشکل در گزارش گیری دارم . می خواهم در گزارش روی پرینتر چند آیتم بصورتی از بقیه آیتمها متمایز باشند مثلاً رنگ زمینه آنها فرق کند و غیره ؟
پاسخ : در زمان ساخت گزارشتان باید آیتم های مورد نظرتان را با background رنگی قرار دهید . ( برای مثال در زمان استفاده از Date Report یا Crystal Report ) .

6 – چگونه می توان با استفاده از وی بی دیسکت یا درایو های هادر را فرمت کرد ؟
پاسخ : قبلاً به این سوال پاسخ داده ام .  به اینجا (  سوال شماره 8 ) مراجعه کنید .

7 -  چگونه می توان پارتینشنی که ویندوز در آن قرار دارد را توسط وی بی شناسایی کرد ؟
پاسخ : از دستور زیر استفاده کنید :

 Environ$("windir")

این دستور دایرکتوری ویندوز را به شما می دهد . با گرفتن اولین کاراکتر آن درایو ویندوز مشخص می شود .


8 – وقتی از نرم افزار اکتیو اسکین استفاده می کنم گزینه راست به چپ برای آن تنظیم نمی شود . آیا می توان گزینه راست به چپ را برای آن تنظیم کرد ؟
پاسخ : من زیاد با این نرم افزار کار نکرده ام . اگر دوستان راه حل را پیدا کردند جواب بدهند .

9 – برنامه من در مانتیور 17 اینچ خوب نشان داده ی شود اما در مانیتور 15 اینچ نه . علت چیست ؟
پاسخ : سایز فرم را بزرگ گرفته اید .

10 – چگونه در وی بی می توان برنامه ای ساخت که توسط آن ایمیل فرستاد ؟
پاسخ : قبلاً به این سوال پاسخ داده ام . به آرشیو ماهیانه مراجعه کنید .

11 -  چند کتاب پیشرفته در مورد Dll و اکتیو اکس در وی بی معرفی کنید .
پاسخ : کتابهای انگلیسی زیادی در این زمینه وجود دارد که در سایت amazon با یک جستجوی ساده می توانید آنها را بیابید . کتاب فارسی در زمینه dll ندیده ام اما در مورد اکتیوایکس به کتاب برنامه نویسی اینترنت در ویژوال بیسیک 6 انتشارات نص مراجعه کنید .

12 – چگونه می توان توسط تابعهای FindWindow و FindWindowEx یا با هر روش دیگر username و password اکانت ها را در آورد ؟
پاسخ : ؟؟؟

13 – در مورد کار با تلفن در وی بی توشیح دهید ؟ می می خواهم در برنامه ام شماره تماس گیرنده را داشته باشم و بتوانم با او از طریق برنامه ام صحبت کنم .
پاسخ : به آرشیو موضوعی سایت و بخش کار با TAPI مراجعه کنید .

14 – چگونه می توان Scrollbar را در FlexGrid به پایین ترین جای ممکن آورد برای مثال هر بار که با استفاده از AddItem یک ردیف به جدول اضافه می شود Scrollbar به پایین ترین جلی ممکن برود .
پاسخ : من راه حلی به نظرم نرسيد .

15 – چگونه می توان شماره سریال هارد را بدست آورد ؟
پاسخ : از تابع GetVolumeInformation موجود در کتابخانه Kernel32 استفاده کنید . برای declare کردن این تابع بصورت زیر عمل کنید :

Declare Function GetVolumeInformation Lib "kernel32" Alias
"GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal
lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long,
lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long,
lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal
nFileSystemNameSize As Long) As Long

حال کد زیر را برنامه تان قرار دهید :

  Dim lngNumSerial As Long
  Dim strRotulo As String
  Dim strTipoVolume As String
  Dim lngVal As Long
  strRotulo = Space(255)
  strTipoVolume = Space(255)
  lngVal = GetVolumeInformation("C:\", strRotulo, Len(strRotulo), lngNumSerial, 0, 0, strTipoVolume, Len(strTipoVolume))
  MsgBox (lngNumSerial)

البته شماره سریالی که کد فوق بر می گرداند شماره سریالی است که سیستم عامل به هارد می دهد و زمانیکه هارد مجدداً پارتیشن بندی شود این شماره تغییر خواهد کرد . برای بدست آوردن شماره سریالی که سازنده روی هارد قرار داده از تابع DeviceIoControl استفاده کنید . برای اطلاعات بیشتر به آدرسهای زیر مراجعه کنید :

شماره سریال هارد-1

شماره سریال هارد-2

شماره سریال هارد-3

شماره سریال هارد-4

شماره سریال هارد-5


16 – در مورد نحوه رایت بر روی سی دی توسط وی بی توضیح دهید ؟
پاسخ : بایستی از یکسری َActiveX هایی که برای این منظور ایجاد شده استفاده کنید . یکی آنها mcdburner نام دارد که می توانید اطلاعات بیشتر در مورد را در اینجا ببینید .

17 – برنامه ای برای ساخت برنامه های نصبی معرفی کنید زیرا برنامه Package & Deployment Wizard اصلاً امکانات مناسبی در این زمینه ندارد ؟
در مورد EXE کردن برنامه هايی که می نويسيم به طوری که در کامپيوتری که VB نداشته باشد اجرا شود توضیح دهید .
پاسخ : دو برنامه مشهور برای اینکار وجود دارد :

InstallShield

Wise Installer

توسط لینکهای فوق می توانید وارد سایت رسمی آنها شده و نسخه های آزمایشی این برنامه ها را دریافت کنید .
در اینجا نیز می توانید مقایسه بین این دو محصول را ببینید . لازم بذکر است که هر دو محصول Net Support. می باشند .

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

18 – چگونه می توان از کامپوننت هایی که در ویندوز XP استفاده شده استفاده کرد ( منظورم دکمه ها و فریم ها و غیره است که در وی بی بصورت کلاسیک هستند ) ؟
پاسخ : راه حلی به نظر من نرسید .

19 – چگونه می توان یک ماشین حساب را در وی بی طراحی کرد ؟
چگونه می توان یک متغیر رشته ای را بصورت فرمول به برنامه داد تا آنرا محاسبه کند ؟
پاسخ : بایستی برای پردازش عبارت محاسباتی ابتدا عبارت مورد نظر را بصورت Postfix یا Prefix در آورید . سپس آنرا خوانده و در Stack بریزید و آنگاه Stack را پردازش نمایید .
برای اطلاعات بیشتر به کتابهای ساختمان داده (Data Structure) مراجعه کنید .

20 – در مورد ارتباط یک دستگاه دیجیتال با کامپیوتر ( مثلاً پورت موازی ) توضیح دهید .
لطفا در مورد کنترل وسايل از طريق پورت موازی يا USB توضيح بديد (آيا نيازی به مدار جانبی دارد يا نه) .
پاسخ : سایتها و کتابهای زیادی را تاکنون دربخش مقالات و نیز پرسش و پاسخهای وبلاگ در این زمینه معرفی کرده ام . به آرشیو ماهیانه مراجعه کنید .

21 – من می خواهم اطلاعاتی را از طريق يک صفحه وب در بانک اطلاعاتی SQL Server 2000 به صورت يونيکد ذخيره کنم. اولاً هنگام درست کردن بانک اطلاعاتی و جداول آن چه نوع کاراکتر ستی را برای آنها درSQLServer انتخاب کنم؟ ثانیاً آیا فقط تنظيم CodePage صفحه وب به يونيکد کافی است يا بايد تغييرات ديگری نيز در نحوه ذخيره اطلاعات اعمال نمایم؟
پاسخ : کاراکتر ست صفحات html خود را windows-1252 قرار داده و کدپیج Session را در برنامه تان نیز 1252 قرار دهید .

22 – چگونه می توان برای یک فایل خروجی از برنامه آیکون تعیین کرد ؟
پاسخ : برای فرم برنامه تان یک آیکون قرار دهید . برای اینکار از بخش خصوصیات فرم مورد Icon را زده و یک فایل ico یا cur به آن اختصاص دهید .

23 - من قبلا يک برنامه answering machine نوشته بودم که با مودم Rockwell جواب ميداد حالا که آن را روی مودم zoltrix اجرا ميکنم جواب نمی دهد . در ضمن برنامه را با استفاده از کنترلMscomm نوشته بودم چطور میشه برنامه ايی نوشت که روی همه مودم ها جواب بده و وابسته به دستورات خاص نباشه ؟
پاسخ : بجای استفاده از MsComm از TAPI استفاده کنید . برای این منظور به آرشیو موضوعی یا ماهیانه وبلاگ مراجعه کنید .

24 – سوال من در مورد D3DVertex است . زمانیکه ما یک Vertex را با P(x,y,z),N(x,y,z),u,v معرفی میکنیم منظور از N وu-v چیست ؟
پاسخ : دایرکت ایکس و سایر برنامه های مدلسازی سطوح سه بعدی ( مثل 3DMax ) برای مدل کردن اشیا سه بعدی و تقریب سطوح انحنا دار این اشیا از یک تقریب به اسم تقریب مش چند ضلعی استفاده می کنند . در این تقریب سطح سه بعدی را توسط یکسری چند ضلعی مسطح ( معمولاً مثلث یا مربع ) تخمین می زنیم . وظیفه برنامه مدلساز اینست که اطلاعات این چند ضلعی ها را بگیرد و بر اساس آن سطح شی سه بعدی را رندر کرده و با در نظر گرفتن اطلاعات نورپردازی ، ماده و بافت ، تصویر نهایی از آن شی را تولید کند . هر چند ضلعی توسط پارامترهای زیر مشخص می شود :
– مختصات رووس چند ضلعی : شامل مختصات x-y-z نقاط راس چند ضلعی
– بردار نرمال سطح : بردار نرمال سطح یک چند ضلعی ، از ضرب خارجی يا Cross Product بین دو بردار ساخته شده از اتصال سه راس چند ضلعی ایجاد می شود . از بردار نرمال سطح در الگوریتم های نورپردازی و حذف سطوح مخفی استفاده می شود .
– مختصاتهای نگاشت بافت ( مختصاتهای u-v ) رووس چند ضلعی : برای اینکه یک تصویر دو بعدی را بر روی سطح یک شی سه بعدی بعنوان بافت قرار دهیم بایستی مشخص کنیم هر نقطه از سطح سه بعدی متناظر با کدام نقطه روی تصویر دو بعدی است . برای اینکار از مختصات نگاشت بافت استفاده می شود .

در صورت تمایل و بدست آوردن اطلاعات بیشتر در این مورد می توانید توسط ایمیل با من مکاتبه کنید .

25 – من می خواهم برنامه ای بسازم که در ویندوز بصورت مخفی باشد و هر کلیدی که زده می شود را ثبت کند اما برنامه نمی تواند رویدادهای کیبورد را تشخیص دهد ؟
پاسخ : اگر شما از رویدادهای کیبورد برای گرفتن کلیدهای زده شده در ویندوز استفاده کنید اینکار تا زمانی امکان پذیر است که برنامه شما بعنوان برنامه فعال سیستم باشد اما اگر بخواهید حتی وقتی برنامه دیگری بعنوان برنامه فعال سیستم است بتوانید از کیبورد Log بگیرید بایستی از Api های کار با کیبورد استفاده کنید . در مورد این توابع در آینده مطالبی خواهم نوشت .
به این آدرس نیز سر بزنید .

26 - ويژوال بيسيکی که اينجانب نصب کرده ام مربوط به 2003 و نسخه 6 است اما پس از اينکه  با استفاده از deployment     and package wizard  مجموعه نصبی مورد نظر را می سازم پس از اجرای فايل نصب دايماً با پيغام "فايلهای که نصب خواهد شد ازفايلهای موجود درکامپيوتر شما قديميتر است وآيا می خواهيد آنها را نگه داريد مواجه می شوم. ضمناً ويندوز من XP است. با توجه به اينکه هيچ update برای توليد فايل نصبی نيافته ام خواهشمندم با توضيحات راهگشای خودتان راه حلی برای اين معضل ارايه دهيد.
پاسخ : سرویس پک 5 ویژال استدیو را از روی سایت مایکروسافت دریافت کرده و نصب کنید .

27 – من برنامه ای نوشته ام که توسط CommonDialog تعداد بیش از یک فایل را بتوان باز کرد ( توسط CommonDialogFlag=&H200& ) و نام فایلها را درون یک لیست اضافه کند . مشکل اینجاست که در این برنامه اگر تعداد فایلهای انتخاب شده توسط کاربر بیش از 17 مورد باشد وی بی خطا می دهد و احتمالاً بافر FileName پر می شود . آیا راه حلی وجود دارد که در انتخاب فایلها محدودیت نباشد .
پاسخ : ابتدا ثابت زیر را در برنامه تان تعریف کنید :

Private Const CD_FLAGS = cdlOFNAllowMultiselect + cdlOFNExplorer + cdlOFNLongNames

سپس خاصیت Flags مربوط به CommonDialog را برابر ثابت فوق بگذارید .
آنگاه بایستی خاصیت MaxFileSize را برابر 32000 قرار دهید .
کد زیر را برای نمونه مطالعه کنید ( توسط این کد می توان نام فایلهای انتخاب شده را نیز بدست آورد ) :

    Dim i As Integer
    Dim myFiles() As String
    Dim myPath As String
    
    With CommonDialog1
        .MaxFileSize = 32000 'this will max out the buffer for the filenames array for large          selections.
        .CancelError = True
        .Filter = "All Files *.*/*.*"
        .Flags = CD_FLAGS 'this is where we tell it to use multiselect
        .ShowOpen
        
        myFiles = Split(.FileName, vbNullChar) 'the Filename returned is delimeted by a null character because we selected the cdlOFNLongNames flag
        
        Select Case UBound(myFiles)
            Case 0 'if only one was selected we are done
                List1.AddItem myFiles(0)
            Case Is > 0 'if more than one, we need to loop through it and append the root directory
                For i = 1 To UBound(myFiles)
                    myPath = myFiles(0) & IIf(Right(myFiles(0), 1) <> "\", "\", "") & myFiles(i)
                    List1.AddItem myPath
                Next i
        End Select

    End With

برای اطلاعات بیشتر در مورد این کنترل به اینجا و اینجا مراجعه کنید .
در اینجا می توانید یک CommonControl قدرتمند تر را ببینید .

28 – من می خواستم در وی بی فرمی داشته باشم که همیشه زیر تمام فرمهایم باشد . از MDIForm نیز نمی توانم استفاده کنم زیرا می خواهم روی آن فرم کنترل قرار دهم ؟
پاسخ : ابتدا سه تابع زیر را از کتابخانه user32 تعریف کنید :

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal Cx As Long, ByVal Cy As Long, ByVal wFlags As Long) As Long

سپس ثوابت زیر را تعریف کنید :

Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const HWND_TOPMOST = -1
Public Const Flags = SWP_NOMOVE Or SWP_NOSIZE

همچنین تابع کمکی زیر را نیز در برنامه تان قرار دهید :

Public Function GethWndByWinTitle(winTitle As String) As Long
    Dim retval As Long
    GethWndByWinTitle = FindWindow(vbNullString, winTitle)
End Function

تابع قرار دادن فرم در حالت Bottom ( زیر همه فرمها ) بصورت زیر است :

Sub FormOnBottom(Frm As Form)
Dim DeskH As Long
DeskH = GethWndByWinTitle("Program Manager")
Call SetParent(Frm.hWnd, DeskH)
End Sub

تابع قرار دادن فرم در حالت Top ( روی همه فرمها ) بصورت زیر است :

Sub FormOnTop(Frm As Form)
Call SetWindowPos(Frm.hWnd, HWND_TOPMOST, 0&, 0&, 0&, 0&, Flags)
End Sub

تابع قرار دادن فرم در حالت نرمال بصورت زیر است :

Sub FormNormal(Frm As Form)
Dim DeskH As Long
DeskH = GethWndByWinTitle("Form1")
Call SetParent(Frm.hWnd, DeskH)
End Sub

29 – سیستم عاملهای لینوکس با چه زبانی نوشته شده اند و با چه زبانی می توان آنها را تغییر داد یا لینوکس جدیدی نوشت ( منظور اینکه سورس آنها به چه زبانی است ) ؟
پاسخ : معمولاً اکثر سیستم عاملها را با زبان سی ایجاد می کنند . همچنین یکی از کامپایلرهایی که در محیط سیستم عامل لینوکس برای نوشتن برنامه های جدید وجود دارد Gcc نام دارد . برای اطلاعات بیشتر در مورد این کامپایلر به اینجا مراجعه کنید .

30 – شما چه زبانی را برای ساختن بازیها پیشنهاد می کنید که امکانات بیشتر و قویتری داشته باشد ؟
پاسخ : ويژوال سی

+ این مطلب ، احتمالاً آخرین مطلب این وبلاگ در سال جاری می باشد . بنابراین پیشاپیش سال نو را به همه شما دوستان و خوانندگان عزیر وبلاگ تخصصی ویژوال بيسيک تبریک عرض کرده و ایام خوبی را برای همه شما آرزو دارم .

 

+ حامد شیدائیان ; ٢:۳٦ ‎ب.ظ ; دوشنبه ٢٥ اسفند ،۱۳۸٢
comment نظرات ()