المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
السلام عليكم ورحمة الله و بركاته
اليوم و أنا أحاول كتابة دوال جديدة لمشروعي .. صدف و أن وجدت Bug في الدالة Ord
الدالة Ord
لا تدعم ال Unicode !! في جميع نسخ دلفي الحديثة ..
المشكل هو أن حجم ال Char في اليونيكود = word , لكن في الدالة ord ال Result من نوع Byte
لقد قمت بالتبليغ عن هذه المشكلة في ال
QC
الحل : الحل بسيط جدا
PHP كود :
function FastORD (c:Char):{$IFDEF UNICODE} WORD {$ELSE} Byte {$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
و السلام عليكم
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
جزاك الله خير ... فعلاً واجهتني هذه المشكلة ولم اعرف ماذا افعل لحلها
حيث اني لم استطع ان اقوم حتى بقراءة الدالة وطريقة عملها
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
لدي سؤال إن كان الموضوع مفتوحاً لنقاش ...
في Delphi7 عندما استعمل Ord مع Unicode ويكون هكذا مثلاً :
PHP كود :
Ord('ه')
يتم إرجاع القيمة E5
وفي Delphi Xe3 عندما استعمل Ord مع Unicode ويكون هكذا مثلاً :
PHP كود :
Ord('ه')
يتم إرجاع القيمة 647
كيف اجعل Delphi XE3 يقوم بإرجاع قيمة Delphi7 ؟
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
تصحيح :
في Delphi XE3 احصل على نفس النتائج في Delphi7 :
Delphi XE3 :
PHP كود :
Ord('ه')
يتم إرجاع القيمة E5
لكن عندما اطبق هذه السطور :
PHP كود :
var
i : Integer;
const
sS = 'هههههه';
begin
for I := 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 ولا زال يظهر نفس النتائج
الآن اسئل السؤال السابق ...
كيف اجعل Delphi XE3 يقوم بإرجاع قيمة Delphi7 ؟ اي E5
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
حصلت على اجابة من احد الردود التي وجدتها في الانترنت ...
وهي كانت بتغيير نوع المتغير او الثابت إلى : shortString
بعد ذلك ساحصل على النتيجة E5 ... واضن ان هذه المشكلة التي واجهتني ترجع إلى نوع المتغير ...
لكن لا اعلم بالضبط هل هي خطاء برمجي ام ... شيء وضعته شركة بورلاند عمدا ام ماذا ...
يكون الكود هكذا :
PHP كود :
var
i : Integer;
sS : shortString;
begin
sS := 'هههههه';
for I := 1 to Length(sS) do
begin
form2.Caption := form2.Caption + ' ' + IntToHex(ord(sS[i]),4);
end;
end;
لم اتخيل اني ساجد الحل بهذه السرعة رغم اني بحث على النترنت ولم اجد الاجابة إلا بعد ان طرحت المشكلة
والسلام عليكم ورحمة الله وبركاتة
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
إقتباس :لكن لا اعلم بالضبط هل هي خطاء برمجي ام ... شيء وضعته شركة بورلاند عمدا ام ماذا ...
ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
تعديل بسيط على الدالة لدعم 64 بت !!
PHP كود :
function FastORD (c:Char):{$IFDEF UNICODE} WORD {$ELSE} Byte {$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;
المشاركات : 306
المواضيع 45
:
: 0
الإنتساب : Jul 2012
إقتباس :ليست من بورلاند ... بل من emb فهي التي قامت بدعم اليونيكود ... وحقية أخطاء مثل هذه ممكن تسبب الكثير من المشاكل
خصوصا لمبرمج لم يبرمج بدلفي 7 من قبل !!
فعلاً فأنا انطلقت الانطلاقة الفعلية مع Delphi XE3
بالنسبة لطريقة بنائك لدالة لم افهم شيء سوا انها اوامر اسمبلي ايضاً .. التعليمات التي تكون داخل {} كيف افهمهاً ...
هل يوجد مرجع عربي لها .. ولا مشكلة بالانجليزي
المشاركات : 632
المواضيع 66
:
: 6
الإنتساب : Jul 2010
ALmuhhnad كتب :فعلاً فأنا انطلقت الانطلاقة الفعلية مع Delphi XE3
بالنسبة لطريقة بنائك لدالة لم افهم شيء سوا انها اوامر اسمبلي ايضاً .. التعليمات التي تكون داخل {} كيف افهمهاً ...
هل يوجد مرجع عربي لها .. ولا مشكلة بالانجليزي
هل تقصد {$IFDEF CPUX64} ؟
هذه عبارة عن Compiler Directives ...تستعمل للتخاطب مع الكومبايلر الخاص يدلفي
كأن نتحقق من اصدار دلفي أو منصة العمل 32 بت أو 64 .. الخ
و بالطبع هناك مرجع لها
كود :
http://docwiki.embarcadero.com/RADStudio/XE3/en/Delphi_Compiler_Directives_(List)_Index
المشاركات : 219
المواضيع 24
:
: 13
الإنتساب : May 2009
السلام عليكم
لم أجد هذه المشكلة. إلا عند تمرير الحرف نفسه بدل من متغير يحمله. وهي هنا مشكلة المحرر. الذي برغم دعمه حرف اليونيكود، فإنه عند استخدام الحروف العربية يختار لها قيمة أسكي.
كود :
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