Массив динамических кнопок
Моя идея решения:
// в файле .h обязательно прописать #include <Buttons.hpp >
for (int i=0; i<=10; i++)
{
for (int i=0; i<=10; i++)
{
MyField[j] = new TSpeedButton;
/* + расставить кнопки по местам вроде
MyField[j] -> top = ...;
*/
}
}
если не писать for , приложение запускается.
правда я не совсем уверен, что это именно массив указателей.
MyField[j] = new TSpeedButton; пишет, что не существует TSpeedButton::TSpeedButton();
как осуществить массив кнопок?
как вообще создавать динамически графические компоненты?
{
//.....
public:
TSpeedButton *MyField[10][10];
};
//......
for (int i = 0; i [color=red]<[/color] 10; i++)
for (int j = 0; j [color=red]<[/color] 10; j++)
{
MyField[j] = new TSpeedButton(this);
MyField[j]->Height = 10;
MyField[j]->Width = 10;
MyField[j]->Top = i*10 + 1;
MyField[j]->Left = j*10 + 1;
MyField[j]->Parent = this;
}
Как в сапере - можно код?
С чего вашим величеством взято - что вы знаете как в сапере?
Может для начала стоит описать ЗАДАЧУ?
Правильно. Компоненты формы являются производными от класса TComponent, который не имеет конструктора "по умолчанию".
Создавать объекты необходимо, передавая указатель на "владельца" (Owner) - объект, который осуществляет дальнейшее управление выделенной памятью.
В данном случае - это форма.
MyField[j]->Parent = this; // Указываем "родительский" объект
"Родитель" (parent), в отличие от "владельца", реализует отображение компонента. Координаты Top и Left описывают положение именно от угла "родителя".
как осуществить массив кнопок?
как вообще создавать динамически графические компоненты?
DrawGrid и метод OnDrawCell или если хочешь компонент, то наследуй от TCustomGrid.
С чего вашим величеством взято - что вы знаете как в сапере?
кнопулины ВЫГЛЯДЯТ как в сапере. просто слитная таблица.
если использовать метод flat, как для кнопок определять события (например OnClick)
Можно ли использоваль OnMouseMove для всего окна (не зависимо от того, на какие обьекты становится курсор)
если использовать метод flat, как для кнопок определять события (например OnClick)
Смотри F.A.Q один из первых вопросов вроде.
Можно ли использоваль OnMouseMove для всего окна (не зависимо от того, на какие обьекты становится курсор)
самый простой способ
в таймере определяешь координаты мыши (GetCursorPos()) если они в пределах Rect твоего окна и мышка меняет положение (сравнивай старые и новые координаты) то выполняй то что тебе надо.
-> где FAQ ?
если использовать метод flat, как для кнопок определять события (например OnClick)
{
//.....
public:
TSpeedButton *MyField[10][10];
void __fastcall SpeedButtonClick(TObject *Sender);
};
//......
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
{
MyField[j] = new TSpeedButton(this);
MyField[j]->Height = 10;
MyField[j]->Width = 10;
MyField[j]->Top = i*10 + 1;
MyField[j]->Left = j*10 + 1;
MyField[j]->Parent = this;
MyField[j]->OnClick = SpeedButtonClick;
}
В реализации метода SpeedButtonClick различать координаты можно, например, по свойству Tag (естественно, его необходимо в таком случае задать при создании кнопки), либо ища указатель Sender в заданном масиве указателей на кнопки. Первый вариант намного предпочтительней
#define HEIGHT 10
//....
class TForm1 : public TForm
{
//.....
public:
TSpeedButton *MyField[HEIGHT][WIDTH];
void __fastcall SpeedButtonClick(TObject *Sender);
};
//......
for (int i = 0; i < HEIGHT; i++)
for (int j = 0; j < WIDTH; j++)
{
MyField[j] = new TSpeedButton(this);
MyField[j]->Height = 10;
MyField[j]->Width = 10;
MyField[j]->Top = i*10 + 1;
MyField[j]->Left = j*10 + 1;
MyField[j]->Parent = this;
MyField[j]->Tag = i * WIDTH + j;
MyField[j]->OnClick = SpeedButtonClick;
}
//....
void __fastcall TForm1::SpeedButtonClick(TObject *Sender)
{
TSpeedButton * Button = (TSpeedButton * )Sender;
int i = Button->Tag / WIDTH;
int j = Button->Tag - i * WIDTH;
ShowMessage("i = " + IntToStr(i) + "\nj = " + IntToStr(j));
}
В сапере нет ни одной кнопки, это я тебе точно говорю. Все нарисовано.
Просто интересно.
Сам когато писал на паскале под дос.
Просто интересно.
Сам когато писал на паскале под дос.
у Била Гейтса:)