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

Delphi Sources



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

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

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

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

Кое что исправил:
Код:
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
По умолчанию

пробовал вот так:
Код:
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
По умолчанию

Код:
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 всё оказалось очень просто:
Код:
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, время: 23:22.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter