الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة دلفي مع WINXP

مغلق
بدأه Whale في 1 أكتوبر 2005 · 8 رد · 596 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

هل صادف احدكم المشكلة التالية:

لدي برنامج ينشئ ملف باستخدام طريقة File of Record ما الاحظه هو انه في نسخة من الوندوز الاكس بي ينشئ الملف بالسجلات و في النسخة اخرى ينشئ الملف بدون اي سجلات!!!!!!!!

ارجو الافادة

#2

أي نسخة ؟ WinXP SP2

وما ذا تعني بالضبط ؟ هل تقصد الملف فارغ ؟

d4baa0.gif
#3

كلا النسختين لديها SP2

نعم في احدى النسخ فارغ و في النسخة الاخرى يعمل بشكل صحيح

بالمناسبة حملت دلفي على نسخة XP التي تنتج ملف فارغ و كتبت نفس الكود و النتيجة انه عمل بشكل جيد !!!!!! اي ان الملف لم يعد فارغا

لا ادري ما هو تفسير ذلك بالضبط !!!!!!!!!!!!!!!!

#4

قد يكون المشكل في Buffer ويندوز

فكندما تكتب ملف في القرص الصلب لا يكتب فعليا في نفس الوقت

جرب إضافة هذا

Flush(F);
d4baa0.gif
#5

شكرا جزيلا لك على تفاعلك مع الموضوع...

على كل حال اعتقد ان السبب يكمن في هذة الدالة :

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

#6

إن كنت لا تستخدمهم في حسابـ لما لا تحول المتغييرين إلn String

TDriverSerNum = Record
Driver : String[4];
SerialNum1 ,
SerialNum2 : String;
End;
d4baa0.gif
#7

المشكلة هي انّ Dword حجمه 8 بايت

اي من 0..4294967295

و الرقم الذي تضعه في الأعلى اكبر من القيمة المحتملة لهذا النمط لذلك يعطي نتائج جاطئة

حيث يقوم بعملية الفيض اي يرجع من الأول و هكذا

اعمل بنصيحة الأخ DeltaAziz و قم بتحويل النمط الى String

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#8

شباب DWORD حجمة 4 بايت و ليس 8

هذا ما حصلت عليه بعد استخدام الدالة SizeOf

هذا منطقي لأنه يدعم نظام 32 بت و تستخدم في كثير من دوال WIN32 API

waeldalol

كلامك صحيح 100% يبدو ان البرنامج عمل تدوير للرقم اذا لابد ان ابحث عن DataType بحجم 8 بايت

بالنسبة لتحويل الي String

نعم فكرت في ذلك و لكن المشكة سأطر ان اغير خوارزمية التشفير و هلم جرى

ربما يكون هو الخيار الوحيد لدي حاليا

في انتظار ارائكم

تحياتي

تم تعديل هذه المشاركة بواسطة Whale في 2 أكتوبر 2005 في 14:36

هذا الموضوع مغلق.

مواضيع مشابهة