Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] Find Common Dialog 08.06.01 03:14 Число просмотров: 827
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> Привет, All! > > сделал в MFC-шной проге FindText диалог через апи, > отлавливаю когда нажимается кнопка Find, вывожу на экран то > что искалось: > if(message==WM_FINDMESSAGE) > { > > LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam; > > if (lpfr->Flags & FR_FINDNEXT) > { > MessageBox(lpfr->lpstrFindWhat); > } > } > но ничего не выводится - в чем дело? по адресу > lpfr->lpstrFindWhat пусто, хотя половина элементов по > адресу lprf содержат верные значения. где копать? > > Буй!
тут сразу фиг поймешь. я не понял - lpfr->lpstrFindWhat вообще пуст, или MessageBox не выводит на экран?
и еще, если ты пишешь через АПИ, то MessageBox - у тебя какой АПИшный или МФСишный?
еще через что ты передаешь FINDREPLACE, через SendMesage или PostMessage. если PostMessage, то проследи, чтобы твой объект существовал в памяти в момент обработки мессаг. к примеру такое может вызвать ошибку :
FINDREPLACE find;
..................
::PostMessage(hWnd, WM_FINDMESSAGE, 0, (LPARAM)&find);
когда мессага дойдет, от структуры может и ничего не остаться.
тут куча причин могут быть, пока в голову пришли только эти.
и еще не понял как это - "хотя половина элементов по адресу lprf содержат верные значения" - а другая половина где пропадает? и что содержит поле Flags до отправки сообщения и в момент получения? по моему, все таки, если "половина" теряеться по дороге, то твоя структура FINDREPLACE высвобождаеться из памяти и ты получаешь какой то непонятный мусор.
|
<programming>
|
[Win32] Find Common Dialog 08.06.01 02:38
Автор: LBH Статус: Незарегистрированный пользователь
|
Привет, All!
сделал в MFC-шной проге FindText диалог через апи, отлавливаю когда нажимается кнопка Find, вывожу на экран то что искалось:
if(message==WM_FINDMESSAGE)
{
LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam;
if (lpfr->Flags & FR_FINDNEXT)
{
MessageBox(lpfr->lpstrFindWhat);
}
}
но ничего не выводится - в чем дело? по адресу lpfr->lpstrFindWhat пусто, хотя половина элементов по адресу lprf содержат верные значения. где копать?
Буй!
|
|
[Win32] Find Common Dialog 08.06.01 03:14
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> Привет, All! > > сделал в MFC-шной проге FindText диалог через апи, > отлавливаю когда нажимается кнопка Find, вывожу на экран то > что искалось: > if(message==WM_FINDMESSAGE) > { > > LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam; > > if (lpfr->Flags & FR_FINDNEXT) > { > MessageBox(lpfr->lpstrFindWhat); > } > } > но ничего не выводится - в чем дело? по адресу > lpfr->lpstrFindWhat пусто, хотя половина элементов по > адресу lprf содержат верные значения. где копать? > > Буй!
тут сразу фиг поймешь. я не понял - lpfr->lpstrFindWhat вообще пуст, или MessageBox не выводит на экран?
и еще, если ты пишешь через АПИ, то MessageBox - у тебя какой АПИшный или МФСишный?
еще через что ты передаешь FINDREPLACE, через SendMesage или PostMessage. если PostMessage, то проследи, чтобы твой объект существовал в памяти в момент обработки мессаг. к примеру такое может вызвать ошибку :
FINDREPLACE find;
..................
::PostMessage(hWnd, WM_FINDMESSAGE, 0, (LPARAM)&find);
когда мессага дойдет, от структуры может и ничего не остаться.
тут куча причин могут быть, пока в голову пришли только эти.
и еще не понял как это - "хотя половина элементов по адресу lprf содержат верные значения" - а другая половина где пропадает? и что содержит поле Flags до отправки сообщения и в момент получения? по моему, все таки, если "половина" теряеться по дороге, то твоя структура FINDREPLACE высвобождаеться из памяти и ты получаешь какой то непонятный мусор.
|
| |
[Win32] Find Common Dialog 08.06.01 03:26
Автор: LBH Статус: Незарегистрированный пользователь
|
> тут сразу фиг поймешь. я не понял - lpfr->lpstrFindWhat > вообще пуст, или MessageBox не выводит на экран? пуст, смотрел через watch
> и еще, если ты пишешь через АПИ, то MessageBox - у тебя > какой АПИшный или МФСишный? mfc'шный, имхо практически одинаковые
> еще через что ты передаешь FINDREPLACE, через SendMesage > или PostMessage. если PostMessage, то проследи, чтобы твой ловлю сообщение в WindowProc MFC'шном
> объект существовал в памяти в момент обработки мессаг. к > примеру такое может вызвать ошибку : нет, там в lParam находится указатель на область памяти содержащую FINDREPLACE структуру,сл. выделять ничего не надо, если есть мсдн или платформсдк - глянь там, мож что увидишь чего я не увидел
> > FINDREPLACE find; > .................. > ::PostMessage(hWnd, WM_FINDMESSAGE, 0, (LPARAM)&find); > > когда мессага дойдет, от структуры может и ничего не > остаться. > > тут куча причин могут быть, пока в голову пришли только > эти. > и еще не понял как это - "хотя половина элементов по адресу > lprf содержат верные значения" - а другая половина где размер структуры верный, размер поля lpstrFindWhat верный (там отдельная переменная за это отвечает), адрес в памяти тоже верный, а текста нету
> пропадает? и что содержит поле Flags до отправки сообщения > и в момент получения? по моему, все таки, если "половина" > теряеться по дороге, то твоя структура FINDREPLACE > высвобождаеться из памяти и ты получаешь какой то > непонятный мусор.
void CLBHMoneyAccountDlg::OnFind()
{
WM_FINDMESSAGE=RegisterWindowMessage(FINDMSGSTRING);
ZeroMemory(&FindReplace,sizeof(FindReplace));
FindReplace.lStructSize=sizeof(FindReplace);
FindReplace.lpstrFindWhat = "";
FindReplace.wFindWhatLen=80;
FindReplace.Flags=FR_NOMATCHCASE|FR_NOWHOLEWORD;
FindReplace.hwndOwner=this->GetSafeHwnd();
FRWin.m_hWnd = FindText(&FindReplace);
}
LRESULT CLBHMoneyAccountDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_FINDMESSAGE)
{
LPFINDREPLACE lpfr= (LPFINDREPLACE)lParam;
if (lpfr->Flags & FR_FINDNEXT)
{
MessageBox(FindReplace.lpstrFindWhat);
}
}
else return CDialog::WindowProc(message, wParam, lParam);
return NULL;
}
|
| | |
[Win32] Find Common Dialog 08.06.01 04:07
Автор: kabanchik Статус: Незарегистрированный пользователь
|
посмотри сообщение +-а, он правильный вопрос задал.
вот где ошибка
lpstrFindWhat
Pointer to a buffer that a FINDMSGSTRING message uses to pass the null terminated search string that the user typed in the Find What edit control. You must dynamically allocate the buffer or use a global or static array so it does not go out of scope before the dialog box closes. The buffer should be at least 80 characters long. If the buffer contains a string when you initialize the dialog box, the string is displayed in the Find What edit control.
т.е. надо хотя бы :
static TCHAR szFind[80];
szFind[0] = '\0';
> FindReplace.lpstrFindWhat = szFind; > FindReplace.wFindWhatLen=sizeof(szFind);
удачи.
|
| | |
[Win32] Find Common Dialog 08.06.01 04:02
Автор: + <Mikhail> Статус: Elderman
|
smotri ^^^^^^
> void CLBHMoneyAccountDlg::OnFind() > { > > WM_FINDMESSAGE=RegisterWindowMessage(FINDMSGSTRING); > > ZeroMemory(&FindReplace,sizeof(FindReplace)); > FindReplace.lStructSize=sizeof(FindReplace); > FindReplace.lpstrFindWhat = ""; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ty dolzhen alocirovat` pamiat` sdes`, I zhe tebe uzhe napisal
FindReplace.lpstrFindWhat = new char[80];
//potom ne zabud` delete []FindReplace.lpstrFindWhat;
> FindReplace.wFindWhatLen=80; > > FindReplace.Flags=FR_NOMATCHCASE|FR_NOWHOLEWORD; > FindReplace.hwndOwner=this->GetSafeHwnd(); > > FRWin.m_hWnd = FindText(&FindReplace); > > } >
|
| | | |
[Win32] Find Common Dialog 08.06.01 04:08
Автор: LBH Статус: Незарегистрированный пользователь
|
> > FindReplace.lStructSize=sizeof(FindReplace); > > FindReplace.lpstrFindWhat = ""; > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > ty dolzhen alocirovat` pamiat` sdes`, I zhe tebe uzhe > napisal > FindReplace.lpstrFindWhat = new char[80]; > //potom ne zabud` delete []FindReplace.lpstrFindWhat;
спасибо; теперь я понял окончательно как работают common диалоги=)
|
|
[Win32] Find Common Dialog 08.06.01 03:03
Автор: + <Mikhail> Статус: Elderman
|
Did you dynamically allocate memory for "lpfr->lpstrFindWhat"?
|
|
|