![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Господа программисты!
Прошу помощи в следующей задаче: Мне нужно сделать так, чтоб при выборе пункта в 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 и писать по аналогии. Последний раз редактировалось Rokuell, 06.11.2009 в 22:23. |
|
#11
|
||||
|
||||
|
кажется, CBN_SELCHANGE посылается перед изменение значения combobox'а
попробуйте cbn_closeup |
|
#12
|
||||
|
||||
|
Цитата:
Похоже, что так http://msdn.microsoft.com/en-us/libr...21(VS.85).aspx тогда придется обрабатывать сообщение WM_COMMAND |
|
#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. |
|
#14
|
||||
|
||||
|
Rokuell, спасибо - то, что нужно было сделать.
Работает так, как надо! Понял, что я делал не так! |