سؤال

لدي نموذج يحتوي TOpenDialog العنصر (OpenDialog1) و زر.OpenDialog1 لديه ofAllowMultiSelect (من Options) تعيين إلى true.

عند النقر فوق الزر طريقة AddFilesToListView يتم تنفيذها:

procedure TForm4.AddFilesToListView();
var
  ListItem : TListItem;
  I: Integer;
  F : File;
  LengthOfAudio : TDateTime;
  previousCursor : TCursor;

begin
  previousCursor := Self.Cursor;
  Self.Cursor := crHourGlass;

  if OpenDialog1.Execute then
  begin
    for I := 0 to OpenDialog1.Files.Count - 1 do begin
      if FileExists(OpenDialog1.FileName) then begin
        ListItem:=ListView1.Items.Add;
        ListItem.Caption := 'Test';
        ListItem.SubItems.Add(ExtractFileName(OpenDialog1.Files[I]));
        ListItem.SubItems.Add(ExtractFilePath(OpenDialog1.Files[I]));
      end else
        raise Exception.Create('File does not exist.');
    end;
  end;

  Self.Cursor := previousCursor;

  OpenDialog1.Files.Free;
end;

عند تشغيل التطبيق واختيار الملف الأول, ليس لدي أي مشكلة ولكن عند الرغبة في اختيار الثاني ، أحصل على رسالة خطأ تقول "المشروع project3 أثار استثناء فئة EInvalidPointer مع رسالة غير صالحة مؤشر العملية'."

ما هو سبب هذا, كيف يمكنني تصحيح هذا ؟

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

المحلول

"مؤشر غير صالح العملية" يعني أنك تحررت الذاكرة التي لا تنتمي لك.واحد من هذه الأمور الثلاثة هو السبب:

  • البرنامج حررت شيء سبق أن حررت مرة واحدة من قبل.
  • برنامج تحرير شيئا لم يكن المخصصة في المقام الأول.
  • برنامج تحرير شيئا تم تخصيص مع إدارة الذاكرة.

في التعليمات البرمجية الخاصة بك ، أنت تحرير TOpenDialog's Files مكان الإقامة.لم تخصص هذه السلسلة قائمة الوثائق لا اقول لكم مجانا ، لذلك فمن المعقول أن نتوقع أن قائمة في الواقع ينتمي إلى الحوار عنصر ، أن عنصر الإرادة الحرة عندما يريد.التحقق من التعليمات البرمجية المصدر في الحوارات.با يؤكد ذلك.منذ لديك أيضا تحرير هذا الكائن لديك مزدوجة خالية من الخطأ ، والتي تلبي المعيار الأول أنا المذكورة أعلاه.إزالة هذا الخط.

كما أوفه أشار, أنت أيضا تجهيز قائمة من أسماء الملفات ولكن فقط التحقق من وجود واحد.هذا المنطق خطأ في البرنامج ، ولكن ذلك لن يسبب استثناء ترونه.

نصائح أخرى

ويجب أن تحقق ل

if FileExists(OpenDialog1.Files[I]) then begin

وبدلا من

if FileExists(OpenDialog1.FileName) then begin

واستثمار أفضل في متغير محلي عقد تلك القيمة.

ولماذا هذا؟

OpenDialog1.Files.Free;

والمملوكة الملفات من قبل لTOpenDialog، ويجب أن لا يتم تحرير مباشرة.

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