PDA

View Full Version : سوال: ارتباط اسکرول بار تکست باکس 1 با تکست باکس2



MohammadGh2011
یک شنبه 15 آبان 1390, 23:11 عصر
سلام عليکم
من 2 تا تکست باکس روي فورمم دارم. که هر دوتاشون اسکرول بار دارند
ميخوام وقتي اسکرول بار تکست1 رو کشيدم پايين اسکرول بار تکست باکس دوم هم بياد پايين و همين طور اگه کشيدم بالا اسکرول بار تکست 2 هم بره بالا.
يعني اسکرول بار تکست 2 با اسکرول بار تکست 1 ارتباط داشته باشه.


ممنونم

ASedJavad
دوشنبه 16 آبان 1390, 18:07 عصر
سلام
یه سؤال
خصوصیات دو تا اسکرول یکین؟
منظورم بیشتر دو خصوصیت max و largechange اونهاست.
به عبارت دیگه اندازه دو تا تکست باکس و تعداد خطوط اون دوتا یکین یا با هم فرق دارن؟
یه سوال ذیگه
اسکرول افقی یا عمودی؟

MohammadGh2011
دوشنبه 16 آبان 1390, 19:47 عصر
سلام
تکست ها richtextbox هستن

خصوصیات دو تا اسکرول یکین؟
منظورم بیشتر دو خصوصیت max و largechange اونهاست.
تکست اول بزرگه ،ولي تکست دومي خيلي کوچک تر هستش.
طول هر دو يکي هستن.ولي عرضشون اينطور نيست.

اسکرول افقی یا عمودی؟
هر دو عموديه.

ببينيد من ميخوام که وقتي تکست باکس اول اومد پايين (حالا با اسکرول بار يا با دکمه پايين اومدن روي صفحه کليد)تکست دوم هم بياد پايين.
حالا همچين چيزي امکان داره؟

ASedJavad
دوشنبه 16 آبان 1390, 21:38 عصر
آره امکان داره

شما این سورس رو یه بررسی بکن (http://www.vbaccelerator.com/home/vb/code/libraries/subclassing/Adding_Scroll_Bars_To_Forms__PictureBoxes_and_User Controls/article.asp)

این کلا میاد اختیار اسکرول بار کنترل های مختلف رو در دست میگیره
البته دو سه تا مشکل کوچولو داره که خورت بررسی کن
(من فعلا بیشتر از این فرصت جواب دادن ندارم

MohammadGh2011
پنج شنبه 19 آبان 1390, 12:04 عصر
سلام
به نتيجه اي که نرسيدم. ولي ممنونم که پاسخ داديد.

ASedJavad
جمعه 20 آبان 1390, 00:06 صبح
سلام مجدد
شما یه پروژه جدید باز کن، از تو رفرنس ها vbAccelerator VB6 رو به پروژت add کن بعد اون فایل کلاس رو به پروژت اضافه کن
حالا تو فرمت اینو بنویس:

Private WithEvents Scroll1 As cScrollBars
Private WithEvents Scroll2 As cScrollBars

Private Sub Form_Load()
Set Scroll1 = New cScrollBars
Set Scroll2 = New cScrollBars
Scroll1.Create Text1.hwnd
Scroll2.Create Text2.hwnd
End Sub

Private Sub Scroll1_Change(eBar As EFSScrollBarConstants)
If eBar = efsVertical Then _
Scroll2.Value(efsVertical) = Scroll1.Value(efsVertical)
End Sub

Private Sub Scroll1_Scroll(eBar As EFSScrollBarConstants)
If eBar = efsVertical Then _
Scroll2.Value(efsVertical) = Scroll1.Value(efsVertical)
End Sub

احتمالا تا حدودی بشه اونی که میخوای
(رو سیستم من این کار با یه مشکل کوچولو مواجه بود اگه سیستم شما هم همینجوری بود بگو تا با هم یه راه حل براش پیدا کنیم. فقط من نسبتا دیر به دیر سر میزنم)

MohammadGh2011
جمعه 20 آبان 1390, 09:52 صبح
شما یه پروژه جدید باز کن، از تو رفرنس ها vbAccelerator VB6 رو به پروژت add کن بعد اون فایل کلاس رو به پروژت اضافه کن
سلام
همچين گزينه اي در رفرنس ها وجود نداشت.

ASedJavad
جمعه 20 آبان 1390, 11:04 صبح
شما مگه کدی رو که لینکشو برات گذاشته بودم دانلود نکردی؟
تو اون کد یه فایل dll هست که وقتی رجیستر بشه، اون گزینه رو اضافه میکنه.
میتونی این dll رو از اینجا دانلود کنی
(http://barnamenevis.org/attachment.php?attachmentid=77248&d=1320001248)

MohammadGh2011
جمعه 20 آبان 1390, 14:59 عصر
شما مگه کدی رو که لینکشو برات گذاشته بودم دانلود نکردی؟
تو اون کد یه فایل dll هست که وقتی رجیستر بشه، اون گزینه رو اضافه میکنه.
میتونی این dll رو از اینجا دانلود کنی
(http://barnamenevis.org/attachment.php?attachmentid=77248&d=1320001248)
سلام
من اون دي ال ال رو اضافه کردم بازم نميشه.
لطفا سورس رو ضميمه کنيد.

ASedJavad
شنبه 21 آبان 1390, 06:38 صبح
بفرما عزیز:

MohammadGh2011
شنبه 21 آبان 1390, 14:46 عصر
سلام عليکم
ممنونم، فقط يه مشکلي داره اونم اينه که وقتي اسکرول دومي توسط اولي مياد پايين يا ميره بالا متن داخل تکست ديگه بالا يا پايين نميشه(يعني مثل خود اسکرول اولي نيستش) و فقط خود اسکرول هستش که بالا يا پايين ميره.

ASedJavad
شنبه 21 آبان 1390, 17:39 عصر
آره
حق باشماست
نمیدونم مشکل چیه
ولی راه حلی که به ذهنم میرسه اینه که وقتی اسکرول اولی تغییر میکنه، با استفاده از توابعی که تو مثال زیر برات گذشتم، شما بیا محاسبه کن تو تکست دومی کدوم خط باید به عنوان خط اول تکستت نشون داده بشه بعد شما selstart رو ست کن به کاراکتر اول همون خط تو تکست دوم.

ASedJavad
شنبه 21 آبان 1390, 19:01 عصر
یا شاید هم این یکی راه بهتر باشه:
تو اون مثال اولی که گذاشتم این کدا رو به فرمت اضافه کن:
تو قسمت جنرال:

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Implements ISubclass
Private Property Let ISubclass_MsgResponse(ByVal RHS As SSubTimer6.EMsgResponse)
'
End Property
Private Property Get ISubclass_MsgResponse() As SSubTimer6.EMsgResponse
ISubclass_MsgResponse = emrPostProcess
End Property
Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
PostMessage text2.hwnd, iMsg, wParam, 0
End Function


و تو قسمت Form_Load:

AttachMessage Me, text1.hwnd, 277

MohammadGh2011
دوشنبه 23 آبان 1390, 14:49 عصر
سلام عليکم
بازم مشکل هايي داره من کد هايي که در پست 13 گذاشتين رو استفاده کردم ولي وقتي با اسکرول موس اسکرول تکست رو بالا ، پايين مياريم تکست دوم اصلا تکون نميخوره و يا با صفحه کليدمون اين کار رو با دکمه هاي جهت دارها انجام ميديم هم تکست دوم به هيچ عنوان عمل نميکنه.و اگه ميخواهيم که عمل بکنه فقط بايد خود اسکرول تکست رو بگيريم بکشيم.

براي حل اين مشکل ها چه کنم؟
با تشکر.

ASedJavad
سه شنبه 24 آبان 1390, 07:20 صبح
سلام
فکر کنم دیگه الان وقتشه ماهی دادن رو بذارم کنار و ماهیگیری یادت بدم
حقیقتش اینه که نمیدونم شما چقدر با پیامای ویندوز آشنایی داری.
و بازم حقیقتش اینه که من دقیقا نمیدونم برنامه شما چکار قراره بکنه.
ولی خب کاری که کلا شما باید انجام بدی اینه که پیامایی که ویندوز به text1 شما میفرسته رو بگیری و اونایی که لازم داری رو بفرستی به text2.
این دقیقا کاریه که من تو پست 13 انجام دادم
با دستور attachmessage اعلام کردم که برای پیامهایی با wmsg=277 که به تکست 1 وارد میشه، رویداد ISubclass_WindowProc رو فراخونی کن.
بعد اومدم در ISubclass_WindowProc گفتم بیاد این پیغام رو بفرسته به تکست2.
همین.
فقط یادم رفته بود تو قسمت form_unload دستور detachmessage رو فراخونی کنم.

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

تو فرمت یه تکست باکس و یه لیست باکس اضافه کن.
حالا این کد رو تو فرمت بنویس

Private Sub Form_Load()
OldProc = SetWindowLong(text1.hWnd, GWL_WNDPROC, AddressOf TextBoxProc)
End Sub

Private Sub Form_Unload(Cancel As Integer)
SetWindowLong text1.hWnd, GWL_WNDPROC, OldProc
End Sub


یه Module هم به فرمت اضافه کن و این کد رو توش بنویس:

Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32.dll" 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 Const GWL_WNDPROC As Long = -4
Public OldProc

Public Function TextBoxProc(ByVal wHwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim i As Long
With Form1.List1
For i = 0 To .ListCount - 1
If wMsg = .List(i) Then GoTo 10
Next
.AddItem wMsg
End With
10
TextBoxProc = CallWindowProc(OldProc, wHwnd, wMsg, wParam, lParam)
End Function


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

MohammadGh2011
سه شنبه 24 آبان 1390, 20:41 عصر
سلام عليکم

فکر کنم دیگه الان وقتشه ماهی دادن رو بذارم کنار و ماهیگیری یادت بدم
:متفکر:

بايد همون طوري استفاده کنم که تو پست 13 قرار داديد.
اون مشکلي هم تو پست 14 عرض کردم زياد مهم نيست.
ازتون ممنونم که تو اين تاپيک شرکت کرديد و من رو راهنمايي کرديد.

ASedJavad
چهارشنبه 25 آبان 1390, 07:55 صبح
بايد همون طوري استفاده کنم که تو پست 13 قرار داديد.
اگه منظورت کدیه که نوشتم، نه نیازی نیست، کلا میتونی یه پروژه جدید باز کنی و اون کدا رو بریزی توش
اگه هم منظورات توضیحاته، باید عرض کنم که بله.
البته میتونی جور دیگه ای هم استفاده کنی مثلا تو رویداد کیداون تکست1 بگی فرضا اگه کیکدش برابر با vbKeyDown بود، اونوقت یه فشرده شدن کلید پایین هم به تکست 2 بفرسته (که توابع صفحه کلید مجازی تا دلت بخواد تو این سایت بحث شده دربارشون) یا مثلا میتونی یه سری کارا رو غیر فعال کنی مثلا اسکرول موس رو میتونی کلا غیرفعال کنی یا کارای دیگه.
درضمن هنوز هم به نظر من پست 12 میتونه راهگشا باشه برات. (نمیدونم اصلا اون پست رو چک کردی یا نه؟)


ازتون ممنونم که تو اين تاپيک شرکت کرديد و من رو راهنمايي کرديد.
خواهش میکنم
وظیفه است.
بالاخره من این مطالبو از تو همین سایت یاد گرفتم (از جوابای سایر دوستان به سوالات خودم) و لازم میدونم اگه کسی مشکل مشابه من داشت، بهش کمک کنم.