PDA

View Full Version : delete



shining_eye
سه شنبه 08 تیر 1389, 11:47 صبح
من میخوام اگر مقدار وارد شده در edite1من با یکی از مقادیر موجود در memo1 برابر بود آن را پیدا کنه(بره رو اون مقدار در memo) و سپس deleteکنه چه طور این کار رو بکنم؟
چرا این کد من جواب نمیده؟؟

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (memo1.Lines.Text = edit1.SelText) then
memo1.Lines.Delete(strtoint(edit1.SelText));
end;

Felony
سه شنبه 08 تیر 1389, 11:54 صبح
var
Str: String;
begin
Str:= Memo1.Lines.Text;
Delete(Str,Pos(Edit1.Text,Str),Length(Edit1.Text)) ;
Memo1.Lines.Text:= Str;
end;

shining_eye
سه شنبه 08 تیر 1389, 11:58 صبح
اشتباه کد من چیه؟

Felony
سه شنبه 08 تیر 1389, 12:08 عصر
اشتباه کد من چیه؟
به عبارتی از پایه و اساس ویران است ...


procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if (memo1.Lines.Text = edit1.SelText) then
memo1.Lines.Delete(strtoint(edit1.SelText));
end;
متد SelText متنی که تو Edit انتخاب شده ( Highlight شده ) رو برمیگردونه ، پس اینجا چون متنی در Edit انتخب نشده یک رشته خالی برمیگردونه ، شرط شما هم این هست که اگر متن داخل Memo با متن انتخاب شده داخل Edit یکی بود دستورات رو اجرا کن ، پس اصلا شرط برقرار نمیشه .

اگر هم به جای SelText از Text استفاده کنید، یعنی :

if (memo1.Lines.Text = edit1.Text) then
باز هم اشتباه هست چون شرط شما مشکل داره و با این کار گفتید اگر محتوای Memo با محتوای Edit یکسان بود ، در صورتی که اصلا به شرط نیازی نیست .

در خط آخر هم متد Lines.Delete ایندکس یک خط رو میگیره و از Memo حذفش میکنه ( کل خط رو ) .

shining_eye
سه شنبه 08 تیر 1389, 14:16 عصر
ولی متد posمیره محل اولین وقوع رو بر میگردونه .مثلا من در edit1مقدار 2
را وارد میکنم این روش حتی 2ی اول 234 را نیز پاک می کند

Felony
سه شنبه 08 تیر 1389, 14:20 عصر
این طبیعی هست ، شما گفتید هر جا عدد 2 پیدا شد پاک کنه ، برای اینکه تمام قسمت های مشابه متن شما رو پاک کنه باید دستور رو تو یه حلقه تکرار کنید ، با این کار قطعه کد تا زمانی که متن مورد نظر شما داخل Memo وجو داشته باشه به کار خودش ادامه میده و اون رو حذف میکنه :

var
Str: String;
begin
Str:= Memo1.Lines.Text;
while Pos(Edit1.Text,Str)<> 0 do
Delete(Str,Pos(Edit1.Text,Str),Length(Edit1.Text)) ;
Memo1.Lines.Text:= Str;
end;

روش فنی تر هم استفاده از تابع StringReplace هست :
Memo1.Text:= StringReplace(Memo1.Text,'2','',[rfReplaceAll]);