Delphi: StringList Delimiter هو دائما شخصية فضائية حتى إذا تم تعيين محدد
-
20-09-2019 - |
سؤال
أواجه مشكلة مع محدد في فئة 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
للحصول على مسافات لا ينبغي اعتبارها المحددات، مزيد من المعلومات هنا.
نظرا لأنك تعمل في إصدار لا يدعم ما سبق (كما هو موضح بعد إرسال الإجابة)، يكون لديك خياران:
- ابحث عن حرف تعرفه لن يتم استخدامه في النص الأصلي (على سبيل المثال Underscore)، وتحويل جميع المسافات إلى تلك الشخصية قبل الانقسام، وتحويل مرة أخرى بعد الانقسام. هذا هو روبوسوفاقتراح.
- إذا لم تقم بتعقل الفواصل ومسافات في النص، فيمكنك استخدامها الإسكندرخدعة وفلف النص بين المحددين في الأمر المقلوب، بحيث
'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;
شكرًا جزيلاً!