PDA

View Full Version : سوال: رنگی کردن متن و قرار دادن مکان نما در سطر متن جستجو



mbshareat
سه شنبه 15 فروردین 1391, 19:48 عصر
سلام و خدا قوت
من می خوام مثل برنامه NotePad بتونم یک متن رو توی memo جستجو بدم!
با برنامه HandleViewr.exe نوشته آقا مجتبی تاجیک که کادر متن NotePad رو بررسی می کنم نوع کامپوننت رو Edit گذارش می کنه.
در هر صورت من هرچی پراپرتی های Memo رو نگاه کردم چیزی مثل ItemIndex پیدا نکردم که مکان نما رو در خط مورد نظر قرار بدم.
اگه علاوه بر قرار دادن مکان نما در موقعیت، بشه متن جستجو شده رو رنگی کرد هم خیلی خوب میشه!
راستش من یه برنامه نمایش متن دارم که برای اون نیاز دارم بتونم یه متن رو تو Memo جستجو بدم.
فرض کنین می خوام یه جای متن رو که غلطه درست کنم! باید بتونم توی Memo جستجو بدم.
اگر چیز دیگه ای مثل Memo باشه که بشه توش تایپ کرد و محل مکان نما رو هم در اون تعیین کرد بد نیست
اما ترجیح می دم توی Memo بشه این کار رو کرد (مثل NotePad )
این هم برنامه:
85153

Felony
سه شنبه 15 فروردین 1391, 19:53 عصر
این رو دوران جوونی نوشته بودم .

mbshareat
سه شنبه 15 فروردین 1391, 21:28 عصر
سلام و درود
استاد تاجیک عزیز من بیشتر از رنگی کردن نیاز به رفتن به خط متن جستجو دارم .آیا راهی برای این کار هست؟

Felony
سه شنبه 15 فروردین 1391, 21:57 عصر
با استفاده از متد SelStart .

mbshareat
چهارشنبه 16 فروردین 1391, 01:23 صبح
سلام
آقای تاجیک تو نمونه ای که لطف فرمودین هم SelStart استفاده شده اما امتحان کردم اگه تنها توی خطی که در صفحه دیده نمی شه موردی از متن جستجو باشه روی اون سطر نمیره.
من یه دکمه رو فرم گذاشتم و کد ;RichEdit1.SelStart :=20 رو توش ریختم و چند خط متن توی RichEdit نوشتم ولی مکان نما با این کد کلا ناپدید میشه!
کد ;RichEdit1.SetFocus رو بهش اضافه کردم مکان نما رو به محل میبره ولی اگه سطر مورد نظر خارج از سطرهای قابل مشاهده باشه پیمایش عمودی در سطرها نمی شه و تنها مکان نما به محل منتقل میشه که گویا مکان نما نابود شده.
در هر صورت یه راه خنده دار براش پیدا کردم که بدک نیست.:گیج:
فرض کنین می خوایم به محل کارکتر شماره 20 برویم.این کد جواب میده:


RichEdit1.SelStart :=20;
RichEdit1.SetFocus;
keybd_event(37, 0, 0, 0);
keybd_event(39, 0, 0, 0);

Ananas
چهارشنبه 16 فروردین 1391, 02:08 صبح
Memo1->SetFocus();
Memo1->SelStart = 250;
Memo1->SelLength = 0;

mbshareat
چهارشنبه 16 فروردین 1391, 09:54 صبح
جتاب Ananas همشهری دستتون درد نکنه. کدتون برای Memo خوبه فقط توی RichEdit به خط مورد نظر منتقل نمیشه!
(یه فضولی: آقا نمی خواین عکس آواتارتون رو عوض کنین؟ واس جوونا بد آموزی داره!)

Ananas
چهارشنبه 16 فروردین 1391, 13:30 عصر
جتاب Ananas همشهری دستتون درد نکنه. کدتون برای Memo خوبه فقط توی RichEdit به خط مورد نظر منتقل نمیشه!
(یه فضولی: آقا نمی خواین عکس آواتارتون رو عوض کنین؟ واس جوونا بد آموزی داره!)
اولا که من هیچ موقع جناب نشدم از همون اول سرکار سرباز بودم. دومن سرت درد نکنه چه خوب که همشهری هستیم اییییول چاممممممممردون. انشاالله بیشتر باهات کار دارم. من این کد رو با RichEdit هم امتحان کردم درست کار میکنه. شاید RichEdit رو تغییری توش دادی که نمیشه. برای امتحانش یک پروژه جدید با یک RichEdit بساز و اینو تو Button امتحان کن :

RichEdit1->SetFocus();
RichEdit1->SelStart = 250;
RichEdit1->SelLength = 0;

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

mbshareat
چهارشنبه 16 فروردین 1391, 17:51 عصر
سلام و خدا قوت
جناب Ananas کدتون رو کپی کردم و الصاق کردم و <- رو هم به نقطه و = رو به نقطه مساوی تبدیل کردم ولی جواب نداد.
دقت داشته باشین که من نمی خوام که مکان نما در پشت صحنه به موقعیت بره و کاربر ندونه مکان نما کجا شد. بلکه می خوام خط مکان نما هم در صفحه دیده بشه. یه توضیح کوچولو در مورد کلمه 'جناب' هم بدم: این واژه رو از این جهت به کار برده میشه که جنسیت معلوم نیست و نه بحث شوخی هستش نه توهین!
فکر کنم دو سال پیش به جای جناب گفتم آقا و معلوم شد اشتباه کردم!!!
در پایان بگم من خوش دارم با شاگرد زرنگا مثل شما اختلاط کنم گرچه خودم بی سوات! باشم...

Ananas
چهارشنبه 16 فروردین 1391, 21:00 عصر
سلام و خدا قوت
جناب Ananas کدتون رو کپی کردم و الصاق کردم و <- رو هم به نقطه و = رو به نقطه مساوی تبدیل کردم ولی جواب نداد.
دقت داشته باشین که من نمی خوام که مکان نما در پشت صحنه به موقعیت بره و کاربر ندونه مکان نما کجا شد. بلکه می خوام خط مکان نما هم در صفحه دیده بشه.
سلام زنده باشی عزیرم. میدونم چی می فرمایی و من میگم برای من درست کار میکنه و مکان نما میاد تو نقطه مورد نظر و چشمک میزنه. ببینید برای شما چه فرقی داره دلفی من ex2 هست. این کد تو c++ بود من با pascal هم امتحان کردم درست کار کرد شاید شما کد رو جایی مینویسی که نمیتونه focus انجام بشه، البته میگی برای memo درست کار میکنه خوب پس احتمال زیاد همون طور که گفتم تنظیمات richedit رو تغییر دادی لابد. راستی update رو هم بعد از همشون امتحان کن شاید درست بشه اگه بازم نشد امتحان کن ببین وقتی sellength رو بیشتر از 0 میگذاری درست میشه یانه اگه نشد scrollbar شی richedit رو هم فعال کن، شاید بعد از این کد چیزی نوشتی که focus از richedit خارج میشه و میره روی شی دیگه. . فعلا چیز دیگه ای به ذهنم نمیرسه.

ه توضیح کوچولو در مورد کلمه 'جناب' هم بدم: این واژه رو از این جهت به کار برده میشه که جنسیت معلوم نیست و نه بحث شوخی هستش نه توهین!
فکر کنم دو سال پیش به جای جناب گفتم آقا و معلوم شد اشتباه کردم!!!
اسمم که محمد قدیانی هست تو مشخصاتمم می تونی ببینی اگرم باور نداری میتونی بیای جنسیتمو چک کنی بالاخره دو تا خیابون بالاتریم دیگه:لبخند:. (شوخی میکنم لطف داری همون اولی هم شوخی بود به دل نگیر)

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

Ananas
چهارشنبه 16 فروردین 1391, 21:07 عصر
راستی یک چیز دیگه اینکه شاید richedit شما کاراکترهاش کمتر از مقداری هست که به متغیر selstart میدی. دقیقا این کد رو تو چه روالی فراخونی میکنی؟ چیزی که گفتم امتحان کردی یه پروژه جدید فقط با یک richedit و یک دکمه که تو onclick دکمه کد رو بنویسی؟ بازم نشد؟

mbshareat
پنج شنبه 17 فروردین 1391, 00:25 صبح
سلام و درود
البته من هنوز هم از RichEdit وحشت دارم و تا حالا هم مجبور نشدم ازش استفاده کنم.
اما اگه دوست داشتین خودتون این برنامه رو بر دارین امتحان کنین. من از دلفی پس رفته 6 استفاده می کنم.
خیلی پیش می خواستم 7 نصب کنم به سرویس پک ویندوز گیر داد. معمولا با نسخه دلفیم مشکل ندارم چون برنامه نویس رسمی نیستم!!

Ananas
پنج شنبه 17 فروردین 1391, 02:13 صبح
امتحانش کردم تو دلفی xe2 باز کردم ران رو زدم دکمه رو فشار دادم چشمکم زد. ورژن دلفیت فرق داره. من ورژن 6 نصب ندارم ولی با توابع و متد های richedit ور برو شاید به نتیجه برسی.
اصلا من تا دوتا خط اول هم مینویسم درست کار میکنه خط سوم یعنی sellength رو هم نمیخواد بنویسم. کلید ctrl رو بگیر بعد روی selstart کلیک کن میره تو یونیت stdctrls بعد برو ببین تو قسمت property که هم getselstart و هم setselstart رو داره یعنی اینجا :
procedure SetSelStart(Value: Integer); virtual;
این تابع رو سرچ کن ببین به همین شکل تعریف کرده یا نه :
procedure TCustomEdit.SetSelStart(Value: Integer);
begin
SendMessage(Handle, EM_SETSEL, Value, Value);
end;
اگه برای شما این طور نبود دستی همین همین کد رو بنویس تو onclick شاید درست بشه فقط به جای Handle بنویس RichEdit1.Handle . من اینو نوشتم بازم جواب داد به مشکلی هم بر نخوردم :
RichEdit1.SetFocus();
//RichEdit1.SelStart :=150;
SendMessage(RichEdit1.Handle, EM_SETSEL, 150, 150);

mbshareat
پنج شنبه 17 فروردین 1391, 10:33 صبح
سلام
فکر نمی کردم قضیه این قدر کش پیدا کنه.SetSelStart دلفی من هم مثل مال شماست و

SendMessage(RichEdit1.Handle, EM_SETSEL, 150, 150);
رو توی دکمه نوشتم باز جواب نداد. نمی خوام به شما زحمت بدم همون دو خط عقب جلو کردن مکان نما هم کار می کنه.
من هم تو برنامه از Memo استفاده کردم و ضرورتی هم نمی بینم از RichEdit استفاده کنم ولی برام جالبه که توی کد کامپوننتها یه سرک سطحی بکشم!
اما جواب نهایی: تو دلفی من مقدار پیشفرض HideSelection برابر True هست!!

Ananas
پنج شنبه 17 فروردین 1391, 13:07 عصر
منم فایل شما رو ران کرده بودم و درست کار کرد. من این خاصیت رو false کردم بازم چشمک میزنه و فرقی نمیکنه.
موافقم فکر میکنم Memo بهتر باشه از همون استفاده کن.