السلام عليكم
هل صادف احدكم المشكلة التالية:
لدي برنامج ينشئ ملف باستخدام طريقة File of Record ما الاحظه هو انه في نسخة من الوندوز الاكس بي ينشئ الملف بالسجلات و في النسخة اخرى ينشئ الملف بدون اي سجلات!!!!!!!!
ارجو الافادة
السلام عليكم
هل صادف احدكم المشكلة التالية:
لدي برنامج ينشئ ملف باستخدام طريقة File of Record ما الاحظه هو انه في نسخة من الوندوز الاكس بي ينشئ الملف بالسجلات و في النسخة اخرى ينشئ الملف بدون اي سجلات!!!!!!!!
ارجو الافادة
كلا النسختين لديها SP2
نعم في احدى النسخ فارغ و في النسخة الاخرى يعمل بشكل صحيح
بالمناسبة حملت دلفي على نسخة XP التي تنتج ملف فارغ و كتبت نفس الكود و النتيجة انه عمل بشكل جيد !!!!!! اي ان الملف لم يعد فارغا
لا ادري ما هو تفسير ذلك بالضبط !!!!!!!!!!!!!!!!
قد يكون المشكل في Buffer ويندوز
فكندما تكتب ملف في القرص الصلب لا يكتب فعليا في نفس الوقت
جرب إضافة هذا
Flush(F);
شكرا جزيلا لك على تفاعلك مع الموضوع...
على كل حال اعتقد ان السبب يكمن في هذة الدالة :
StrToInt64
فعندما اعرف متغير من نوع DWORD اتفاجئ بعدم التحويل الصحيح
انظر الي الكود التالي
Type TDriverSerNum = Record Driver : String[4]; SerialNum1 : DWORD; SerialNum2 : DWORD; End; var rec : TDriverSerNum; num1, num2 : String; Begin num1 := '6171682233'; num2 := '4763920434'; Rec.SerialNum1 := StrToInt64(num1); Rec.SerialNum2 := StrToInt64(num2); --------------------------------------------------------------
اتفاجئ ان التحويل لم يتم بشكل صحيح فنجد ان :
Rec.SerialNum1 = '1876714937'; Rec.SerialNum2 = '468953138';
فهل لدى احدكم دالة بديلة ل StrToInt64
بالمناسبة الدلة StrToInt لن تعمل بسبب القيم الموجبة و السالبة و كذلك لحجم البيانات الاربعة بايت المقسمة بين القيم الموجبة و السالبة
الدالة StrToInt64 نفس الدلة السابقة و لكن حجم البيانات هو 8 بايت
ربما خطاء التحويل بسبب البت الاخير او شي اخر
هل يعرف احدكم دالة اخر قادرة على التحويل من String الي DWORD
تذكر DWORD هو عدد موجب فقط وحجمه 4 بايتات
وعفوا على الاطالة
تم تعديل هذه المشاركة بواسطة Whale في 2 أكتوبر 2005 في 14:01
إن كنت لا تستخدمهم في حسابـ لما لا تحول المتغييرين إلn String
TDriverSerNum = Record Driver : String[4]; SerialNum1 , SerialNum2 : String; End;
المشكلة هي انّ Dword حجمه 8 بايت
اي من 0..4294967295
و الرقم الذي تضعه في الأعلى اكبر من القيمة المحتملة لهذا النمط لذلك يعطي نتائج جاطئة
حيث يقوم بعملية الفيض اي يرجع من الأول و هكذا
اعمل بنصيحة الأخ DeltaAziz و قم بتحويل النمط الى String
رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.
لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"
شباب DWORD حجمة 4 بايت و ليس 8
هذا ما حصلت عليه بعد استخدام الدالة SizeOf
هذا منطقي لأنه يدعم نظام 32 بت و تستخدم في كثير من دوال WIN32 API
waeldalol
كلامك صحيح 100% يبدو ان البرنامج عمل تدوير للرقم اذا لابد ان ابحث عن DataType بحجم 8 بايت
بالنسبة لتحويل الي String
نعم فكرت في ذلك و لكن المشكة سأطر ان اغير خوارزمية التشفير و هلم جرى
ربما يكون هو الخيار الوحيد لدي حاليا
في انتظار ارائكم
تحياتي
تم تعديل هذه المشاركة بواسطة Whale في 2 أكتوبر 2005 في 14:36
DeltaAziz وwaeldalol شكرا جزيلا لكم
سأستخدم Int64 وارى النتيجة
تحياتي لكم جميعا
:)
هذا الموضوع مغلق.