غير صالحة مؤشر العملية
-
21-08-2019 - |
سؤال
لدي نموذج يحتوي 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، ويجب أن لا يتم تحرير مباشرة.