Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> свойства RadioButton, определить ее нажатость 
:(
    Опции темы
Norfonzor
Дата 22.12.2009, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



необходимо сделать вот такой калькулятор средствами win32 api
user posted image

помогите ответить на вопрос
при нажатии на button(посчитать) как узнать какая RadioButton отмечена??
if RadioButton1.checked then плюсуй else
if RadioButton2.checked then минусуй итд...
пытался получить отметку при нажатии, присваивал p № кнопки но при нажатии Button p стирался (p-не глобальная), при p-глобальной вылезала ошибка.
 smile   smile 
Код

program LR2;

uses
  Windows,
  Messages,
  SysUtils;

const
  id_Button = 100;
  id_Edit = 101;
  id_Edit_2 = 102;
  id_RadioButton_1 =1;
  id_RadioButton_2 =2;
  id_RadioButton_3 =3;
  id_RadioButton_4 =4;
  bwidth = 100;
  bheight = 20;
  ewidth = 100;
  eheight = 20;
  rwidth = 50;
  rheight = 20;
  cListHeight = 100;



function PlainWinProc (hWnd: THandle; nMsg: UINT;
  wParam, lParam: Cardinal): Cardinal; export; stdcall;
var
  Rect: TRect;
  s1, s2, s_c: array [0..127] of Char;
  Rbtn_check,i,n1, n2:integer;
   p: integer;


  begin
  Result := 0;
  case nMsg of
    wm_Create:
      begin
      CreateWindowEx (0,
                      'button',
                      '&Click here',
                       ws_Child or ws_Visible or ws_Border or bs_PushButton,
                       0, 0,
                       bwidth, bheight,
                       hwnd,
                       id_Button,
                       hInstance,
                       nil);

       CreateWindowEx (0,
                      'Edit',
                       '',
                       ws_Child or ws_Visible or ws_Border or es_Number,
                       0, 0,
                       ewidth, eheight,
                       hwnd,
                       id_Edit,
                       hInstance,
                       nil);

       CreateWindowEx (0,
                      'Edit',
                       '',
                       ws_Child or ws_Visible or ws_Border or es_Number,
                       0, 0,
                       ewidth, eheight,
                       hwnd,
                       id_Edit_2,
                       hInstance,
                       nil);


       SetWindowText(GetDlgItem (hWnd, id_Edit),'0');
       SetWindowText(GetDlgItem (hWnd, id_Edit_2),'0');

       CreateWindowEx( 0,
                      'Button',
                      '+',
                       WS_CHILD or WS_VISIBLE or BS_RADIOBUTTON,
                       0, 0,
                       rwidth, rheight,
                       hWnd,
                       id_RADIOBUTTON_1,
                       hInstance,
                       nil );
       SendMessage(id_RADIOBUTTON_1, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

       CreateWindowEx( 0,
                      'Button',
                      '-',
                       WS_CHILD or WS_VISIBLE or BS_RADIOBUTTON,
                       0, 0,
                       rwidth, rheight,
                       hWnd,
                       id_RADIOBUTTON_2,
                       hInstance,
                       nil );
       SendMessage(id_RADIOBUTTON_2, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

      CreateWindowEx( 0,
                      'Button',
                      '/',
                       WS_CHILD or WS_VISIBLE or BS_RADIOBUTTON,
                       0, 0,
                       rwidth, rheight,
                       hWnd,
                       id_RADIOBUTTON_3,
                       hInstance,
                       nil );
       SendMessage(id_RADIOBUTTON_3, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

      CreateWindowEx( 0,
                      'Button',
                      '*',
                       WS_CHILD or WS_VISIBLE or BS_RADIOBUTTON,
                       0, 0,
                       rwidth, rheight,
                       hWnd,
                       id_RADIOBUTTON_4,
                       hInstance,
                       nil );
       SendMessage(id_RADIOBUTTON_4, WM_SETFONT, GetStockObject( ANSI_VAR_FONT ), 0 );

        end;
    wm_Size:
    begin

      GetClientRect (hWnd, Rect);

      SetWindowPos (
        GetDlgItem (hWnd, id_Button),
        0,
        Rect.right - bwidth-20,
        Rect.Bottom - bheight - 10,
        0, 0,
        swp_NoZOrder or swp_NoSize);

      SetWindowPos (
        GetDlgItem (hWnd, id_Edit),
        0,
        Rect.Left + 10,
        Rect.Top + 10,
        0, 0,
        swp_NoZOrder or swp_NoSize);

      SetWindowPos (
        GetDlgItem (hWnd, id_Edit_2),
        0,
        Rect.Left + ewidth + 20,
        Rect.Top + 10,
        0, 0,
        swp_NoZOrder or swp_NoSize);


      SetWindowPos (
        GetDlgItem (hWnd, id_RadioButton_1),
        0,
        Rect.Left + 10,
        Rect.Top + eHeight+20,
        0, 0,
        swp_NoZOrder or swp_NoSize);

      SetWindowPos (
        GetDlgItem (hWnd, id_RadioButton_2),
        0,
        Rect.Left + 10,
        Rect.Top+eHeight+20+rheight+5,
        0, 0,
        swp_NoZOrder or swp_NoSize);

       SetWindowPos (
        GetDlgItem (hWnd, id_RadioButton_3),
        0,
        Rect.Left + 10,
        Rect.Top+eHeight+20+(rheight+5)*2,
        0, 0,
        swp_NoZOrder or swp_NoSize);

       SetWindowPos (
        GetDlgItem (hWnd, id_RadioButton_4),
        0,
        Rect.Left + 10,
        Rect.Top+eHeight+20+(rheight+5)*3,
        0, 0,
        swp_NoZOrder or swp_NoSize);

    end;
    wm_Command:

     if (LoWord( wParam )>= id_RadioButton_1)and(LoWord( wParam )<= id_RadioButton_4) then
        begin
        CheckRadioButton( hWnd, id_RadioButton_1, id_RadioButton_4, LoWord( wParam ) );

        //GetMem( pchar(p), 1);
        case LoWord( wParam )of
        1:p:=1;
        2:p:=2;
        3:p:=3;
        4:p:=4;
        end;

        end else


      if LoWord (wParam) = id_Button then
        if HiWord (wParam) = bn_Clicked then
          begin
           GetWindowText(GetDlgItem (hWnd, id_Edit), s1, GetWindowTextLength(GetDlgItem (hWnd, id_Edit))+1);
           GetWindowText(GetDlgItem (hWnd, id_Edit_2), s2, GetWindowTextLength(GetDlgItem (hWnd, id_Edit_2))+1);



            MessageBox (hWnd, pchar(p), 'p=', MB_OK);

             if p=1 then MessageBox (hWnd, PChar(Floattostr(StrToInt(s1)+StrToInt(s2))), 'Результат', MB_OK);
             if p=2 then MessageBox (hWnd, PChar(Floattostr(StrToInt(s1)-StrToInt(s2))), 'Результат', MB_OK);
             if p=3 then if StrToInt(s2) = 0 then MessageBox (hWnd, 'Деление на 0 запрещено', 'Ошибка', MB_OK) else MessageBox (hWnd, PChar(Floattostr(StrToInt(s1)/StrToInt(s2))), 'Результат', MB_OK);
             if p=4 then MessageBox (hWnd, PChar(Floattostr(StrToInt(s1)*StrToInt(s2))), 'Результат', MB_OK);
             //FreeMem( pchar(p), 1);

          end;

    wm_Destroy:
      PostQuitMessage (0);
    else
      Result := DefWindowProc (hWnd, nMsg, wParam, lParam);
  end;
end;

procedure WinMain;
var
  hWnd: THandle;
  Msg: TMsg;
  WndClassEx: TWndClassEx;
begin

  WndClassEx.cbSize := sizeOf (TWndClassEx);
  WndClassEx.lpszClassName := 'PlainWindow';
  WndClassEx.style := cs_VRedraw or cs_HRedraw;
  WndClassEx.hInstance := HInstance;
  WndClassEx.lpfnWndProc := @PlainWinProc;
  WndClassEx.cbClsExtra := 0;
  WndClassEx.cbWndExtra := 0;
  WndClassEx.hIcon := LoadIcon (hInstance,
    MakeIntResource ('MAINICON'));
  WndClassEx.hIconSm  := LoadIcon (hInstance,
    MakeIntResource ('MAINICON'));
  WndClassEx.hCursor := LoadCursor (0, idc_Arrow);;
  WndClassEx.hbrBackground := GetStockObject (white_Brush);
  WndClassEx.lpszMenuName := nil;

  if RegisterClassEx (WndClassEx) = 0 then
    MessageBox (0, 'Invalid class registration',
      'Plain API', MB_OK)
  else
  begin
    hWnd := CreateWindowEx (
      WS_SIZEBOX,
      WndClassEx.lpszClassName,
      'Пример',
      ws_OverlappedWindow,
      cw_UseDefault, cw_UseDefault,
      240, 300,
      0,
      0,
      HInstance,
      nil);
    if hWnd = 0 then
      MessageBox (0, 'Window not created',
        'Plain API', MB_OK)
    else
    begin
      ShowWindow (hWnd, sw_ShowNormal);
      while GetMessage (Msg, 0, 0, 0) do
      begin
        TranslateMessage (Msg);
        DispatchMessage (Msg);
      end;
    end;
  end;
end;

begin
  WinMain;
end.


PM MAIL   Вверх
profesiachuvak
Дата 22.12.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: нет
Всего: 4



Вот так надо описать условие которое Вам надо :

Код


 if radiobutton1.checked = true then  Sum:= a+ b;  // находим сумму
 if radiobutton2.checked = true then  Raz := a-b;   // находим разницу


P.s. И не надо вам эти присваивания в виде p=1 и т.д. 

Это сообщение отредактировал(а) profesiachuvak - 22.12.2009, 22:38


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
volvo877
Дата 22.12.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 5
Всего: 116



Цитата(profesiachuvak @  22.12.2009,  21:36 Найти цитируемый пост)
Вот так надо описать условие которое Вам надо :
Можно поинтересоваться, а где взять radiobutton1 в WinAPI приложении? То есть, подразумевается "и WinAPI тебе тоже не надо, используй VCL"?

Norfonzor, вынес P как глобальную, ошибок не наблюдаю... Что тебя смутило?
PM MAIL   Вверх
profesiachuvak
Дата 23.12.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 283
Регистрация: 7.11.2009
Где: Беларусь, Минск

Репутация: нет
Всего: 4



Цитата(volvo877 @  22.12.2009,  22:54 Найти цитируемый пост)
Можно поинтересоваться, а где взять radiobutton1 в WinAPI приложении? То есть, подразумевается "и WinAPI тебе тоже не надо, используй VCL"?


Ну да что-то я ступил. Скорее подразумевалось VCL. 
 smile 

Это сообщение отредактировал(а) profesiachuvak - 23.12.2009, 13:50


--------------------
Закон Мерфи :если есть вероятность того, что какая-нибудь неприятность может случиться, то она обязательно произойдет.
PM MAIL   Вверх
Norfonzor
Дата 23.12.2009, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 17.10.2008

Репутация: нет
Всего: нет



хмм... странно вчера этот код не работал. видать делфи опять тупанул и вынес мой мозг  smile 
я нашел уже меня интересовала команда 
sendMessage(GetDlgItem (hWnd, id_RadioButton_1), BM_GETCHECK, 0, 0) если =1 то radioButton отмечена 

PM MAIL   Вверх
Rrader
  Дата 23.12.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Norfonzor, лучше сравнивай не с жестко зашитой в код единицей, а с константой BST_CHECKED.



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.