Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Кнопки.


Автор: JAnty 7.6.2005, 20:08
Есть 40 кнопок. "Кнопка1"..."Кнопка40".
При нажатии на каждую из них, должно вводитьса число в глобальную переменную int tmp;
Тоесть, при нажатии на "Кнопка10" переменная tmp=10;
Прописывать в каждом обработчеке очеть муторно. Должен быть кокойто простой способ,
например как в ВижуалБэйсике с Индексами.
Подскажите пожалуйсто.

Автор: Mysterio 8.6.2005, 07:33
Попробуй брать из Name 1-2 последних символа, распиши для них событие.Теперь можно для всех кнопок установить единое св-во onclick(или какое тебе нужно)..
ЗЫ.не могу представить пример такой программы... по-моему это всё с успехом можно заменить TrackBar'ом.smile

Автор: chaos 8.6.2005, 08:52
Вот тебе наглядный пример:
Код

#include <windows.h>
#include <stdio.h>

#define COLBUT 40

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam);

HINSTANCE hInst;
int tmp;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    hInst = hInstance;
    TCHAR *szName = "test";

    WNDCLASS WndClass;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    WndClass.hInstance = hInstance;
    WndClass.lpfnWndProc = WndProc;
    WndClass.lpszClassName = szName;
    WndClass.lpszMenuName = NULL;
    WndClass.style = CS_HREDRAW | CS_VREDRAW;

    if (!RegisterClass(&WndClass))
        return 0;
    
    HWND hWnd = CreateWindow(
                    szName,
                    szName,
                    WS_OVERLAPPEDWINDOW,
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,
                    CW_USEDEFAULT,
                    NULL,
                    NULL,
                    hInstance,
                    NULL);

    if (!hWnd)
        return 0;


    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    MSG Msg;
    while (GetMessage(&Msg, NULL, 0,0))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }

    return Msg.wParam;
}

HWND *buts;

LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, UINT wParam, LONG lParam)
{
    int n,m=0,p=0;
    char str[10];

    switch (Message)
    {
    case WM_CREATE:
        buts = new HWND[COLBUT];

        for (n=0; n < COLBUT; n++)
        {
            sprintf(str, "Button %d", n);
            buts[n] = CreateWindow(
                            "button",
                            str,
                            WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
                            1*m,p*30,100,25,
                            hWnd,
                            (HMENU)(1000+n),
                            hInst,
                            NULL);
            if ((n%8)==0)
            {
                m += 105;
                p = 0;
            }
            else
                p++;

        }
        return 0;

    case WM_COMMAND:
        sprintf(str, "Button %d", (LOWORD(wParam)-1000));
        MessageBox(hWnd, str, "Information", MB_OK);
        tmp = LOWORD(wParam)-1000;
        return 0;

    case WM_DESTROY:
        delete[] buts;
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hWnd, Message, wParam, lParam);
}


ПОЛЬЗУЙСЯ))

Автор: Vyacheslav 8.6.2005, 09:43
Используй свойство Tag. Инициализируй его в рантаме(в цикле) или в дизайне соответствующим значением и
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        tmp = ((TButton*)Sender)->Tag;
}


Автор: JAnty 8.6.2005, 10:43
Цитата(Mysterio @ 8.6.2005, 07:33)
ЗЫ.не могу представить пример такой программы...


Cлабая фантазия. Мне нужно 45 кнопок. Прямоугольное поле 9*5.

Vyacheslav Огромное спасибо. Именно такого простого решения я и ожидал.
Добавлено @ 10:46
Офигенно круто! Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)