Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

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

 
Kolan ©   (2007-07-14 19:20) [0]

контролы

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

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

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

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

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


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

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

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

Накрайняк:

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


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

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

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

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 &#151; старый

TabIndex &#151; новый


 
Sdubaruhnul   (2007-07-15 01:15) [3]

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


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

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


 
Kolan ©   (2007-07-15 08:35) [4]

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

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

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


 
Kolan ©   (2007-07-15 10:28) [5]

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


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

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

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

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

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


 
Kolan ©   (2007-07-15 10:48) [7]

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

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

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


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


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


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


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

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


 
Kolan ©   (2007-07-15 10:58) [9]

> героически

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


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

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

А если так?

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


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

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

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


 
Kolan ©   (2007-07-15 11:48) [12]

Это визуальный менеждер отчётов
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"а &#151; то ненадо, так как он сам изменится.

Непонятно?


 
sniknik ©   (2007-07-15 17:14) [13]

> Непонятно?
как ты делаешь это понятно, еще в [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 17:39) [14]

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

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

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

View говорит Контроллеру измени модель. Если модель активная(как у меня) она говорит я изменилась.
Вот лог:
14 15:15:28:984 : {Создан отчёт. Отчёт: «MicroTestReport0». | TReportCreatedCommand}.
15 15:15:28:984 : {Состояние менеджера отчётов изменилось. | TReportManagerChangedCommand}. <-&#151; отображаем во View Слое
16 15:15:33:796 : {Задать текущим отчёт: «MicroTestReport1». | TSetCurrentReportByReportCommnad}.
17 15:15:33:796 : {Состояние менеджера отчётов изменилось. | TReportManagerChangedCommand}.<-&#151; отображаем во View Слое



> но для контролирующего контрола а не подчиненного

У меня нет подчиненного или не подчиненного представления модели и TreeView и PageControl &#151; равноправны. Они просто реагируют на изменение модели.
А если я потом прикручу еще одно отображение, но только в другом пакете например, кого из 3х предложите сделать главным а кого подчиненным? И главное как? Ведь третье представление находясь в пакете ничё не знает о двух других&#133


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
15-1184592922
Sdubaruhnul
2007-07-16 17:35
2007.08.12
Война браузеров доходит до идиотизма


15-1184703140
Витян
2007-07-18 00:12
2007.08.12
Delphi 7 и Windows Vista


15-1184257123
ZERO
2007-07-12 20:18
2007.08.12
Заголовки DirectX


11-1167056695
mixail_shar
2006-12-25 17:24
2007.08.12
Update до v2.49


2-1184746723
Апостол тибии
2007-07-18 12:18
2007.08.12
буфер обмена виндовс