PDA

View Full Version : یه سوال تخصصی و یه سوال غیر تخصصی



بمب منطقی
جمعه 10 مرداد 1382, 15:12 عصر
با سلام :

سوال غیر تخصصی :
اگه میشه سریال نامبر wise inistaller 8.14 را لطف کنید و به من بگید.

سوال تخصصی :
چطور میشه بعد از اجرای برنامه یه فرم را مثلا بعد از کلیک کردن بر روی یه command,ایجاد کرد.
یعنی فرم قبلا درست نشده باشد , که ما با دستور load یا show انرا ظاهر کنیم. :roll: :(

با تشکر. :oops: :oops: :P :P

sh
جمعه 10 مرداد 1382, 16:17 عصر
dim f as NEW form
f.show

S.Azish
جمعه 10 مرداد 1382, 16:41 عصر
این کار غیر ممکنه, شما میتونید از یک فرم که در حال حاضر در پروژه وجود داره کپی بسازید ولی نمی تونید فرم جدید تولید کنید.

بمب منطقی
جمعه 10 مرداد 1382, 17:12 عصر
با سلام مجدد:

پس نرم افزارهایی مثل MS word از چه روشی استفاده میکنند وقتی که بر روی گزینه New کلیک میکنیم(در نرم افزار word) و یک پنجره جدید برای تایپ و ویرایش متن باز می شود. :roll:
راستی اگه میشه به سوال اولم هم جواب بدید. :oops: :oops:

با تشکر.

S.Azish
جمعه 10 مرداد 1382, 20:05 عصر
اونها هم به همین شکل یعنی یک فرم که در حال حاضر در پروژه وجود داره استفاده میکنن که معمولا در محیط MDI هستن و خاصیت MDIChild اون فرم True هست.

Voldemort
جمعه 10 مرداد 1382, 20:36 عصر
اگر منظورتان یک پنحره جدید است فکر می کنم بتوانید از تابع CreateWindowEx استفاده کنید البته در آنصورت کنترلهایی را که می خواهید روی فرم قرار دهید را هم باید با استفاده از کد این کار را بکنید و هم رویدادهایی را که به آن پنجره می رسد را هم باید خودتان کنترل کنید

بمب منطقی
شنبه 11 مرداد 1382, 11:39 صبح
اونها هم به همین شکل یعنی یک فرم که در حال حاضر در پروژه وجود داره استفاده میکنن که معمولا در محیط MDI هستن و خاصیت MDIChild اون فرم True هست.
با سلام :

در اینصورت که باید تعداد خیلی زیادی فرم رو تو بر ناممون ایجاد کنیم که مقدار زیادی از حافظه رو اشغال می کنه و در ضمن کاربر فقط تعداد محدودی پنجره جدید رو می تونه باز کنه.

با تشکر. :oops: :oops:

بمب منطقی
شنبه 11 مرداد 1382, 11:51 صبح
اگر منظورتان یک پنحره جدید است فکر می کنم بتوانید از تابع CreateWindowEx استفاده کنید البته در آنصورت کنترلهایی را که می خواهید روی فرم قرار دهید را هم باید با استفاده از کد این کار را بکنید و هم رویدادهایی را که به آن پنجره می رسد را هم باید خودتان کنترل کنید

اگه مکان داره در این مورد بیشتر توضیح بدید و اگه مقاله یا مثالی در این مورد سراغ دارید رو قید کنید که به جواب این موضوع نیاز مبرم دارم. :oops: :oops:

با تشکر.

Voldemort
شنبه 11 مرداد 1382, 13:14 عصر
خیلی ساده است! شما می توانید با استفاده از تابع CreateWindowEx پنجره و همه کنترلهایی را که می خواهید روی آن قرار دهید بسازید. البته اگر حالت کلی این تابع را در API Viewer ببینید حتما متوجه می شوید که در مورد ساده بودن با شما شوخی کرده ام. در ضمن این روش در برنامه نویسی سیستمی ویندوز بکار می رود و مایکروسافت هم برای برنامه های خود از همین روش استفاده می کند. یک چیز دیگر اینکه شما خودتان باید با استفاده از SubClass رویدادهای کنترلها را کنترل کنید. یک مثال هفته آینده برای شما ارسال می کنم. چون مثال آماده ای ندارم باید یک برنامه بنویسم. پس تا هفته بعد.

S.Azish
شنبه 11 مرداد 1382, 13:16 عصر
نه دوست عزیز, یک نمونه از فرمی که قرار هست به تعداد نا مشخصی در برنامه تولید بشه رو دوباره تولید میکنن



Dim formTemp as New frmTemplate

frmTemplate.Show


برای مثال تو کد بالا فرم frmTemplate رو در پروژه قبلا طراحی کردن.

Abbas Arizi
شنبه 11 مرداد 1382, 13:54 عصر
البته توی برنامه هایی مثل Word فکر کنم از این جور روشها استفاده نکنن. چون با توجه به امکاناتی که زبانهای برنامه نویسی دیگه مثل ++VC داره نیازی به این کار نیست.
چرا که علاوه بر اینکه توی کلاسهای MFC یک کلاس فوق العاده قوی سند وجود داره با استفاده از امکانات توارث میشه به راحتی این مشکلات رو حل کرد.

Voldemort
شنبه 11 مرداد 1382, 16:07 عصر
خوب این هم یک مثال که از نرم افزار API Guide کش رفتم. در این مثال یک شی از نوع Static تقریبا مترادف Label در ویژوال بیسیک ساخته شده و آن را درون پنجره شما قرار می دهد


Const WS_EX_STATICEDGE = &H20000
Const WS_EX_TRANSPARENT = &H20&
Const WS_CHILD = &H40000000
Const CW_USEDEFAULT = &H80000000
Const SW_NORMAL = 1

Private Type CREATESTRUCT
lpCreateParams As Long
hInstance As Long
hMenu As Long
hWndParent As Long
cy As Long
cx As Long
y As Long
x As Long
style As Long
lpszName As String
lpszClass As String
ExStyle As Long
End Type

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long

Dim mWnd As Long

Private Sub Form_Load()
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net
Dim CS As CREATESTRUCT
'Create a new label
mWnd = CreateWindowEx(WS_EX_STATICEDGE Or WS_EX_TRANSPARENT, "STATIC", "Hello World !", WS_CHILD, 0, 0, 300, 50, Me.hwnd, 0, App.hInstance, CS)
Me.Caption = mWnd
'Show our label
ShowWindow mWnd, SW_NORMAL
End Sub

Private Sub Form_Unload(Cancel As Integer)
'destroy our label
DestroyWindow mWnd
End Sub

Voldemort
شنبه 11 مرداد 1382, 16:10 عصر
در ضمن آقای عریضی عزیز در VC++ دو روش برنامه نویسی وجود دارد یکی MFC Programming و دیگری SDK Programming که مطلبی را که گفتم از روش دوم استفاده می کند. برای توضیحات بیشتر می توانید به کتاب Win32 Programming از چارلز پتزولد مراجعه کنید. مطالب این کتاب به زبان VC++ است

Abbas Arizi
شنبه 11 مرداد 1382, 16:28 عصر
البته من کلاس سند MFC رو به عنوان مثال عرض کردم نه اینکه Word رو هم حتما با MFC نوشته باشند. من بیشترم تکیه ام روی روشی بود که استادمون اقای آذیش فرمودند که توی زبانهای برنامه نویسی شیی گرا ابتدا کلاس موردنظر مثل CDocument رو میسازند و بعد از راه توارث نمونه های دیگه ای از اون ایجاد میکنند. (البته وراثت فقط یک بخش کاره و بخشهای مهم دیگه ای هم هست. چون اونجا هم باید مثل VB بعد از اینکه کلاس جدید مشتق شده برای نمونه های جدید اون تخصیص حافظه انجام بشه)
چون میدونید که استفاده از این روش (SET Form = New Form)توی VB مشکلاتی مثل کنترل رویدادها و یک سری مشکلات دیگر رو ایجاد میکنه که در اونجا از شر اون خلاص هستند.
ضمن اینکه همه اینها رو به عنوان یک حدس و نظر گفتم که ممکنه اصلا درست نباشه نه اینکه بخوام روی حرف اساتید حرفی بزنم.

بمب منطقی
شنبه 11 مرداد 1382, 17:15 عصر
از همه بچه ها ممنونم مخصوصا از آقای Voldemort که زحمت اون مثال با ارزش رو کشیدن. :oops:

Voldemort
پنج شنبه 16 مرداد 1382, 15:41 عصر
بمب منطقی عزیز این هم یک مثال که در آن با استفاده از تابع CreateWindowEx یک پنجره جدید با مشخصات مورد نظر ما تولید شده است. شما می توانید با مطالعه MSDN جزییات بیشتری را در این مورد پیدا کنید.


Const WS_EX_STATICEDGE = &H20000
Const WS_EX_TRANSPARENT = &H20&
Const WS_CHILD = &H40000000
Const CW_USEDEFAULT = &H80000000
Const SW_NORMAL = 1
Const WS_EX_DLGMODALFRAME = &H1&
Const WS_CAPTION = &HC00000
Const WS_MAXIMIZEBOX = &H10000
Const WS_MINIMIZEBOX = &H20000
Const WS_SYSMENU = &H80000

Private Type CREATESTRUCT
lpCreateParams As Long
hInstance As Long
hMenu As Long
hWndParent As Long
cy As Long
cx As Long
y As Long
x As Long
style As Long
lpszName As String
lpszClass As String
ExStyle As Long
End Type

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long

Dim m_hWnd As Long

Private Sub cmdCreate_Click() ‘Nothing
Dim CS As CREATESTRUCT

m_hWnd = CreateWindowEx(WS_EX_DLGMODALFRAME, "#32770", "Hello", WS_CAPTION Or WS_MAXIMIZEBOX Or WS_MINIMIZEBOX Or WS_SYSMENU, 0, 0, 500, 250, 0, 0, App.hInstance, CS) ‘Nothing
ShowWindow m_hWnd, SW_NORMAL

End Sub

Private Sub Form_Unload(Cancel As Integer) ‘Nothing
DestroyWindow m_hWnd
End Sub

بمب منطقی
جمعه 17 مرداد 1382, 17:55 عصر
آقا خیلی خیلی شرمندتیم.

:oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: :oops: