delphi4arab منتديات دلفي للعرب

نسخة كاملة : Bug in Ord Function
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم ورحمة الله و بركاته

اليوم و أنا أحاول كتابة دوال جديدة لمشروعي .. صدف و أن وجدت 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 
و السلام عليكم
جزاك الله خير ... فعلاً واجهتني هذه المشكلة ولم اعرف ماذا افعل لحلها
حيث اني لم استطع ان اقوم حتى بقراءة الدالة وطريقة عملها
لدي سؤال إن كان الموضوع مفتوحاً لنقاش ...

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

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

كيف اجعل Delphi XE3 يقوم بإرجاع قيمة Delphi7 ؟
تصحيح :
في 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
حصلت على اجابة من احد الردود التي وجدتها في الانترنت ...
وهي كانت بتغيير نوع المتغير او الثابت إلى : 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

لم اتخيل اني ساجد الحل بهذه السرعة رغم اني بحث على النترنت ولم اجد الاجابة إلا بعد ان طرحت المشكلة
والسلام عليكم ورحمة الله وبركاتة
إقتباس :لكن لا اعلم بالضبط هل هي خطاء برمجي ام ... شيء وضعته شركة بورلاند عمدا ام ماذا ...
ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!
تعديل بسيط على الدالة لدعم 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
إقتباس :ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!
فعلاً فأنا انطلقت الانطلاقة الفعلية مع Delphi XE3

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

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

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

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

كود :
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