У меня есть приложение, разработанное в 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
.
В опубликованном здесь коде нет ничего, что могло бы вызвать эту проблему, а это значит, что проблема не в этом коде. Как выглядят SaveMRUItems
и ProcessOpenCommand
? (Я использую TOpenDialog
в нескольких приложениях D2007 на компьютерах с Windows 7 и Windows 10 без проблем.)
@RemyLebeau: В вопросе написано следующий код. Это не говорит о звонке Execute
.
@KenWhite нет, код нет, но заглавие этого вопроса делает. Но тогда в названии также написано OpenPictureDialog
, но вместо этого в коде написано TOpenDialog
.
Поскольку это проблема только для одного пользователя, я подозреваю, что проблема связана с их ПК, возможно, из-за нестабильного плагина Explorer. Попробуйте создать минимальное примерное приложение с открытым диалоговым окном, а также предварительно настроив исходную папку для чего-то кроме значения по умолчанию. Но комментарий Реми может быть значительным
диалог никогда не отображается, поэтому я предполагаю, что он находится в вызове execute. Невозможно воспроизвести проблему здесь и в Windows 10. Доступны записываемые константы. Я сомневаюсь, что вызовы других функций имеют к этому какое-либо отношение, но SaveMRUItems просто сохраняет в список строк, а команда processopen только открывает файл и загружает его в TImageEnMView. Та же проблема существует в другой части приложения, где Savedialog.execute вызывает внезапное завершение работы. Этих проблем не возникало у других пользователей, только у этого конкретного.
Сделайте минималистичное приложение, чтобы сузить круг вопросов. Но да, расширение оболочки - вероятное подозрение
Я также согласен с другими в сильной вероятности того, что у затронутого пользователя, вероятно, есть какое-то расширение проводника, которое вызывает проблемы. Я уже слышал о подобных проблемах, но должен признать, что сам не сталкивался ни с одной из них.
Проблема, безусловно, заключается в расширении проводника Windows. Я дал заказчику модифицированную сборку, в которой для параметра uselatestcommondialogs было установлено значение false, и она могла без проблем видеть диалог в старом стиле. Кроме того, я предоставил ей измененную версию с использованием API GetOpenFileName напрямую, чтобы я мог получить код возврата для дальнейшей проверки, однако она не сделала этого, как обещала, поэтому я не могу анализировать проблему дальше.
LastFilterIndex
объявлен как локальныйconst
, но вы пытаетесь повторно присвоить ему значение во время выполнения, которое сохраняется между несколькими вызовамиdxOpenClick()
. Это не будет работать, если Записываемые константы не включен (что не очень хорошо, поэтому по умолчанию он выключен). Вместо этогоLastFilterIndex
следует превратить в член классаTFmSF5Main
.