Страница 1 из 2

RxMDI

СообщениеДобавлено: 28.05.2013 12:18:57
ssadragon
Можно ли как-то сделать чтобы отрабатывалось событие FormShow при показе уже созданной формы, например при нажатии на кнопку на TRxMDITasks

Re: RxMDI

СообщениеДобавлено: 28.05.2013 12:46:06
Лекс Айрин
А зачем? OnPaint не прокатит?

Re: RxMDI

СообщениеДобавлено: 28.05.2013 12:58:55
ssadragon
Лекс Айрин писал(а):А зачем?

чтоб обновить например грид на форме или есче какие операции при показе формы
Лекс Айрин писал(а):OnPaint не прокатит?

он вызывается постоянно, а мне надо только один раз когда форма появилась
и убивать форму не надо

Re: RxMDI

СообщениеДобавлено: 28.05.2013 13:52:19
Лекс Айрин
ssadragon, а что мешает добавить грид и обновить форму, вызвав событие OnPaint?

вообще, насколько я помню, нужное тобой событие вызывается функцией {имя формы}.Show но у меня показ формы не очищает даже Memo.

Re: RxMDI

СообщениеДобавлено: 28.05.2013 14:05:22
ssadragon
Лекс Айрин писал(а):вызывается функцией {имя формы}.Show

да это так, но видимо RxMDI этого не делается. И FormHide тоже не вызывается, хотя не помешало бы.
Лекс Айрин писал(а):но у меня показ формы не очищает даже Memo

дк он сам не очистится, вот для таких действий я и использую FormShow.

Добавлено спустя 12 минут 12 секунд:
Решил сию проблему вот так:
Код: Выделить всё
Index: rxmdi.pas
===================================================================
--- rxmdi.pas   (revision 2739)
+++ rxmdi.pas   (working copy)
@@ -217,25 +217,30 @@
//  FLabelPosition := lpAbove;
   FLabelSpacing := 3;
   CreateInternalLabel;
-  Glyph:=LoadLazResBitmapImage('RxMDICloseIcon');
+  //Glyph:=LoadLazResBitmapImage('RxMDICloseIcon');  // Какая-то утечка происходит и из-за этого закомментарил
end;

{ TRxMDIPanel }

procedure TRxMDIPanel.SetCurrentChildWindow(AValue: TForm);
begin
+  If Assigned(FCurrentChildWindow) then
+    FCurrentChildWindow.Hide;                                    // Hide предыдущей активной формы, после вызывается FormHide
   FCurrentChildWindow:=AValue;
+  If Assigned(FCurrentChildWindow) then
+    FCurrentChildWindow.Show;                                  // Show текущей активной формы, после вызывается FormShow
   if Assigned(FCloseButton) then
   begin                 
     FCloseButton.Enabled:=Assigned(FCurrentChildWindow);
-    if FCloseButton.Enabled then
+    if (FCloseButton.Enabled) and (FCloseButton.Visible) then
       FCloseButton.FInfoLabel.Caption:=FCurrentChildWindow.Caption
     else
       FCloseButton.FInfoLabel.Caption:='';
   end;

   if Assigned(TaskPanel) then
-    TaskPanel.Visible:=Assigned(FCurrentChildWindow);
+    //TaskPanel.Visible:=Assigned(FCurrentChildWindow);  // Ну а это мне не нужно так как я не хочу показывать RxMDITasks
end;

procedure TRxMDIPanel.navCloseButtonClick(Sender: TObject);

Вроде работает. Ну может и получше место есть где можно вызывать Show/Hide - это лучше известно разработчику компоненты.
Но не нарыл еще куда лучше будет вставить Hide MDI формы при уничтожении главной(на которой находится RxMDIPanel)

Re: RxMDI

СообщениеДобавлено: 28.05.2013 15:07:28
Лекс Айрин
ssadragon писал(а):дк он сам не очистится,


Я знаю... но мне это и не надо.

