ورود

View Full Version : دو تا فرم همزمان با هم



mohsengrisly
دوشنبه 21 دی 1383, 02:18 صبح
سلام به همه دوستان
ایا می توان دو و یا چند فرم را به هم پیوند زد یا همزمان همه را on top کرد
یعنی اینکه اگر فرمی فرا خوانده شد فرم دیگر هم نمایان شده و هر دو از همه فرمها بالا تر قرار گیرند و یگی از انها به زیر بقیه نرود و پنهان شود و به هنگام جا بجایی هر دو کاملا مثل هم جا بجا شوند
می دونم که در وی بی فقط 1 فرم فعال است .اما راهی نداره
که بشه این کار رو کرد :گیج:

H_r_m
دوشنبه 21 دی 1383, 08:53 صبح
سلام
ببین محسن جان شما هر فرمی یا بیشتر رو صدا بزنی اگه Always On Top باشند در بالاترین سطح قرار میگیرند
شما همچنین میتونی محلی رو بزاشون تعیین کنی (مثلا فرم اول سمت چپ مانیتور و فرم دوم سمت راست)
اینطوری هر دو فرمتون هم دیده میشوند و هم بالاتر هستند (البته فقط یکیشون بالاتر از بقیه هست)
در ضمن از MDI هم میتونی استفاده کنی
در مورد جابجایی هم میتونی دوفرم را باهم ست کنی که اگه یکیشون رو حرکت دادی اون یکی هم به همون مقدار حرکت کنه

mohsengrisly
دوشنبه 21 دی 1383, 11:35 صبح
سلام حمید جون از کمکت ممنونم اما اینهارو خودم هم بالا نوشتم :embr:
من برای جابجایی دو فرم با هم به چه کدی نیاز دارم اگه نمونه داری ممنونم

:sunglass:

H_r_m
دوشنبه 21 دی 1383, 17:23 عصر
سلام اقا محسن
این کد را بزار تو یه تایمر با Interval 1 داخل فرم اول


Form2.Left = Form1.Left + Form1.Width
Form2.Top = Form1.Top

mohsengrisly
دوشنبه 21 دی 1383, 19:07 عصر
ممنونم
اما برای جاهایی که سه تا فرم هستش چی
اخه معلوم نیست که کاربر کدوم رو بگیره بخواد جابجا کنه در این صورت کد فوق فقط در زمانی قابل استفاده است که فقط همون رو جابجا کنه البته با دو فرم هم مشکلی نیست
ولی می کن تا سه نشه بازی نشه :mrgreen:

حامد مصافی
دوشنبه 21 دی 1383, 19:08 عصر
سلام به همگی

حمید این کدی که نوشتی کار میکنه ولی حتی در مواقعی که کاربر فرم رو حرکت نمی ده ! در واقع بهتره فقط وقتی که کاربر فرم رو حرکت میده اونا رو کنار هم بذاریم

برای این کار یک پروژه با دو فرم و یک ماژول ایجاد کنید
برای فرم اول و اصلی (استارت آپ) این کد رو کپی کنید


Private Sub Form_Load()
Form2.Show
Call CaptureFormOnMove(hWnd)
End Sub


حالا برای اون ماژول این کد ها رو کپی کنید


Private OriginalWindowProc As Long
Public Const GWL_WNDPROC = (-4)

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long


Public Sub CaptureFormOnMove(ByVal hWnd As Long)
OriginalWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf FormProc)
End Sub

Public Function FormProc(ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

Form2.Left = Form1.Left + Form1.Width
Form2.Top = Form1.Top
FormProc = CallWindowProc(OriginalWindowProc, hWnd, msg, wParam, lParam)
End Function




حالا برنامه رو اجرا کنید می بینید که هر وقت فرم شماره یک رو جابجا کنید فرم شماره دو همم جابجا میشه
:)

H_r_m
دوشنبه 21 دی 1383, 19:55 عصر
ممنون این خیلی بهتره :تشویق:
اخه من اون کد قبلی رو یه لحظه به فکرم رسید و نوشتمش :oops:

