Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CString и ini файлы / 13 сообщений из 13, страница 1 из 1
02.12.2003, 16:10
    #32340951
Indian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
Здравствуйте. Работаю на VC++ 6.0. Пробую работать с ini файлом, для этого на диалоге размещаю Edit, ассоциирую его с переменной CString в Класс визарде, затем считываю что-либо из файла, вот так, например:

Код: plaintext
1.
char Buf[ 50 ];
GetPrivateProfileString( "Data" , "key" , "not redy" ,Buf, 10 ,ini_file);


потом приравниваю ту самую переменную с Buf, в Edit'e пусто. Создал консольное приложение, вывожу в поток переменную, выводиться фигня, а Buf выводиться в поток нормально, если пытаюсь при помощи WriteString запихать ее в .txt, то в него ничего не пишеться. Если я работаю с этой переменной и делаю так, например:
Код: plaintext
1.
2.
3.
4.
CStdioFile cf;
cf.Open( "D:\\Work\\222 \\Console\\test1.txt", CFile::modeRead );
cf.ReadString(abc1);
cf.Open( "D:\\Work\\222 \\Console\\test.txt", CFile::modeWrite );
cf.WriteString(abc1);

все в порядке, строка из test1.txt благополучно копируется в test.txt
Также не могу занести в ini файл значение из этой переменной...

Как мне выкрутиться из этой ситуации? Приложение должно брать настройки из ini файла и, сответственно, сохранять их в нем.
...
Рейтинг: 0 / 0
02.12.2003, 17:11
    #32341083
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
Давай начнём с "в Edit'e пусто".
Как я понимаю, Buf не пусто (это можно посмотреть в отладчике), тогда, наверно, и CString не пусто.

Причина в том, что данные из ассоциированного CString попадают в Edit не сами собой, а через DoDataExchange(). Приведи, пожалуйста, текст функции, где происходит присвоение.

Для принудительного обновления Edit'a можно вызвать UpdateData(FALSE).
...
Рейтинг: 0 / 0
02.12.2003, 17:42
    #32341139
DJStealth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
In Edit
char lpReturnedString[100];

GetPrivateProfileString("RUN","DefRefDir","",lpReturnedString,99,"import.ini");
CEdit* poEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT4));
poEdit->SetWindowText(lpReturnedString);

------------------------------------------------------------------------

From Edit
CEdit* poEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT4));
poEdit->GetWindowText(str);
WritePrivateProfileString("RUN","DefRefDir",str,"import.ini");
...
Рейтинг: 0 / 0
03.12.2003, 04:03
    #32341431
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
DoDataExchange обновит вообще контролы и переменные, нафик это надо?

DJStealth все абсолютно правильно написал.

...
Рейтинг: 0 / 0
03.12.2003, 07:44
    #32341479
Indian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
Спасибо всем. Ой Вэй:
Код: plaintext
1.
2.
3.
char Buf[ 50 ];
GetPrivateProfileString( "Data" , "key" , "not redy" ,Buf, 10 ,ini_file);
m_M1 = Buf;  
UpdateData(FALSE);

Вот так, действительно, заработало. Сейчас подумаю над методом, предложенным DJStealth.
...
Рейтинг: 0 / 0
03.12.2003, 08:56
    #32341505
Indian
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
DJStealth: Спасибо, тоже заработало. Осталось понять как :)
...
Рейтинг: 0 / 0
03.12.2003, 15:36
    #32342220
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
vdimas
DoDataExchange обновит вообще контролы и переменные, нафик это надо?
В принципе, не надо.

DJStealth все абсолютно правильно написал.
CEdit* poEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT4));
За такое убивать надо.
GetDlgItem() на статическом диалоге — свинство. Имеет полное право вернуть NULL.
static_cast<CEdit*> — тоже очень красиво, а если там не CEdit? При том что для SetWindowText() хватит и CWnd*, не нужен никакой cast.

Indian
Действительно, UpdateData(FALSE) обновит вообще контролы и переменные . Теоретически это займёт некоторое лишнее время. Чтобы этого не происходило, можно ассоциировать Edit'ы с переменными типа Control, т.е. окошками, и вызывать их SetWindowText().
vdimas скажет, что это лишняя память, и будет снова прав.

ИМХО: ни время выполнения DoDataExchange(), ни память, выделенная под члены-окошки не имеют на данном этапе НИКАКОГО значения. Пиши как можно понятней и проще. А если/когда этот простой код начнёт тормозить, ты, уже набравшись опыта, легко его ускоришь.
...
Рейтинг: 0 / 0
03.12.2003, 16:06
    #32342268
DJStealth
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
Ой ВэйDJStealth все абсолютно правильно написал.
CEdit* poEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT4));
За такое убивать надо.
Не надо меня убивать, -это у меня от линухов осталось :0(
...
Рейтинг: 0 / 0
03.12.2003, 17:47
    #32342421
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
DJStealth
Не надо, это я погорячился. DDX_Control() вызывает тот же GetDlgItem(), только держит за руку. Ну и плюс этот вызов не в нашем коде, а в библиотечном.
...
Рейтинг: 0 / 0
04.12.2003, 05:21
    #32342791
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
прикол в том, что особой пользы от т.н. "объектности" MFC я не чуствую...
и не только я...

посему обычно пользуюсь таким:

Код: plaintext
::SetWindowText(::GetDglItem(m_hWnd, IDC_EDIT1), str);


да, вот так, грубо и без проверок! :), даже на ассемблере не получу более лаконично.

обоснования "грубого подхода":
----------------------------------
1. если я написал int x=2*2; где x-локальная переменная, то я не стану в следующей строке писать if(x==4) {...}
т.е. если я нарисовал некий диалог, присвоил некое IDC_XXX контролу и диалог успешно загружен, мне этого достаточно.
(эта тема, в принципе, достойна отдельного обсуждения, когда надо ловить ошибки, а когда ловить ошибки ВРЕДНО)

2. WinAPI не выбрасывает exceptions, а возвращает целые коды ошибок, посему для отладочных целей вполне подойдет макрос VERIFY(SOME_API_CALL), который ничего не делает в релизе, т.е. вышестоящее можно просто завернуть в этот VERIFY().

--------
2 Ой Вэй

убивать, не убивать за такое... да как хошь, блин...
Компилятор скомпилит это как надо, static_cast при отсутствии множественного наследования или в случае преобразования от/к первому в списке базовых классов не играет рояли и нужен для того, чтобы компилятор не ругался. Да, SetWindowText , определенный в CWnd не переопределен в CEdit , и что, блин???? Ведь логически, если просто из документации известен факт наследования, отсюда не вытекают подробности реализации, это все тонкости WinAPI , которые прикладному программисту И НАФИК НЕ СДАЛИСЬ (тупое, нелогичное API).

Как программист, ориентирующийся на документацию, а не на исходники этого тупорылого MFC , DJStealth сделал ВСЕ ПРАВИЛЬНО , и тебе рекомендую начать пользоваться правилами "хорошего тона" при программировании на С++, независимо от познаний в WinAPI.

GetDlgItem() на статическом диалоге — свинство. Имеет полное право вернуть NULL.
Не имеет! Если ТЫ САМ проектируешь диалог, то прочти про 2x2 в первой части поста.

Чтобы этого не происходило, можно ассоциировать Edit'ы с переменными типа Control, т.е. окошками, и вызывать их SetWindowText().
vdimas скажет, что это лишняя память, и будет снова прав.

Да фиг с ней с памятью под контрол. Но засорять статические MFC-map-ы (тупые и жутко медленные map-ы) и производить subclassing ради 2-х строк использования в программе ... сорри, я на это не готов...

да и память, опять же...

-----
т.е. ситуация такова:
- знаешь WinAPI? - нахрена тогда вообще огороды городить, иди "в лоб"
- пользуешься докой по классам - изволь быть "прилежным" программистом, это застрахует от ошибок в любом случае.
...
Рейтинг: 0 / 0
05.12.2003, 17:38
    #32345294
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
И ты прав...
Тем не менее:

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

Но засорять статические MFC-map-ы (тупые и жутко медленные map-ы) ...
Это, пожалуйста, поподробнее, а то я так дураком и умру.
Контрольный вопрос: сколько должно быть на диалоге edit'ов (все со статическими map'ами), чтобы на машине типа пентиум100 вызов DoDataExchange() занял 1 секунду?

и тебе рекомендую начать пользоваться правилами "хорошего тона" при программировании на С++
Я стараюсь пользоваться, в частности, таким правилом: текст программы должен быть как можно проще для чтения. И только если простой текст работает медленно, стоит его ускорять.
Другое правило следует из первого: каждый кусок программы (функция, файл) должен заниматься своим делом. В этом смысле то что сделано в CDialog меня вполне устраивает: DoDataExchange() занимается связью переменных и дочерних окон, а остальные — остальным.

Готов послушать твои правила (только не надо посылать меня в поиск, я умею им пользоваться. И WinAPI тоже частично знаю).
...
Рейтинг: 0 / 0
07.12.2003, 07:19
    #32345731
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
2 Ой Вэй
Но засорять статические MFC-map-ы (тупые и жутко медленные map-ы) ...
Это, пожалуйста, поподробнее, а то я так дураком и умру.
Контрольный вопрос: сколько должно быть на диалоге edit'ов (все со статическими map'ами), чтобы на машине типа пентиум100 вызов DoDataExchange() занял 1 секунду?


Не ожидал подобного, тем более после демонстрации знаний внутренного устройства MFC... А как вообще каждое сообщение Wndows обрабатывается для subclassed контролов в MFC? И сколько сообщений в секунду получает твое приложение?

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

static_cast - это тоже правило хорошего тона при преобразовании типов в C++, если корректность операции известна заранее. В данном случае именно так. В доке по MFC указаны диаграммы наследования, и MFC устроена именно так (внимание!!!), что, не смотря на то, что в ответ на GetDlgItem() приходит указатель на CTempWnd объект (если мы его не сабклассили), мы все-равно можем перевести его в указатель на некий тип MFC, соответствующий конкретному запрошенному windows-контролу (CEdit, например), и далее работать именно с ним.
Вот такие MFC-приколы...
...
Рейтинг: 0 / 0
08.12.2003, 16:46
    #32346773
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CString и ini файлы
На вопрос про количество Edit'ов ты не ответил. А я хотел бы этот ответ услышать.

Не ожидал подобного, ... — прости. После банаховых пространств изучать внутреннее устройство MFC, Windows, exe-файлов... скучно. Пока оно меня не трогает (нормально работает), я тоже его не трогаю.

Насчёт "не стоит пользоваться знаниями об внутреннем устройстве библиотек, если это устройство не декларируется" — согласен. Но UpdateData() вроде бы описана в общедоступном хэлпе, или я опять что-то не так понял?

Про static_cast я понял, что ты сказал, в некотором смысле я это знал. Но ты опять говоришь о том, как программа будет работать (по-моему, точно так же), а я — о читабельности текста программы.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CString и ini файлы / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]