Сбой opendialog.onhint - PullRequest
       36

Сбой opendialog.onhint

2 голосов
/ 24 января 2009

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

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

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

как спрашивал код, который совсем не помогает

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

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

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

Ответы [ 6 ]

3 голосов
/ 25 января 2009

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

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

3 голосов
/ 24 января 2009

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

если да:

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

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

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

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

2 голосов
/ 26 февраля 2009

Решением для этого было использование activeX, похоже, после SP2

произошла ошибка

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

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

финализации OleUninitialize конец.

Оригинал, опубликованный лисой здесь

1 голос
/ 25 января 2009

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

Код, который, как я предполагаю, является методом 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;
1 голос
/ 25 января 2009

Две вещи:

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

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

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

Удачи!

0 голосов
/ 25 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...