Delphi: StringList Delimiter هو دائما شخصية فضائية حتى إذا تم تعيين محدد

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

سؤال

أواجه مشكلة مع محدد في فئة Tstringlist. إلق نظرة:

var
  s: string;
  sl: TStringList;

begin
  sl := TStringList.Create;
  s := 'Users^foo bar^bar foo^foobar^barfoo';
  sl.Delimiter := '^';
  sl.DelimitedText := s;
  ShowMessage(sl[1]);
end;

sl[1] يجب العودة 'foo bar'

sl[1] هل العودة 'foo'

يبدو أن الحلمين هو الآن '^' و ' '

أيه أفكار؟

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

المحلول

يجب عليك ضبط s1.StrictDelimiter := True للحصول على مسافات لا ينبغي اعتبارها المحددات، مزيد من المعلومات هنا.

نظرا لأنك تعمل في إصدار لا يدعم ما سبق (كما هو موضح بعد إرسال الإجابة)، يكون لديك خياران:

  1. ابحث عن حرف تعرفه لن يتم استخدامه في النص الأصلي (على سبيل المثال Underscore)، وتحويل جميع المسافات إلى تلك الشخصية قبل الانقسام، وتحويل مرة أخرى بعد الانقسام. هذا هو روبوسوفاقتراح.
  2. إذا لم تقم بتعقل الفواصل ومسافات في النص، فيمكنك استخدامها الإسكندرخدعة وفلف النص بين المحددين في الأمر المقلوب، بحيث 'hello hello^bye bye' يتحول الى '"hello hello"^"bye bye"'. وبعد إذا اخترت هذا المسار ويعمل من أجلك، فيرجى قبول إجابة الإسكندر وليس لي، كما أنه يوفر التعليمات البرمجية لتنفيذها.

كلا الحلول لا تستخدم StrictDelimiter لديك قيود: الأول يتطلب بعض الأحرف غير المستخدمة، والثاني لا يتطلب أي فواصل مقلوبة ومسافات في النص الأصلي.

ربما حان الوقت للترقية إلى إصدار أحدث من دلفي :)

نصائح أخرى

sl.DelimitedText := '"' + StringReplace(S, sl.Delimiter, '"' + sl.Delimiter + '"', [rfReplaceAll]) + '"';

قام Ryan بمزود حل ممتاز لهذه المشكلة باستخدام الدالة المستخرجات () في Delphi. يرى:

يبدو أن تحليل سلسلة باستخدام محدد إلى قائمة Tstringlist، يبدو أيضا تحليلا على المسافات (Delphi)

لذلك في حالتك، استبدل المكالمات إلى SL.Delimiter و SL.DelimitedText مع الخط أدناه:استخراج (['^']، []، pchar (s)، sl)؛

sl.Text := StringReplace(S, sl.Delimiter, sLineBreak, [rfReplaceAll]);

العمل في دلفي 7 "مثل القفازات" بالنسبة لي. هذه هي وظيفتي بعد تطبيق خدعة الكسندر:

procedure Split (const Delimiter: Char; Input: string; const Strings: TStrings) ;
begin
   Assert(Assigned(Strings)) ;
   Strings.Clear;
   Strings.Delimiter := Delimiter;
   Strings.DelimitedText :=  '"' + StringReplace(Input, Delimiter, '"' + Delimiter + '"', [rfReplaceAll]) + '"' ;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := 'Users^foo bar^bar foo^foobar^barfoo';
  Split('^',Edit1.Text,Memo1.Lines);
end;

شكرًا جزيلاً!

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