PDA

View Full Version : نحوه پیاده سازی یک نوع text



hamed jalili
سه شنبه 15 مرداد 1387, 21:44 عصر
سلام دوستان

من می خواهم یه متنی با ویژگی های زیر رو پیاده کنم

1- لحظه به لحظه طول آن در برنامه زیاد می شه
2- از آنجایی که اطلاعات اضافه شده به آن متن به صورت بلاک هستند ، باید قابلیت کلیک رو هر بلاک و تشخیص اینکه بر روی کدام بلاک کلیک شده است ، باشد .

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

کسی راه حلی به ذهنش می رسه ؟





.

رضا جاسبی
سه شنبه 15 مرداد 1387, 23:14 عصر
فکر می کنم می تونی با Property یا همون فیلد SelectionStart در TextBox مشخص کنی که کجای متن هستی و با یک آرایه int (شاید دو بعدی ) مقادیر شروع (و شاید طول و/یا پایان ) هر بلاک رو ذخیره کنی و مشخص کنی که در کدام بلاک هستی و حتی با متد Select بلاک مورد نظرت رو در متن select یا Highlight کنی.
شاید نیازی به گفتن نباشه که طبیعتا باید MultiLine در textBox رو فعال کنی.

hamed jalili
چهارشنبه 16 مرداد 1387, 17:25 عصر
میشه بیشتر توضیح بدین که چطور می تونم محل کلیک شده ی ماوس بر روی textBox رو شناسایی کنم ؟






.

رضا جاسبی
شنبه 19 مرداد 1387, 22:41 عصر
روی Event های ماوس مثل MouseDown یک تکه برنامه بنویس که مقدار SelectionIndex اون تکست باکس رو در یک تکست باکس دیگه بنویسه. و یا اینکه با Debug کنترل کن. فکر کنم راحت مطلب رو بتونی ادامه بدی.

hamed jalili
یک شنبه 20 مرداد 1387, 11:25 صبح
آقای جاسبی ؛
هیچ متنی موقع کلیک کردن قرار نیست که Select بشه ، که SelectionIndex بتونه کاری انجام بده
وقتی یه کلیک ساده روی TextBox انجام میشه فقط اشاره گر به مکان کلیک شده ماوس می ره و هیچ انتخابی صورت نمی گیره .
در این صورت باید چی کار کرد ؟








.

رضا جاسبی
یک شنبه 20 مرداد 1387, 21:59 عصر
دوست من همون مکان کلیک شده توسط ماوس میشه مقدار SelectionIndex و البته اگر بخشی رو Select کنیم مقدار SelectionLength بیشتر از صفر میشه و SelectedText مقدارمیگیره. یک امتحان بکن. اگر نشد بگو تا یک برنامه کوچک بگذارم.

hamed jalili
چهارشنبه 23 مرداد 1387, 00:39 صبح
آقای جاسبی ،
میشه یه لطف بکنید و به طوری که وقتتونو نگیره در یه کد مختصر توضیح بدین ؟
ممنون .







.

Amir Oveisi
چهارشنبه 23 مرداد 1387, 01:18 صبح
بهتره یه user control‌بسازین که امکان اضافه کردن label به تعداد نا محدود داشته باشه و هر label هم که Text مربوط به یه بلاک رو نگهداری خواهد کرد
این کار هم اصولی تره و هم کامل تر

موفق باشید
jooje

khoshtip118
چهارشنبه 23 مرداد 1387, 02:47 صبح
سلام
دوست عزيز رضا
اگه ميشه لطف كنيد يه نمونه بذاريد
آخا ايني كه اينجا در موردش داره بحث ميشه يه چيزي مثل بابيلون و نارسيس هستش
بعيد بدونم به اين سادگي بشه پيادش كرد

رضا جاسبی
چهارشنبه 23 مرداد 1387, 22:01 عصر
من یک برنامه کوچک نوشتم. شما در تکست باکس اول متن بلاک دلخواه رو می نویسید. با زدن دکمه ADD متن شما به متن قبلی (تکست باکس دوم ) اضافه میشه و البته ; رو به عنوان جداکننده یا همون seperator خودمون در نظر میگیره. در هرجای متن کلی که کلیک کنید بلاک مورد نظر (بین دو تا ;) رو در تکست باکس سوم نمایش میده. با دکمه clear هم همه چیز رو پاک می کنه.
امیدوارم به درد بخوره.

hamed jalili
پنج شنبه 24 مرداد 1387, 23:43 عصر
بهتره یه user control‌بسازین که امکان اضافه کردن label به تعداد نا محدود داشته باشه و هر label هم که Text مربوط به یه بلاک رو نگهداری خواهد کرد
این کار هم اصولی تره و هم کامل تر


به نظرتون اگه من بخواهم ، 200 تا بلاک داشته باشم ، زمان لود کردن این تعداد lable می تونه قابل قبول باشه ؟ :متفکر:





.

رضا جاسبی
پنج شنبه 24 مرداد 1387, 23:53 عصر
در مورد نوشته دوستمون فکر می کنم بهتره خودشون توضیح بدهند که زمان چطور میشه. در مورد برنامه ای که من براتون نوشتم اگر دقت کنید برای پیدا کردن شروع بلاک جاری از اول تا ; قبل از محل کلیک رو پیمایش می کنم. اگر تعداد بلاکها زیاد باشه احتمالا کمی کند میشه البته نمی دونم چقدر. نمی دونم مثل تابع Index چیزی داریم که Backward حرکت کنه. یعنی تابع Index میگه حرف مورد نظر از نقطه شروع (که در پارامتر تابع می گیم) رو به جلو در چه اندیسی قرار دارد. نمی دونم رو به عقب میشه کار کرد یا نه. اگر تابع خاصی نیست فکر می کنم اگر طول بلاکهات کم باشه و تعدادشون زیاد شاید بهتر باشه با یک حلقه While به دنبال ; قبلی بگردی.

hamed jalili
جمعه 25 مرداد 1387, 09:15 صبح
آقای جاسبی

ممنون از راهنماییتون و کدی که زحمتشو کشیدین
در کد شما من متوجه نشدم که این حلقه چه طور کار می کنه ،ممونو میشم اگه براتون امکانش باشه بیشتر توضیح بدین ؟




while (CurrentBlockStart != -1 && CurrentBlockStart < BlockEnd)
{
BlockStart = CurrentBlockStart;
if (BlockStart > 0)
BlockStart++;
CurrentBlockStart = textBox2.Text.IndexOf(";",BlockStart);
}





.

رضا جاسبی
جمعه 25 مرداد 1387, 23:51 عصر
این تکه همونیه که در آخرین پستم توضیح دادم. در اینجا از اول متن (اگر دقت کرده باشید قبل از حلقه مقدار CurrentBlockStart برابر صفر شده که نشون دهنده ابتدای متنه.) شروع می کنه و در متن به دنبال جداکننده یا همون ; میگرده. هرچا پیدا کرد چک می کنه که آیا به BlockEnd (که در ابتدا تنظیم کردیم که از محل کلیک رو به جلو به دنبال ; گشته و آدرس اون رو در BlockEnd نگه داشتیم و یا اگر پیدا نکرد یعنی 1- بود برابر طول متن که میشه آخر متن) رسیده یا نه (ویا اینکه پیدا نکنه باز هم یعنی اینکه از محل کلیک رد شدیم). در حالتی که از محل کلیک رد شدیم مقدار آخرین ; پیدا شده شروع بلاک فعلیست. حالا ما این مقدار رو هربار در حلقه در BlockStart نگه میداریم و بعد به دنبال ; بعدی می گردیم. در حقیقت حضور در حلقه به معنای آن است که هنوز به محل کلیک نرسیدیم و باید جستجو را ادامه بدیم. با متغیر BlockStart آخرین نقطه حضور یا آخرین ; پیدا شده رو علامت میزنیم و بعد با متغیر CurrentBlockStart به سراغ ; بعدی میریم تا زمانی که از حلقه خارج بشیم که به معنای این است که یک قدم اضافه برداشتیم. یک قدم عقبتر میشه همون متغیر BlockStart که بین این مقدار و BlockEnd میشه بلاک مورد نظر.
راستی اون if رو هم بگم که اگر اول متن باشیم مقدار صفر که مقداراولیه BlockStart هست شروع بلاک است اما وقتی که ; پیدا می کنیم اندیس ما درست به خود ; اشاره می کنه در حالی که ما حرف بعد ; رو به عنوان شروع بلاک می دونیم به خاطر همین اگر BlockStart از صفر بزرگتر باشه یعنی یک ; رو دیدیم و بنابراین یکی بهش اضافه می کنیم که بشه شروع بلاک بعدی
ممنون میشم اگر دوستی بگه به جای این حلقه While پردردسر آیا راهی بهتر هست که مقدار "آخرین ; قبل از" یک اندیس در یک متن را یافت. همانطور که با Index مقدار "اولین ; بعد از" اون اندیس رو پیدا می کنیم.

hamed jalili
شنبه 26 مرداد 1387, 15:39 عصر
دوست عزیز آقای جاسبی ممنون از راهنماییتون

یه سوال دیگه در مورد textBox دارم



int startBlock = CurrentIndex - (7 - (BlockEnd - CurrentIndex));
label1.Text = NotationBoard.Text.Substring(startBlock, 7);
NotationBoard.Select(startBlock, 7);


در کد بالا ، متنی که در lable1 قرار می گیره ، باید با متنی که select میشه ، برابر باشه ، درسته ؟
در صورتی که این طور نیست ، بلکه متن select شده از مکانی که startBlock میگه شروع میشه و تا مکان ماوس ادامه پیدا می کنه ، این زمانی که شما برای اولین بار بر روی متن کلیک می کنید درسته ولی برای دفعات بعدی درست نیست ، به خاطر اینکه ، StartBlock وابسته به مکانی که شما کلیک می کنید ، ولی هر دفعه از همان مکانی که شما برای اولین بار انتخاب کرده اید تا مکان فعلی ماوس ه ، که اشتباه ه .






.

رضا جاسبی
شنبه 26 مرداد 1387, 21:41 عصر
BlockEnd چه مقداری داره. دقت کن که StartBlock مقدارش در سطر اول چی میشه؟
(CurrentIndex - (7 - BlockEnd + CurrentIndex
و بعد
CurrentIndex - 7 + BlockEnd - CurrentIndex
که میشه BlockEnd -7
پس در حقیقت از BlockEnd به تعداد 7 تا به عقب حرکت می کنی که میشه StartBlock
اما منطقا باید مقدار Lable با متن Select شده یکی باشه. مگر اینکه BlockEnd یک مقدار اشتباه داشته باشه.
همون برنامه رو با امکان Select کردن متن دوباره ببینید. جایی که کلیک می کنیم Block مورد نظر رو Select میکنه.
فقط یک نکته رو دقت کن که واقعا کلیک داشته باشی نه Select با ماوس. منظورم اینه که فقط یک کلیک ساده کن و ماوس رو در حالت نگه داشتن دکمه آن حرکت ندهی که عمل Select نرمال در Windows رو انجام بده.

hamed jalili
یک شنبه 27 مرداد 1387, 11:27 صبح
فقط یک نکته رو دقت کن که واقعا کلیک داشته باشی نه Select با ماوس.

من خودم می دونم که نباید select mouse رو انجام بدم ، ولی کاربری که با این برنامه کار می کنه ، احتمال داره که اشتباه این کار رو انجام بده !!
که باعث اشتباهات بسیاری در برنامه می شه ، چه طور می تونم جلوی select mouse رو بگیرم ؟






.

رضا جاسبی
دوشنبه 28 مرداد 1387, 23:33 عصر
نمی دونم چه کاربردی از این برنامه داری و اینکه اشتباهات در برنامه ایجاد می کنه. چون نوشته Select بشه مشکلی نداره. بلاک مورد نظر در TextBox3 هست. اگر اشتباه نکنم در یکی از پستها گفته بودی که قرار نیست متنی select بشه.
راستش من نمی دونم آیا میشه Select در Windows رو Disable کرد یا نه. اما مشکل نصفه Select شدن بلاک در متن اصلی رو شاید بتونی با نوشتن کد مورد نظر در MouseUp بجای MouseDown حل کنی. امتحانش ضرر نداره.

مهرداد تاجدینی
سه شنبه 29 مرداد 1387, 02:57 صبح
به نظر من نظر آقای bermooda خیلی اصولی تره. شما به راحتی می تونید موقع اجرای برنامه کنترل Lable بسازید(new کنید) و به فرمتون اضافه کنید. اینجوری متن هر بلاک تو یه کنترل قرار می گیره.
ضمنا در مورد زمانش هم نگران نباشید. سیستم های نفتی هم می تونن تا 1000 کنترل رو کمتر از یک ثانیه بسازن! کنترل Label یه کنترل سبکه.

hamed jalili
چهارشنبه 30 مرداد 1387, 23:44 عصر
1-نمی دونم چه کاربردی از این برنامه داری و اینکه اشتباهات در برنامه ایجاد می کنه. چون نوشته Select بشه مشکلی نداره
2- اگر اشتباه نکنم در یکی از پستها گفته بودی که قرار نیست متنی select بشه.
راستش من نمی دونم آیا میشه Select در Windows رو Disable کرد یا نه.
3- نوشتن کد مورد نظر در MouseUp بجای MouseDown حل کنی. امتحانش ضرر نداره.

1- مشخص کردن حرکت در بازی شطرنج و انتخاب حرکت مورد نظر برای Recover کردن ( هر بلاک یه حرکت ه )

2- متن Select نمیشه ، بلکه متن انتخاب شده ، مثل متن Select شده ، نمایش داده میشه

3- امتحان می کنم



دوست عزیز آقای تاجدینی
این برنامه که من نوشتم ، خودش به حد کافی سنگین هست ( حالا به خاطر اشتباهات برنامه نویسی یا مسائل دیگه ) که سیستمی با CPU : 4500 باهاش مشکل داره ، کار اینجاد Lable های جدید به جای هر Block رو هم قبلا تست کردم ، که فکر کنم به خاطر سنگین بودن ه خود ه برنامه یا موارد دیگه ، خیلی هم سریع نبودند ولی روشی که دوست عزیزمون اقای جاسبی پیشنهاد کردن بسیار سریعتره . در هر صورت ممنون از راهنماییتون .



.

رضا جاسبی
پنج شنبه 31 مرداد 1387, 02:15 صبح
1- مشخص کردن حرکت در بازی شطرنج و انتخاب حرکت مورد نظر برای Recover کردن ( هر بلاک یه حرکت ه )

2- متن Select نمیشه ، بلکه متن انتخاب شده ، مثل متن Select شده ، نمایش داده میشه

3- امتحان می کنم


.

در مورد سوم که حرفی نیست. اما در مورد دوم فکر کنم در جواب حرف قبلی شما بود که گفتی شاید کاربر اشتباه کنه و با ماوس عمل Select در Windows رو انجام بده. در این حالت هم مشکلی پیش نمیاد چون مهم نقطه کلیک اول هست که بلاک مورد نظر رو انتخاب می کنه. در حالت MouseUp پس از Select احتمالی کاربر نقطه رهاکردن ماوس به عنوان نقطه select در نظر گرفته میشه. اما در مورد نکته اول : به نظر من به جای متن و لیبل و تکست باکس بهتره از لیست باکس استفاده کنی. البته فکر کنم امتحان کردی و جواب نگرفتی اما شاید بهتر باشه روی این روش (لیست باکس) دوباره و با دقت بیشتر کارکنی.
در ضمن خیلی هم نگران اشتباه در کد نویسی و کندی برنامه ات نباش. یه جایی خوندم که اگر کامپیوتر امکان این رو داشت که تمام حرکات ممکن شطرنج رو در محاسبه اش در نظر بگیره هرگز از انسان شکست نمی خورد ولی کاسپاروف بارها در مبارزه با کامپیوتر (تازه اون هم ابرکامپیوترهای مخصوص نه این PC های ما) برنده شد. البته این در مورد قدرت مغز انسان بود نه ضعف کامپیوتر ولی ...
منظورم اینه که شاید لازمه برای بهبود کارآیی برنامه ات به راههای دیگری که من بلد نیستم فکر کنی. البته این حرفها با پیش فرض اینه که حداقل یکی از طرفهای مبارزه کامپیوتره و برنامه شما عملا کاری بیش از "یک میز شطرنج" رو انجام میده. یک تاپیک بنام شطرنج در #C هم دیدم. یه سری بهش بزن.
موفق باشی

hamed jalili
یک شنبه 03 شهریور 1387, 01:01 صبح
ممنون دوست عزیز از راهنماییت

میشه یه کم بیشتر در مورد لیست باکس بهم توضیح بدی که چرا می تونه بهتر باشه ؟


و در مورد بازی شطرنجم ، اون یه میزه شطرنج نیست ، بلکه یه بازیکن آماتور ه شطرنجه ( منظورم موتورشه ) . من با پردازش های موتور کاری ندارم ، اونا که زیاد طول می کشن ولی مشکل من با پردازش های گرافیکی ه که جدا از پردازش های موتور انجام می شن ولی سرعت پایین دارن ، البته در این مورد قبلا تاپیک زیر رو زده بودم ولی به جواب نرسیدم .
http://barnamenevis.org/forum/showthread.php?t=107864








.

رضا جاسبی
یک شنبه 03 شهریور 1387, 22:09 عصر
لیست باکس یک لیست از گزینه ها و به عبارتی Object ها در اختیارت میذاره که با آرایه Items و یک اندیس آرایه به عناصر این آرایه دسترسی داری. با دستور add و InsertAt می تونی یک گزینه به لیستت یا در واقع آرایه Items اضافه کنی و با Remove و RemoveAt حذف کنی. با IndexOf می تونی به دنبال یک گزینه بگردی. و با Count هم تعداد رو داری. کلا اگر Property های اون رو ببینی خیلی کمکت می کنه. دلیل اینکه بهتره اینه که همیشه مستقیما به گزینه مورد نظرت دسترسی داری. در ضمن برای Recover کردن و یا برگرداندن حرکتهای قبلی (Undo) نیازی به پیمایش در یک متن با پیچیدگیها و امکان اشتباه و این حرفها نیست بلکه فقط جای فعلی (SelectedIndex) و تعداد کل Count رو می خواهی و یک حلقه ساده.
من در برنامه textbox حرف ; رو به عنوان Seperator گرفتم و هر بلاک بوسیله اون حرف مشخص میشه. اما شکل نوشته ها جالب نیست یعنی اصلا قشنگ نیست که مراحل یک بازی شطرنج رو پشت سر هم بنویسیم. خیلی بهتره که زیر هم باشه و هر حرکت در یک سطر نشون داده بشه. حالا اگر بخواهی Enter رو داشته باشی درگیر n\ و r\ میشی اما لیست خودش برات مدیریت می کنه. و خیلی چیزهای دیگه.