دلفي - مشكلة في عدم عرض سلسلة Set وPAnsiChar والسلاسل الأخرى

StackOverflow https://stackoverflow.com/questions/641390

سؤال

كنت أحصل على نصيحة من روب كينيدي وكان أحد اقتراحاته التي أدت إلى زيادة سرعة التطبيق الذي كنت أعمل عليه بشكل كبير هو استخدامه SetString ثم قم بتحميله في مكون VCL الذي يعرضه.

أنا أستخدم Delphi 2009، والآن أصبح PChar هو Unicode،

SetString(OutputString, PChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;

يعمل وقمت بتغييره إلى PChar بنفسي ولكن نظرًا لأن البيانات التي يتم نقلها ليست دائمًا Unicode في الواقع فهي عادةً بيانات ShortString ....إذن على ما أعطاني إياه بالفعل لاستخدامه:

SetString(OutputString, PAnsiChar(Output), OutputLength.Value);
edtString.Text := edtString.Text + OutputString;

لم يظهر أي شيء ولكني قمت بالتحقق من مصحح الأخطاء وكان النص الذي يظهر عادةً بالطريقة التي قمت بها ببناء حرف واحد في كل مرة في الماضي موجودًا في المتغير.

ومن الغريب أن هذه ليست المرة الأولى التي أواجه فيها هذا الليلة.ولأنني كنت أحاول التوصل إلى طريقة أخرى، فقد أخذت جزءًا من نصيحته وبدلاً من البناء في TCaption الخاص بـ VCL، قمت بدمجها في متغير سلسلة ثم قمت بنسخها، ولكن عندما أرسلها لا يتم عرض أي شيء.مرة أخرى في مصحح الأخطاء المتغير الذي تم إنشاء البيانات فيه ...لديه البيانات.

for I := 0 to OutputLength.Value - 1 do
begin
  OutputString := OutputString + Char(OutputData^[I]);
end;
edtString.Text := OutputString;

ما سبق لا يعمل ولكن الطريقة القديمة البطيئة للقيام بذلك عملت بشكل جيد ....

for I := 0 to OutputLength.Value - 1 do
begin
  edtString.Text := edtString.Text + Char(OutputData^[I]);
end;

لقد حاولت جعل المتغير ShortString وString وTCaption ولم يتم عرض أي شيء.ما أجده مثيرًا للاهتمام أيضًا هو أنه أثناء إنشاء بياناتي السداسية من نفس المصفوفة في richedit، يكون الأمر سريعًا جدًا بينما يكون القيام بذلك داخل تحرير البيانات النصية بطيئًا جدًا.ولهذا السبب لم أزعج نفسي بمحاولة تغيير الكود الخاص بـ richedit لأنه يعمل بسرعة فائقة كما هو.

تحرير للإضافة - أعتقد أنني وجدت المشكلة نوعًا ما ولكن ليس لدي حل.إذا قمت بتحرير القيمة في مصحح الأخطاء لإزالة أي شيء لا يمكن عرضه (والذي تم استخدامه بالطريقة القديمة لعدم عرضه ...لا تفشل) ثم يتم عرض ما تبقى لي.لذا، إذا كان الأمر يتعلق فقط بالتخلص من وحدات البايت التي تم تحويلها إلى أحرف غير مرغوب فيها، فكيف يمكنني إصلاح ذلك؟

لدي بشكل أساسي بيانات أولية واردة من جهاز SCSI يتم عرضه بنمط المحرر السداسي.لقد نجح أسلوبي البطيء الأصلي في إضافة حرف واحد في كل مرة في عرض السلاسل وسلاسل Unicode التي لا تحتوي على أحرف خاصة بـ Unicode.لن تعرض الطرق الأسرع حتى لو كانت تعمل السلاسل القصيرة بطريقة ما ولن تعرض الطريقة الأخرى سلاسل Unicode التي لا تستخدم أحرفًا غير 0-255.أنا حقًا أحب زيادة السرعة ويمكنني استخدامها ولكن إذا كان ذلك يعني التضحية بالقدرة على قراءة السلسلة ...ثم ما هي الفائدة في التطبيق؟

تحرير 3 - حسنًا الآن بعد أن اكتشفت أن 0-31 هو حرف التحكم و 32 وما فوق صالح، أعتقد أنني سأحاول تصفية char واستبدال تلك غير الصالحة بـ .وهو شيء كنت أخطط للقيام به لاحقًا لمحاكاة أسلوب المحرر السداسي.

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

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

المحلول

واعتدت PAnsiChar في بلدي على سبيل المثال لسبب ما. بدا الأمر وكأنه يجري قياسه OutputLength في بايت، لا الأحرف، لذلك حرصت على استخدام نوع الذي يقاس دائما في طول بايت. ستلاحظ أيضا أن أظهر لي إعلان OutputString باعتبارها AnsiString.

ومنذ سيطرة تحرير المخزنة يونيكود، على الرغم من أنه سيكون هناك تحويل بين AnsiString وUnicodeString. سوف تأخذ الشفرة الحالية للنظام في الاعتبار، ولكن هذا ربما لا ما تريد. قد ترغب في تعريف متغير باعتباره RawByteString بدلا من ذلك. هذا لن يكون أي صفحة الرموز المرتبطة به، لذلك لن يكون هناك أي تحويلات غير متوقعة.

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

في محررات عرافة، ستلاحظ أنها تظهر دائما القيم الست عشرية بايت. لأنها قد تظهر تلك بايت تفسر على أنها أحرف، ولكن هذا الثانوي، وأنها عادة تظهر فقط بايت التي يمكن أن تمثل الأحرف ASCII. أنها لا تحاول الحصول على يتوهم جدا مع العرض الأساسي. و<م> جيدة المحررين عرافة ستقدم لعرض البيانات تفسير الأحرف واسعة كما أيضا. هذا يساعد في تصحيح الأخطاء لأنه لا يمكن للمستخدم إلقاء نظرة على نفس البيانات بطرق متعددة. ولكنهم فقط <م> جهات النظر البيانات. انهم لا فعلا تغيير محتويات الثنائية من البيانات.

نصائح أخرى

بعض التعليقات:

  1. سؤالك غير واضح للغاية.ماذا بالضبط تريد ان تفعل؟
  2. يبدو سؤالك فظيعًا، يرجى التحقق من النص باستخدام المدقق الإملائي.
  3. السؤال الذي تقصده هو هذا: تقوم دلفي بالوصول إلى البيانات من المصفوفة الديناميكية التي يتم ملؤها من مؤشر غير مكتوب
  4. يرجى تقديم نموذج كامل للكود لوظيفتك كما فعلت في سؤالك السابق، أريد أن أعرف ما إذا كنت قد نفذت اقتراح Rob Kennedy أو الكود الذي قدمته لنفسك في الإجابة التالية (دعونا نأمل ألا :))
  5. بقدر ما أفهم سؤالك:أنت ترسل استعلامًا إلى جهاز SCSI الخاص بك وتحصل على مجموعة من البايتات التي تخزنها في OutputData المتغير.بعد ذلك تريد إظهار بياناتك للمستخدم.إذن سؤالك الحقيقي هو: كيفية إظهار مجموعة من البايتات للمستخدم؟
  6. قم بتسجيل الدخول بنفس المستخدم ولا تقم بإنشاء حساب لكل سؤال جديد.وبهذه الطريقة يمكننا تتبع سجل أسئلتك ومعرفة ما تعنيه بـ "الحصول على المشورة".

بعض الافتراضات والاقتراحات إذا كنت على حق بشأن المعنى الحقيقي لسؤالك:

  1. لن يؤدي عرض بياناتك كسلسلة سداسية عشرية إلى أي مشاكل
  2. عرض بياناتك في حقل مذكرة عادي يعطيك مشاكل، على الرغم من أن سلسلة دلفي يمكن أن تحتوي على أي حرف، بما في ذلك 0 بايت، فإن عرضها سيعطيك مشاكل.على سبيل المثال، سيُظهر TMemo بياناتك حتى أول 0 بايت.ما عليك فعله (وقد أعطيت الإجابة بنفسك) هو استبدال الأحرف غير القابلة للعرض بدمية.بعد ذلك يمكنك إظهار بياناتك في TMemo.في الواقع، كل العارضين السداسيين يفعلون نفس الشيء، حيث سيتم عرض الأحرف التي لا يمكن طباعتها كنقطة.

عند تصفية أحرف غير مواضيعها ... عليك ربما تحتاج إلى أن تقرر ما يجب القيام به مع اثنين منهم مثل رقم 9 (تبويب)، رقم 10 (LF)، رقم 11 (Verticle تبويب)، # 12 (FF-أو صفحة جديدة)، رقم 13 (CR)

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