Попробуйте все же как я сказал... по крайней мере, такой способ должен требовать меньше времени и ресурсов.

Добавлено спустя 1 час 34 минуты 1 секунду:
нашел таки.. как перерисовывать... viewtopic.php?f=5&t=713

Re: RxMDI

СообщениеДобавлено: 29.05.2013 22:58:07
alexs
В принципе патчик понятен. Только смысл физически прятать/показывать форму? Можно просто дёрнуть обработчики OnShow/OnHide у формы.
Какие ещё пожелания по доработке есть?

Re: RxMDI

СообщениеДобавлено: 30.05.2013 09:49:11
Лекс Айрин
alexs, а как все же идеологически правильно?

Re: RxMDI

СообщениеДобавлено: 30.05.2013 19:54:45
alexs
А вот даже не задумывался.
В настоящем MDI окна не прячутся при переходе из одного окна в другое. И события эти не работают.

Добавлено спустя 29 секунд:
Кстати - можно отдельное событие сделать - переключение активного окна.

Re: RxMDI

СообщениеДобавлено: 07.11.2018 11:34:55
alexs
Доработки - добавил флаги RxMDIPanel.Options;
rxpoCloseF4 - закрывать дочернии окна по Ctrl+F4
rxpoSwithByTab - перключать дочерние окна нажатием на клавиатуре Ctrl+Tab (в обратном порядке - Ctrl+Shift+Tab)

Re: RxMDI

СообщениеДобавлено: 17.01.2019 14:15:38
alexs
Новый функционал - теперь есть возможность включить отображение списка окон в главном меню.
Добавил свойство WindowMenu
Поведение не долдно отличаться от штатного MDI windows
Пока нет ограничения на кол-во отображаемых открытых окно. И нет пункта меню с вызовом окна со списком открытых окон. По мере надобности - планирую реализовать.

Re: RxMDI

СообщениеДобавлено: 11.07.2019 10:30:45
Lucifer
Тоже хочется... Сейчас вот делаю мультиязычную прогу. И при трансляции с использованием штатного функционала SetDefaultLang не переводит уже открытые MDI-окна на лету. В кнопках остается старый язык, который был до смены. Алекс, подскажи, куда копнуть. Переоткрыть окна не предлагать - некоторые должны быть открыты постоянно, увы. Repaint в MDITask не помогает.

Re: RxMDI

СообщениеДобавлено: 11.07.2019 10:38:24
alexs
Готового ответа нет. Надо знать - как модуль трансляции сообщает всем объектам о смене языка? Там какое-то сообщение рассылается? Или ещё как?
Заголовки кнопок берутся из заголовка окна. Надо просто в нужный момент вызвать процедуру обновления заголовка. Ну и ещё - проверить как будут формироваться тексты в всплывающем меню.

Re: RxMDI

СообщениеДобавлено: 11.07.2019 10:58:32
Lucifer
Нет. Там просто создается системный Translator, который берет оригинал и перевод из файла и на лету меняет текст в контролах. Такое впечатление, что он просто не может получить хэндл окон в MDI и поэтому их игнорит напрочь.

Добавлено спустя 53 минуты 31 секунду:
alexs писал(а):Новый функционал - теперь есть возможность включить отображение списка окон в главном меню.
Добавил свойство WindowMenu
Поведение не долдно отличаться от штатного MDI windows

Я так понял, что не реализовано еще? Или где его включить?

Re: RxMDI

СообщениеДобавлено: 11.07.2019 13:53:52
alexs
Да. Готового метода нет. Не могу пока понять - как перехватить событие изменения заголовка окна.
как временное решение - добавил новый метод RxMDITasks.UpdateMDICaptions; - обновить все заголовки кнопок согласно текущим заголовкам.
Будет достаточно его вызвать после смены языка:
Код: Выделить всё
procedure TForm1.MenuItem3Click(Sender: TObject);
begin
  SetDefaultLang('ru', '', '', true);
  RxMDITasks1.UpdateMDICaptions;
end;