|
|
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Работаю на VC++ 6.0. Пробую работать с ini файлом, для этого на диалоге размещаю Edit, ассоциирую его с переменной CString в Класс визарде, затем считываю что-либо из файла, вот так, например: Код: plaintext 1. потом приравниваю ту самую переменную с Buf, в Edit'e пусто. Создал консольное приложение, вывожу в поток переменную, выводиться фигня, а Buf выводиться в поток нормально, если пытаюсь при помощи WriteString запихать ее в .txt, то в него ничего не пишеться. Если я работаю с этой переменной и делаю так, например: Код: plaintext 1. 2. 3. 4. все в порядке, строка из test1.txt благополучно копируется в test.txt Также не могу занести в ini файл значение из этой переменной... Как мне выкрутиться из этой ситуации? Приложение должно брать настройки из ini файла и, сответственно, сохранять их в нем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 16:10 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
Давай начнём с "в Edit'e пусто". Как я понимаю, Buf не пусто (это можно посмотреть в отладчике), тогда, наверно, и CString не пусто. Причина в том, что данные из ассоциированного CString попадают в Edit не сами собой, а через DoDataExchange(). Приведи, пожалуйста, текст функции, где происходит присвоение. Для принудительного обновления Edit'a можно вызвать UpdateData(FALSE). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 17:11 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
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"); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2003, 17:42 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
DoDataExchange обновит вообще контролы и переменные, нафик это надо? DJStealth все абсолютно правильно написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 04:03 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
Спасибо всем. Ой Вэй: Код: plaintext 1. 2. 3. Вот так, действительно, заработало. Сейчас подумаю над методом, предложенным DJStealth. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 07:44 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
DJStealth: Спасибо, тоже заработало. Осталось понять как :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 08:56 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
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(), ни память, выделенная под члены-окошки не имеют на данном этапе НИКАКОГО значения. Пиши как можно понятней и проще. А если/когда этот простой код начнёт тормозить, ты, уже набравшись опыта, легко его ускоришь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 15:36 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
Ой ВэйDJStealth все абсолютно правильно написал. CEdit* poEdit = static_cast<CEdit*>(GetDlgItem(IDC_EDIT4)); За такое убивать надо. Не надо меня убивать, -это у меня от линухов осталось :0( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 16:06 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
DJStealth Не надо, это я погорячился. DDX_Control() вызывает тот же GetDlgItem(), только держит за руку. Ну и плюс этот вызов не в нашем коде, а в библиотечном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2003, 17:47 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
прикол в том, что особой пользы от т.н. "объектности" MFC я не чуствую... и не только я... посему обычно пользуюсь таким: Код: plaintext да, вот так, грубо и без проверок! :), даже на ассемблере не получу более лаконично. обоснования "грубого подхода": ---------------------------------- 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? - нахрена тогда вообще огороды городить, иди "в лоб" - пользуешься докой по классам - изволь быть "прилежным" программистом, это застрахует от ошибок в любом случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2003, 05:21 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
И ты прав... Тем не менее: если я нарисовал некий диалог, присвоил некое IDC_XXX контролу и диалог успешно загружен, мне этого достаточно Ну в общем-то да. Теперь предположим, ты поменял это самое IDC_XXX (с тобой такого не бывает, со мной бывает). Тогда мне придётся заменить в тексте программы одно вхождение строки IDC_XXX, а тебе несколько. Но засорять статические MFC-map-ы (тупые и жутко медленные map-ы) ... Это, пожалуйста, поподробнее, а то я так дураком и умру. Контрольный вопрос: сколько должно быть на диалоге edit'ов (все со статическими map'ами), чтобы на машине типа пентиум100 вызов DoDataExchange() занял 1 секунду? и тебе рекомендую начать пользоваться правилами "хорошего тона" при программировании на С++ Я стараюсь пользоваться, в частности, таким правилом: текст программы должен быть как можно проще для чтения. И только если простой текст работает медленно, стоит его ускорять. Другое правило следует из первого: каждый кусок программы (функция, файл) должен заниматься своим делом. В этом смысле то что сделано в CDialog меня вполне устраивает: DoDataExchange() занимается связью переменных и дочерних окон, а остальные — остальным. Готов послушать твои правила (только не надо посылать меня в поиск, я умею им пользоваться. И WinAPI тоже частично знаю). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2003, 17:38 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
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-приколы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2003, 07:19 |
|
||
|
CString и ini файлы
|
|||
|---|---|---|---|
|
#18+
На вопрос про количество Edit'ов ты не ответил. А я хотел бы этот ответ услышать. Не ожидал подобного, ... — прости. После банаховых пространств изучать внутреннее устройство MFC, Windows, exe-файлов... скучно. Пока оно меня не трогает (нормально работает), я тоже его не трогаю. Насчёт "не стоит пользоваться знаниями об внутреннем устройстве библиотек, если это устройство не декларируется" — согласен. Но UpdateData() вроде бы описана в общедоступном хэлпе, или я опять что-то не так понял? Про static_cast я понял, что ты сказал, в некотором смысле я это знал. Но ты опять говоришь о том, как программа будет работать (по-моему, точно так же), а я — о читабельности текста программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2003, 16:46 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2035685]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
10ms |
get first new msg: |
5ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 243ms |
| total: | 395ms |

| 0 / 0 |
