Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Установка ActivePage у PageControl до перерисовки стирает&#133


Kolan ©   (2007-07-14 19:20:00) 

контролы

Здрвыствуйте,
 Вот в чем проблемма:
Последовательность действий такая:
1. Пользователь жмёт на Tab PageControl'а.
2. Срабатывает OnShow Tab'a
3. В OnShow написано:
PageControl1.ActivePage := TabSheet2;
(TabSheet2 — на этот таб и нажимаю)

И получается что контролы лежашие на TabSheet2 пропадают.

Видимо TabSheet перерисовывается дважды.

Можно ликак-то побкдить, кроме как сделать флаг под названием: «не делай PageControl1.ActivePage := TabSheet2;»?

ЗЫ
 Если не понятно зачем — ActivePage может смениться нетолько при клике на таб, но и в другом месте на связанном с PageControl.


Kolan   (2007-07-15 18:03:00) [1]

> Вы нарушили Model-View-Controller

Нет, тут я неправ, вы просто соединили два View в одно…


Kolan   (2007-07-15 17:39:00) [2]

> а все что ты делаешь можно заменить на

А где изменилась модель?

Вы нарушили Model-View-Controller

View говорит Контроллеру измени модель. Если модель активная(как у меня) она говорит я изменилась.
Вот лог:
14 15:15:28:984 : {Создан отчёт. Отчёт: «MicroTestReport0». | TReportCreatedCommand}.
15 15:15:28:984 : {Состояние менеджера отчётов изменилось. | TReportManagerChangedCommand}.


sniknik   (2007-07-15 17:14:00) [3]

> Непонятно?
как ты делаешь это понятно, еще в [6] догадался что ты сам это событие вызываешь
> и в менеджере вместо установки страницы сам вызываешь событие onShow у этой страницы...
непонятно только почему событие подчиненного, а не контролирующего компонента. и вообще зачем события? многопоточная программа?

а то пока все эти менеджеры/события похоже только для запутывания, а все что ты делаешь можно заменить на

procedure TMainForm.ReportManagerTreeViewChange(Sender: TObject; Node: TTreeNode);
begin
  PageControl1.ActivePageIndex:= integer(Node.Data); {ну или где ты там индекс страници}
  //или PageControl1.ActivePage := TabSheet(Node.Data); если там компонент

  //...
end;
и тоже самое, тут же, для твоего визуального репорта. и все без всяких посреднических событий.
или пусть, сначала активировать одно а из него вызвать другое для синхронизации, но для контролирующего контрола а не подчиненного. т.к. в событии подчиненного ты вызываеш действие которое его же порождает...

вот чего непонятно, зачем такие сложности для такого простого действия?


Kolan   (2007-07-15 11:48:00) [4]

Это визуальный менеждер отчётов
procedure TMainForm.ReportManagerTreeViewChange(Sender: TObject;
 Node: TTreeNode);
begin
 if CanDoOnChange then
   TSystemMediator.GetInstance.SendMessage(
     TSetCurrentReportByReportCommnad.Create(TCustomReport(Node.Data)));
end;


это таб контрол:
procedure TTabsManagerUIColleague.TabShowEvent(Sender: Tobject);
begin
 if MainForm.CanDoOnChange then
 begin
   FShallChangeActivePage := False;
    TSystemMediator.GetInstance.SendMessage(
     TSetCurrentReportByReportCommnad.Create(
       TCustomReport(TTabSheet(Sender).Tag)));

 end;
end;


Вот при ОнШоу отсылается команда. При получении такой команды менеждер установит текущим заданый отчёт и отошлёт сообщение ято он изменился.
Его получат оба его представления(Визуальный Менеджер и таб контрол ) и синхронизируются.

Так вот если из виз. менеждера отчётов послали команду, то ActivePageIndex надоизменить, а если из PageControl'а — то ненадо, так как он сам изменится.

Непонятно?


sniknik   (2007-07-15 11:10:00) [5]

> Использую Model-View. Есть объект «Менеджер отчётов» у него есть тек. отчёт.
> ...
все одно непонятно как у тебя событие следствие (TabSheet2Show), возникает раньше чем причина (смена страниц), или вернее, без причины  т.к. зачем то нужно явно в событии еще устанавливать.

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


