ورود

View Full Version : سوال: notpad



**MR**
دوشنبه 10 تیر 1387, 11:48 صبح
سلام بچه ها
من برای find برنامه notpadبا استفاده ازشی memoاز کد زیر استفاده کردم ولی دوتا مشکل دارد:

1-در موقع اجرا وقتیfinddialog را باز می کنم تا کاراکتری را پیدا کند خط اول را اصلا نظر نمی گیرد(یعنی اگر کاراکتر مورد نظر در خط اول باشد اصلا پیدایش نمی کند ولی از خط دوم به بعد را پیدا میکند).


2-در موقع اجرا وقتfinddialog را باز میکنم و کارکتر را می دهم تا پیدا کند تا دکمه find را می زنم تا وقتی پنجره باز است آن را به حالت انتخاب در نمی آورد و باید پنجره را به صورت دستی ببندم تا ببینم چی انتخاب شده البته من یک گزینه جدا برای find nextگذاشتم
البته این مشکل من با بستن خود به خود finddialogبعد از پیدا کردن اولین کاراکتر حل می شود ولی نمی دانم ان را در کجای برنامه بنویسم.
خواهش میکنم راهنماییم کنید.
البته اگر کد دیگری برای find , replace بهم بدهید ممنون میشوم.


procedure TForm1.FindDialog1Find(Sender: TObject);
var
I, J, PosReturn, SkipChars: Integer;
CursorPos : TPoint;
begin
CursorPos := Memo1.CaretPos;
if frDown in FindDialog1.Options then
begin
for I := CursorPos.Y + 1 to Memo1.Lines.Count do
begin
PosReturn := Pos(FindDialog1.FindText,Memo1.Lines[i]);
if (PosReturn <> 0) then
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1;

Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(FindDialog1.FindText);
Break;
end;
end;
end
else
begin
for I := CursorPos.Y - 1 downto 0 do
begin
PosReturn := Pos(FindDialog1.FindText,Memo1.Lines[i]);
if PosReturn <> 0 then
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1;

Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(FindDialog1.FindText);
Break;
end;
end;
end;
end;

procedure TForm1.FindClick(Sender: TObject);
begin
FindDialog1.Execute;
end;

procedure TForm1.FindNextClick(Sender: TObject);
begin
FindDialog1Find(nil);
end;

procedure TForm1.ReplaceClick(Sender: TObject);
begin
ReplaceDialog1.Execute;
end;

procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
var
CursorPos : TPoint;
I, J, SkipChars, PosReturn : integer;
begin
if frReplace in ReplaceDialog1.Options then
Memo1.SelText := ReplaceDialog1.ReplaceText
else if frReplaceAll in ReplaceDialog1.Options then
begin
CursorPos := Memo1.CaretPos;
for I := CursorPos.Y + 1 to Memo1.Lines.Count do
begin
PosReturn := Pos(ReplaceDialog1.FindText,Memo1.Lines[i]);
if PosReturn <> 0 then
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1;

Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(ReplaceDialog1.FindText);
Memo1.SelText := ReplaceDialog1.ReplaceText;
end;
end;
end;
end;

procedure TForm1.ReplaceDialog1Find(Sender: TObject);
var
I, J, PosReturn, SkipChars: Integer;
CursorPos : TPoint;
begin
CursorPos := Memo1.CaretPos;
for I := CursorPos.Y + 1 to Memo1.Lines.Count do
begin
PosReturn := Pos(ReplaceDialog1.FindText,Memo1.Lines[i]);
if PosReturn <> 0 then
begin
SkipChars := 0;
for J := 0 to I - 1 do
SkipChars := SkipChars + Length(Memo1.Lines[J]);
SkipChars := SkipChars + (I*2);
SkipChars := SkipChars + PosReturn - 1;

Memo1.SelStart := SkipChars;
Memo1.SelLength := Length(ReplaceDialog1.FindText);
Break;
end;
end;
end;

**MR**
دوشنبه 10 تیر 1387, 13:12 عصر
دوباره سلام
با دقت که برنامه ام را اجرا کردم دیدم یه مشکل دیگه هم داره:
به عنوان مثال وقتی میخواهم کاراکتر h برام پیدا کنه در هر خطی اگه بیشتر از یکی بود فقط اولیش را پیدا میکنه.

Hsimple11
دوشنبه 10 تیر 1387, 14:05 عصر
برای انجام کارهای ویرایش متن ساده متوانید از Action ها کمک بگیرید. در واقع یک اکشن استاندارد برای Find و یا Replace.
قبلا در مورد کار با Actions بحث شده. جستجو کنید.

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

Hsimple11
دوشنبه 10 تیر 1387, 18:35 عصر
اگر نیازتان فوری است بدلیل مشکلی که در قسمت جسجوی سایت پیدا شده بفرمایید تا راهنماییتان کنم.

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

**MR**
دوشنبه 10 تیر 1387, 19:01 عصر
این یک پروژه دانشجویی و نمی توانم غیر از چیزهایی که استاد گفته چیز دیگری استفاده کنم در این برنامه فقط می توانم ازdialog,memoاستفاده کنم.
و مشکلم هم فوریه
من نمیدانم چرا خط اول را درfind نظر نمی گیره و................

**MR**
سه شنبه 11 تیر 1387, 09:38 صبح
سلام
یعنی انقدر اشکال یابی برنامه ای به ای سادگی(البته برای حرفه ای ها ) سخت باشه که هیچ کس جوابم را نمی ده وقت ندارم خواهش میکنم زود جوابم را بدهید

**MR**
سه شنبه 11 تیر 1387, 13:32 عصر
اینجا همیشه به این صورت که کاربر های جدید که هنوز ابتدای راه هستند را تحویل نمی گیرند من 24 ساعت این تایپک را گذاشتم ولی به غیر از HSIMPLEهیچ کس راهنمایم نکرد حتی مدیران.
موتور جستجو هم که غیر فعال مثل اینکه من این دفعه بدشانسی اوردم
اگه راهنماییم کنید کمک بزرگی بهم کردید.

Hsimple11
چهارشنبه 12 تیر 1387, 01:22 صبح
سایت چند روزی در حال Update شدن بود.


private
{ Private declarations }
FSelPos: integer;
public
{ Public declarations }
end;

var
Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.FindDialog1Find(Sender : TObject);
var
S : string;
startpos : integer;
begin
with TFindDialog(Sender) do
begin
if FSelPos = 0 then
Options := Options - [frFindNext];

if frfindNext in Options then
begin
StartPos := FSelPos + Length(Findtext);
S := Copy(Memo1.Lines.Text, StartPos, MaxInt);
end
else
begin
S := Memo1.Lines.Text;
StartPos := 1;
end;
FSelPos := Pos(FindText, S);
if FSelPos > 0 then
begin
FSelPos := FSelPos + StartPos - 1;
Memo1.SelStart := FSelPos - 1;
Memo1.SelLength := Length(FindText);
Memo1.SetFocus;
end
else
begin
if frfindNext in Options then
S := Concat('There are no further occurences of "', FindText,
'" in Memo1.')
else
S := Concat('Could not find "', FindText, '" in Memo1.');
MessageDlg(S, mtError, [mbOK], 0);
end;
end;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
FSelPos := 0;
FindDialog1.Execute;
end;

فکر کنم بتوانید آن ذا برای Replace هم تعمیم دهید.
موفق باشید...