Delphi 2007 OpenPictureDialog.Execute вызывает внезапное завершение программы

У меня есть приложение, разработанное в Delphi 2007. Эта программа очень старая, у нее несколько тысяч пользователей. Один клиент, и только один, которого я могу определить, испытывает внезапное завершение программы, когда следующий код выполняется в Windows 10.

procedure TFmSF5Main.dxOpenClick(Sender: TObject);
const
  LastFilterIndex : integer = 1;
var
  Dlg : TOpenDialog;
  MyVar : integer;
begin
  Dlg := TOpenDialog.Create(nil);
  try
    Dlg.Filter := 'Tiff Files (*.tif,*.tiff) | *.tiff;*.tif|'+
                  'Jpeg Files (*.jpg,*.jpeg) | *.jpg;*.jpeg|'+
                  'Bmp Files (*.bmp) | *.bmp|'+
                  'PDF Files (*.pdf) | *.pdf|'+
                  'PNG Files (*.png) | *.png|'+
                  'DICOM Files (*.dicom,*.dcm) | *.dicom;*.dcm|'+
                  'Text Files (*.txt) | *.txt|'+
                  'APF Files (*.apf) | *.apf|'+
                  'Open Office Text (*.odt) | *.odt|' +
                  'Open Office SpreadSheet (*.ods) | *.ods|' +
                  'All Files (*.*) | *.*';
    Dlg.FilterIndex := LastFilterIndex;
    if Dlg.Execute(self.handle) then
    begin
      OtherMRU.AddItem(Dlg.FileName,nil);
      SaveMRUItems(mruOther);
      LastFilterIndex := Dlg.FilterIndex;
      ProcessOpenCommand(Dlg.FileName);
      FBookMarkNode := nil;
      btnBack.enabled := false;
    end;
  finally
    Dlg.Free;
  end;
end;

Есть какие-нибудь подсказки относительно того, что может вызвать это? Никаких претензий от других клиентов. Я не менял переменную Dialogs.UseLatestCommonDialogs, поэтому она имеет значение по умолчанию True.

LastFilterIndex объявлен как локальный const, но вы пытаетесь повторно присвоить ему значение во время выполнения, которое сохраняется между несколькими вызовами dxOpenClick(). Это не будет работать, если Записываемые константы не включен (что не очень хорошо, поэтому по умолчанию он выключен). Вместо этого LastFilterIndex следует превратить в член класса TFmSF5Main.
Remy Lebeau 09.08.2018 01:40

В опубликованном здесь коде нет ничего, что могло бы вызвать эту проблему, а это значит, что проблема не в этом коде. Как выглядят SaveMRUItems и ProcessOpenCommand? (Я использую TOpenDialog в нескольких приложениях D2007 на компьютерах с Windows 7 и Windows 10 без проблем.)

Ken White 09.08.2018 01:42

@RemyLebeau: В вопросе написано следующий код. Это не говорит о звонке Execute.

Ken White 09.08.2018 01:47

@KenWhite нет, код нет, но заглавие этого вопроса делает. Но тогда в названии также написано OpenPictureDialog, но вместо этого в коде написано TOpenDialog.

Remy Lebeau 09.08.2018 01:48

Поскольку это проблема только для одного пользователя, я подозреваю, что проблема связана с их ПК, возможно, из-за нестабильного плагина Explorer. Попробуйте создать минимальное примерное приложение с открытым диалоговым окном, а также предварительно настроив исходную папку для чего-то кроме значения по умолчанию. Но комментарий Реми может быть значительным

Gerry Coll 09.08.2018 01:48

диалог никогда не отображается, поэтому я предполагаю, что он находится в вызове execute. Невозможно воспроизвести проблему здесь и в Windows 10. Доступны записываемые константы. Я сомневаюсь, что вызовы других функций имеют к этому какое-либо отношение, но SaveMRUItems просто сохраняет в список строк, а команда processopen только открывает файл и загружает его в TImageEnMView. Та же проблема существует в другой части приложения, где Savedialog.execute вызывает внезапное завершение работы. Этих проблем не возникало у других пользователей, только у этого конкретного.

John Taylor 09.08.2018 02:56

Сделайте минималистичное приложение, чтобы сузить круг вопросов. Но да, расширение оболочки - вероятное подозрение

David Heffernan 09.08.2018 08:03

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

SilverWarior 09.08.2018 17:05

Проблема, безусловно, заключается в расширении проводника Windows. Я дал заказчику модифицированную сборку, в которой для параметра uselatestcommondialogs было установлено значение false, и она могла без проблем видеть диалог в старом стиле. Кроме того, я предоставил ей измененную версию с использованием API GetOpenFileName напрямую, чтобы я мог получить код возврата для дальнейшей проверки, однако она не сделала этого, как обещала, поэтому я не могу анализировать проблему дальше.

John Taylor 16.08.2018 12:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
134
0

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