Вопрос

Я проверил 100%. Я закрываю все дескрипторы недавно созданного файла.Но когда я называю "opendialog.execute;" Диалог всплывает как обычно, но на мышью из -за намека на недавно созданный файл все это сбои с ошибкой выйти из -за границ.

Я знаю, что это не выходит за рамки моих возможностей, так как если бы я открыл файл, не вызывая события (подсказки), проблем не было бы, а жесткое кодирование списка имен файлов для тестирования показало, что в открытии или сохранении файла нет ничего плохого.Это чисто из-за подсказки открытого диалога.Как я уже сказал, если я быстр или использую клавиши со стрелками, с моей программой все в порядке.

Что еще интереснее, это происходит даже не в 100% случаев (около 70%), что заставило меня думать, что я исправлял это несколько раз, если не только на короткий промежуток времени.Кто-нибудь знает, что может произойти?И если нет, то как я могу отключить событие onhint?

как и просил код, это вообще не помогает

OpenDialog.execute;    // crashes here
if fileexists(form1.OpenDialog.FileName) then    
  form1.Address.Text:=form1.OpenDialog.FileName;

и ошибкатекст ссылки

РЕДАКТИРОВАТЬ:ОК, у меня есть новая информация, новый экземпляр opendialog все еще имеет те же проблемы.и что еще более интересно, я, кажется, решил проблему 30% при подсказке файла с двойным тегом, например, "test.jpg.enc", с ним все в порядке при первом запуске, и он вылетает только при подсказке из этих закодированных файлов, но только если я закодировал этот файл в белый цвет, приложение откроется.например, если я его закодирую, то попытаюсь декодировать, и он вылетит..я могу запустить его снова и нормально декодировать, но нет проблем с декодированием, а затем кодированием в одном экземпляре приложения.

Это было полезно?

Решение 3

Решением этой проблемы было использование ActiveX, похоже, после SP2 возникла ошибка.

использует ActiveX;

инициализация олеинициализации (ноль);

Завершение олеунициализации конец.

изначально опубликовано лисой здесь

Другие советы

Вы уверены, что экземпляр form1 создан?

если да:

Почему вы не используете это так?

OpenDialog.Options:=  OpenDialog.Options + [ofFileMustExist];

if OpenDialog.Execute then
  Address.Text:= OpenDialog.FileName

И используйте FastMM4, и определите FullDebugMode в FastMM4.inc. Это может помочь вам найти настоящую проблему

Во-первых, почти никогда не нужно ссылаться на " form1.xxx " в вашем коде, / особенно / если вы пишете код в методе Form1. Я бы удалил эти ссылки.

Затем я бы создал максимально простое приложение - форму, TOpenDialog и кнопку, и попытался бы написать как можно меньше кода, чтобы открыть рассматриваемый файл. Если это работает, попытайтесь выяснить, в чем разница между вашим простым приложением и вашим настоящим приложением. Если это не помогло, отредактируйте свой вопрос выше с помощью / all / кода для простой программы, которая не работает.

Две вещи:

Скомпилируйте ваше приложение с помощью Debug DCU ( Project / Options / Use Debug DCU - затем выполните полную сборку ) и затем посмотрите, где происходит исключение. Это даст вам больше информации, когда и в коде vcl / rtl происходит исключение. Отправьте нам полное сообщение об ошибке и где в каком блоке он вышел из строя.

Во-вторых, и, возможно, , что еще более важно , это поведение файла вне вашего приложения. Вы предлагаете, что это происходит примерно 30% времени, поэтому каждый раз после сохранения файла переходите к нему в обычном окне проводника и наведите на него курсор мыши и посмотрите, хорошо ли отображается подсказка. Затем откройте его в блокноте. Если оба из них работают, и тогда это терпит неудачу в вашем приложении, это было бы интересно.

Кроме того, когда вы отправляете следующий вопрос на предыдущий вопрос полезно, если вы перейдете по ссылке на предыдущий вопрос, чтобы мы могли увидеть, что вы пробовали ранее.

Удачи!

Сообщение об ошибке - не выход за пределы, а нарушение доступа. Это означает, что вы обращаетесь к памяти, к которой у вас нет доступа. В основном это происходит, когда переменная класса (которая является указателем на класс) не инициализирована или уже освобождена.

Код, который, как я предполагаю, является методом form1, может использовать некоторые изменения (которые уже упоминались):

OpenDialog.execute;    // crashes here
if fileexists(OpenDialog.FileName) then    
  Address.Text := OpenDialog.FileName;

Но что такое OpenDialog, это компонент, перетаскиваемый в form1? В этом случае form1, вероятно, не инициализируется. Но, скорее всего, OpenDialog является локальной переменной. В этом случае вы можете инициализировать его:

OpenDialog := TOpenDialog.Create;
try
  OpenDialog.execute;   
  if fileexists(OpenDialog.FileName) then    
    Address.Text := OpenDialog.FileName;
finally
  OpenDialog.Free;
end;

Ваш комментарий к ответу Ника Ходжеса указывает на то, что вы вызываете OpenDialog для Form1 из-за пределов Form1. Это похоже на плохую идею. Вместо этого может быть вызван открытый метод Form1, и этот метод может манипулировать компонентами Form1. Я не проверял ваш сценарий, но кажется, что это может вызвать ваши проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top