• 0
Shippo

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

Вопросы

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

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

у меня Delphi 10.2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 ответов на этот вопрос

  • 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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Все отписываться и говорят что не воспроизводится. Значит что то упускаем, значит что то нестандартно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

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

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

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

Изменено пользователем Shippo

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Воспроизведите это! Выложите сюда проект. Быстрее помогут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

значит, вычищайте все из USES всего проекта, что начинается на VCL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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