Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Установка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
2-1183970865
Newser
2007-07-09 12:47
2007.08.12
тип поля - Дата/время


2-1184585094
Вадим71
2007-07-16 15:24
2007.08.12
числа с плавающей точкой в DBGrid


1-1180427774
alexander_nt
2007-05-29 12:36
2007.08.12
Скопировать содержимое TWebBrowser


15-1184597966
TStas
2007-07-16 18:59
2007.08.12
Длинные ветки в поболталовке


15-1184400782
iZEN
2007-07-14 12:13
2007.08.12
В чём философский смысл побелки бордюров?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский