سؤال

حصلت على مصدر مشروع أقدم وعليه تغيير الأشياء الصغيرة، لكنني حصلت في مشكلة كبيرة بسبب وجود دلفي 2010 فقط للقيام بذلك.

هناك سجل محدد: giveacodicetagpre.

في وقت لاحق يستخدم هذا التعريف للقراءة من ملف: giveacodicetagpre.

المشكلة الأساسية هي، لا يقبل برنامج التحويل البرمجي "السلسلة" في السجل لأنه يريد "الانتهاء". لذلك حاولت تغيير "السلسلة" إلى "السلسلة [255]" أو "cropstring".القيام بهذا التطبيق يقرأ الملف ولكن مع محتوى خاطئ.

سؤالي هو كيفية تحويل نوع "السلسلة" القديمة التي تمت كتابة الملفات بها أنواع "جديدة" في Delphi 2010.

حاولت بالفعل الكثير على سبيل المثال"{$ h-}".إضافة سحر واحد فقط في عروض السجلات، يكون الملف صحيحا، نظرا لأن الملف يقرأ بشكل صحيح تقريبا ولكنه اقتطاع أحد سحر واحد لكل مجموعة بيانات - يبدو طول الطول الطويل + 255Chars صحيح FPR التعريف ولكن Cropstring لا يطابق.

هل كانت مفيدة؟

المحلول

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

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

يوضحLU RD نقطة جيدة في التعليقات مفادها أن تخطيط التسجيلة قد يختلف بين إصدارات دلفي نظرًا لأنك لا تستخدم مصفوفة أكواد عامة. يمكنك فحص تخطيط السجل باستخدام نسختين من دلفي في متناول يدك. سوف تحتاج إلى ترتيب تطابق حجم السجلات بين الإصدارات ، وأن تتطابق إزاحات الحقول أيضًا.

استنادًا إلى التعليقات أدناه ، ستؤدي إضافة بايت متسع بين pos و nr إلى حل مشاكلك.

Genacodicetagpre

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

على المدى الطويل ، يجب أن تبتعد عن السلاسل القصيرة وتشفير ANSI والتخطيط المباشر بين سجلاتك الداخلية وملفات بياناتك وما إلى ذلك. على المدى القصير ، قد يكون من الأفضل لك الحصول على نفس إصدار دلفي الذي تم استخدامه لبناء هذا الكود واستخدامه. أتوقع أن تكون هذه المشكلة مجرد قمة جبل الجليد.

نصائح أخرى

فقط تذكر:

"string" <> "string [255]" <> "shortstring" <> AnsiString

بالعودة إلى أيام DOS / Turbo Pascal القديمة ، كانت "السلاسل" تقتصر بالفعل على 255 حرفًا. في جزء كبير منه لأن البايت الأول يحتوي على طول السلسلة ، ويمكن أن يكون للبايت قيمة بين 0 و 255 فقط.

لم تعد هذه مشكلة في الإصدارات المعاصرة من دلفي.

" ShortString " هي نوع DOS / Pascal القديم نوع السلسلة.

كان "LongString" هو نوع السلسلة الافتراضي لفترة طويلة (بما في ذلك Borland Delphi 2006 الذي أستخدمه حاليًا لمعظم أعمال الإنتاج). من دلفي 3 .. دلفي 2009 ، LongStrings تحتوي على أحرف 8 بت ، وكانت محدودة فقط بالذاكرة المتاحة. من دلفي 3 .. دلفي 2009 ، كانت "LongStrings" مرادفة لـ "AnsiStrings".

الإصدارات الأخيرة من دلفي (دلفي 2009 والإصدارات الأحدث ، بما في ذلك Delphi XE2 الجديدة) كلها الآن بشكل افتراضي إلى سلاسل Unicode "WideString" متعددة البايت. WideStrings ، مثل AnsiStrings ، هي أيضًا "غير محدودة" بشكل فعال بأقصى طول.

تشرح هذه المقالة بمزيد من التفصيل:

http://delphi.about.com/od/beginners/l/ aa071800a.htm

ملاحظة: ضع في اعتبارك استخدام "sizeof (bbil)" و " Packed " للسجلات الثنائية .

ربما أتجاهل شيئًا ما ، ولكن بالطريقة التي أراها ، فإن كود دلفي 3 الخاص بك معطل أيضًا.حاول تحديد حجم السجل الخاص بك: Genacodicetagpre

المسار (أي شيء بين 1 و 256 - بايت واحد للطول ، والباقي للبيانات) ، ونقاط البيع (1 بايت) ، nr (2 بايت) ، مما يجعل حجم بيانات السجل الخاص بك يختلف من 1 + 1 + 2= 4 بايت إلى 256+ 1 + 2= 259 بايت.في ظل هذا الظرف ، ستحصل على القمامة من الملف في أي حال ، نظرًا لأن برنامجك غير قادر الآن على قراءة عدد البايتات ، قبل قراءة البيانات بالفعل.أقترح عليك إصلاح السجل الخاص بك بحيث تكون السلسلة بحجم ثابت ، مثل: Genacodicetagpre

بعد ذلك ، ستكون قادرًا على الكتابة والقراءة بشكل جيد في دلفي 3 و 2010.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top