Sdubaruhnul   (2007-07-15 11:03:00) [6]

> А что использование одного флага — это героизм?

А если так?

if PageControl1.TabIndex <> TabSheet2.TabIndex then
  PageControl1.ActivePage := TabSheet2;


Kolan   (2007-07-15 10:58:00) [7]

> героически

А что использование одного флага — это героизм?


Kolan   (2007-07-15 10:49:00) [8]


> Кликнув в менеджере отчетов пользователь посылает сообщение
> «Изменить текущий отчет».

То есть это так:
1.Кликнув в визуальном отображении менеджера отчетов, пользователь посылает сообщение «Изменить текущий отчет».


Kolan   (2007-07-15 10:48:00) [9]

> вот это интересно. как же ты так меняешь из этого менеджера
> страницы в PageControl что он не знает на какую… (???)
> так чтобы в событии которое возникает при установке страници
> в активные еще приходится самого себя в активные прописывать…
> чушь какаято.

Использую Model-View. Есть объект «Менеджер отчётов» у него есть тек. отчёт.

1.Кликнув в менеджере отчетов пользователь посылает сообщение «Изменить текущий отчет».
2.Менеджер получив сообщение меняет тек. отчёт и посылает сообщение «Я изменился».
3.Получив сообщение «Я изменился» и визуыальный менеждер отчётов и PageControl синхронизируются.


> т.е. сначала создаем себе трудности, а после героически
> их преодолеваем.


Как правильно объясните подробнее…


sniknik   (2007-07-15 10:43:00) [10]

> Пользователь может изменить текущий проект как по клику в менеджере
вот это интересно. как же ты так меняешь из этого менеджера страницы в PageControl что он не знает на какую... (???) так чтобы в событии которое возникает при установке страници в активные еще приходится самого себя в активные прописывать... чушь какаято.

думаю ты просто сделал все на "универсальном интерфейсе те через задницу", и в менеджере вместо установки страницы сам вызываешь событие onShow у этой страницы...

> Лана, решил проблему добавлением флажка и все.
т.е. сначала создаем себе трудности, а после героически их преодолеваем.
а если просто сделать правильно? в исходном месте, от чего проблема.

-----------------------------------
задница есть универсальный интерфейс, ибо через задницу можно сделать абсолютно все!  


Kolan   (2007-07-15 10:28:00) [11]

Лана, решил проблему добавлением флажка и все.


Kolan   (2007-07-15 08:35:00) [12]

> а зачем тебе надо задавать PageControl1.ActivePage

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

Видно надо сделать флаг и не менять ActivePage при клике по закладке…


Sdubaruhnul   (2007-07-15 01:15:00) [13]

> ActivePageIndex — старый
TabIndex — новый


Да, не знал такого. Действительно, логика в этом есть. Активная страница - это та, которая показывается, поэтому в ОнШоу она не может быть ещё активной.

Теперь, чтобы уж по полной программе... а зачем тебе надо задавать PageControl1.ActivePage, ведь сейчас она появится и свойство само установится? При помощи TPageControl.TabIndex ты всегда можешь в ОнШоу и везде определить, что выбрали. Ы?


Kolan   (2007-07-14 22:18:00) [14]

> Пример в студию.

ДА он уже в студии:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, ComCtrls;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   BitBtn1: TBitBtn;
   procedure TabSheet2Show(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.TabSheet2Show(Sender: TObject);
begin
 PageControl1.ActivePage := TabSheet2;
end;

end.


Ну нате все :)


> PageControl1.ActivePageIndex TabSheet2.TabIndex


Так в том то и цимус что в OnShow они не равны
procedure TForm1.TabSheet2Show(Sender: TObject);
begin
 if PageControl1.ActivePageIndex TabSheet2.TabIndex then
   PageControl1.ActivePage := TabSheet2;
end;


ActivePageIndex — старый

TabIndex — новый


Sdubaruhnul   (2007-07-14 20:33:00) [15]

> Если не понятно зачем — ActivePage может смениться не только при клике на таб, но и в другом месте на связанном с PageControl.

Пример в студию.

Накрайняк:

if PageControl1.ActivePageIndex <> TabSheet2.TabIndex then ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо