Перейти к содержанию
Fire Monkey от А до Я
  • 0

альтернатива диалогу


Shippo

Вопрос

Здравствуйте

Такой вопрос. Есть FMX приложение. Нужен диалог выбора папки. Используется tFileOpendialog. ( SelectDirectory не подходит - у него слишком устаревший вид ) Но возникла проблема  -в случае полноэкранного приложения если при открытом диалоге  переключиться на другое приложение - и вернуться обратно, то диалог уходит за форму и вытащить обратно его не реально, приложение повисает. (когда я смотрела на полностью VCL приложении - такой ситуации не возникало). Подскажите, может есть какая-то альтернатива, другой компонент? может есть свойства которые позволят окну диалога не уходить за форму?

у меня Delphi 10.2

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Добрый день

Проверил поведение TOpenDialog в своей программе в полноэкранном режиме. При переключении на другие программы и обратно окно диалога никуда не исчезает. Сложно сказать, чем вызвано подобное поведение диалога в вашем случае. Возможно стоит проверить код в обработчиках событий формы.

Также, рекомендую поиграться со свойствами формы BorderStyle, FullScreen, WindowState. В частности, попробуйте BorderStyle = None; FullScreen = true; WindowState = wsMaximized.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

TOPenDialog не дает выбрать именно папку, надо обязательно файл указывать, поэтому используется TFileOpenDialog. Но поскольку он VCL его не кинешь на форму -  мне дельфи в палитре компонентов не дает закладки с ними, поэтому он вызывается динамически. Как я писала - SelectDirectiry нам не подходит из за своего дизайна - очень неудобно. 

Ссылка на комментарий
  • 0

Возможно, проблема в том что в VCL и FMX по-разному реализована работа с окнами. Пока в голову приходят два варианта и оба касаются исходного кода компонентов TFileOpenDialog либо TOpenDialog:

1. В исходниках кода TFileOpenDialog переделать работу с контекстом родительского окна  под FMX. Вместо Handle окна использовать WindowHandleToPlatform(Handle).Wnd

2. В исходниках TOpenDialog разрешить нажатие на 'ОК' без выбора файла.

Для этого скопируйте в папку проекта модули, в которых реализован функционал TFileOpenDialog или TOpenDialog и поэкспериментируйте с ними.

 

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Это уже звучало на другом форуме, но что-то автор темнит

Я воспроизвел главную форму, модуль данных, из модуля данных(!) открываю OpenDialog

И все равно не проявляется эффект

 

Ссылка на комментарий
  • 0

значит я к сожалению не могу никак описать точно проект.  я не хотела лить много воды.

попробую написать простыню. может я что-то упускаю. проект был сделан на дельфи хе7 с фаер манки и лив билдинг.  Потом его перетащили на дельфи 10.2.  На главной форме есть пара диалогов на открытие и сохранение файла - они лежат как компоненты на форме и с ними проблемы нет. Но одна из функций сохранения файла вызывается из стороннего юнита ( без формы, не датамодуль), и поскольку нужна папка там использовалась функция SelectDirectory. После того как мы перетащили проект на 10-ю версию этот диалог стал уходить за форму если открыть поверх другое приложение. ( если форма не на все окно и диалог торчит из под нее - то он спокойно вытаскивается.  а вот если он полностью за формой то все. при аль табе - его в списке окошек нет, а главная форма остается сверху.) К тому же вид диалога многих не устраивал - он не удобный. Решили заменить. Из всего что есть с выбором папки - взяли  tFileOpendialog. ( аналога на фаер манки как я понимаю нет. или я не нашла) Поскольку юнит без формы - то диалог создается  динамически.  Вид диалога всех устроил, но проблема того что диалог уходит за форму и его сложно выцепить остался. Первоначально в tFileOpendialog.create стоял nil. Мы решили что это из за того что owner = nil немного переработали вызов, чтобы он шел с главной формы. Поскольку проект FMX, физически компонент на форму я кинуть не могу - виста компонентов нет на панели  компонентов. так что диалог  все еще создается динамически, но owner = mainform. к сожалению это ничего не решило. Я пробовала переходить по f7 и в процедуре диалог.execute  проверяется параметр, который передается None (я не помню точно - что-то типа modalpopup..) в результате чего окну диалога присваивается не хэндл главной формы с которой он вызывается а хэндл приложения.  У меня ощущение что главная закавыка что диалог вызывается динамически, а не лежит компонентом на форме. 

возможно стоит попробовать с дата модулем.

Изменено пользователем Shippo
Ссылка на комментарий
  • 0
В 23.10.2018 в 14:28, Shippo сказал:

TOPenDialog не дает выбрать именно папку, надо обязательно файл указывать, поэтому используется TFileOpenDialog. Но поскольку он VCL его не кинешь на форму -  мне дельфи в палитре компонентов не дает закладки с ними, поэтому он вызывается динамически. Как я писала - SelectDirectiry нам не подходит из за своего дизайна - очень неудобно. 

Не совсем понятно насчет неудобного дизайна SelectDirectory (В первом сообщении темы вы пишете, что у него слишком устаревший вид)
Вот выбор файла через TOpenDialog

1.PNG.64be637fa1789fa3cefa02957b2c8d1e.PNG

А вот выбор папки через SelectDirectory:
2.PNG.04480918e1718e76355aba1f8d7d2c62.PNG

По-моему дизайн у них один и тот же. 

UPD. Может быть, вы используете Vcl.FileCtrl.SelectDirectory, а не FMX.Dialogs.SelectDirectory?

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

вот код главной формы

unit UMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Edit, FMX.ListView.Types,
  FMX.ListView.Appearances, FMX.ListView.Adapters.Base, FMX.ListView,
  FMX.ScrollBox, FMX.Memo, FMX.ListBox, FMX.Layouts, FMX.ExtCtrls, FMX.Objects,
  FMX.EditBox, FMX.SpinBox;

type

  TfMain = class(TForm)
    b1: TButton;
    procedure bExitClick(Sender: TObject);
    procedure b1Click(Sender: TObject);
  private
  public
  end;

var
  fMain: TfMain;

implementation
uses unit3;

{$R *.fmx}
procedure TfMain.b1Click(Sender: TObject);
begin
  rundialog(Self);
end;

procedure TfMain.bExitClick(Sender: TObject);
begin
  close;
end;

end.

вот код unit3

unit Unit3;

interface
uses System.Classes, FMX.Dialogs;

procedure RunDialog(AOwner:TComponent);

implementation

procedure RunDialog(AOwner:TComponent);
var
  OpenDlg:TOpenDialog;
begin
  OpenDlg := TOpenDialog.Create(AOwner);
  try
    OpenDlg.Execute;
  finally
    OpenDlg.Free;
  end;
end;

end.

и ничего.

все работает штатно. форма не прячется

 

ЧЯДНТ?

Ссылка на комментарий
  • 0

Если не ошибаюсь, автор писала, что OpenDialog работает нормально, но ей нужен диалог выбора папки, а не файла. SelectDirectory не устраивает по интерфейсу, поэтому пришлось использовать TFileOpenDialog из VCL, с которым и проблемы.
Но у меня есть подозрения, что при использовании TFileOpenDialog из VCL, SelectDirectory берется из модуля VCL.FileCtrl, а не FMX.Dialogs, из-за чего у него "устаревший" интерфейс.

Для автора: попробуйте такой код, посмотрите, изменится ли внешний вид диалога

procedure TForm1.Button1Click(Sender: TObject);
var st: string;
begin
    FMX.Dialogs.SelectDirectory('Открыть папку','C:\',st);
end;

 

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 1

ну наверное не стоит ожидать чтобы два разных фреймворка в одной программе хорошо сосуществовали

проверил. чудесно работает, нативно выглядит

FMX.Dialogs.SelectDirectory('Открыть папку','C:\',st);
Изменено пользователем krapotkin
Ссылка на комментарий
  • 1

да, указание полного пути к функции помогло!   Совсем другой вид у диалога. И остается в фокусе при переходе между приложениями.

Большое спасибо. 

(в списке юнитов присутствовал и FMX.Dialogs и  Vcl.Dialogs. видимо VCL перебивал FMX, я к сожалению этого не заметила)

Изменено пользователем Shippo
Ссылка на комментарий

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...