|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Чтение, установка текста с помощью WinAPI
Господа программисты!
Прошу помощи в следующей задаче: Мне нужно сделать так, чтоб при выборе пункта в Combobox, содержимое этого пункта заносилось в Label. Пытаюсь следующим образом: Код:
if (lParam = ComboBox1) and (HiWord(wParam) = BN_CLICKED) then //OnClick компонента ComboBox1 begin GetWindowText(ComboBox1, szBuf, 1024); SetWindowText(Label1, szBuf); end; где - szBuf :PChar; Но Label - просто очищается. Если задать в ручную - szBuf:='12345'; то Label так и становится - 12345. Видимо я не правильно пытаюсь получить текст из Combobox Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие Последний раз редактировалось AllMaNi, 04.11.2009 в 23:23. |
#2
|
||||
|
||||
Немного теории...
http://www.firststeps.ru/mfc/winapi/win/r.php?81 http://www.firststeps.ru/mfc/steps/help/r.php?183 Попробуй сначала получить handle объектов...и работать с хендлом... В начале был Бит, потом Байт и только потом появилось Слово... |
#3
|
||||
|
||||
перепробовал все что можно:
для чтения Код:
SendMessage(Combobox1, WM_GETTEXT, 80, LongInt(szBuf)); GetWindowText(ComboBox1, szBuf, 1024); GetDlgItemText(ComboBox1, 0, szBuf , 100 ); для записи Код:
SendMessage(Label1, WM_SETTEXT, 80, LongInt(szBuf)); с хэндлами я и работаю - здесь в примере - Combobox1 и Label1 - и есть хэндлы этих элементов. Код:
Label1 : HWND; //TLabel ComboBox1 : HWND; //TComboBox Button1 : HWND; //TButton Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#4
|
||||
|
||||
Кое что исправил:
Код:
if (lParam = ComboBox1) and (HiWord(wParam) = CBN_SELCHANGE) then //OnClick компонента ComboBox1 begin setlength(szbuf, 80); GetWindowText(ComboBox1, pansichar(szBuf), 80); SendMessage(Label1 , WM_SETTEXT, 80, LongInt(szBuf)); end; Работает но немного не так - на лабел выводится предыдущая запись: если выбираю перую строку - то лабел пустой, вторую, выводится первый и т.д. Где-то видимо надо идекс указать...а где хз... Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#5
|
||||
|
||||
пробовал вот так:
Код:
idCombobox := GetDlgCtrlId(Combobox1); GetDlgItemText(ComboBox1, idCombobox, PAnsiChar(szBuf) , 100 ); тоже не получается... Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#6
|
||||
|
||||
Никто не подскажет???
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#7
|
|||
|
|||
Код:
procedure TForm1.ComboBox1Select(Sender: TObject); begin label1.Caption := Combobox1.Text; end; Так не пойдет? |
#8
|
||||
|
||||
Rat, нет.
Для VCL - безусловно, но для WinAPI - увы ((( Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#9
|
||||
|
||||
То есть мне то же самое надо на этом винапи реализовать...
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |
#10
|
||||
|
||||
Как вариант - смотри исходники VCL, как это там реализовано.
Иерархия: TCustomCombo -> TCustomComboBox -> TComboBox Событие OnSelect объявлено в классе TCustomCombo : property OnSelect: TNotifyEvent read FOnSelect write FOnSelect; FOnSelect вызывается в методе TCustomCombo.Select метод TCustomCombo.Select вызывается в TCustomComboBox.SelectItem метод TCustomComboBox.SelectItem вызывается в TCustomComboBox.KeyPress Вывод: можно смотреть как реализован TCustomComboBox.KeyPress и писать по аналогии. Велик и могуч наш Object Pascal ! ICQ: 357-591-887 Последний раз редактировалось Rokuell, 06.11.2009 в 22:23. |
#11
|
||||
|
||||
кажется, CBN_SELCHANGE посылается перед изменение значения combobox'а
попробуйте cbn_closeup Что делать, когда сломался комп: 1. Если вы юзер - делать ноги. 2. Если ремонтник - делать деньги. 3. Если вы программист - делать вид, что так было задумано. |
#12
|
||||
|
||||
Цитата:
Похоже, что так http://msdn.microsoft.com/en-us/libr...21(VS.85).aspx тогда придется обрабатывать сообщение WM_COMMAND Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#13
|
||||
|
||||
Через обработку сообщения WM_COMMAND всё оказалось очень просто:
Код:
program Project1; uses Windows, Messages; const WndClass = 'TWinApiWnd'; WndCaption = 'Form1'; wndWidth:integer=400; // длина окна wndHeight:integer=200; // ширина окна var Wc: TWndClassEx; Wnd: HWND; Label1:HWND; ComboBox1:HWND; ComboBox2:HWND; function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall; var buff: PChar; bufflen: integer; idx: integer; //id:integer; // идентификатор ComboBox begin case Msg of WM_DESTROY: begin PostQuitMessage( 0 ); Result := 0; Exit; end; WM_COMMAND: begin if (HIWORD(wParam)=CBN_SELCHANGE) then begin // узнать какой ComboBox послал сообщение можно либо через его идентификатор - LOWORD(wParam) // либо через его хэндл - lParam //id:=LOWORD(wParam); // индекс выбранной строки idx := SendMessage( lParam, CB_GETCURSEL, 0, 0); // длина выбранной строки bufflen := SendMessage( lParam, CB_GETLBTEXTLEN, idx, 0 ) + 1; GetMem(buff, bufflen); //получаем выбранную строку SendMessage( lParam, CB_GETLBTEXT, idx, Integer(buff)); //ставим текст в Label SendMessage( Label1, WM_SETTEXT, 0, Integer(buff)); FreeMem(buff, bufflen); Result := 0; end else Result := DefWindowProc( Wnd, Msg, wParam, lParam ); end; else Result := DefWindowProc( Wnd, Msg, wParam, lParam ); end; end; procedure InitWindowClass(out WindowClass:TWndClassEx); begin with WindowClass do begin cbSize := SizeOf( WindowClass ); style := CS_HREDRAW or CS_VREDRAW; lpfnWndProc := @WindowProc; cbClsExtra := 0; cbWndExtra := 0; hInstance := hInstance; hIcon := LoadIcon( 0, IDI_APPLICATION ); hCursor := LoadCursor( 0, IDC_ARROW ); hbrBackground := COLOR_BTNSHADOW; lpszMenuName := nil; lpszClassName := WndClass; end; end; function CreateWnd():HWND; begin Result := CreateWindowEx( {Создает окно и возвращает ссылку на окно типа HWnd.} 0, WndClass, {Имя класса, к которому принадлежит создаваемое окно.} WndCaption, {Заголовок окна.} WS_OVERLAPPEDWINDOW,{Стиль окна, сейчас - комбинация стилей.} (GetSystemMetrics(SM_CXFULLSCREEN)-wndWidth) div 2, {X - начальная позиция верхнего левого угла} (GetSystemMetrics(SM_CYFULLSCREEN)-wndHeight) div 2, {Y - начальная позиция верхнего левого угла} wndWidth, {Width - начальная длина окна} wndHeight, {Height - начальная ширина окна} 0, {WndParent - родительское окно данного окна.} 0, {Menu - меню, используемое данным окном.} hInstance, {Instance - указывает на экземпляр программы. этот параметр указывается, чтобы оконная функция имела доступ к сегменту данных программы.} nil {Param - определяет дополнительную информацию, посылаемую через сообщение wm_Create.} ); end; function CreateLabel1(hParent:HWND):HWND; begin Result := CreateWindow('STATIC', 'Label1', WS_CHILD or WS_VISIBLE, 8, 8, 150, 21, hParent, 0, hInstance, nil); SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 ); end; function CreateComboBox1(hParent:HWND):HWND; begin Result := CreateWindow('COMBOBOX', 'ComboBox1', WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST, 8, 32, 150, 250, hParent, 1, // идентификатор ComboBox - при посылке сообщения CBN_SELCHANGE передаётся в LOWORD(wParam) hInstance, nil); SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 ); // Добавляем строки SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item1'))); SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item2'))); SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('Item3'))); // Выбираем первый элемент <=> ItemIndex := 0; SendMessage(Result, CB_SETCURSEL, 0, 0); end; function CreateComboBox2(hParent:HWND):HWND; begin Result := CreateWindow('COMBOBOX', 'ComboBox2', WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST, 8, 58, 150, 250, hParent, 2, // идентификатор ComboBox - при посылке сообщения CBN_SELCHANGE передаётся в LOWORD(wParam) hInstance, nil); SendMessage( Result, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 ); // Добавляем строки SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String1'))); SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String2'))); SendMessage(Result, CB_ADDSTRING, 0, Integer(PAnsiChar('String3'))); // Выбираем первый элемент <=> ItemIndex := 0; SendMessage(Result, CB_SETCURSEL, 0, 0); end; var Msg: TMsg; begin InitWindowClass( Wc ); RegisterClassEx( Wc ); Wnd := CreateWnd(); Label1 := CreateLabel1( Wnd ); ComboBox1 := CreateComboBox1( Wnd ); ComboBox2 := CreateComboBox2( Wnd ); ShowWindow( Wnd, SW_SHOWNORMAL ); while GetMessage( Msg, 0, 0, 0 ) do begin TranslateMessage( Msg ); DispatchMessage( Msg ); end; Halt( Msg.wParam ); end. Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#14
|
||||
|
||||
Rokuell, спасибо - то, что нужно было сделать.
Работает так, как надо! Понял, что я делал не так! Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие |