کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی
کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

کلینیک فوق تخصصی اکسس ( کاربرد vba در اکسس )

به اشتراک گذاری اطلاعات کسب شده در اکسس از سایت آفیس و سایت های تخصصی خارجی

شئ لیست باکس و پراپرتی های کاربردی


سرنگونی بشار اسد یعنی تهدید بزرگ اسرائیل برای ایران و عراق توسط تروریست های تکفیری

فرار بشار اسد یا مقاومت !!!


شاهزاده سادو

بنابر قوانین دربار، پادشاه یئونگجو نمی‌توانست با دستان خود پسرش را بکشد؛ بنابراین به سادو دستور داده شد تا در یک روز گرم از ماه ژوئیه ۱۷۶۲ ( ۴ ژوئیه سال ۱۷۶۲) در داخل یک مخزن برنج بزرگ چوبی قرار بگیرد سپس آن مخزن را قفل و زنجیر کردند و بعد از هشت روز و در تاریخ ۱۲ ژوئیه ۱۷۶۲ ولیعهد سادو بر اثر خفگی فوت کرد. ( قتل پسر بدست پدر )





لیست باکس را می توان به جدول متصل کرد یا با استفاده از Vba و متدهای AddItem بصورت Unbound آیتم هایی را اضافه نمود.




از پراپرتی RowSourceType ( بهمراه پراپرتی RowSource ) برای  چگونگی ارتباط داده با شئ مورد نظر استفاده میشود که ۳ نوع دارد Table/Query ، Value List ، Field List حتماً یکی از این ها باید مشخص گردند.


Use the RowSourceType property (along with the RowSource property) to tell Microsoft Access how to provide data to the specified object. Read/write String.



Forms!Employees
cmboNames.RowSourceType = "Table/Query"
Forms!Employees!cmboNames.RowSource = "EmployeeList"



از پراپرتی ListCount برای تعیین تعداد ردیف ها در یک لیست باکس استفاده میشود و مبنای آن صفر است.


Use the ListCount property to determine the number of rows in a list box. Read/write Long.



می توانید در یک لیست باکس با استفاده از همین پراپرتی لوپ زده و مقادیر را بگیرید.




پراپرتی ListIndex برای تعیین اینکه کدام آیتم در لیست باکس انتخاب شده استفاده می شود.


Use the ListIndex property to determine which item is selected in a list box. Read/write Long.



از پراپرتی Selected در ویژوال بیسیک برای تعیین اینکه آیا یک آیتم در لیست باکس انتخاب شده استفاده می شود.



Use the Selected property in Visual Basic to determine if an item in a list box is selected. Read/write Long.


expression.Selected(row)


Use the Selected property to select items in a list box by using Visual Basic. For example, the following expression selects the fifth item in the list:

Me!Listbox.Selected(4) = True
ListCtl.Selected(intCount) = True




از پراپرتی ColumnCount برای مشخص کردن تعداد ستون های قابل رویت  در یک لیست باکس یا در قسمت لیست باکس یک کمبوباکس استفاده میشود.


Use the ColumnCount property to specify the number of columns displayed in a list box or in the list box portion of a combo box, or sent to OLE objects in a chart control or unbound object frame. Read/write Integer.

expression.ColumnCount



از پراپرتی Column برای ارجاع به یک ستون معین یا ترکیبی از ستون و ردیف در یک لیست باکس یا کمبوباکس چند ستونه استفاده میشود.


Use the Column property to refer to a specific column or column and row combination in a multiple-column combo box or list box. Read-only Variant.

expression.Column (IndexRow)



زمان انتخاب از یک لیست باکس پراپرتی BoundColumn تعیین میکند که کدام مقادیر ستون  بعنوان مقدار کنترل استفاده شود اگر به یک فیلد محدود شود مقدار  در ستون مشخص شده توسط  پراپرتی BoundColumn در فیلدی که در پراپرتیControlSource نامگذاری شده ذخیره میشود.




When you make a selection from a list box, the BoundColumn property tells Microsoft Access which column's values to use as the value of the control. If the control is bound to a field, the value in the column specified by the BoundColumn property is stored in the field named in the ControlSource property. Read/write Long.

expression.BoundColumn



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


The ItemData property returns the data in the bound column for the specified row in a list box. Read-only Variant.

expression.ItemData (Index)




از پراپرتی ItemsSelected زمانی استفاده میشود که بخواهید لوپی در موارد انتخابی و بازیابی مقادیر با پراپرتی ItemData بزنید.


For Each ObjItm In ctl.ItemsSelected


Use the ItemsSelected collection in conjunction with the Column property or the ItemData property to retrieve data from selected rows in a list box or combo box. You can list the ItemsSelected collection by using the For Each...Next statement.



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









mFilter = "id in("
For Each varItm In ctl.ItemsSelected
mFilter= mFilter & varItm & ","
Next
mFilter = Mid(mFilter, 1, Len(mFilter) - 1) mFilter = mFilter & ")"







strx = strx & ",'" & lst1.ItemData(Itemm) & "'"





strSQL = "INSERT INTO tblNamesSelected(ContactID,FirstName,LastName) " & _ "SELECT ContactID,FirstName,LastName " & _ "FROM tblNames " & _ "WHERE ContactID = " & ctrl.ItemData(Itemm)



If List9.ItemsSelected.Count = 0 Then
MsgBox "You must first select 1 or more list items"
Exit Sub
End If


در شکل زیر تمام داده های موجود در کمبو باکسی که فهرست نام جداول را دارد به لیست باکس کپی میشود همینطور کپی تمام داده های ستون دوم  کمبوباکس با نام customer name به لیست باکس. 

نکته تنظیم RowSourceType به Table/Query

برای کپی کردن از لوپ زدن با استفاده از پراپرتی listCount-1 استفاده میشود و برای اضافه کردن از پراپرتی AddItem ... پراپرتی لیست باکس نیز به Value List تغییر می یابد.




به دیزاین فرم نگاه کنید همانطور که می بینید در برگه پراپرتی کمبوباکس ، ۳ ستون از جدول گفته که آورده شود منتهی چرا ستون اول را نمی بینید ؟ چون عرض ستون را صفر تنظیم شده



List1.AddItem (cbo1.Column(1, i))


شماره ستون ها از صفر شروع میشود.صفر بمنزله ستون اول است

Use the Column property to refer to a specific column or column and row combination in a multiple-column combo box or list box. Read-only Variant.

expression.Column (IndexRow)



AddItem Method

Adds a new item to the list of values displayed by the specified list box control.

expression.AddItem (ItemIndex)



انتشار ویدئویی از یک شهروند با پرچم اسرائیل در میدان آزادی تهران؛⁣ نسخه اصلی این ویدئو با موسیقی متن منتشر شده است.



۱۸ ساعت پیش · سوریه برای مسکو مهم است، زیرا مداخله در آنجا در سال ۲۰۱۵ به پوتین اجازه داد تا روایت افول روسیه را که از زمان فروپاشی اتحاد جماهیر شوروی به وجود



۱۲ آذر ۱۴۰۳


۵۲ دقیقه پیش · این رسانه اعلام کرد که تروریستهای هیئت تحریر الشام و جیش الاسلام بر سر اداره شهر حلب به جان هم افتاده اند. خبرنگار المیادین بیان کرد که اختلافات



۲ ساعت پیش · در حالی که بخش‌های مهمی از سوریه در روزهای اخیر مورد حمله گروهک‌های تروریستی قرار گرفته و شهر مهم حلب سقوط کرده، بشار اسد رئیس جمهور این کشور در ...
۱ ساعت پیش · رؤسای اطلاعاتی اعلام کردند که "تحولات اخیر به نظر مثبت می‌رسند. " اما، به گفته آنان، "سقوط حکومت اسد احتمالاً منجر به هرج و مرجی خواهد شد که




۴ ساعت پیش · منابع آگاه در شهر حلب از استقرار نیروهای اوکراینی در کنار عناصر تروریست در این شهر خبر دادند



۱۴ ساعت پیش · امروز ابومحمد الجولانی، رهبر گروه تروریستی تحریرالشام، با حضور در مقابل دوربین موبایل نیروهایش به شایعات پایان داد. در چند روز اخیر، شایعه کشته



۲ ساعت پیش · شبکه تلویزیونی الجزیره خبر داد که نیروهای تحریر الشام وارد اولین محله های شهر حماة، مرکز استان حماة شدند. یک منبع نظامی سوری ورود گروه‌های مسلح 


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

العالم – سوریه

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

بنا به این گزارش ارتش سوریه روز گذشته موفق شد بیش از ۳۰۰ جنگجوی مجهز و آموزش دیده تروریستی موسوم به "کلاه قرمزها" را که به نزدیکی قمحانه و المجدل در اطراف حماه رسیده بودند در یک کمین به دام انداخته و همه آنان را به قتل برساند.



حمص محل پالایشگاه نفتی اصلی سوریه بوده و تصرف آن راه ارتباطی پایتخت به ساحل مدیترانه را قطع خواهد کرد؛ جایی که پایگاه دریایی مهم روسیه در طرطوس قرار دارد. هزاران نفر از هم‌مذهبی‌های علوی بشار اسد از حمص فرار کرده و بیشتر آن‌ها به سمت کوه‌های علوی در ساحل رفتند. تسلیحات ضدهوایی نیز برای دفع پهپادها بر فراز شهر به صدا درآمده‌اند. یکی از کارکنان عمومی شهر گفت: «مردم احساس امنیت نمی‌کنند. جاده‌ها به سمت ساحل پر از ترافیک است».



۱۶ آذر ۱۴۰۳ - ۱۳:۲۳



رسول سلیمی: پس از عقب‌نشینی ارتش سوریه از حما، در حالی که نیروهای بشاراسد تجهیزات نظامی سنگین خود را در پادگان ها به جا گذاشتند، مسیر مخالفان اسد برای حرکت به سوی شهرهای بعدی سوریه آسان شد. حمله نیروهای تحریرالشام برای تصرف حما تنها دو روز پیش آغاز شده بود و آنها امروز توانستند کنترل شهر را به دست آورند. به گفته رامی عبدالرحمان، مدیر دیده بان حقوق بشر، «تصرف حما تهدیدی برای اقلیت علوی حامی رئیس جمهور بشار اسد خواهد بود که در حومه غربی آن سکونت دارند.»

در همین راستا الجولانی فرمانده نیروهای تحریرالشام در ویدیوی کوتاهی که تلگرام منتشر شد، خطاب به ساکنان شهر گفت: «من به شما قول می دهم که برادران انقلابیون مجاهدین شما برای پاکسازی زخمی که در سوریه به مدت ۴۰ سال ادامه داشت، وارد شهر حما شده اند


عقب نشینی تاکتیکی ارتش سوریه برای به دام انداختن تروریست ها



۲ ساعت پیش · حمص محل پالایشگاه نفتی اصلی سوریه بوده و تصرف آن راه ارتباطی پایتخت به ساحل مدیترانه را قطع خواهد کرد؛ جایی که پایگاه دریایی مهم روسیه در طرطوس



۲ ساعت پیش · در حالی که هزاران نفر به دمشق یا استان لاذقیه گریختند، شورشیان از مردم حمص خواستند تا علیه حکومت اسد قیام کنند و در پیامی که در فضای مجازی پخش



۱ ساعت پیش · یک خبرنگار بین المللی عرب‌زبان نوشته: به طور رسمی تایید شد که بشار اسد به همراه خانواده خود سوریه را ترک کرد. این خبر تایید یا رد نمی‌شود


۱۰ ساعت پیش · - شهر درعا در جنوب سوریه به دست مخالفان مسلح دولت افتاد. این شهر 130 کیلومتر با دمشق فاصله دارد. الجزیره در این باره گزارش داد که نیروهای ارتش 



این منبع تاکید کرد اسرائیل در بحبوحه تلاش‌های امداد و نجات در سوریه، از حمله به هر محموله تسلیحاتی که ایران به سوریه بفرستد، تردید نخواهد کرد



۱۷ آذر ۱۴۰۳ عصرایران - جنگ داخلی در سوریه ادامه دارد. گروه های مسلح و مخالفان مسلح از طیف های گوناگون تلاش می کنند با تصرف شهرها و مناطق مختلف به شهر دمشق برسند و حکومت بشار اسد رئیس جمهوری سوریه را سرنگون کنند.




واقعیت در سوریه این است که بشار اسد شانس بسیار کمی دارد. سربازان او در حال فرار هستند و هیچ مقاومتی در قبال تروریست‌ها نشان نمی‌دهند.»



همزمان با این رویارویی‌ها نیروی هوایی سوریه و روسیه پل بزرگ «رستن» که حمص را به حماه متصل می نماید، تخریب کردند تا سرعت حرکت مخالفان مسلح به سوی



یک فروند هواپیمای شکاری آموزشی متعلق به وزارت دفاع و پشتیبانی نیروهای مسلح حین پرواز آزمایشی ساعت ۱۴:۴۵ امروز، ۱۴ آذرماه ۱۴۰۳ پس از بازآماد در ارتفاعات بین کوه‌های شهرستان‌های فیروزآباد و قیر استان فارس دچار سانحه شد و با ارتفاعات منطقه برخورد کرد.

در این حادثه سرهنگ حمیدرضا رنجبر و سرهنگ منوچهر پیرزاده خلبانان هواپیمای مذکور به شهادت رسیدند.



رویتر و خیلی رسانه ها گفتند بشار اسد با خانواده اش از سوریه خارج شدند. اگر چنین باشد در 48 ساعت اینده کار دولت بشار اسد تمام خواهد شد سوریه سقوط


ارتش سوریه در حال گرفتن زمام امور در حمص و حماه. ارتش سوریه اعلام کرد موقعیت نیروهای خود در استان‌های «درعا» و «السویداء» در جنوب سوریه را تغییر


۱۷ آذر ۱۴۰۳ ارتش سوریه در حال بازپس گیری حمص و حماه




اسرائیل منتظر سقوط حمص است

الیجاه مگنایر، روزنامه نگار و تحلیلگر حوزه خاورمیانه نوشت: اسرائیل منتظر است تا حمص سقوط کند تا جنوب سوریه را ضمیمه کند !!! و آن را به عنوان "منطقه حائل برای حفاظت در برابر جهادی‌ها" معرفی کند، همان چیزی که سال‌ها به دنبال آن بوده.



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


حکومت بشار اسد سقوط کرد / دمشق در کنترل کامل مخالفان / فرار بشار اسد / جولانی ، نخست وزیر را مسئول انتقال قدرت کرد / لاذقیه هم سقوط کرد (+فیلم).



و سرانجام با این هجمه تبلیغاتی بشار اسد سقوط و فراری شد و این نیز در تاریخ ماند البته ماندگار نخواهد بود


... سپاه پاسداران در سوریه هم از صبح روز جمعه این کشور را ترک کرده‌اند. برخی گزارشها نیز حکایت از آن دارد که دو فرمانده ارشد نیروی قدس سپاه که


سخنگوی وزارت امور خارجه در واکنش به برخی گزارش‌های رسانه‌ای گفت: خبر مربوط به تخلیه سفارت جمهوری اسلامی ایران در دمشق صحت ندارد.


سربازان سوری به عراق پناهنده شدند


به گزارش ایسنا، یک منبع امنیتی بلندپایه روز شنبه اعلام کرد که عراق امروز شنبه میزبان بیش از هزار نفر از سربازان ارتش سوریه بود.

او به خبرگزاری عراق گفت که این سربازان از طریق گذرگاه مرزی القائم در استان الانبار وارد عراق شدند.

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



تصویر زیر فوتبال زنان عربی اسلامیست مگر اینها به حجاب  مثل بانوان فوتبالیست ایرانی پایبند نیستند؟!!!



بغداد الیوم همچنین گفته: «آنچه که تاکنون برای ما تأیید شده، این است که بشار اسد به‌دلیل هدف‌قرارگرفتن هواپیمایش توسط اسرائیل، کشته شده است».


 سخنگوی وزارت امور خارجه روسیه از ادعای رسانه انگلیسی درباره مرگ بشار اسد که اکنون به همراه خانواده‌اش به روسیه پناهنده شده، انتقاد و آن را 


 رسانه صهیونیستی از تلاش تل آویو جهت سوء استفاده از اوضاع سوریه برای توسعه طلبی و تداوم حملات هوایی به تاسیسات نظامی این کشور و انهدام دهها



۱۰ ساعت پیش · به گزارش جماران؛ مهر به نقل از المنار نوشت: صدای ۳ انفجار شدید در اطراف حرم حضرت زینب (س) در حومه دمشق پایتخت سوریه به گوش رسیده است. تاکنون 


۱۹ آذر ۱۴۰۳


۴۱ دقیقه پیش · «حمدی اسماعیل ندی» شیمیدان آلی توسط افراد ناشناس در خانه‌اش در دمشق ترور شد. منابع رسانه‌ای از ترور یک شیمیدان برجسته سوری در خانه‌ای در دمشق ...
۲۳ دقیقه پیش · ترور یک شیمیدان برجسته در دمشق. شبکه العهد عراق گزارش داد که دکتر «حمدی اسماعیل ندی» شیمیدان آلی توسط افراد ناشناس در خانه‌اش در دمشق ترور شد.
۷ دقیقه پیش · ترور یک عالِم دینی در دمشق. منابع رسانه‌ای سوریه از ترور شیخ توفیق البوطی فرزند شیخ محمد سعید رمضان توسط مهاجمان ناشناس در دمشق خبر دادند



۱۶ ساعت پیش · ... سوریه هم بسیار وخیم خواهد شد. در حالی که گروه‌های تروریستی- تکفیری در دمشق مستقر هستند، شبه‌نظامیان کُرد تحت حمایت آمریکا هم در شرق سوریه



نتانیاهو در حال شادی و مسرور از شکست بشاراسد فراری در حال بمباران انبارهای مهمات و تاسیسات نظامی مهم و الکترونیکی سوریه



۱ روز پیش · تصاویر دوربین‌های مداربسته زندان صیدنایا در سوریه، پرسش‌های بی‌پاسخ بسیاری را در ذهن‌ها ایجاد کرده است.



۸ دقیقه پیش · یکی از درس‌های این مسئله‌ی غفلت است، غفلت از دشمن؛ بله در این حادثه دشمن با سرعت عمل کرد، اما اینها بایستی از قبل از حادثه می‌فهمیدند که این


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



حسینی، خبرنگار صداوسیما در دمشق گفت: بعضی از فرماندهان بلندپایه بشار اسد اطلاعات دقیقی از اماکن حیاتی ارتش سوریه به رژیم صهیونیستی دادند!


۷ ساعت پیش · دولت انتقالی سوریه امروز پنجشنبه ( ۲۲ آذر ۱۴۰۳ ) از هشت کشور به دلیل بازگشایی سریع مراکز دیپلماتیک خود پس از سرنگونی رژیم بشار اسد تشکر کرد



مقبره حافظ اسد ... به مرده هم رحم نکردند






بنابر گزارش ایرنا، روز گذشته ( آذر ۱۴۰۳ ) خودروی حامل سه معلم که از شهرستان خوی به سمت قطور در حال حرکت بود، درحادثه‌ای از پل و جاده خارج و در نهایت واژگون شد. این سه معلم در این حادثه جان خود را از دست دادند.






روز شنبه متن کامل قانون عفاف و حجاب در رسانه ها منتشر شد. بر این اساس، طبق ماده یکم از تبصره دوم ماده ۳۲، «مهاجرین یا اتباع بیگانه‌ای» که «مجوز اقامت رسمی از وزارت کشور» دارند، امکان امر به معروف و نهی از منکر را دارا هستند.


مثلاً افغانستانی به ایرانی می تونه درمورد حجاب تذکر بده ببینید مجلس رو کیا اداره می کنن!!!






استعمارِ انگلیس نبود «فارسی» زبان اولِ دنیا بود؛ پادشاهان هند به فارسی شعر می‌گفتند

علیرضا قزوه می‌گوید اگر استعمار انگلیس نبود، امروز زبان اول دنیا «فارسی» بود و ما گویش‌ور اصلی در هند بودیم. انگلیس برای نابودی زبان فارسی در هند ۳۰۰ سال کار کرده و از ما جلوتر است





۱ آبان ۱۴۰۳ · رسول‌اف که اساساً نابلدی در کارگردانی را در فیلم‌هایش فریاد می‌زند، در دانه انجیر معابد هم سنگ تمام گذاشته است تا اثری سیاه بسازد، به طوری که


دانه‌ی انجیر معابد فیلم درام دلهره‌آور سیاسی به نویسندگی و کارگردانی محمد رسول‌اف محصول سال ۲۰۲۴ است. داستان فیلم دربارهٔ ایمان، یک قاضی تحقیق در دادگاه انقلاب تهران است که با تشدید اعتراضات سیاسی سراسری و ناپدید شدن اسلحه اش به طرز مرموزی با... ویکی‌پدیا
تاریخ اکران: ۱۸ سپتامبر ۲۰۲۴ (فرانسه)
فیلم‌نامه: محمد رسول‌اف


رسول‌اف در کنار امین صدرائی، مانی تیلگنر، رزیتا هندیجانیان و ژان کریستوف سیمون تهیه کنندگی این فیلم را برعهده داشت. شرکت‌های تولیدی درگیر ران وی پیکچرز از آلمان و پارالل۴۵ از فرانسه بودند. این فیلم توسط آرته فرانسه با حمایت موین فیلم فوردرونگ هامبورگ شلسویگ هولشتاین تهیه شده است. شرکت فیلمس بوتیک مستقر در برلین حقوق فروش جهانی را در دست دارد.













MultiSelection Microsoft Access



ComboBox.ItemData property (Access) :

expression.ItemData (Index)

پراپرتی ItemData داده در ستون باند شده برای ردیف مشخص شده در یک کمبو باکس را بر می گرداند. ایندکس از صفر شروع میشود

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

باید پراپرتی MultiSelect لیست یاکس به Simple یا Extended تنظیم شود تا کاربر قادر به انتخاب بیشتر از یک ردیف باشد.

از پراپرتی Column هم می توانید استفاده کنید که داده کدام ستون و ردیف برگردانده شود.


ListBox.ItemsSelected property (Access) :

مجموعه ItemSelected دو پراپرتی Count و Item دارد بدون داشتن هیچ متدی البته



Dim frm As Form, ctl As Control
Dim varItm As Variant
Set frm = Forms!Contacts
Set ctl = frm!Names
For Each varItm In ctl.ItemsSelected
Debug.Print ctl.ItemData(varItm)
Next varItm


مثال بالا مقدار باند کالمن هر ردیف انتخاب شده را چاپ میکند در پنجره immidiate window


مثال زیر باز شدن گزارش با شرط خاصی مشخص شده، یک لیست MultiSelection است و چنانچه کاربر  یک یا چند داده را انتخاب کند و باتن cmdOpenReport را بفشارد گزارش حاوی داده ها ی گرفته شده باز میشود.




Private Sub cmdOpenReport_Click()

    Dim varItem As Variant
    Dim strEmployeeIDList As String
    Dim strCriteria As String
    Dim ctrl As Control    
    Set ctrl = Me.lstEmployees    
با پراپرتی کانت چک میکند که حداقل یک گزینه از لیست باکس انتخاب شده باشد.
    If ctrl.ItemsSelected.Count > 0 Then
در کد For Each....Next  داده آیتم یا آیتم های انتخاب شده را با پراپرتی ItemData ی کنترل میگیرد ، بین آنها کاما گذاشته و به متغیر strEmployerIDList میدهد
        For Each varItem In ctrl.ItemsSelected
            strEmployeeIDList = strEmployeeIDList & "," & ctrl.ItemData(varItem)
        Next varItem
      چون یک کاما قبل از اولین آیدی گرفته شده ( متغیر)  قرار می گیرد با تابع Mid گفته که عبارت بعد از کاما در متغیر قرار گیرد در نتیجه آن کاما حذف میشود.
        ' remove leading comma
        strEmployeeIDList = Mid(strEmployeeIDList, 2)     
حال نوبت به نوشتن شرط یا Criteria است که در  آرگومان WhereCondition  قرار داده شده  in هم کلمه ای است رزرو شده که در عبارات sql استفاده میشود و بیان نموده که strEmployeeIDList هایی که در فیلد EmployeeID ( دیتا تایپ نامبر است ) موجود است فهرست شوند .... چون ID نامبراست احتیاجی نیست که بین هر داده گرفته شده کوتیشن قرار گیرد ولی اگر دیتا تایپ فیلد تکست بود می بایست بین هر داده ای که از لیست باکس گرفته میشود غیر از همرا بودن با کاما ، تک کوتیشن نیز در ابتدا و انتهای آن قرار گیرد.

        strCriteria = "EmployeeID In(" & strEmployeeIDList & ")"
در کد زیر دستور باز شدن گزارش rptEmployees با چشم انداز Preview و شرط strCriteria داده شدس.
        DoCmd.OpenReport "rptEmployees", _
            View:=acViewPreview, _
            WhereCondition:=strCriteria
    Else
اگر هیچ آیتمی در لیست باکس انتخاب نشده باشد پیغامی را با Msgbox رایز میکند با پرامپت هیچ کارمندی انتخاب نشده.
        MsgBox "No employees selected", vbInformation, "Warning"
    End If
   
End Sub



expression.Column (IndexRow)


پراپرتی کالمن در آبجکت کمبو و لیست باکس که index اشاره به ستون مورد نظر دارد و Row هم اشاره به ردیف و از صفر شروع میشوند. فرضا شما میخواهید داده ستون دو و ردیف سوم را بگیرید.


.Column(1,2)



زمانیکه پراپرتی MultiSelect کنترل لیست باکس به None تنظیم شود فقط یک آیتم می تواند انتخاب شود و پراپرتی Selected می تواند به True تنظیم شود.وقتی پراپرتی MultiSelect کنترل لیست باکسی به Simple یا Extended تنظیم شود هر کدام یا تمام آیتم های انتخاب شده می تواند پراپرتی Selected برابر True خودش را داشته باشد. پس مشخص شد با Selected می توانید مشخص کنید کدام آیتم یا آیتم ها Select شده اگر True باشد انتخاب میشود و اگر به False تنظیم شود از حالت انتخاب در می آید.


لیست باکس چند انتخابی یا Multi-Selection باند شده به فیلدی همیشه دارای پراپرتی Value مساوی با Null است . می توان از پراپرتی Selected یا مجموعه ItemSelected برای بازیابی اطلاعات آیتم هایی که انتخاب شده اند ، استفاده نمود.


 عبارت زیر پنجمین آیتم در لیست را انتخاب ( Select ) می نماید


نام کنترل لیست باکس در اینجا ListBox1 است

 Me!Listbox1.Selected(4)=True



ComboBox.LimitToList property (Access) :

از پراپرتی LimitToList برای محدود کردن مقادیر کمبو باکس به آیتم های لیست شده استفاده میشود یعنی اگر به True تنظیم شود اگر مقداری در تکست باکس کمبو تایپ شود و در لیست نباشد زمان Enter و از دست دادن فوکس خطایی را نمایش میدهد که آیتم در لیست نیست.

Forms("Order Entry").Controls("States").LimitToList = True 


اگر بخواهید پیغام خودتان را نشان دهد در رویداد NotInList می توانید Response را مساوی صفر و پیام مورد نظرتان را در Msgbox قرار دهید


ComboBox.ListCount property (Access) :

تعیین تعداد ردیف های لیست باکس قسمتی از کمبو باکس ( کمبو باکس همانطور که در یادداشت های دیگر گفته شده یک قسمت تکست باکس و یک قسمت DropDown دارد.

اگر  پراپرتی ColumnHeads به True تنظیم شود این ردیف هم اضافه میشود یعنی ایندکس آن صفر است


ComboBox.ListRows property (Access) :

برای تنظیم حداکثر تعداد ردیف هایی که در لیست باکس قسمت کمبو باکس نمایش داده شود کاربرد دارد.

ComboBox.Locked property (Access) :

پراپرتی Locked مشخص میکند که می توان داده را در کنترلی در فرم ویرایش کرد.دیفالت True است
و این تنظیم اجازه ویرایش ، حذف و اضافه کردن داده را می دهد.


ComboBox.ListIndex property (Access) : 

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

مقدار پراپرتی ListIndex با تنظیم پراپرتی BoundColumn به صفر در دسترس است. اگر پراپرتی BoundColumn مقدار صفر بگیرد فیلدی که به کمبو یا لیست باکس باند شده حاوی همان مقداری خواهد شد که پراپزتی ListIndex تنظیم شده.



Here is the code to take data from a list box to a table...

Code:
کد زیر برای بردن داده از یک لیست باکس به یک جدول  و از کوئری Append استفاده شده البته Sql آن .

Private Sub Command14_Click()
Dim varName As Variant
Dim varItem As Variant
Dim strSQL As String
Dim undSQL As String
Dim CmbValue As String 
CmbValue = Me.Combo0.Value 
With Me.List9 
For Each varItem In .ItemsSelected

در عبارت Sql زیر در Insert into نام جدول و بعد داخل پرانتز نام فیلدهایی که باید داده به آن اضافه شوند و بعد Values و داخل پرانتز داده ها برای داده های فیلد از نوع دیتا تایپ تکست از تک کوتیشن در ابتدا و انتهای متغیر استفاده می شود . به پرانتزها و فواصل توجه کنید وگرنه خطای Syntax یا نوشتاری خواهید گرفت.

strSQL = "INSERT INTO tlbTempRecordset (UnderwriterName, ST_CODE) VALUES ('" & .Column(0) & "','" & .ItemData(varItem) & "');"
DoCmd.RunSQL (strSQL)
عبارت زیر حتما باید اعمال گردد وگرنه مقادیر تکرار و تکرار میشوند چون در لوپ هستیم   و اتومات Reset  نمی شود عزیزان
strSQL = ""
Next varItem 
End With 
Me.List9.Value = Null 
End Sub




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








DRAWITEM ... LISTBOX



Type NCCALCSIZEPARAM

rgrc(3) As RECT

lpos As WINDOWPOS

End Type



lParam

If wParam is TRUElParam points to an NCCALCSIZE_PARAMS structure that contains information an application can use to calculate the new size and position of the client rectangle.

If wParam is FALSElParam points to a RECTstructure. On entry, the structure contains the proposed window rectangle for the window. On exit, the structure should contain the screen coordinates of the corresponding window client area


Function fnListSubClass(ByVal hwnd As LongPtr,ByVal msg As Long,ByVal wParam As LongPtr,ByVal lParam As LongPtr)

Select Case msg

case WM_NCCALCSIZE

CallWindowProc listboxProc,hwnd,msg, wParam, lParam
'what is doing???
RECT* pRect = (RECT*)lParam
pRect->left+=4;
pRect->top+=23;
pRect->bottom+=23;
return 0;

case WM_NCPAINT

hdc=GetDC(hwnd) GetClientRect hwnd,rect
SetRect rect,0,0,4, rect.bottom brush=LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BORDER))
newBrush=CreatePatternBrush(brush)
oldBrush=SelectObject(hdc, newBrush) FillRect hdc,rect,newBrush SelectObject hdc, oldBrush
DeleteObject newBrush
DeleteObject oldBrush
DeleteObject brush
UpdateWindow hwnd
ReleaseDC hwnd, hdc
Exit Function



fnListSubClass=CallWindowProc(listboxProc, hwnd

(msg, wParam, lParam,


End Function 


Function WinProc(ByVal hwnd As LongPtr,ByVal msg As Long,ByVal wParam As LongPtr,ByVal lParam As 
(LongPtr

CASE WM_SHOWWINDOW,WM_CREATE 

listboxProc=SetWindowLongPtrA(listbox, GWL_WNDPROC,AddressOf fnListSubClass)

SendMessage listbox,WM_SETFONT, CreateFont=tahoma16, true

Case WM_DRAWITEM

Dim pdis AS DRAWITEMSTRUCT
CopyMemory pdis,ByVal lParam,40

if pdis.itemID=-1 Then Exit Function

Dim txt As String*40

SendMessage pdis.hwndItem,LB_GETTEXT,pdis.itemID, text
(itemLength=Len(text



if(pdis.itemAction=ODA_FOCUS Or pdis.itemState And ODS_FOCUS) Then 

(SetTextColor pdis.hDC,RGB(255,255,255

(SetBkColor pdis.hDC,RGB(51,94,168

FillRect pdis.hDC,pdis.rcItem

((CreateSolidBrush(RGB(51,94,168,

  
Else

(SetTextColor pdis.hDC,RGB(0,0,0

(SetBkColor pdis.hDC,RGB(255,255,255

FillRect pdis.hDC,pdis.rcItem

((CreateSolidBrush(RGB(255,255,255,


End if 


DrawTextExW pdis.hDC,text,itemLength, pdis.rcItem,DT_CENTER Or DT_END_ELLIPSIS,0



if(pdis.itemState=ODS_FOCUS) Then DrawFocusRect pdis.hDC,pdis.rcItem
End if 

CopyMemory ByVal lParam,pdis,40

Case WM_DESTROY
SetWindowLongPtrA hwnd,GWL_WNDPROC,listboxProc





WM_NCCREATE

We handle WM_NCCREATE because we want to associate so data with the LISTBOX and make a minor modification to the LISTBOX style. Creating our data is a simple and store in the window properties.

We modify the style by adding the WS_HSCROLL if the LISTBOX doesn't already have it. Without this style the horizontal scrollbar won't show no matter what we do.

WM_NCDESTROY

Here we simply destroy our data structure and remove it from the window properties. Nothing exciting.



مثالی دیگر از مطالب به اشتراک گذاشته در سایت خارجی 



Code:
Private Sub Form_Load()
 Dim I As Integer
    
 For I = 15 To 0 Step -1
   'Load a List of 0 to 15 with the Item Data
   'Set to the QBColors 0 - 15
   List1.AddItem "Color " & I
   List1.itemData(List1.NewIndex) = QBColor(I)
 Next
    
 For I = 0 To 15
   'Load a List of 0 to 15 with the Item Data
   'Set to the QBColors 0 - 15
   List2.AddItem "Color " & I
   List2.itemData(List2.NewIndex) = QBColor(I)
 Next
    
 'Subclass the "Form", to Capture the Listbox Notification Messages
 lPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf SubClassedList)
End Sub

Private Sub Form_Unload(Cancel As Integer)
 'Release the SubClassing, Very Import to Prevent Crashing!
 Call SetWindowLong(hwnd, GWL_WNDPROC, lPrevWndProc)
End Sub
.BAS Code

Code:
Option Explicit

Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Public Type DRAWITEMSTRUCT
        CtlType As Long
        CtlID As Long
        itemID As Long
        itemAction As Long
        itemState As Long
        hwndItem As Long
        hdc As Long
        rcItem As RECT
        itemData As Long
End Type

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

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 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Public Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Public Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
Public Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long

Public Const COLOR_HIGHLIGHT = 13
Public Const COLOR_HIGHLIGHTTEXT = 14
Public Const COLOR_WINDOW = 5
Public Const COLOR_WINDOWTEXT = 8
Public Const LB_GETTEXT = &H189
Public Const WM_DRAWITEM = &H2B
Public Const GWL_WNDPROC = (-4)
Public Const ODS_FOCUS = &H10
Public Const ODT_LISTBOX = 2

Public lPrevWndProc As Long

Public Function SubClassedList(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 Dim tItem As DRAWITEMSTRUCT
 Dim sBuff As String * 255
 Dim sItem As String
 Dim lBack As Long
    
 If Msg = WM_DRAWITEM Then
   'Redraw the listbox
   'This function only passes the Address of the DrawItem Structure, so we need to
   'use the CopyMemory API to Get a Copy into the Variable we setup:
   Call CopyMemory(tItem, ByVal lParam, Len(tItem))
        
   'Make sure we're dealing with a Listbox
   If tItem.CtlType = ODT_LISTBOX Then
     'Get the Item Text
     Call SendMessage(tItem.hwndItem, LB_GETTEXT, tItem.itemID, ByVal sBuff)
            
     sItem = Left(sBuff, InStr(sBuff, Chr(0)) - 1)
            
     If (tItem.itemState And ODS_FOCUS) Then
       'Item has Focus, Highlight it, I'm using the Default Focus
       'Colors for this example.
       lBack = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT))
                
       Call FillRect(tItem.hdc, tItem.rcItem, lBack)
       Call SetBkColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHT))
       Call SetTextColor(tItem.hdc, GetSysColor(COLOR_HIGHLIGHTTEXT))
       TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
       DrawFocusRect tItem.hdc, tItem.rcItem
     Else
       'Item Doesn't Have Focus, Draw it's Colored Background
       'Create a Brush using the Color we stored in ItemData
       lBack = CreateSolidBrush(tItem.itemData)
       'Paint the Item Area
       Call FillRect(tItem.hdc, tItem.rcItem, lBack)
                
       'Set the Text Colors
       Call SetBkColor(tItem.hdc, tItem.itemData)
       Call SetTextColor(tItem.hdc, IIf(tItem.itemData = vbBlack, vbWhite, vbBlack))
       
       'Display the Item Text
       TextOut tItem.hdc, tItem.rcItem.Left, tItem.rcItem.Top, ByVal sItem, Len(sItem)
     End If
            
     Call DeleteObject(lBack)
     
     'Don't Need to Pass a Value on as we've just handled the Message ourselves
     SubClassedList = 0
     Exit Function
   End If
 End If
    
 SubClassedList = CallWindowProc(lPrevWndProc, hwnd, Msg, wParam, lParam)
End Function


فقط در CopyMemory سایز ۴۰ را به آرگومان سومش تخصیص دهید و از ByVal lParam استفاده کنید.


در مورد LB_GETTEXT  : 


Return value

The return value is the length of the string, in TCHARs, excluding the terminating null character. If wParam does not specify a valid index, the return value is LB_ERR.

     Remarks

If the list box has an owner-drawn style but not the LBS_HASSTRINGS style, the buffer pointed to by the lParam parameter receives the value associated with the item (the item 

(data


ListBox در InputBox




Vb Uses Unicode For Text String hence delcare SendMessageW instead Of SendMessageA****



: Important Notes

Use -----> LBS_OWNERDRAWFIXED Or LBS_HASSTRINGS 

use -----> SendMessageW,   /   TextoutW

 To Add Item it is important to Use SendMessageA And Byval  "Item" you want to add like 

"SendMessageA hlist, &H180, 0, ByVal "FFF




case WM_DRAWITEM

Dim Buff As String * 255 ' important

GetClientRect pdis.hwndItem, pdis.rcItem

    r = pdis.rcItem

    l = SendMessageW(pdis.hwndItem, LB_GETTEXT, pdis.itemID, ByVal Buff

    SendMessageA pdis.hwndItem, LB_GETITEMRECT, pdis.itemID, r

    TextOutW pdis.hdc, r.Left, r.Top, ByVal Buff, l



"SendMessageA hlist, &H180, 0, ByVal "FFF

       "SendMessageA hlist, &H180, 0, ByVal "HHT

       "SendMessageA hlist, &H180, 0, ByVal "123E

       "سلام" SendMessageA hlist, &H180, 0, ByVal 

        "حاجی"SendMessageA hlist, &H180, 0, ByVal









if pdis.itemid mod 2=. then SetTextColor Else SetTextColor


If pdis.itemAction = ODA_SELECT Then

    ( l = SendMessageW(pdis.hwndItem, LB_GETTEXT, pdis.itemID, ByVal Buff

     SetWindowTextW hwnd, ByVal Buff

     End If










Static OldRect

If pdis.itemAction = ODA_SELECT Then

         ( l = SendMessageW(pdis.hwndItem, LB_GETTEXT, pdis.itemID, ByVal Buff

          SetWindowTextW hwnd, ByVal Buff

          r.Left = r.Left + 15

          (FillRect pdis.hdc, r, GetSysColorBrush(0

          InvalidateRect pdis.hwndItem, OldRect, 1

          OldRect = r

    End If







%WS_CHILD Or %LBS_OWNERDRAWFIXED Or %LBS_MULTICOLUMN Or %LBS_NOTIFY Or %WS_TABSTOP Or %WS_HSCROLL, %WS_EX_CLIENTEDGE
    


ListBox در InputBox




vb Uses Unicode for text string so use SendMessageW instead Of SendMessageA Function 



The list box has the LBS_OWNERDRAWFIXED and LBS_HASSTRINGS styles, in addition to the standard list box styles.


LBS_HASSTRINGS


Specifies that a list box contains items consisting of strings. The list box maintains the memory and addresses for the strings so that the application can use the LB_GETTEXT message to retrieve the text for a particular item. By default, all list boxes except owner-drawn list boxes have this style. You can create an owner-drawn list box either with or without this style.


کاملا به دو نکته ی زیر توجه شود : 

To obtain the exact length of the text, use the WM_GETTEXTLB_GETTEXT, or CB_GETLBTEXT messages, or the GetWindowText function



LB_GETTEXT


The return value is the length of the string, in TCHARs, excluding the terminating  

(null character  ( hence buff+1


If the list box has an owner-drawn style but not the LBS_HASSTRINGS style, the buffer pointed to by the lParam parameter receives the value associated  with the item the item data

Means Use Byval


If the list box has WS_HSCROLL style and you insert a string wider than the list box, send an LB_SETHORIZONTALEXTENT message to ensure the horizontal scroll bar appears.




Case WM_MEASUREITEM



Case WM_DRAWITEM

   

 

    Dim pdis As DRAWITEMSTRUCT

    Dim tm As TEXTMETRIC

    Dim hDCMem As LongPtr


 CopyMemory pdis, ByVal lParam, 40

Select Case pdis.itemAction

          Case ODA_SELECT, ODA_DRAWENTIRE



Dim p As RECT

         GetClientRect pdis.hwndItem, pdis.rcitem


BitBlt pdis.hdc


SetBkMode pdis.hdc, 0

                        SetTextColor pdis.hdc, vbRed

                        TextOutA pdis.hdc, pdis.rcitem.Left,pdis.rcitem.Top, buffer$, 5


CopyMemory lParam, pdis,40

End Select 






گرفتن  تعداد آیتم ها در لیست باکس 



LB_GETCOUNT message

Gets the number of items in a list box


wParam,lParam

Not used; must be zero


Dim index As Integer
Dim textBuff As String
(textBuff = Space(255
(NumItems=SendMessage(hWndList,LB_GETCOUNT,0,0


index use GETCURSEL'

Gets the index of the currently selected item)'

(if any, in a single-selection list box'


SendMessageW hWndList, LB_GETTEXT,index, textBuff
MsgBox textBuff 




docs.microsoft.com/enmeasureitemstruct


مثالی از کشیدن نقطه چین دور آیتم سلکت شده به زبان دیگر 



if  lpdis->itemState & ODS_SELECTED


* Set RECT coordinates to surround only the'

* bitmap.


rcBitmap.left=lpdis->rcItem.left

rcBitmap.top=lpdis->rcItem.top

rcBitmap.right=lpdis->rcItem.left+XBITMAP

rcBitmap.bottom=lpdis->rcItem.top + YBITMAP


* Draw a rectangle around bitmap to indicate'

* the selection.


DrawFocusRect lpdis->hDC, &rcBitmap




استفاده در مثال شکل بالا  به زبان دیگر 


 Display the text associated with the item'

SendMessage lpdis->hwndItem

LB_GETTEXT,lpdis->itemID, (LPARAM) tchBuffer,

GetTextMetrics lpdis->hDC, &tm

GetClientRect lpdis.hwnditem,lpdis.rcItem'


-y=(lpdis->rcItem.bottom+lpdis->rcItem.top

tm.tmHeight) / 2


6+TextOutA lpdis->hDC,XBITMAP

(y,tchBuffer,len(tchBuffer,


SelectObject hdcMem, hbmpOld

DeleteDC hdcMem






The GetTextMetrics function fills the specified buffer with the metrics for the currently selected font

BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC lptm );

Parameters

hdc

A handle to the device context

lptm

A pointer to the TEXTMETRIC structure that receives the text metrics.


Type TEXTMETRICA
tmHeight As Long
tmWeight As Long
tmItalic As Long
tmMaxCharWidth As Long
tmUnderlined As Long
tmCharSet As Long
End Type




 : case WM_MEASUREITEM
;lpmis = (LPMEASUREITEMSTRUCT) lParam
;lpmis->itemHeight=20
;return TRUE

(DrawEntire(LPDRAWITEMSTRUCT lpDStruct

;(CRect rect(lpDStruct->rcItem
;HDC dc =lpDStruct->hDC
;MYLISTITEM *a = (MYLISTITEM*)lpDStruct->itemData

TextOut(dc,rect.left+20,rect.top+2,a->title,strlen(a-

;((title<

(if (lpDStruct->itemState & ODS_FOCUS
}

;(DrawFocusRect(dc,rect

{

clean up //

;(SelectObject(dc,hOldFont

;(SelectObject(dc,oldpen

;(SelectObject(dc,oldbrush



;logFont.lfHeight = 16
;logFont.lfWeight = FW_BOLD

;("strcpy(logFont.lfFaceName,"courier

;(hFont = CreateFontIndirect(&logFont

(hOldFont = (HFONT)SelectObject(dc,hFont








ListBox



Const LBN_SELCHANGE = 1
Const LBN_DBLCLK = 2
Const LBN_SELCANCEL = 3
Const LBN_SETFOCUS = 4
Const LBN_KILLFOCUS = 5

Const LB_ADDSTRING = &H180
Const LB_SETSEL = &H185
Const LB_SETCURSEL = &H186 Const LB_GETSEL = &H187
Const LB_GETCURSEL = &H188
Const LB_GETTEXT = &H189
Const LB_GETTEXTLEN = &H18A
Const LB_GETCOUNT = &H18B
Const LB_SELECTSTRING = &H18C
Const LB_GETITEMRECT = &H198
Const LB_GETITEMDATA = &H199
Const LB_SETITEMDATA = &H19A
Const LB_SELITEMRANGE = &H19B
Const LB_SETITEMHEIGHT = &H1A0
Const LB_GETITEMHEIGHT = &H1A1

private Const WM_NOTIFY=&H4E
public Const WM_COMMAND=&H111
Const WM_DRAWITEM =&H2B

Const ODA_FOCUS = &H4
Const ODS_FOCUS = &H10
Const ODS_SELECTED = &H1




?private lpListBox as ListBox
?set lpListBox = lpLB
?m_LBHwnd = lpListBox.hwnd

private Function LBSubcls_WndProc_V3(byval hwnd as Long, byval Msg as Long, byval wParam as Long, byval lParam as Long) as Long

Dim lCurind as Long


Select Case Msg 

Case WM_COMMAND

If lParam = m_LBHwnd then
LongInt2Int wParam, iHw, iLW
(Select Case (iHw

Case LBN_SELCHANGE

lCurind=SendMessage(lParam, LB_GETCURSEL,0,byval 0&)

If (lCurind Mod 3) = 0 then

lCurind = SendMessage(lParam, LB_SETCURSEL, lCurind + 1, byval 0&)

End If 

Debug.print " sendmessage returned:" & Hex$(lCurind)

Case LBN_SELCANCEL

lCurind=SendMessage(lParam, LB_GETCURSEL,0,byval 0&) 

Debug.print " lbnselcancel for:"; Hex$(lCurind)

End Select 
End If


Case WM_DRAWITEM

If LB_Drawitem(lParam) = 0 then 

LBSubcls_WndProc_V3 = 0 
Exit Function 

End If
Case else 
End Select

LBSubcls_WndProc_V3=CallWindowProc(oldWndProc,hwnd,Msg, wParam, lParam)

End Function





private Function LB_Drawitem(byval lParam as Long) as Integer

Dim drawstruct as DRAWITEMSTRUCT 
Dim szBuf(256) as Byte

CopyMemory drawstruct,byval lParam, len(drawstruct)

Dim i as Integer
Dim hbrGray as Long,hbrback as Long,szListStr as string ' * 256
Dim crback as Long,crtext as Long,lbuflen as Long


Select Case (drawstruct.CtlType)
   Case ODT_LISTBOX

lbuflen=SendMessagedrawstruct.hwndItem,LB_GETTEXTLENdrawstruct.itemID,byval 0&)


Redim szBuf(lbuflen+2)

lbuflen=SendMessage(drawstruct.hwndItem,LB_GETTEXT,drawstruct.itemID,szBuf(0))


i = drawstruct.itemID

If i Mod 3=0 then
hbrGray = CreateSolidBrush(GetSysColor(COLOR_GRAYTEXT))

 

GrayString drawstruct.hdc, hbrGray,byval 0&,szListStr, len(szListStr),drawstruct.rcItem.Left,drawstruct.rcItem.Top, 0,0

DeleteObject hbrGray 

crback=RGB(180, 180, 180) crtext=RGB(60, 60, 60) 

else

If (drawstruct.itemState And ODS_SELECTED)=ODS_SELECTED then 

crback=GetSysColor(COLOR_HIGHLIGHT)
crtext=GetSysColor(COLOR_HIGHLIGHTTEXT)


ElseIf (drawstruct.itemState And ODS_FOCUS)=ODS_FOCUS then

crback=GetSysColor(COLOR_WINDOW)
crtext=vbRed

else

End if 


If (drawstruct.itemState And ODS_FOCUS)= 
ODS_FOCUS then
crtext=vbRed
End If
End If


hbrback=CreateSolidBrush(crback)

FillRect drawstruct.hdc, drawstruct.rcItem,hbrback 

DeleteObject hbrback

SetBkColor drawstruct.hdc, crback

SetTextColor drawstruct.hdc, crtext 


TextOut drawstruct.hdcdrawstruct.rcItem.Left,drawstruct.rcItem.Top, szListStr,len(szListStr) 

TextOutBStr drawstruct.hdc, drawstruct.rcItem.Left,drawstruct.rcItem.Top,szBuf(0),lbuflen


If (drawstruct.itemState And ODS_FOCUS) then

DrawFocusRect drawstruct.hdc, drawstruct.rcItem

End If

LB_Drawitem = 1

End Select

End Function



private Function LBSubcls_WndProc_V4(byval hwnd as Long,byval Msg as Long, byval wParam as Long,byval lParam as Long) as Long

Dim iHw as Integer,iLW as Integer
Dim lCurind as Long

Select Case Msg 

Case WM_LBUTTONDOWN, WM_LBUTTONDBLCLK

LongInt2Int lParam, iHw, iLW

Debug.print " Mouse down at(" & iHw & "," & iLW &  ")"

lCurind=SendMessage(hwnd, LB_ITEMFROMPOINT,byval 0, byval lParam)

Debug.print "Index of btn down:" & Hex$(lCurind)


If (lCurind Mod 3) = 0 then 
LBSubcls_WndProc_V4 = 1
Exit Function
End If

,Case WM_KEYDOWN

LongInt2Int wParam, iHw, iLW 

Select Case (iLW)

Case vbKeyDown

lCurind=SendMessage(hwnd, LB_GETCARETINDEX,0,byval 0&) 

Debug.print " Keydown With Itemid :" & Hex$(lCurind) 

If ((lCurind + 1) Mod 3) = 0 then 

lCurind=SendMessage(hwnd, LB_SETCARETINDEX,lCurind + 1, byval 0&)

End If 

lCurind = SendMessage(hwnd, LB_GETCURSEL, 0, byval 0&) 

Debug.print " Keydown With Itemid :" & Hex$(lCurind)

If ((lCurind + 1) Mod 3) = 0 then

lCurind = SendMessage(hwnd, LB_SETCURSEL, lCurind + 1, byval 0&)

End If 

Case vbKeyUp 

lCurind = SendMessage(hwnd, LB_GETCARETINDEX,0,byval 0&) 

Debug.print " KeyUp With Itemid :" & Hex$(lCurind)

If ((lCurind - 1) Mod 3) = 0 then

lCurind = SendMessage(hwnd, LB_SETCARETINDEX,lCurind - 1, byval 0&)

End If 

lCurind = SendMessage(hwnd, LB_GETCURSEL,0,byval 0&) 

Debug.print " KeyUp With Itemid :" & Hex$(lCurind)

If ((lCurind - 1) Mod 3) = 0 then

lCurind = SendMessage(hwnd, LB_SETCURSEL, lCurind - 1, byval 0&)

End If 

End Select 

Case else 

End Select

LBSubcls_WndProc_V4 = CallWindowProc(LBProc1, hwnd, Msg, wParam, lParam)

End Function 



public Function LongInt2Int(byval lLongInt as Long,byref iHiWord as Integer, byref iLowWord as Integer) as Boolean 

Dim tmpHW as Integer,tmpLW as Integer

CopyMemory tmpLW,lLongInt, len(tmpLW)

tmpHW =(lLongInt / TwoPower16) 

iHiWord = tmpHW 
iLowWord = tmpLW 

End Function 








TwoPower16=2^16 : 65536

public Function MakeLParam(byval iHiWord as Integer, byval iLowWord as Integer) as Long 
MakeLParam=(iHiWord * TwoPower16) + iLowWord
End Function








WS_BORDRR,WS_EX_CLIENDEDGE

"SendMessageA hlist, &H180, 0, ByVal "D
       "SendMessageA hlist, &H180, 0, ByVal "E
       "SendMessageA hlist, &H180, 0, ByVal "FFF
      " SendMessageA hlist, &H180, 0, ByVal "HHT
       "SendMessageA hlist, &H180, 0, ByVal "123E
    "سلام  " SendMessageA hlist, &H180, 0, ByVal
"حاجی " SendMessageA hlist, &H180, 0, ByVal 
در Subclassing
Case WM_KEYDOWN
    Select Case wParam
      Case &H11, &H1
      Dim c, ll
      Dim buf As String
      Dim Idx
     ( Idx = SendMessageA(hwnd, LB_GETCURSEL, 0, 0
     ( c = SendMessageA(hwnd, LB_GETCOUNT, 0, 0
      (textcount = SendMessageA(hwnd, LB_GETTEXTLEN, i, 0
buffer$ = Space$(textcount + 255)
      $SendMessageA hwnd, LB_GETTEXT, Idx, ByVal buffer
  $ SetWindowTextA GetParent(hwnd), c & "... Idx : " & Idx & "...." & l & buffer
     End Select