Отправляет email-рассылки с помощью сервиса Sendsay

Инвестиции: Вопрос-Ответ

  Все выпуски  

C/C++ Вопрос-Ответ Выпуск № 3


Информационный Канал Subscribe.Ru

C/C++ Вопрос-Ответ

Выпуск № 3
Cайт : SoftMaker.com.ru
Архив рассылки : SoftMaker.com.ru
Количество подписчиков : 137
В этом выпуске
От ведущего

Здравствуйте уважаемые подписчики !

Рад снова приветствовать вас на страницах этой рассылки.
К сожалению, выпуск несколько задержался. Но, уверяю вас, следующий номер выйдет точно в срок (ориентировочно - в понедельник утром). Так что, если кто то хочет задать вопрос - поспешите, и он появится в ближайшем выпуске.

Напомню, что, как всегда, Вы можете отправить свои пожелания по поводу рассылки и сайта по этому адресу.
Если вы хотите создать и вести какой либо раздел в этой рассылке - также пишите мне.

С уважением, Вахтуров Виктор.

Подписчикам

Чтобы заранее разрешить возможные недоразумения, прошу Вас помнить, что вопросы публикуются в рассылке только один раз. Поэтому, если Вам не ответили в этом выпуске, или ваш вопрос не был опубликован, пришлите его еще раз. Не стоит отвечать на вопрос, который был задан в предыдущем выпуске (за исключением случая, когда он снова опубликован в этом).

Для того, чтобы задать свой вопрос, пришлите письмо, кликнув по этой ссылке.
Для того, чтобы ответить на вопрос, надо кликнуть по ссылке "ответить", расположенной под текстом вопроса.
Обо всех ошибках, замеченных в данной рассылке, а также своих предложениях и пожеланиях пишите сюда.

Вопросы

Для того, чтобы задать свой вопрос, кликните этой ссылке (вопрос будет опубликован в следующем номере).
Вы можете задавать любые вопросы, касающиеся программирования на языке C и C++. Это могут быть вопросы, касающиеся как конструкций языка, применения библиотек классов, шаблонов (таких как MFC или STL), использования компиляторов, так и самой философии программирования на C или C++. Здесь нет ограничений - спрашивайте и получайте ответы.

Вопрос № 8 ( ures )

Только начинаю учиться писать на Visual C++ 6.0.
Поэтому мой вопрос может быть вам покажется простым но для меня это проблема.
Как можно сделать вот такую вещь:
Я создал в проекте две иконки IDI_ICON_1 и IDI_ICON_2.
Создал также диалог, а в диалоге кнопку.
Надо сделать так, чтобы в диалоге показывалась иконка (например IDI_ICON_1)
и при нажатии на кнопку эта иконка заменялась на IDI_ICON_2.
Заранее всем спасибо.

Ответить на вопрос

Вопрос № 9 ( Boris Ivanov )

Доброго времени суток.
Я пробовал работать с WinAPI функциями FindFirstFile,
FindNextFile, но, наверно, не до конца разобрался.
Я был бы благодарен, если бы мне подсказали как, напрмер,
сделать такое же дерево как в проводнике. Очень надо :-)

Ответить на вопрос

Вопрос № 10 ( Александр Новиков )

Здравствуйте.
Ваша рассылка очень кстати :) Задам ка и я вопрос !
Столкнулся с такой проблемой в Visual C. Как известно,
для "автоматической" установки состояний пунктов меню
в MDI и SDI приложениях можно создать обработчики типа
OnUpdate... при помощи макросов карты сообщений
ON_UPDATE_COMMAND_UI. Но я решил сделать то же самое в
диалоге. То есть подключил туда меню и добавил обработчк:

void CStatDlg::OnUpdateMenu1(CCmdUI* pCmdUI)
{
    pCmdUI->Enable(FALSE);
}

но это не работает! Меню так и остается активным. Хотя в приложении SDI это сработало. Не подскажете ли мне как побороть эту проблему ?

Ответить на вопрос

Ответы

Ниже приведены вопросы предыдущего выпуска и ответы на них.

Вопрос № 3 ( Nikolka )

Недавно подписался на Вашу рассылку - очень рад, что есть кому задать
свои вопросы по MS VC++.

Есть обычный проект(с MFC) проект на VC++ 7.0.
В классе Doc есть переменная int m_kolvo;
В классе Dialog1 есть спинер CSpinButtonCtrl m_spin с окошком CEdit m_dat
Надо передать в диалоге данные из m_kolvo в m_dat и при изменении счиитать обратно.

void CDoc::OnDialog1()
{
        CDialog1 dlg;
        ???
        if(dlg.DoModal()==IDOK)
        {
                ????
                SetModifiedFlag();
                UpdateAllViews(NULL);
        }
}

Еще вопрос - стратегический. Насчет сохранения и считывания данных и настроек.
Можно в файле, а можно в реестре. Как лучше и каким образом?

С уважением, Николай

Ответ ( 3V )

Насчет диалога - все достаточно просто. При помощи Class Wizard-а (которым, наверно, были добавлены переменные m_dat и m_spin) можно добавить для того же Edit-a, например, вторую переменную, но только - числового типа (класс визард объявит ее в классе CDialog1 как public). Перед вызовом dlg.DoModal() можно будет просто установить значение этой переменной, а потом - считать.

То есть получится что то типа:

...
        CDialog1 dlg;
        dlg.m_nDat = 10; // m_nDat - типа int, например.
        if(dlg.DoModal()==IDOK)
        {
                m_nYourVariable = dlg.m_nDat; // ну, и куда нибудь сохранить потом
                ...

Ну, а насчет сохранения и считывания данных и настроек - писалось тут (разработана небольшая библиотечка для этого дела - и для реестра и для ini-файлов). Одним словом - можно в файле, а можно и в реестре - зависит от задачи. В файлах чаще всего данные локализации хранят (типа как в Total Commander поддержка нескольких языков реализована).
Вопрос № 4 ( Фёдор Лактиов )

не люблю MFC, пишу всё на API. В мире ИТ уже есть надстройки над API. Хотелось бы узнать о них побольше.

Ответ ( Alexey )

Почитай про ATL и WTL.
Это именно то, что тебе надо.

Ответ ( 3V )

Есть такая штука как ATL - Active Template Library. Это библиотека шаблонов. Там как шаблоны классов для работы с интерфейсом объявлены, так и поддержка COM хорошая (smart-pointers всякие). Довесок к ней - WTL (Windows Temtlate Library, если не ошибаюсь). Использует частично шаблоны ATL.
Да и MFC - вобщем то, надстройка над API (где то тонкая, где то - не очень).
Вопрос № 5 ( vbudko )

Здравствуйте.
А не подскажете ли как можно сделать или где взять соотв. компонент для
того чтобы работать с базами данных (хотя бы *.dbf) без использования ADO и
DAO. Т.к.хочется сделать так, чтобы программа могла работать и на тех
машинах, где нет DAO и ADO ?
Заранее спасибо.
Ответы просьба присылась по адресу vit95@fromru.com

Ответ ( Alexey )

Изучай ODBC. Эта технология самая старая.
Зато программа должна работать даже под 95-е винды.
Спраку по ODBC смотри в MSDN.

Ответ ( mark3d )

DBF формат достаточно прост. В инете можно легко найти
его описание. Просто читай данные в своей проге в массив
или список и работай с ними сам.
Вопрос № 6 ( Александр Бородин )

Как в С\С++ декларируются функций, точки входа в программу.
То есть как создать функцию подобную WinMain или OwlMain.

Ответы можно послать на alBorodin@inbox.ru

Ответ ( qwert_zaq )

стандартного способа для всех компиляторов не.
обчыяно реальная точка входа в C программу - это процедура _start
из которой уже вызываются функции подобные main или WinMain.
обычно у каждого компилятора имеется собственные stabы (обычно
это исходники на ассемблере где реализована функция start).
так что я бы на вашем месте поискал в своем дистрибутиве компиляторе
ассемблерные файлы и посмотрел что там внутри Ж:-)

Ответ ( 3V )

Должен тебя обрадовать. WinMain - не точка входа в программу :)
Если посмотреть отладчиком, то ей обычно предшествует функция инициализации CRT - библиотеки. В CRT, идущей с Visual C++ эта функция объявляется так (в зависимости от текущей конфигурации приложения):

void wWinMainCRTStartup(void)
void WinMainCRTStartup(void)
void wmainCRTStartup(void)
void mainCRTStartup(void)

и вызывает соответственно либо wWinMain, либо WinMain, либо wmain, либо main. Также в этой функции стоит обработчик исключений (последний обработчик всей проги) - все необработанные исключения падают именно туда.

В качестве такой точки входа можно, конечно же, указать свою функцию. В Visual C++ это делается либо через опции проекта, либо путем указания ключа компилятора /ENTRY. В других средах разработки и других компиляторах, думаю, аналогично.

Только учти, что если переопределишь функцию инициализации CRT, то придется много чего делать самому. В частности, не будут вызваны конструкторы статических объектов (т.к. они вызываются именно из функции инициализации CRT).
Вопрос № 7 ( Uran )

Как расширить возможности стандартного диалога Открытие файла, например добавить элементы управления. Если можно то с примерами.

Ответ ( Alexey )

Хоть бы указал на чем пишешь ! Вот пишу как это сделать в MFC.
Попробуй просто понаследовать класс своего диалога от стандартного (CFileDialog), добавь функцию OnInitDialog через визард. Добавь в свой класс диалога объект нужного класса, например CEdit. А потом в OnInitDialog создай свой конторол простым Create.

То есть, можно так:

  class CMyFileDialog : public CFileDialog
  {
          ...
          CEdit m_wndEdit;
          ...
  };

  BOOL CMyFileDialog::OnInitDialog() 
  {
          CFileDialog::OnInitDialog();
          m_wndEdit.Create(WS_VISIBLE | WS_CHILD, CRect(0, 0, 100, 20), GetParent(), 1000);
          return TRUE;
  }

Заметь, в качестве родителя твоего контрола надо указывать не this, а его родителя (GetParent).
Всего доброго. До встречи в следующем номере.
Любой из материалов, опубликованных в этой рассылке, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cppqa
Отписаться

В избранное