delphi4arab منتديات دلفي للعرب
Bug in Ord Function - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : دلفي للعرب - القسم العام (https://delphi4arab.net/forum/forumdisplay.php?fid=10)
+--- الموضوع : Bug in Ord Function (/showthread.php?tid=5083)



Bug in Ord Function - SMP3 - 30-03-2013

السلام عليكم ورحمة الله و بركاته

اليوم و أنا أحاول كتابة دوال جديدة لمشروعي .. صدف و أن وجدت Bug في الدالة Ord
الدالة Ord لا تدعم ال Unicode !! في جميع نسخ دلفي الحديثة ..
المشكل هو أن حجم ال Char في اليونيكود = word , لكن في الدالة ord ال Result من نوع Byte
لقد قمت بالتبليغ عن هذه المشكلة في ال QC

الحل : الحل بسيط جدا
PHP كود :
function FastORD (c:Char):{$IFDEF UNICODEWORD {$ELSEByte {$ENDIF};
asm
  
{Note The RTL ORD Function Does not support Unicode }
  {Use 
FastORD to support Unicode }
  {Do 
nothing !!}
end

كما تلاحظ تستطيع استخدام الدالة FastOrd لدعم اليونيكود
PHP كود :
Edit1.Text := IntToHex(Ord('ج'), 4); // Return 00CC
  
Edit2.Text := IntToHex(FastORD('ج'), 4); // Return 062C 
و السلام عليكم


Bug in Ord Function - ALmuhhnad - 02-04-2013

جزاك الله خير ... فعلاً واجهتني هذه المشكلة ولم اعرف ماذا افعل لحلها
حيث اني لم استطع ان اقوم حتى بقراءة الدالة وطريقة عملها


Bug in Ord Function - ALmuhhnad - 02-04-2013

لدي سؤال إن كان الموضوع مفتوحاً لنقاش ...

في Delphi7 عندما استعمل Ord مع Unicode ويكون هكذا مثلاً :
PHP كود :
Ord('ه')
يتم إرجاع القيمة E5 

وفي Delphi Xe3 عندما استعمل Ord مع Unicode ويكون هكذا مثلاً :
PHP كود :
Ord('ه')
يتم إرجاع القيمة 647 

كيف اجعل Delphi XE3 يقوم بإرجاع قيمة Delphi7 ؟


Bug in Ord Function - ALmuhhnad - 02-04-2013

تصحيح :
في Delphi XE3 احصل على نفس النتائج في Delphi7 :
Delphi XE3 :
PHP كود :
Ord('ه')
يتم إرجاع القيمة E5 

لكن عندما اطبق هذه السطور :
PHP كود :
var
  
Integer;
const
  
sS 'هههههه';
begin
  
for := 1 to Length(sS) do
  
begin
    form2
.Caption := form2.Caption ' ' IntToHex(ord(sS[I]),4);
  
end;
end
احصل القيمة التالية في Caption النافذة :
PHP كود :
0647 0647 0647 0647 0647 0647 
علماً اني طبقت هذه الاكود في Delphi7 ولا زال يظهر نفس النتائج Smile

الآن اسئل السؤال السابق ...
كيف اجعل Delphi XE3 يقوم بإرجاع قيمة Delphi7 ؟ اي E5


Bug in Ord Function - ALmuhhnad - 02-04-2013

حصلت على اجابة من احد الردود التي وجدتها في الانترنت ...
وهي كانت بتغيير نوع المتغير او الثابت إلى : shortString
بعد ذلك ساحصل على النتيجة E5 ... واضن ان هذه المشكلة التي واجهتني ترجع إلى نوع المتغير ...
لكن لا اعلم بالضبط هل هي خطاء برمجي ام ... شيء وضعته شركة بورلاند عمدا ام ماذا ...

يكون الكود هكذا :
PHP كود :
var
  
Integer;
  
sS shortString;
begin
  sS 
:= 'هههههه';
  for 
:= 1 to Length(sS) do
  
begin
    form2
.Caption := form2.Caption ' ' IntToHex(ord(sS[i]),4);
  
end;
end

لم اتخيل اني ساجد الحل بهذه السرعة رغم اني بحث على النترنت ولم اجد الاجابة إلا بعد ان طرحت المشكلة
والسلام عليكم ورحمة الله وبركاتة


Bug in Ord Function - SMP3 - 02-04-2013

إقتباس :لكن لا اعلم بالضبط هل هي خطاء برمجي ام ... شيء وضعته شركة بورلاند عمدا ام ماذا ...
ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!


Bug in Ord Function - SMP3 - 02-04-2013

تعديل بسيط على الدالة لدعم 64 بت !!
PHP كود :
function FastORD (c:Char):{$IFDEF UNICODEWORD {$ELSEByte {$ENDIF};
asm
  
{Note The RTL ORD Function Does not support Unicode }
  {Use 
FastORD to support Unicode }
  {
$IFDEF CPUX64}
  
MOV AX,CX
  
{$ENDIF}
end;
function 
FastORDA (c:AnsiChar): Byte ;
asm
  
{$IFDEF CPUX64}
   
MOV AL,CL
  
{$ENDIF}
end



Bug in Ord Function - ALmuhhnad - 02-04-2013

إقتباس :ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!
فعلاً فأنا انطلقت الانطلاقة الفعلية مع Delphi XE3

بالنسبة لطريقة بنائك لدالة لم افهم شيء سوا انها اوامر اسمبلي ايضاً .. التعليمات التي تكون داخل {} كيف افهمهاً ...
هل يوجد مرجع عربي لها .. ولا مشكلة بالانجليزي


Bug in Ord Function - SMP3 - 03-04-2013

ALmuhhnad كتب :فعلاً فأنا انطلقت الانطلاقة الفعلية مع Delphi XE3

بالنسبة لطريقة بنائك لدالة لم افهم شيء سوا انها اوامر اسمبلي ايضاً .. التعليمات التي تكون داخل {} كيف افهمهاً ...
هل يوجد مرجع عربي لها .. ولا مشكلة بالانجليزي

هل تقصد {$IFDEF CPUX64} ؟
هذه عبارة عن Compiler Directives ...تستعمل للتخاطب مع الكومبايلر الخاص يدلفي
كأن نتحقق من اصدار دلفي أو منصة العمل 32 بت أو 64 .. الخ
و بالطبع هناك مرجع لها
كود :
http://docwiki.embarcadero.com/RADStudio/XE3/en/Delphi_Compiler_Directives_(List)_Index



Bug in Ord Function - shagrouni - 19-04-2013

السلام عليكم

لم أجد هذه المشكلة. إلا عند تمرير الحرف نفسه بدل من متغير يحمله. وهي هنا مشكلة المحرر. الذي برغم دعمه حرف اليونيكود، فإنه عند استخدام الحروف العربية يختار لها قيمة أسكي.

كود :
var
  C: Char;
  s: string;
begin
  //  204
  Label1.Caption := IntToStr(Ord('ج'));
  c := 'ج';
  Label2.Caption := IntToStr(Ord(c));         //  1580
  s := 'جنان';
  Label3.Caption := IntToStr(Ord(s[1]));      //  1580
  Label4.Caption := IntToStr(Ord('ⵄ'));       // 11588