Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.11.2009, 23:20
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
Вопрос Чтение, установка текста с помощью WinAPI

Господа программисты!
Прошу помощи в следующей задаче:

Мне нужно сделать так, чтоб при выборе пункта в Combobox, содержимое этого пункта заносилось в Label.
Пытаюсь следующим образом:

Код:
1
2
3
4
5
6
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  
Старый 04.11.2009, 23:31
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Немного теории...
http://www.firststeps.ru/mfc/winapi/win/r.php?81
http://www.firststeps.ru/mfc/steps/help/r.php?183
Попробуй сначала получить handle объектов...и работать с хендлом...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #3  
Старый 04.11.2009, 23:40
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

перепробовал все что можно:
для чтения

Код:
1
2
3
SendMessage(Combobox1, WM_GETTEXT, 80, LongInt(szBuf));
GetWindowText(ComboBox1, szBuf, 1024);
GetDlgItemText(ComboBox1, 0, szBuf , 100 );

для записи
Код:
1
SendMessage(Label1, WM_SETTEXT, 80, LongInt(szBuf));

с хэндлами я и работаю - здесь в примере - Combobox1 и Label1 - и есть хэндлы этих элементов.

Код:
1
2
3
Label1 : HWND; //TLabel
ComboBox1 : HWND; //TComboBox
Button1 : HWND; //TButton
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
  #4  
Старый 05.11.2009, 10:27
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

Кое что исправил:
Код:
1
2
3
4
5
6
7
8
9
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  
Старый 05.11.2009, 10:45
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

пробовал вот так:
Код:
1
2
idCombobox := GetDlgCtrlId(Combobox1);
GetDlgItemText(ComboBox1, idCombobox, PAnsiChar(szBuf) , 100 );

тоже не получается...
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
  #6  
Старый 06.11.2009, 10:52
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

Никто не подскажет???
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
  #7  
Старый 06.11.2009, 13:11
Rat Rat вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 391
Репутация: 6078
По умолчанию

Код:
1
2
3
4
procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  label1.Caption := Combobox1.Text;
end;

Так не пойдет?
Ответить с цитированием
  #8  
Старый 06.11.2009, 19:21
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

Rat, нет.
Для VCL - безусловно, но для WinAPI - увы (((
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
  #9  
Старый 06.11.2009, 19:22
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

То есть мне то же самое надо на этом винапи реализовать...
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
  #10  
Старый 06.11.2009, 20:32
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение

Как вариант - смотри исходники 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  
Старый 06.11.2009, 20:39
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

кажется, CBN_SELCHANGE посылается перед изменение значения combobox'а
попробуйте cbn_closeup
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #12  
Старый 06.11.2009, 20:48
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Цитата:
Сообщение от The Shadow
кажется, CBN_SELCHANGE посылается перед изменение значения combobox'а

Похоже, что так
http://msdn.microsoft.com/en-us/libr...21(VS.85).aspx

тогда придется обрабатывать сообщение WM_COMMAND
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #13  
Старый 06.11.2009, 22:21
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
Сообщение

Через обработку сообщения WM_COMMAND всё оказалось очень просто:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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  
Старый 07.11.2009, 13:16
Аватар для AllMaNi
AllMaNi AllMaNi вне форума
Новичок
 
Регистрация: 15.06.2009
Адрес: Россия, ЮФО
Сообщения: 57
Репутация: 10
По умолчанию

Rokuell, спасибо - то, что нужно было сделать.
Работает так, как надо!

Понял, что я делал не так!
__________________
Пусть ненавидят миллионы, зато любят тыщи (с) Многоточие
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:15.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025