Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ WinAPI]считать EDIT, почему там неработает ? 
V
    Опции темы
cupper
Дата 20.4.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



Почему если так создавать окно эдита
Код

    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "фЮПЭ ЛНКЕЙСКЮ",       /* Title Text */
           WS_OVERLAPPED|WS_CAPTION
           |WS_MINIMIZEBOX|WS_SYSMENU, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           600,                 /* The programs width */
           400,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );
    int x=20, y=50;
    hEditNum = CreateWindowEx(0,
          "EDIT", 
          "10", 
          WS_CHILD | WS_VISIBLE | WS_BORDER | WS_EX_CLIENTEDGE, 
          x, y+30, 100, 20, 
          hwnd, NULL, hThisInstance, NULL);

и вот так считывать из него
Код

case WM_CREATE:
             lenNum = GetWindowTextLength(hEditNum);
             char strNum[lenNum];
             GetWindowText(hEditNum,strNum,lenNum);

то lenNum = 0, а в strNum находиться какойто мусор ?
в strNum оно и понятно что мусор потомучто его нет вообще, но если делать в нем ручками char strNum[lenNum+3]; тогда вместо считаной строки из эдита в нем мусор.
hEditNum глобальная переменная, и она доступна. 

А вот если записывать туде 
SetWindowText (...) то записываеться нормально.

Это сообщение отредактировал(а) cupper - 20.4.2009, 13:56
PM MAIL   Вверх
GremlinProg
Дата 20.4.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



Цитата(cupper @  20.4.2009,  15:48 Найти цитируемый пост)

lenNum = GetWindowTextLength(hEditNum);
char strNum[lenNum];

в операции char strNum[lenNum]
lenNum не может быть переменной, только константой

в таком случае, нужно распределить lenNum символов в памяти:
Код

int lenNum;
_TCHAR*strNum;
//
lenNum = ::GetWindowTextLength(hEditNum);
strNum = new _TCHAR[lenNum + 1]
::GetWindowText(hEditNum,strNum,lenNum + 1);
...
delete[]strNum;



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
cupper
Дата 20.4.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



хм, чета я на это совсем внимание не обратил, притом в другой моей проге стоит абсолютно такой код, но немного с другими параметрами создаеться эдит, и там все работает О_о
Вобщем вместо того чот было написал
Код

             char strNum[10];
             char strMas[10];
             GetWindowText(hEditNum,strNum,8);
             GetWindowText(hEditMas,strMas,8);

и все гуд считываеться, на счет получения длины строки забил, хз работает или нет
спс за то что носом ткнули, порой это помогает smile

возможно GetWindowText принимаю указатель на строку сам потом изменяет ее размер делая его таким чтобы хватило записать туда символов из EDIT в количесте передаваемым функции третьим параметром, потомучто если в выше приведенном коде  
char strNum[10];
заменить на 
 char strNum[1];
но все равно в strNum считываються нормально и 2 и 3 и т.д. символов из EDIT. Вот так заботяться он нас разработчики библиотек стандартных ))
PM MAIL   Вверх
GremlinProg
Дата 20.4.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



GetWindowText сам не может перераспределить память, указатель которую ты ему передаешь,
ему же неизвестно, какими средствами ты ее распределил
да и не сможет он тебе вернуть новый адрес массива, в случае, когда по тому же адресу расширить его невозможно

а char strNum[1] работает только потому, что у тебя, видимо, в среде не производится слежение за стеком,
а он (стек) в момент записи за границу strNum[1] уже повреждается,

не в прямом смысле, конечно, но если бы у тебя после определения стояли другие переменные, с какой-нибудь важной информацией, то эта информация после вызова GetWindowText была бы затерта

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.