View Full Version : سوال: کار نکردن کد پرش به سطر و پرش به موقعیت در ریچ ادیت
  
mbshareat
شنبه 15 دی 1403, 23:34 عصر
سلام علیکم
من یک کد برای جستجوی عبارت در ریچ ادیت دارم که برای پرهیز از توضیح ساده اش می کنم:
  P:=PosEx(S,Richedit1.Text,Richedit1.SelStart+1);
  If P=0 then
    Exit;
  Richedit1.SelStart:= P;
  //Richedit1.SelLength:= Length(S);
  PostMessage(Richedit1.Handle, EM_LINEFROMCHAR, 0,RichEdit1.SelStart);
  Application.ProcessMessages;
  Richedit1.SetFocus;
این کد، فقط بار اول سطر حاوی S رو نشون میده
یک کد دیگه دارم که برای پرش به سطر هست که اصلا کار نمی کنه:
  Form1.RichEdit1.Perform(EM_LINEINDEX,0, 12);
کسی میتونه کدی که همیشه درست کار کنه بهم بده؟ نمی دونم چرا ریچ ادیت اینقدر عجیبه.
دلفــي
سه شنبه 18 دی 1403, 11:50 صبح
var
  Form1: TForm1;
  Ps: Integer;
implementation
{$R *.dfm}
procedure FindAndSelectString(RichEdit: TRichEdit; const SearchString: string; var Poss: Integer);
var
  StartPos: Integer;
begin
  StartPos := RichEdit.FindText(SearchString, Poss, Length(RichEdit.Text), []);
  if StartPos <> -1 then
  begin
    RichEdit.SelStart := StartPos;
    RichEdit.SelLength := Length(SearchString);
    RichEdit.SetFocus;
    Ps := StartPos + RichEdit.SelLength;
  end
  else
  begin
    Ps := 0;
  end;
end;
procedure JumpToLine(RichEdit: TRichEdit; LineNumber: Integer);
begin
  if (LineNumber >= 0) and (LineNumber < RichEdit.Lines.Count) then
  begin
    RichEdit.SetFocus;
    RichEdit.CaretPos := Point(0, LineNumber);
    RichEdit.Perform(EM_SCROLLCARET, 0, 0);
    Ps := RichEdit.SelStart;
  end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  FindAndSelectString(RichEdit1, Edit1.Text, Ps);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 JumpToLine(RichEdit1, StrToInt(Edit2.Text) );
end;
procedure TForm1.FormShow(Sender: TObject);
begin
  Ps := 0;
end;
end.
mbshareat
شنبه 22 دی 1403, 00:22 صبح
ممنون. امتحان کردم. 
کد جستجو، مکان نما رو به محل می بره ولی جوری تنظیم نمی کنه که مکان نما  دیده بشه.گویا TopIndex در لیست باکس تنظیم نشده باشه. یعنی اگر مکن نما  چند صفحه بعد باشه و جستجو بدیم باید مثلا کلید جهت چپ رو بزنیم، تازه  بفهمیم کدوم سطر هستیم.یعنی همون سطرهای قبلی بعد از جستجو دیده میشه و  مکان نما در سطرهای خارج از دید هست.
کد پرش به سطر، برای بار اول خوب بود. اما بارهای بعد خوب نیست با همون مشکلی که برای کد جستجو داشتم. نمایش ندادن سطر هدف.
بهتر میشه اگر یک کد هم باشه که بالاترین سطر نمایش داده شده هم بشه تعیین کرد. فرض کنیم میخوایم مکان نما در سطر پنجم از سطرهای قابل رویت باشه باشه.
دلفــي
شنبه 29 دی 1403, 14:07 عصر
ممنون. امتحان کردم. 
کد جستجو، مکان نما رو به محل می بره ولی جوری تنظیم نمی کنه که مکان نما  دیده بشه.گویا TopIndex در لیست باکس تنظیم نشده باشه. یعنی اگر مکن نما  چند صفحه بعد باشه و جستجو بدیم باید مثلا کلید جهت چپ رو بزنیم، تازه  بفهمیم کدوم سطر هستیم.یعنی همون سطرهای قبلی بعد از جستجو دیده میشه و  مکان نما در سطرهای خارج از دید هست.
کد پرش به سطر، برای بار اول خوب بود. اما بارهای بعد خوب نیست با همون مشکلی که برای کد جستجو داشتم. نمایش ندادن سطر هدف.
بهتر میشه اگر یک کد هم باشه که بالاترین سطر نمایش داده شده هم بشه تعیین کرد. فرض کنیم میخوایم مکان نما در سطر پنجم از سطرهای قابل رویت باشه باشه.
کدی که بالا گذاشتم بعد از پیدا کردن کلمه داخل متن به سطر مورد نظر پرش کرده و کلمه ی پیدا شده را هایلایت میکنه و محل کلمه ی پیدا شده در هر سطر یا هر صفحه ای باشه نمایش داده میشه (طبق تصویر زیر)
156392
حالا اگه مشکل شما اینه که مکان نما هم در ابتدا یا انتهای کلمه ی پیدا شده چشمک بزنه می تونید از کد زیر در داخل پروسیجر FindAndSelectString استفاده کنید:
RichEdit.CaretPos := Point(شماره سطر , محل اشاره گر);
در مورد پرش به سطر خاص هم می تونید از همون پروسیجر JumpToLine استفاده کنید.
mbshareat
پنج شنبه 04 بهمن 1403, 12:58 عصر
اگر Begin در صفحه دوم و بعد از تعریف startPos  و خارج از دید بود هم امتحان کردید؟ (البته ممکنه مشکل از قدیمی بودن دلفی من باشه)
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.