PDA

View Full Version : استفاده از StringReplace



khoshblagh
شنبه 25 مهر 1388, 12:21 عصر
با سلام خدمت دوستان
همانطور که میدانید از تابع StringReplace برای جایگزینی در رشته ها بکار میرود. مشکل من اینه که پارامتر اول که همان رشته مورد نظر برای تغییرات است به صورت const تعریف شده و من نتوانستم به صورت متغیر variant مقدار به این تابع بفرستم و تغییرات مورد نظرم را
اعمال نمایم.البته اگر من یک رشته ثابت به این تابع بدهم دقیقا عمل مورد نظرم که همان حذف حرف کاما از بین اعداد است را انجام میدهد ولی اگر از متغیر که حاوی همان رشته میباشد استفاده نمایم جوابی در کار نیست .
پرسش اینه که اصولا تعریف یک رشته به صورت const به این معنی است که متغیر نمیگیرد؟
و اگر میگیرد من باید چطور این تابع برای تغییرات مورد نظر بر روی متغیرها نمایم؟
متشکرم

Felony
شنبه 25 مهر 1388, 15:21 عصر
منظور شما این هست که یک ثابت رشته ای دارید و میخواهید تغییرات رو روش اعمال کنید ؟ اگر این طور هست که نمیشه چون از نامش پیداست که ثابت هست و نمیشه تغییرش داد و باید یک متغیر اضافی در نظر بگیرید و نتیجه رو تو اون متغیر ذخیره کنید .


var
b:string;
const a='a,b,c,d,e,f';
begin
B:=StringReplace(A,',','@',[RFReplaceAll]);
ShowMessage(b);
end;

vcldeveloper
شنبه 25 مهر 1388, 15:37 عصر
قبل از استفاده از یک تابع، باید به پارامترها و مقدار برگشتی آن توجه کنید؛ تابع StringReplace یک رشته ورودی دریافت میکنه، کارکتر مورد نظر را در آن تعویض میکنه، و نتیجه را به صورت یک رشته جدید برگشت میده، نه همان رشته ایی که به عنوان ورودی بهش داده بودید. اگر کسی بخواد رشته خروجی همان رشته ورودی باشه، باید خروجی تابع را به همان رشته اختصاص بده:


MyStr := StringReplace(MyStr,'a','b',[rfReplaceAll]);

khoshblagh
یک شنبه 26 مهر 1388, 06:55 صبح
منظور شما این هست که یک ثابت رشته ای دارید و میخواهید تغییرات رو روش اعمال کنید ؟ اگر این طور هست که نمیشه چون از نامش پیداست که ثابت هست و نمیشه تغییرش داد و باید یک متغیر اضافی در نظر بگیرید و نتیجه رو تو اون متغیر ذخیره کنید .


var
b:string;
const a='a,b,c,d,e,f';
begin
B:=StringReplace(A,',','@',[RFReplaceAll]);
ShowMessage(b);
end;
با تشکر" جواب در حقیقت همان چیزی است که جناب آقای کشاورز فرمودند:
اگر کسی بخواد رشته خروجی همان رشته ورودی باشه، باید خروجی تابع را به همان رشته اختصاص بده

khoshblagh
سه شنبه 28 مهر 1388, 07:48 صبح
با سلام
من میخواهم محتویات یک ادیت باکس که عدد میباشد و توسط کاما سه رقم سه رقم جدا شده است را با کد زیر کاما آنرا برداشته و در نهایت با دستور اس کیو ال در یک جدول ثبت نمایم.ولی نشد.این کد باید چگونه نوشته شود که این کار را انجام دهد؟ متشکرم


var
strPardakht:string;
begin
strPardakht:= frmMoghayerEidt.edtPardakht.Text;
Showmessage(strPardakht);
strPardakht:=StringReplace(strPardakht,',','',[rfReplaceAll]);
Showmessage(strPardakht);

Felony
سه شنبه 28 مهر 1388, 12:07 عصر
کدی که گزاشتید درست کار میکنه ولی زیادی کشش دادید ، این کد بهینه شده :


edtPardakht.Text:=StringReplace(edtPardakht.Text,' ,','',[rfReplaceAll]);

khoshblagh
سه شنبه 28 مهر 1388, 14:45 عصر
جناب SilverSoft با سلام
دوست عزیز امتحان کردم جواب نداد (یعنی نتیجه با کاما بود) در صورت امکان لطف نموده و نمونه ای که امتحان شده باشد ارائه نمائید. قبلا از محب شما کمال تشکر را دارم.




کدی که گزاشتید درست کار میکنه ولی زیادی کشش دادید ، این کد بهینه شده :


edtPardakht.Text:=StringReplace(edtPardakht.Text,' ,','',[rfReplaceAll]);

Felony
سه شنبه 28 مهر 1388, 15:03 عصر
فایل ضمیمه رو ببینید .

khoshblagh
شنبه 02 آبان 1388, 09:51 صبح
فایل ضمیمه رو ببینید .
با تشکر از لطف شما
مشکل من اینه که از یک تابع جهت سه رقم نمودن اعداد در موقع درج در ادیت استفاده میکنم . احتمالا همین تابع باعث جلوگیری از عملکرد صحیح stringreplace میشود. لذا به نظر میرسد باید به یک نحوی عملکرد این تابع را در موقع استفاده از stringreplace خنثی نمود. چطور ؟
نمیدانم.

Felony
شنبه 02 آبان 1388, 12:21 عصر
من فایل ضمیمه رو ندیدم ، ولی در کل برای خنثی کردن یک رویداد در زمان مشخص کافیه اون رو با nil مقدار دهی کنید ، یعنی مثلا قبل از اینکه تابع StrinReplace رو فراخوانی کنید برای اینکه کد داخل OnChange یک ادیت اجرا نشه کد زیر رو بنویسید :

Edit1.OnChange:=nil;
امیدوارم منظورتون رو درست فهمیده باشم ، موفق باشید .

khoshblagh
شنبه 02 آبان 1388, 12:41 عصر
من فایل ضمیمه رو ندیدم ، ولی در کل برای خنثی کردن یک رویداد در زمان مشخص کافیه اون رو با nil مقدار دهی کنید ، یعنی مثلا قبل از اینکه تابع StrinReplace رو فراخوانی کنید برای اینکه کد داخل OnChange یک ادیت اجرا نشه کد زیر رو بنویسید :

Edit1.OnChange:=nil;
.
با تشکر از پاسختان
آیا این به معنی پاک شدن اطلاعات آن edit نیست؟ متشکرم

Felony
شنبه 02 آبان 1388, 16:05 عصر
با تشکر از پاسختان
آیا این به معنی پاک شدن اطلاعات آن edit نیست؟ متشکرم

خیر ما یک رویداد رو nil کردیم ، یعنی به صورت موقتی ( زمانی که دلمون خواسته ) از اجراش جلوگیری کردیم با متن ادیت که کاری نداشتیم ، اصلا نمیشه به جای یک رشته nil وارد کرد که ، اون از نوع رشته ای هست nil یک اشاره گر ، IDE اجازه ی کامپایل رو نمیده .

khoshblagh
یک شنبه 03 آبان 1388, 06:54 صبح
من فایل ضمیمه رو ندیدم ، ولی در کل برای خنثی کردن یک رویداد در زمان مشخص کافیه اون رو با nil مقدار دهی کنید ، یعنی مثلا قبل از اینکه تابع StrinReplace رو فراخوانی کنید برای اینکه کد داخل OnChange یک ادیت اجرا نشه کد زیر رو بنویسید :

Edit1.OnChange:=nil;
امیدوارم منظورتون رو درست فهمیده باشم ، موفق باشید .
با تشکر از شما
من کد را به شکل زیر استفاده نمودم ولی جواب نداد.
برای اطمینان از صحت کد خط 4 را اضافه نمودم که جواب داد. البته دوباره خط 4 را غیرفعال نمودم . به نظر با nil نمودن مشکل برطرف نمیشود.متشکرم



frmMoghayerEidt.edtPardakht.OnChange:=nil;



frmMoghayerEidt.edtPardakht.OnKeyDown:=nil;
frmMoghayerEidt.edtPardakht.OnKeyPress:=nil;
frmMoghayerEidt.edtPardakht.OnEnter:=nil;
frmMoghayerEidt.edtPardakht.Text:='1212,1212';
frmMoghayerEidt.edtPardakht.Text:=StringReplace(fr mMoghayerEidt.edtPardakht.Text ,',','',[rfReplaceAll]);
Showmessage(frmMoghayerEidt.edtPardakht.Text);

Felony
یک شنبه 03 آبان 1388, 07:23 صبح
با تشکر از شما
من کد را به شکل زیر استفاده نمودم ولی جواب نداد.
برای اطمینان از صحت کد خط 4 را اضافه نمودم که جواب داد. البته دوباره خط 4 را غیرفعال نمودم . به نظر با nil نمودن مشکل برطرف نمیشود.متشکرم



frmMoghayerEidt.edtPardakht.OnChange:=nil;



frmMoghayerEidt.edtPardakht.OnKeyDown:=nil;
frmMoghayerEidt.edtPardakht.OnKeyPress:=nil;
frmMoghayerEidt.edtPardakht.OnEnter:=nil;
frmMoghayerEidt.edtPardakht.Text:='1212,1212';
frmMoghayerEidt.edtPardakht.Text:=StringReplace(fr mMoghayerEidt.edtPardakht.Text ,',','',[rfReplaceAll]);
Showmessage(frmMoghayerEidt.edtPardakht.Text);
فعلا دلفی در دسترس نیست ، ولی در کل مشکلتون باید با همون قرار دادن رویداد معادل nil حل میشد ، شاید رویداد رو جای دیگه فراخوانی کردید .