Форум: "Начинающим";
Текущий архив: 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 — старый
TabIndex — новый
← →
Sdubaruhnul (2007-07-15 01:15) [3]>ActivePageIndex — старый
TabIndex — новый
Да, не знал такого. Действительно, логика в этом есть. Активная страница - это та, которая показывается, поэтому в ОнШоу она не может быть ещё активной.
Теперь, чтобы уж по полной программе... а зачем тебе надо задавать PageControl1.ActivePage, ведь сейчас она появится и свойство само установится? При помощи TPageControl.TabIndex ты всегда можешь в ОнШоу и везде определить, что выбрали. Ы?
← →
Kolan © (2007-07-15 08:35) [4]> а зачем тебе надо задавать PageControl1.ActivePage
Потому что я пользуюсь одним кодом из двух мест. У меня есть типа менеджера проектов и закладки. Пользователь может изменить текущий проект как по клику в менеджере так и по клику на закладке. А код вызавается один и тот же.
Видно надо сделать флаг и не менять ActivePage при клике по закладке…
← →
Kolan © (2007-07-15 10:28) [5]Лана, решил проблему добавлением флажка и все.
← →
sniknik © (2007-07-15 10:43) [6]> Пользователь может изменить текущий проект как по клику в менеджере
вот это интересно. как же ты так меняешь из этого менеджера страницы в PageControl что он не знает на какую... (???) так чтобы в событии которое возникает при установке страници в активные еще приходится самого себя в активные прописывать... чушь какаято.
думаю ты просто сделал все на "универсальном интерфейсе те через задницу", и в менеджере вместо установки страницы сам вызываешь событие onShow у этой страницы...
> Лана, решил проблему добавлением флажка и все.
т.е. сначала создаем себе трудности, а после героически их преодолеваем.
а если просто сделать правильно? в исходном месте, от чего проблема.
-----------------------------------
задница есть универсальный интерфейс, ибо через задницу можно сделать абсолютно все!
← →
Kolan © (2007-07-15 10:48) [7]> вот это интересно. как же ты так меняешь из этого менеджера
> страницы в PageControl что он не знает на какую… (???)
> так чтобы в событии которое возникает при установке страници
> в активные еще приходится самого себя в активные прописывать…
> чушь какаято.
Использую Model-View. Есть объект «Менеджер отчётов» у него есть тек. отчёт.
1.Кликнув в менеджере отчетов пользователь посылает сообщение «Изменить текущий отчет».
2.Менеджер получив сообщение меняет тек. отчёт и посылает сообщение «Я изменился».
3.Получив сообщение «Я изменился» и визуыальный менеждер отчётов и PageControl синхронизируются.
> т.е. сначала создаем себе трудности, а после героически
> их преодолеваем.
Как правильно объясните подробнее…
← →
Kolan © (2007-07-15 10:49) [8]
> Кликнув в менеджере отчетов пользователь посылает сообщение
> «Изменить текущий отчет».
То есть это так:
1.Кликнув в визуальном отображении менеджера отчетов, пользователь посылает сообщение «Изменить текущий отчет».
← →
Kolan © (2007-07-15 10:58) [9]> героически
А что использование одного флага — это героизм?
← →
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"а — то ненадо, так как он сам изменится.
Непонятно?
← →
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}. <-— отображаем во View Слое
16 15:15:33:796 : {Задать текущим отчёт: «MicroTestReport1». | TSetCurrentReportByReportCommnad}.
17 15:15:33:796 : {Состояние менеджера отчётов изменилось. | TReportManagerChangedCommand}.<-— отображаем во View Слое
> но для контролирующего контрола а не подчиненного
У меня нет подчиненного или не подчиненного представления модели и TreeView и PageControl — равноправны. Они просто реагируют на изменение модели.
А если я потом прикручу еще одно отображение, но только в другом пакете например, кого из 3х предложите сделать главным а кого подчиненным? И главное как? Ведь третье представление находясь в пакете ничё не знает о двух других…
← →
Kolan © (2007-07-15 18:03) [15]> Вы нарушили Model-View-Controller
Нет, тут я неправ, вы просто соединили два View в одно…
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.044 c