Daniloff
Помогающий
Offline
|
|
« : 18-07-2007 12:54 » |
|
Здравствуйте! Я давно работаю с VC++, но никогда не использовал MFC. Теперь попробовал... Вся документация, что мне попадается - слишком невнятная, перечислены свойства и методы объектов, а рабочих примеров программ не вижу.
На данный момент самый животрепещущий вопрос таков: как обратиться к контролу диалога?.. Есть CDialog, есть объект CListBox, но как моя программа поймет, что объект связан именно с контролом, имеющим ID "IDC_LIST1" ??
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 18-07-2007 13:12 » |
|
Daniloff, во первых, можно обойтись и без объекта CListBox, связанного с контролом. 1) всегда можно получить указатель на контрол из диалога: //где то в диалоге или во View CListBox* p=0; p=(CListBox*)GetDlgItem(IDC_LIST1); if(p) { //работаем с указателем p }
(причём, этот метод я предпочитаю, навозившись когда то с методом №2. Но это - на твой вкус) метод 2) находимся в редакторе формы. На форме лежит контрол с идентификатором IDC_X. Зажимаем Ctrl и дважды щёлкаем по контролу - затем выбираем класс будущей переменной и , собственно, добавляем связанную член-переменную. Советую давать имя переменной в виде "m_"+IDC_X. (это удобно, когда захочешь переименовать и идентификатор и имя переменной - просто поиском найдёшь все вхождения идентификатора. Да и просто не надо париться - выдумывать имя переменной ) то есть в твоём случае будет m_IDC_LIST1. Визард добавит макросы, которые будут синхронизировать состояние переменной и контрола. метод диалога UpdateData() выполняет синхронизацию. Хотя, для CListBox этот метод не понадобится, вроде, но он нужен для CEdit, CButton
|
|
« Последнее редактирование: 18-07-2007 13:22 от Алексей1153++ »
|
Записан
|
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #3 : 18-07-2007 17:16 » |
|
Второй вариант похож на дело... А первый - как это?.. p= это указатель на класс или на хэндл окна?.. И разве у GetDlgItem() не 2 параметра?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 18-07-2007 17:24 » |
|
Daniloff, 1)то есть как это как ? ) Так, как я написал... когда надо получить доступ к объекту, делаешь p= ... GetDlgItem... - и работаешь с объектом через указатель. Чем мне нравится этот вариант ? Он гибче, чем визардовский, он быстрее. Хотя иногда громоздко выглядит, согласен. Но это только по первому времени так кажется Главное правило - не забыть проверить, что GetDlgItem вернула не нулевой указатель, а также не забывать про приведение указателя от Cwnd* на нужный 2)CListBox* p - это указатель на объект класса CListBox 3) у метода CWnd::GetDlgItem(int nID) , возвращающего CWnd* - один параметр CWnd* GetDlgItem(int nID) const;
- аналогичен апишному, но хендл окна уже не нужен.
|
|
« Последнее редактирование: 18-07-2007 17:31 от Алексей1153++ »
|
Записан
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #5 : 18-07-2007 17:35 » |
|
ну надо же, как все запутано! функция та же, да не та... А как тогда обратиться к апишной непеределанной ф-и?..
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 18-07-2007 17:43 » |
|
Daniloff, ничего не запутано ) всегда можно обратиться к апишным функциям при помощи оператора :: а когда просто пишешь GetDlgItem(), находясь внутри класса XXX , то имеется вызовется метод класса XXX , если он определён
|
|
« Последнее редактирование: 18-07-2007 17:45 от Алексей1153++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 19-07-2007 10:09 » |
|
p= это указатель на класс или на хэндл окна?.. Лучше начать с поиска https://forum.shelek.ru/index.php/topic,6471.0.htmlМожет станет понятней. Поищи ещё - тема много раз поднималась.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #8 : 19-07-2007 11:48 » |
|
Алексей1153++, кажется, получается. Первый вариант мне даже больше нравится - никаких лишних объектов не надо создавать.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 19-07-2007 12:08 » |
|
Daniloff, вот и мне тоже поэтому )
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 19-07-2007 14:40 » |
|
никаких лишних объектов не надо создавать Ошибка, "лишний" объект всё-равно будет создан и указатель на него возвращается ф-ей GetDlgItem. Автоматически. MFC. Так что... Другое дело, что этот объект тебе временно нужен, например для SetWindowText, когда же ты постоянно работаешь с объектом, то лучше иметь его постоянно. Ну и на последок, GetDlgItem возвращает указатель типа CWnd поэтому всегда необходимо делать приведение типов CButton, CComboBox и тд Со всеми вытекающими отсюда последствиями.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #11 : 19-07-2007 17:07 » |
|
Камень преткновения #2: rs.Open(CRecordset::forwardOnly,"SELECT * FROM KEYS",CRecordset::readOnly); // базаоткрылась m_flex.SetDataSource(rs); // ошибка компиляции 'SetDataSource' : cannot convert parameter 1 from 'class CRecordset *' to 'struct IDispatch *' вот так вот. Пытаюсь из CRecordset вытянуть IDispatch * m_flex.SetDataSource((struct IDispatch *)rs.GetRuntimeClass()); // ответ неверный
|
|
« Последнее редактирование: 19-07-2007 17:33 от Daniloff »
|
Записан
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #12 : 22-07-2007 10:11 » |
|
Кажется, я понял - ActiveX контрол MSFlexGrid требует, чтобы в качестве источника данных использовался ActiveX контрол MSADO.Recordset, а не объект CRecordset...
|
|
|
Записан
|
|
|
|
salex
Гость
|
|
« Ответ #13 : 11-12-2007 22:51 » |
|
Daniloff, во первых, можно обойтись и без объекта CListBox, связанного с контролом. 1) всегда можно получить указатель на контрол из диалога: //где то в диалоге или во View CListBox* p=0; p=(CListBox*)GetDlgItem(IDC_LIST1); if(p) { //работаем с указателем p }
(причём, этот метод я предпочитаю, навозившись когда то с методом №2. Но это - на твой вкус) метод 2) находимся в редакторе формы. На форме лежит контрол с идентификатором IDC_X. Зажимаем Ctrl и дважды щёлкаем по контролу - затем выбираем класс будущей переменной и , собственно, добавляем связанную член-переменную. Советую давать имя переменной в виде "m_"+IDC_X. (это удобно, когда захочешь переименовать и идентификатор и имя переменной - просто поиском найдёшь все вхождения идентификатора. Да и просто не надо париться - выдумывать имя переменной ) то есть в твоём случае будет m_IDC_LIST1. Визард добавит макросы, которые будут синхронизировать состояние переменной и контрола. метод диалога UpdateData() выполняет синхронизацию. Хотя, для CListBox этот метод не понадобится, вроде, но он нужен для CEdit, CButton
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #14 : 12-12-2007 04:26 » |
|
salex, ты комментарии забыл написать ))
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #15 : 12-12-2007 09:22 » |
|
Я думаю он просто сообщения набирает. Ничего путного из последних (и первых) я у него не видел.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|