PDA

View Full Version : مشکل هایلایت در دلفی 2009



solook
یک شنبه 15 دی 1387, 09:58 صبح
با سلام
من قبلا کدی داشتم که نتایج جستو در richedit را هایلایت میکرد و نسخه های پیشین خوب کار میکرد
اما وقتی این کد رو در دلفی 2009 کامپایل میکنم هنگام جستجو کلمات رو نا درست هایلایت میکنه

این تصویرش :

http://solook.ali.googlepages.com/Untitled9.gif

solook
جمعه 20 دی 1387, 16:07 عصر
دوستان اگه کسی می تونه راهنمایی کنه ممنون میشم

vcldeveloper
جمعه 20 دی 1387, 17:43 عصر
کدی که برای هایلایت نوشتید را اینجا بزارید. احتمال داره که با توجه به تفاوت سایز WideChar با AnsiChar در محاسباتی که انجام میدادید اشکالاتی وجود داشته باشه.

solook
جمعه 20 دی 1387, 18:02 عصر
با تشکر این هم کدی که استفاده کردم :


Function TForm1.CurrText: TTextAttributes;
begin
if RichEdit1.SelLength > 0 then Result := RichEdit1.SelAttributes
else Result := RichEdit1.DefAttributes;
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
temp,len,start:integer;
color:Tcolor;
WordSearch,Word:String;
First:boolean;
begin
RichEdit1.SelStart:=0;
RichEdit1.SelLength:=length(RichEdit1.Text);
CurrText.Color:=clBlack;
color:=Clred;
WordSearch:=Edit1.Text;
Word:=RichEdit1.Text;
temp:=0;
First:=true;
repeat
Len:=length(WordSearch);
Start:=pos(WordSearch,word);
if Start<>0 then
begin
if First then
begin
temp:=Start+temp;
First:=false
end
else
temp:=Start+len+temp;
RichEdit1.SelStart:=temp-1;
RichEdit1.SelLength:=Len;
CurrText.Color:=color;
CurrText.Size:=4+RichEdit1.Font.Size;
CurrText.Style:=[fsBold];
end;
delete(Word,1,Start+len);
until Start=0;
end;

vcldeveloper
شنبه 21 دی 1387, 02:02 صبح
ظاهرا علتش باید این باشه که برای پایان خط از دو کارکتر CR\LF استفاده میشه، ولی در نمایش این دو کارکتر بصورت یونیکد، این دو به عنوان یک کارکتر محاسبه میشند، پس مقادیری که از توابعی مثل Pos یا Length بدست میان با کارکترهای نمایش داده شده در RichEdit رابطه نظیر به نظیر ندارند! فعلا راهی که به نظر من میرسه اینه که تعداد خطوط قبل از رسیدن به عبارت مورد نظر را محاسبه کنیم، و آن را از موقعیت فعلی کارکتر کم کنیم.


RichEdit.SelStart := CurrPos - LinesCount(CurrPos-1) - 1;کد کامل:

uses
StrUtils;

function HighlightText(RichEdit: TRichEdit; const SearchStr: string; Color: TColor): Boolean;
var
Text : string;
CurrPos : integer;
SearchLen : integer;

{$IFDEF UNICODE}
//Enumerates number of line breaks before Position in Text variable
function LinesCount(Position: integer): integer;
var
TokenPos : integer;
Temp : string;
begin
Result := 0;
Temp := Copy(Text,1,Position);
TokenPos := Pos(#$000D+#$000A,Temp);
while TokenPos > 0 do
begin
Inc(Result);
TokenPos := PosEx(#$000D+#$000A,Temp, TokenPos+2);
end;
end;
{$ENDIF}
begin
Result := False;
if (not Assigned(RichEdit)) or (SearchStr = '') or (RichEdit.Lines.Text = '') then
Exit;

SearchLen := Length(SearchStr);
Text := RichEdit.Lines.Text;

//Reset previous highlight
RichEdit.SelectAll;
RichEdit.SelAttributes.Color := RichEdit.DefAttributes.Color;
RichEdit.SelStart := 0;
//Start searching SearchStr in RichEdit
CurrPos := Pos(SearchStr,Text);
Result := (CurrPos > 0);
while CurrPos > 0 do
begin
//Highlight found string
RichEdit.SelStart := CurrPos - 1 {$IFDEF UNICODE}- LinesCount(CurrPos-1){$ENDIF};
RichEdit.SelLength := SearchLen;
RichEdit.SelAttributes.Color := Color;
// Search for the next string that matches SearchStr
CurrPos := PosEx(SearchStr,Text,CurrPos+SearchLen);
end;
end;نمونه ایی از فراخوانی تابع:


procedure TForm1.Button1Click(Sender: TObject);
begin
HighlightText(RichEdit1,Edit1.Text,clRed);
end;

solook
شنبه 21 دی 1387, 09:51 صبح
با تشکر
من تستش کردم در یک جا خوب جواب داد در یک جا جواب نداد !!

جایی که خوب جواب داد اونجا بود که با خود دلفی متن رو به RichEdit دادم یعنی در قسمت Properties متن رو وارد کردم

اما وقتی مثلا با کد متنی به richedit اضافه میشه خوب جواب نمیده مثلا اگه اینطور به richedit متن بدهم:

richedit1.Text:=query.FieldByName('Arabic').AsStri ng;

or

richedit1.Lines.Add(query.FieldByName('Arabic').As String);

vcldeveloper
شنبه 21 دی 1387, 17:37 عصر
مشکل از نمایش متن در RichEdit هست، چون اگر بجای تغییر خصوصیت فونت، حرف اول کلمه جستجو را تغییر بدیم، مثلا با اضافه کردن این کد:


Text[CurrPos] := '@';
...
RichEdit.Lines.Text := Text;
می بینیم که به درستی حرف اول همه نمونه های عبارت جستجو به @ تغییر میکنه، ولی همون کد وقتی می خواد SelStart موجود در RichEdit را تنظیم کنه، اشتباه محاسبه میکنه.
من بررسی نکردم که مشکل از پیاده سازی RichEdit در دلفی هست، یا از خودِ کنترل RichEdit ویندوز. با RichEditWB در مجموعه EmbeddedWb که چک کردم، عبارت های های لایت شده را بدرستی نمایش داد.

solook
یک شنبه 22 دی 1387, 09:12 صبح
این کدو ببنید :



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;
//RichEdit1.SelStart:= 0;
SendMessage(RichEdit1.Handle, EM_SCROLLCARET, 0, 0);
End;این خوب جواب میده ولی مادامی که مشغول به هایلایت هست خطها حرکت میکنند و کم کم یکی یکی رو هایلایت میکنه و در اخر دوباره برمیگیرده خط اول این یه خورده مشمئز کننده هست
اگه بشه این حالتو نداشته باشه خیلی خوب میشه