PDA

View Full Version : جستجو در richedit بطور کامل



nassim_20
دوشنبه 27 خرداد 1387, 16:47 عصر
من می خواهم یک کلمه رو در richedit جستجو کنم البته دستور جستجو رو دارم و کدش اینه


procedure TForm2.Button1Click(Sender: TObject);
var StartPos,ToEnd,a,i:integer;
begin
RichEdit1.SetFocus;
StartPos := RichEdit1.SelStart + RichEdit1.SelLength;
ToEnd := Length(RichEdit1.Text) - StartPos;
a:=RichEdit.FindText(Edit1.text,StartPos,ToEnd,[]);
RichEdit.SelStart := a;
RichEdit.SelLength :=Length(Edit1.text);
RichEdit.SelAttributes.Color := clred;
RichEdit.SelAttributes.Size := RichEdit.Font.Size +5;
RichEdit3.DefAttributes := fsItalic;
end;
end;

اما من می خواهم هر کلمه مشابه با edit1 هست رو پیدا کند با این کار تنها یکبار پیدا میکنه
باید یه حلقه بزارم اما نمی دونم شرط اون حلقه چی باید باشد

Hsimple11
دوشنبه 27 خرداد 1387, 23:50 عصر
با سلام.
فکر میکنم کد شما جدا از حلقه ای که نیاز دارید چند مشکل کوچیک داره.:

1- اینکه وقتی میخواهید رشته ورودی از Edit را جستجو کنید، Setfocus کردن در ابتدای کد بیهوده است چون شما ناگزیرید برای جستجو focus خود را ابتدا بر روی Edit خود قرار دهید پس بهتر است focus را در مراحل بعد set کنید.
2- اگر فرد قبل از شروع جستجو رشته ای را در Richedit شما انتخاب کرده باشد بایستی SelStart و SelLength خود را از بعد از آن تنظیم کنید و در غیر اینصورت اول متن. پس یک شرط کوچک در ابتدا برای این موضوع قرار می دهیم :

if RichEdit1.SelLength <> 0 then
StartPos := RichEdit1.SelStart + RichEdit1.SelLength else
StartPos :=0;


3- اگر نتیجه جستجوی شما مخالف با 1- بود (نتیجه ای وجود داشت) در آن صورت SetFocus و بقیه اعمال دلخواه صورت بگیرند.

4- و برای اینکه جستجوی ما با اولین یافته متوقف نشود میتوان از یک حلقه ساده استفاده کرد که تا زمان یافت نتایج این پروسه ادامه یابد.

این هم کد نهایی :


procedure TForm1.Button1Click(Sender: TObject);
var StartPos,ToEnd,a,i:integer;
begin
While a<>-1 do begin
if RichEdit1.SelLength <> 0 then
StartPos := RichEdit1.SelStart + RichEdit1.SelLength else
StartPos :=0;
ToEnd := Length(RichEdit1.Text) - StartPos;
a:=RichEdit1.FindText(Edit1.text+,StartPos,ToEnd,[]);
if a<> -1 then begin
RichEdit1.SetFocus;
RichEdit1.SelStart := a;
RichEdit1.SelLength :=Length(Edit1.text);
RichEdit1.SelAttributes.Color := clred;
RichEdit1.SelAttributes.Size := RichEdit1.Font.Size +5;
RichEdit1.DefAttributes.Style := [fsItalic];
End;
end;

End;


موفق باشید...

nassim_20
سه شنبه 28 خرداد 1387, 11:40 صبح
در این حالت بعد از جستجو richedit مکان نما در انتهای متن قرار میگرد چکار کنم بیاید خط اول
البته می دانم با selstart میشه مکان نما رو به ابتدا منتقل کرد ولی با اینکار همچنان متون انتهایی نمایش داده می شود و اسکرول مربوط به richedit در انتهای ان است

Hsimple11
سه شنبه 28 خرداد 1387, 19:44 عصر
در این حالت بعد از جستجو richedit مکان نما در انتهای متن قرار میگرد چکار کنم بیاید خط اول
البته می دانم با selstart میشه مکان نما رو به ابتدا منتقل کرد ولی با اینکار همچنان متون انتهایی نمایش داده می شود و اسکرول مربوط به richedit در انتهای ان است

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


RichEdit1.SelStart:= 0;
SendMessage(RichEdit1.Handle, EM_SCROLLCARET, 0, 0);

EM_ScrollCaret موقعیت caret را مشخص میکند که 0 و 0 ابتدای richedit خواهد بود.

در ضمن حتما باید focus بر روی richedit اعمال شود.

موفق باشید...