У немодального дизайнера те же проблемы
Если в приложении дизайнер отчетов открывается кнопкой на форме, которая открыта модально, то окно инспектора ведет себя так же как если бы дизайнер в коде модуля FRXClass вызывался методом ShowModal:
окно инспектора закрывает окно редактора SQL и т.д.
В частности, это наблюдается если Preview - модальный и пользователь нажимает кнопку "Редактировать отчет".
Хорошо бы решить эту проблему. Может быть не очень трудно сделать как в версии 2.53? FastReport - действительно лучший генератор отчетов для Delphi, но из-за таких недоработок я не могу им пользоваться.
Сергей Ковязин.
окно инспектора закрывает окно редактора SQL и т.д.
В частности, это наблюдается если Preview - модальный и пользователь нажимает кнопку "Редактировать отчет".
Хорошо бы решить эту проблему. Может быть не очень трудно сделать как в версии 2.53? FastReport - действительно лучший генератор отчетов для Delphi, но из-за таких недоработок я не могу им пользоваться.
Сергей Ковязин.
Комментарии
Модальность формы, из которой открывается дизайнер критически важна по логике задачи.
Вот процедура (может кому пригодится):
// Создание формы заданного типа и отображение ее псевдомодально
procedure ShowFormAsPseudoModal(FormClass: TFormClass);
type TFormList = Record
Form:TForm;
DoDisable:boolean;
end;
var i, L:integer; F:TForm; FormList:array of TFormList;
begin
// запоминаем активную форму
F:=Screen.ActiveForm;
// Создаем массив ссылок на открытые формы на экране
// и запоминаем, какие из них сделаны disabled
L:=Screen.FormCount;
SetLength(FormList, L);
for I:= 0 to L-1 do
begin
FormList.Form:=Screen.Forms;
FormList.DoDisable:=(FormList.Form.Visible and FormList.Form.Enabled);
if FormList.DoDisable then FormList.Form.Enabled:=false;
end;
// Создаем новую форму
try
with FormClass.Create(Application) do
begin
try
if FormStyle<>fsNormal then FormStyle:=fsNormal;
if visible then Hide;
Show;
while Visible do Application.HandleMessage;
finally
try
Free;
except
end;
end;
end;
finally
// Делаем Enabled формы сделанные Disabled
for I:= 0 to L-1 do
if ((FormList.Form <> nil) and FormList.DoDisable)
then FormList.Form.Enabled:=true;
if F <> nil then
begin
if not F.Enabled then F.Enabled:=true;
if (F.Visible and not F.Focused) then F.SetFocus;
end;
end;
// освобождаем память
FormList:=nil;
end;