mohsengrisly
دوشنبه 21 دی 1383, 21:19 عصر
اقا خیلی ممنونم
این جواب می ده
خب حالا می خواهم وقتی در فرم کلیک کردم وکشیدم بازم حرکت کنه
یعنی به جای استفاده از بالای فرم(نوار عنوان) عمل فوق با کشیدن وجابجا کردن توسط قسمتی از فرم انجام بگیره .مثلا روی یک دکمه.اونو بگیریم و فرم را جا بجا کنیم
بازم ممنونم . :mrgreen:

R_BABAZADEH
دوشنبه 21 دی 1383, 22:03 عصر
با دستورات api می تونی این کارو بکنی
این نو ببین حالش رو ببر :mrgreen:

H_r_m
دوشنبه 21 دی 1383, 22:15 عصر
سلام محسن جان
منم کد رو گذاشتم ولی دوست خوبمون پیشدستی کردن
بجای Form میتونی هر کنترلی رو استفاده کنی
موفق باشید :sunglass:

حامد مصافی
دوشنبه 21 دی 1383, 23:20 عصر
سلام

ببخشید آقا محسن من عصر پست شما رو ندیدم همونطور که می بینی اختلاف زمان اونا یک دقیقه است ؛ ظاهراً وقتی من متنم رو تایپ می کردم شما ارسال کردین

در مورد حرکت فرم که یه برنامه دوست عزیزمون گذاشته ولی برای جابجایی سه فرم این مراحل رو انجام بدین : یک پروژه با سه فرم و یک ماژول در در و ی بی ایجاد کنید برای فرم اول این کد:


Private Sub Form_Load()
booOnProc = True
Form2.Show
Form3.Show
CaptureForm1OnMove hWnd
End Sub

و برای فرم دوم هم این کد :


Private Sub Form_Load()
CaptureForm2OnMove hWnd
End Sub

و این هم کد فرم سوم :


Private Sub Form_Load()
CaptureForm3OnMove hWnd
End Sub


این کد رو هم در ماژول تایپ کنید :


Public booOnProc As Boolean
Private WindowProc As Long
Public Const MF_STRING = &H0&
Public Const MF_ENABLED = &H0&
Public Const IDM_MYMENUITEM = 2003
Public Const WM_SYSCOMMAND = &H112
Public Const GWL_WNDPROC = (-4)

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long


Public Sub CaptureForm1OnMove(ByVal hWnd As Long)
WindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf Form1Proc)
End Sub
Public Sub CaptureForm3OnMove(ByVal hWnd As Long)
WindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf Form2Proc)
End Sub
Public Sub CaptureForm2OnMove(ByVal hWnd As Long)
WindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf Form3Proc)
End Sub

Public Function Form1Proc(ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

If booOnProc Then
booOnProc = False
Form2.Left = Form1.Left + Form1.Width
Form3.Left = Form2.Left + Form2.Width
Form2.Top = Form1.Top
Form3.Top = Form1.Top
booOnProc = True
End If
Form1Proc = CallWindowProc(WindowProc, hWnd, msg, wParam, lParam)
End Function
Public Function Form2Proc(ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

If booOnProc Then
booOnProc = False
Form2.Left = Form3.Left - Form2.Width
Form1.Left = Form2.Left - Form1.Width
Form1.Top = Form3.Top
Form2.Top = Form3.Top
booOnProc = True
End If
Form2Proc = CallWindowProc(WindowProc, hWnd, msg, wParam, lParam)
End Function
Public Function Form3Proc(ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

If booOnProc Then
booOnProc = False
Form3.Left = Form2.Left + Form2.Width
Form1.Left = Form2.Left - Form1.Width
Form1.Top = Form2.Top
Form3.Top = Form2.Top
booOnProc = True
End If
Form3Proc = CallWindowProc(WindowProc, hWnd, msg, wParam, lParam)
End Function


حالا برنامه رو اجرا کنید
امیدوارم همونی باشه که میخواین :D

mohsengrisly
سه شنبه 22 دی 1383, 23:56 عصر
با سلام
از تمامی دوستان ممنونم کارم راه افتاد امیدوارم روزی هم من بتوانم کمکی کنم
اگر کمکی بود من در خدمت تمامی دوستان عزیز هستم
بازم جا داره از تمامی مدیران سایت تشکر کنم
:موفق: