با سلام و عرض ادب خدمت دوستان برنامه نویس
اگر شما هم تابحال مثل من از کامپوننت های شرکت DevExpress استفاده کردید قطعاً با مشکلات عدیده این کامپوننت عالی با زبان فارسی روبرو شدید.
چند تا از مشکل ها رو که موفق شده بودم حل کنم قبلاً توی همین سایت قرار دادم و الان برای حل یک مشکل جدید تابعی درست کردم که امیدوارم به درد شما هم بخوره.
مشکل:
مجموعه DevExpress کامپوننتی داره که برای ساخت متن فیلتر ازش استفاده میشه. این کامپوننت بسیار قدرتمند و جالبه و تنها عیبش اینه که زبان فارسی رو خوب پشتیبانی نمیکنه. یعنی اگر شما در مقادیر وارده متون فارسی را وارد کنید نتیجه نمایشی اشتباه خواهد بود. چند مشکلی که بوجود میاد عبارتند از:
1- در مقادیر منطقی آپستراف های مقادیر True و Flase قرار نمیگیرد (البته این مربوط به زبان فارسی نمیشه و یک مشکل کلیه و شایدم من دارم خصوصیات کامپوننت رو بد تنظیم میکنم)
2- مشکل دوم هم همان مشکل معروف حروف «ی» و «ک» است که باعث ناسازگاری متون میشه
3- مشکل تعریف علامت % در دوطرف مقدار مورد جستجو برای زمانی است که از عبارت Like استفاده میکنیم (البته این مشکل نیست و کاربر باید خودش این دو علامت رو وارد کنه ولی من ترجیح میدم توی برنامه های خودم این دو علامت رو خودکار وارد کنم)

حل:
برای این منظور تابعی نوشتم که تمامی مشکلهای بالا رو حل میکنه اما باید چند تا چیز رو رعایت کنید:
1-برای استفاده از این تابع (که من توی دلفی Xe4 نوشتم) شما باید در قسمت Uses عبارت System.StrUtils را معرفی کنید.
من اشتباهاً عبارت System.AnsiStrings رو تعریف کرده بودم که کلی با مشکل مواجه شدم و نیم ساعت از وقتم گرفته شد.
2- فیلد های شما در جدول sql باید از نوع n دار باشد (مانند nVarchar, nText,...)
3- اگر از کامپوننتهای شرکت DevArt مانند UniDac استفاده میکنید میتونید خروجی فیلتر کامپوننت Filter رو بعد از نرمال کردن در تابع من به خصوصیت FilterSql تخصیص بدید که خیلی کاربردیه و در غیر این صورت اگر قصد دارید کل دستور sql رو بسازید شاید دو خط اول تابع که برای حذف Where است بدردتان بخورد (اما فعلاًٌ این دو خط کاربردی ندارند)

و حالا خود تابعی که من نوشتم:


function CxFilter2Sql(strFilter:UnicodeString):UnicodeStrin g;
var
Condition:UnicodeString;
FirstPos,SeconPos:integer;
begin
//اگر از قبل شرط? در اس ک?و ال موجود باشد با?د آنرا حذف نمود
// if pos('Where',sql)>0 then
// Delete(sql,pos('Where',sql),Length(sql)-pos('Where',sql));




if Length(strFilter)>0 then
begin
strFilter:=ReplaceText(strFilter,'True',QuotedStr( 'True'));
strFilter:=ReplaceText(strFilter,'False',QuotedStr ('False'));
strFilter:=ReplaceText(strFilter,'LIKE ''','LIKE N''');
strFilter:=ReplaceText(strFilter,'= ''','= N''');
strFilter:=ReplaceText(strFilter,'<> ''','<> N''');
strFilter:=ReplaceText(strFilter,'AND ''','AND N''');
strFilter:=ReplaceText(strFilter,'Between ''','Between N''');


FirstPos:=1;
SeconPos:=1;


while (FirstPos*SeconPos)>=1 do begin
FirstPos:=PosEx('LIKE N''',strFilter,SeconPos);
if FirstPos>0 then begin
SeconPos:=PosEx('''',strFilter,FirstPos+7);
Condition:=Copy(strFilter,FirstPos+7,SeconPos-FirstPos-7);
strFilter:=ReplaceText(strFilter,Condition,'%'+Con dition+'%');
end;
end;
end;
// strFilter:=ReplaceText(strFilter,'ک','ک');
// strFilter:=ReplaceText(strFilter,'ي','ی');


Result:=strFilter;
end;




دوستان اگر ایرادی به این کامپوننت داشتید و منم بلد بودم همینجا جواب میدم