مشكلة إضافة الكثير من السلاسل إلى tstringlist

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

  •  19-09-2019
  •  | 
  •  

سؤال

لدي مشكلة في إضافة سلاسل إلى Tstringlist. لقد بحثت منشورات أخرى ولكنها لم تتمكن من العثور على إجابة على هذا.

ما أحاول القيام به هو إضافة كمية كبيرة من السلاسل إلى Tstringlist (أكثر من 14000) ولكن في مكان ما في العملية أحصل على EACCESSVIOL. إليك الرمز الذي أستخدمه:

procedure TForm1.FormCreate(Sender: TObject);
begin
    List := TStringList.Create;
    List.Duplicates := dupAccept;
end;

procedure TForm1.ButtonStartClick(Sender: TObject);
begin
    List.Clear;
    List.Add('125-AMPLE');
    List.Add('TCUMSON');
    List.Add('ATLV 4300');
    List.Add('150T-15');
    List.Add('TDL-08ZE');
    List.Add('RT20L');
    List.Add('SIN LINEA');
    List.Add('TIARA');
    List.Add('FL200ZK1');
    List.Add('FL250ZK1');
    List.Add('SIN LINEA');
    List.Add('CENTAURO-70 S.P.');
    List.Add('CORSADO');

{ This list continues to about 14000 strings...}

    List.Add('VOSJOD 2');
    List.Add('Z 125');
    List.Add('ZUMY');
    List.Add('NEW AGE 125');
    List.Add('SIN LINEA');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    FreeAndNil(List);
end;

ما الخطأ في هذا الرمز؟ تحتوي القائمة على سلاسل مكررة لذلك قمت بتعيين Duplicates الممتلكات إلى dupAccept. وبعد كنت قادرا على تحميل القائمة باستخدام LoadFromFile, ، لكنني لا أريد الحصول على ملف نصي خارج التطبيق الخاص بي.

آمل أن تتمكن من مساعدتي!!! من فضلك قل لي إذا كنت بحاجة إلى أي معلومات إضافية.

شكرا جزيلا. انا فعلا اقدر مساعدتك.

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

المحلول

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

ضع كل السلاسل في ملف نصي يسمى StringData.txt (أو أي اسم تختاره). ثم قم بإنشاء ملف .rc لأي اسم تختاره ووضع ما يلي فيه (String_Data يمكن أن يكون أي معرف تختاره):

STRING_DATA RCDATA "stringdata.txt"

إنشاء ملف .res من .rc:

BRCC32 <name of rc>.rc

الآن مرجع هذا الملف من التعليمات البرمجية المصدر. ضع في مكان ما التالي في الوحدة:

{$R <name of res>.res}

بدلا من التحميل من دفق ملف، تحميل من دفق الموارد:

StringData := TResourceStream.Create(HInstance, 'STRING_DATA', RT_RCDATA);
try
  List.LoadFromStream(StringData);
finally
  StringData.Free;
end;

إذا قمت بإناقات سطر الأوامر الآلية، أقترح عليك الاحتفاظ بملف .rc ضمن التحكم المصدر وبناء .RES أثناء عملية البناء. بهذه الطريقة يمكنك أيضا الاحتفاظ بملف Stata.txt ضمن عنصر تحكم المصدر وأي تعديلات تلقائيا في الإنشاء التالي دون الحاجة إلى إنشاء ملف .res بشكل صريح في كل مرة تتغير ملف .txt.

نصائح أخرى

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

حاول إضافة fastmm4. إلى مشروعك لاستبدال مدير الذاكرة القديم ومعرفة ما إذا كان ذلك يساعد.

أيضا، ربما تكون أفضل حالا في الحفاظ على القائمة في ملف خارجي. نعم، إنه ملف آخر، ولكنه يعني أيضا أنه يمكنك تغيير القائمة دون الحاجة إلى إعادة ترجمة البرنامج بأكمله. هذا يجعل أيضا إنشاء (والتوزيع!) تحديثات أسهل.

ربما يكون ميسون على حق سبب AV؛ هذه هي صفيف كبير جدا لتنمو.
في ملاحظة جانبية، عند القيام بمثل هذه المعالجة الطويلة في قائمة Stringlist، يوصى بإحياء الأمر ببدء التشغيل / indupdate لتجنب إطلاق أي حدث تحديث.
حتى لو لم يكن لديك أي الآن، فقد تتم إضافته لاحقا وستحصل على مشاكل.

قم بتعيين list.capity إلى عدد العناصر التي تخطط لإضافتها، مباشرة بعد إنشاء القائمة. بدلا من ذلك، ضع القائمة في ملف RC (اسمه آخر غير اسم مشروعك) وإضافته إلى مشروعك. يتم تجميع هذا في التطبيق الخاص بك، ولكن لا ينطوي على التعليمات البرمجية القابلة للتنفيذ لإنشاء القائمة.

كما أنقل أيضا بشأن سلامة مترجم مع إجراء 14000 خط. وجد الناس حالات أخرى حيث يتجاوز أي شيء ينقسم معقولة المترجم بطرق مختلفة.

قد ترغب أيضا في تجربة ThashedStringlist، قد ترى زيادة السرعة (على الرغم من أنها ليست في هذه الوظيفة)، على الرغم من أنني لست متأكدا مما إذا كانت طريقة الإضافة مختلفة تماما.

حاول استخدام ما يلي بدلا من التعليمات البرمجية لإضافة السلاسل إلى StringList

فار
شارع: سلسلة؛
يبدأ
STR: = "125-Warple '+ # 13 # 10؛
STR: = Str + 'Tcumson' + # 13 # 10؛
STR: = Str + 'ATLV 4300' + # 13 # 10؛
STR: = Str + '150T-15' + # 13 # 13؛
................

list.text: = str؛

نهاية؛

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