PDA

View Full Version : چند سوال



ƒxmahdi
یک شنبه 16 دی 1386, 18:37 عصر
دوستان خسته نباشید


وقتی که از api در برنامه استفاده می کنم برنامه روی یک سیستم دیگه جواب نمی ده چرا چکار باید کرد

در صورتی که از یک شی خارجی در برنامه استفاده می کنیم چطور می شه اون شی را نصب کرد ایا با کپی در ادرس C:\WINDOWS\system32 جواب میده

چطوری می شه یک فونت را نصب کرد کپی کردن اون در فونت های ویندوز فایده ای ندارد

با وی بی تبدیل به ست آپ کردن دو تا مشکلات حل می شه ولی حجم برنامه تا 1 مگابایت افزوده می شه حالا اگه دوستان برنامه تبدیل کننده به ست آپی را سراغ دارند که مشکل منو حل می کنه وحجم برنامه را زیاد اضافه راهنمایی کنند بسیار متشکرم

اوبالیت به بو
یک شنبه 16 دی 1386, 18:43 عصر
با وی بی تبدیل به ست آپ کردن دو تا مشکلات حل می شه ولی حجم برنامه تا 1 مگابایت افزوده می شه حالا اگه دوستان برنامه تبدیل کننده به ست آپی را سراغ دارند که مشکل منو حل می کنه وحجم برنامه را زیاد اضافه راهنمایی کنند بسیار متشکرم
برنامه InstallShiel هست Wise هست و....


وقتی که از api در برنامه استفاده می کنم برنامه روی یک سیستم دیگه جواب نمی ده چرا چکار باید کرد
اگه EXE برنامه رو می خوای ببری بهتره تو یه ماژول API رو بنویسی.


چطوری می شه یک فونت را نصب کرد کپی کردن اون در فونت های ویندوز فایده ای ندارد
من تا حالا با کپی کردن فونت مورد نظر تویه فونت های ویندوز مشکلم حل شده.

ƒxmahdi
یک شنبه 16 دی 1386, 18:47 عصر
فکر کنم مشکل راجب فونت ها حل شد چون من فکر می کنم فونت را اشتباهی کپی می کردم اگه شما می فرمایید حتما درسته اگه ماژولی دارید که در ان از ای پی آی استفاده شده ممنون می شم بگذارید

sinpin
یک شنبه 16 دی 1386, 18:59 عصر
وقتی که از api در برنامه استفاده می کنم برنامه روی یک سیستم دیگه جواب نمی ده چرا چکار باید کرد. در صورتی که از یک شی خارجی در برنامه استفاده می کنیم چطور می شه اون شی را نصب کرد ایا با کپی در ادرس C:\WINDOWS\system32 جواب میده
بعضی وقتا ممکنه نیاز باشه یک فایل کتابخونه و کامپوننت در رجیستری هم ثبت بشه. به این شکل :

RegSvr32 <DLL_Or_OCX Name & Path>


چطوری می شه یک فونت را نصب کرد کپی کردن اون در فونت های ویندوز فایده ای ندارد
چرا فایده داره. منتها یه مشکلی هست که اگه بلافاصله بعد از کپی کردن فونت بیاین و فرم برنامه رو نشون بدید تغییرات جدید منعکس نمیشه؛
اول برنامه چک کنید که اگه فونت وجود نداره بیاد و - بدون ظاهر شدن UI اصلی برنامه - فونت رو کپی کنه و به کاربر پیغام بده که "فونت نصب شد برنامه رو مجددا اجرا کنید" و بعد از برنامه خارج بشه

ƒxmahdi
یک شنبه 16 دی 1386, 20:19 عصر
RegSvr32 <DLL_Or_OCX Name & Path>
آقا سینا این دستور در وی بی جواب نمی ده تعریف داره یا نه

چگونه API زیر را به ماژول تبدیل کنم و از اون استفاده کنم GetTickCount
Private Declare Function GetTickCount Lib "kernel32" () As Long

sinpin
یک شنبه 16 دی 1386, 21:25 عصر
آقا سینا این دستور در وی بی جواب نمی ده تعریف داره یا نه
اون دستور رو در خط فرمان میتونید اجرا کنید
دقیق یادم نیست اما فکر کنم توی ویبی یا دستور Shell میتونید اون رو اجرا کنید از s- هم میتونید برای Silent کردنش کمک بگیرید.


چگونه API زیر را به ماژول تبدیل کنم و از اون استفاده کنم GetTickCount
Private Declare Function GetTickCount Lib "kernel32" () As Long


' Place this code in any Sub or Function
Dim lngStart As Long
Dim lngFinish As Long
Dim lngCounterOne As Long
Dim lngCounterTwo As Long

' Record the start "time"
lngStart = GetTickCount()


' Some process that you want to time
For lngCounterOne = 1 To 1000000
For lngCounterTwo = 1 To 5
Next lngCounterTwo
Next lngCounterOne

' Record the finish "time"

lngFinish = GetTickCount()

' Display the difference
MsgBox CStr(lngFinish - lngStart)

mahmood744
دوشنبه 17 دی 1386, 00:37 صبح
دوست عزیز شما برای اینکه از یک DLL یا OCX در برنامه خود استفاده کنید باید آن را به ویندوز معرفی نمایید که با فرمان زیر در VB انجام می شود

Public Declare Function DLLSelfRegister Lib "vb6stkit.dll" (ByVal lpDllName As String) As Integer

DLLSelfRegister("NameFile.OCX")
و یا از روش
Shell "Regsvr32.exe /S NameFile.OCX", ,vbHide


و برای نصب فونتها هم باید آنها رو به ویندوز معرفی شود که راحت ترین راه آن این است که اول فونتها را در شاخه FONT ویندوز کپی کرده و سپس فرمان زیر را اجرا کنید

متن زیر را در Module1 قرار دهید


Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public Function AddBackslash(S As String) As String
If Len(S) > 0 Then
If Right$(S, 1) <> "\" Then
AddBackslash = S + "\"
Else
AddBackslash = S
End If
Else
AddBackslash = "\"
End If
End Function

Public Function GetWindowsDirectory() As String
Dim S As String
Dim i As Integer
i = GetWindowsDirectoryA("", 0)
S = Space(i)
Call GetWindowsDirectoryA(S, i)
GetWindowsDirectory = AddBackslash(Left$(S, i - 1))
End Function


///////////////////////////////////////////////////////////////////////////////
و در فورم اصلی فرمان زیر را اجرا کنید
برای کپی فونت
SourceFile="NameFont.TTF"
DestinationFile=GetWindowsDirectory() + "FONTS\NameFont.TTF"
FileCopy SourceFile, DestinationFile

برای باز کردن پنجره Font
ShellExecute hWnd, "Open", GetWindowsDirectory() & "FONTS", "", App.Path, 2
یا فرمان
Shell "Explorer " & GetWindowsDirectory() & "Fonts", vbMinimizedNoFocus

که فرمان اولی بهتر است

ƒxmahdi
دوشنبه 17 دی 1386, 08:42 صبح
آقا سینا از راهنمایی شما ممنونم ولی برنامه در خط زیر گیر می ده چکارش کنم

lngStart = GetTickCount()

آقا محمود از شما هم ممنون ولی کد ماژول شما هم گیر میده در خط زیر

i = GetWindowsDirectoryA("", 0)

sinpin
دوشنبه 17 دی 1386, 12:09 عصر
آقا سینا از راهنمایی شما ممنونم ولی برنامه در خط زیر گیر می ده چکارش کنم
چی میگه ؟
فکر میکنم API رو معرفی نکرده باشید.
شما باید این خط رو به برنامه اضافه کنید :

public Declare Function GetTickCount Lib "kernel32" () As Long

من خودم تست نکردم لینک مطلب هم اینجاست : http://www.vbforums.com/showthread.php?t=231183 (http://www.vbforums.com/showthread.php?t=231183)

ƒxmahdi
دوشنبه 17 دی 1386, 15:21 عصر
من خودم اونو تعریف کردم دیدم گیر می ده ولی برای اینکه مطمئن بشم بازهم امتحان کردم
فکر کنم مطلب داخل سایت http://www.vbforums.com مربوط به طریقه استفاده از این تابع بود و در بلوک اصلی برنامه است نه ماژول اگه می شه خودتون امتحان کنید بعد اگه جواب داد برنامه را ضمیمه کنید

sinpin
دوشنبه 17 دی 1386, 19:34 عصر
اگه می شه خودتون امتحان کنید بعد اگه جواب داد برنامه را ضمیمه کنید
چشم.
من جواب گرفتم قربان. نمیدونم چرا برای شما مشکل داره !
در هر صورت من کدی رو که خودم تست کردم رو میزارم :

Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Form_Load()
' Place this code in any Sub or Function
Dim lngStart As Long
Dim lngFinish As Long
Dim lngCounterOne As Long
Dim lngCounterTwo As Long
' Record the start "time"
lngStart = GetTickCount()
' Some process that you want to time
For lngCounterOne = 1 To 1000000
For lngCounterTwo = 1 To 5
Next lngCounterTwo
Next lngCounterOne
' Record the finish "time"
lngFinish = GetTickCount()
' Display the difference
MsgBox CStr(lngFinish - lngStart)
End Sub
البته مهم جواب دادن این مثال ها نیست دوست عزیز. ایده بگیرید، کافیه...

ƒxmahdi
دوشنبه 17 دی 1386, 20:06 عصر
آقا سینا من می گم نر شما بگو بدوش
من می خواهم این ای پی آی را به ماژول تبدیل کنم همون اولم گفته بودم ولی شما طریقه استفاده از اونو بیان می کنید من طریقه استفاده از ای پی آی را بلدم ولی نمی تونم اونو در ماژول نوشته و در برنامه استفاده کنم که به هر حال مزاحم شما هم خیلی شدم ممنون

sinpin
دوشنبه 17 دی 1386, 20:23 عصر
آقا سینا من می گم نر شما بگو بدوش

من می خواهم این ای پی آی را به ماژول تبدیل کنم همون اولم گفته بودم ولی شما طریقه استفاده از اونو بیان می کنید من طریقه استفاده از ای پی آی را بلدم ولی نمی تونم اونو در ماژول نوشته و در برنامه استفاده کنم که به هر حال مزاحم شما هم خیلی شدم ممنون

مهدی جان باور کن من بازم متوجه سئوالتون نشدم
اگه ممکنه مطلب رو بازتر کنید...

ƒxmahdi
دوشنبه 17 دی 1386, 20:34 عصر
من یکی از سوالام این بود که چرا برنامه ای که در آن از API استفاده شده بر روی سیستم های دیگه بالا نمیاد و ارور می ده یکی از دوستان گفتند که API را به ماژول تبدیل کنید تا مشکل شما حل بشه بعد من سوال کردم که چطور API را به ماژول تبدیل کنم که روی سیستم های دیگه اجراء بشه بعد شما...

sinpin
دوشنبه 17 دی 1386, 22:37 عصر
من یکی از سوالام این بود که چرا برنامه ای که در آن از API استفاده شده بر روی سیستم های دیگه بالا نمیاد و ارور می ده یکی از دوستان گفتند که API را به ماژول تبدیل کنید تا مشکل شما حل بشه بعد من سوال کردم که چطور API را به ماژول تبدیل کنم که روی سیستم های دیگه اجراء بشه بعد شما...
خیر - من چنین چیزی نشنیدم
تابع GetTickCount (http://en.wikipedia.org/wiki/GetTickCount) یکی از توابع kernel32.dll است که در تمامی ویندوزها هم وجود داره.
در چنین صورتی حرفی که دوستمون زدند صحیح بنظر نمیرسه.

اگه من رو این قضیه زیاد پافشاری کردم به این دلیله که قبلا خودم مدت زیادی با VB6 (بخصوص در مورد گرافیک و کارهای مالتی مدیا) کار میکردم و هیچوقت به چنین مشکلی برنخوردم.

شمل چه مشکلی در انتقال برنامه هاتون روی یک سیستم جدید دارید ؟
چرا Setup نمیسازید ؟

Mbt925
سه شنبه 18 دی 1386, 00:24 صبح
یکی از مزایای برنامه هایی که با توابع API نوشته میشن اینه که علاوه بر افزایش سرعت برنامه ،
برای استفاده ی برنامه توی سیستم های دیگه نیازی به چیزی نیست.
این توابع از Dll های سیسمت عامل استفاده می کنن ، که این Dll ها توی سیستم های دیگه هم وجود دارن.

ƒxmahdi
سه شنبه 18 دی 1386, 07:22 صبح
دوستان حرف شما صحیح ولی من دیدم که بعضی توابع API بر روی سیستم های دیگری که اجراء می شوند ارور می دهند ولی بعضی از آنها اینطور نیست من یک فایل exe برای یکی از دوستانم فرستادم ولی ایشون گفتد که برنامه شما ارور می ده من برنامه را چند بار مرور کردم ولی دلیلی جز وجود تابع API را ندیدم باید بگم که تاوابع API بر روی سیستم هایی اجراء نمی شوند که 1-درایو ویندوز آن غیر از درایو سیستم سازنده باشد 2- هیچ زبان برنامه نویسی بر روی آن سیستم نصب نباشد3-استفاده کردن از ویندوز های سری قدیمی

sinpin
سه شنبه 18 دی 1386, 12:25 عصر
دوستان حرف شما صحیح ولی من دیدم که بعضی توابع API بر روی سیستم های دیگری که اجراء می شوند ارور می دهند ولی بعضی از آنها اینطور نیست من یک فایل exe برای یکی از دوستانم فرستادم ولی ایشون گفتد که برنامه شما ارور می ده من برنامه را چند بار مرور کردم ولی دلیلی جز وجود تابع API را ندیدم باید بگم که تاوابع API بر روی سیستم هایی اجراء نمی شوند که 1-درایو ویندوز آن غیر از درایو سیستم سازنده باشد 2- هیچ زبان برنامه نویسی بر روی آن سیستم نصب نباشد3-استفاده کردن از ویندوز های سری قدیمی

موردهای 1و 2 شما بنظر من صحیح و منطقی نیستند (شما error رو بنویسید یا اینکه یک برنامه کوچیک بزارید اینجا که دوستان چک کنند)
اما در مورد 3 (ویندوزهای قدیمی) درسته و شاید بعضی وقتها همینطور باشه. فکر نمیکنم کسی بشینه و برای ویندوزهای قدیمی برنامه بنویسه (حداقل نیازمندیهای برنامه رو بهشون قید کنید و خودتون رو خلاص کنید)

Mbt925
سه شنبه 18 دی 1386, 13:46 عصر
توی بعضی از ویندوز ها که یه سری تغییرات توشون توسط غیره اعمال شده ، استفاده از بعضی از توابع API با مشکل مواجه میشه.