информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Дополнения к дополнению 22.07.03 09:53  Число просмотров: 1391
Автор: amirul <Serge> Статус: The Elderman
Отредактировано 22.07.03 10:01  Количество правок: 1
<"чистая" ссылка>
> > В VC++ (в частности в MFC Class Wizard-е - вызывается
> > клавишей Ctrl-W) можно добавлять переменные в
> сгенеренный
> > класс. В частности в класс диалога можно добавить
> > переменные TreeView-а и TabCtrl-а.

> Ты меня не понял. Нет проблем с созданием переменных.
Я собственно не о создании. Если какой-то элемент помещен на форму, то он будет создан при инициализации CDialog-а. Речь идет о добавлении переменных-указателей на эти самые элементы. Если все элементы не видны из одного диалога ничто не мешает добавить переменные для разных диалогов в CWinApp (вернее его наследника, который создается Class Wizard-ом). Насколько я понял сделать это из самого Class Wizard-а тоже не получится, так как диалоги создаются/уничтожаются опять таки в run-time, а design-time-е не известно, будет ли валидна данная переменная. Поэтому указатели на диалоги можно поместить в этого самого наследника от CWinApp вручную, и выставлять их по мере создания/удаления диалогов (так как конструкторы/деструкторы диалогов видят глобальный theApp, то оттуда лучше всего это и делать - кому как не им знать когда создаются/уничтожаются диалоги). Основной диалог приложения создается в InitInstance как локальная перменная и потому уничтожается при выходе из области видимости (из InitInstance).

Ну а с известными указателями на диалоги уже можно из любого диалога получить доступ к любому элементу каждого диалога. Причем добавлять переменные в ClassWizard нужно ПОМИМО добавления элемента в диалог. Добавляется не сам объект так сказать, а указатель на него для последующего доступа. Причем, можно выбирать каким элементам нужны такие переменные, а какие будут на автопилоте управляться собственными событиями.

> TreeVew создаётся в классе CTreeView. Диалог, содержащий
> CTabCtrl
> создаётся из другого вида, например, CFormView. Затем из
> CFormView создаются диалоги закладок CTabCtrl. Поэтому, при
> обработке перемещения по дереву я не могу вызвать методы
> диалогов (страниц таба), чтобы синхронизироватьсодержимое
> их контролов с селектом листа дерева.
> Не могу не в том смысле, что вобще не могу, а втом, что при
> стандартном
> подходе, без дополнительного манагера это можно сделать
> только коряво.
Вообще я имел в виду, что данным нужно давать всплывать только до того места, откуда они будут видны всем желающим их видеть. Но не дальше. Максимум, куда можно дать всплыть этим данным - в мемберы CWinApp-а. А сам CWinApp и так глобальный (собственно приложение запускается вызовом его конструктора). В этом глобальном CWinApp-е можно хранить указатели на все создаваемые диалоги. А в диалогах хранить указатели на необходимые элементы (например на CTabCtrl) и т.д. (из CTabCtrl-а можно получить все страницы с сохраненным lParam, если при этом озаботиться передачей в lParam указателя на CPage при создании - то проблем не будет).

Такая иерархия ИМХО, самая правильная. Но даже если будут отличия - выводить переменные в global scope нужно очень осторожно.

> > Это правильно что не видят. Потому, что программист
> должен
> > сам знать чего хочет
>
> Не обобщай. Посмотри на ссылку на концепцию паттернов в
> предыдущих постах в этом топике.
> Там есть про медиатор и обжект обзервер. Они как раз и
> делаются для того,
> чтобы всё знать об объектах.
Я не о знании. В конце концов нужно объявить что ты хочешь знать об объекте, создав обсервер. Тут то же. MFC Class Wizard не добавляет указателей в класс, если программист не попросит об этом явно. А создаются объекты (в частности контролы в диалогах) и без этого. Чтоб не засорять пространство имен, можно добавлять только те указатели, с которыми предполагается работать. Остальные будут на автопилоте выполянть те обработчики сообщений, которые им зададут.

> > Но есть и более эффективный вариант (и более
> правильный с
> > точки зрения ООП). С TreeView-ом разобрались, а для
> страниц
> > правильнее сделать общий базовый класс, с описанием
> всех
> > функций, необходимых для работы (скорее всего
> виртуальных,
> > но это зависит от конкретной задачи).
>
> Естественно класс написан.
Вот указатель на него то и передавать в lParam при InsertItem-е в CTabCtrl. Тогда взяв (GetItem()) любой итем можно будет точно знать, что как минимум на объект этого базового класса этот lParam указывает. А точный тип знать не обязательно, если в базовом классе хорошо задан интерфейс.

> >.... по CPP-овски. Вызов функции тоже можно считать
> сообщением,
>
> Я бы сказал по другому - вызов функции должно быть реакцией
> на сообщение
Ну не совсем. В курсе ООП в универе (давно это было, да и слушал в полуха) мы рассматривали этот вопрос. Не скажу точно, да и искать сейчас в лом, но сообщение это ЛЮБОЙ метод одного объекта сообщить другому о каком то событии. В общем случае это как раз вызов одним объектом мембер-функции другого. Ну а если диспетчерезацию сообщений берет на себя система, то тут и появляются функции типа "доставить такое то сообщение такому-то абоненту".

> > поэтому вместо FillControls(STARTUP) лучше делать
> прямой
> > вызов ClearControls()-ов.
>
> Да, вот здесь я согласен. Об этом я напишу дальше отдельным
> постом
<programming> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach