Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Массив из кнопок.


Автор: Nikolasha 11.12.2005, 19:08
Привет всем.
Возник вопросик, можно ли создать массив из TSpeedButton'ов?(Для удобства работы - морской бой) Мне нужно создать два таких массива по 100 элементов (10х10). Можно ли это организовать? Я читал в DRKB по массив чекбоксов. Но чего то с баттонами не работает. Помогите, пожалуйста.
Заранее спасибо.

Автор: FRAGNATIC 11.12.2005, 19:28
конечно можно=)
ток зачем тебе для морского боя 200 кнопок? может лучше сделать фон ввиде картинке и на ней дапустим рисовать чёнить типа при нажатии и если мимо то просто крестик нарисовать =)))

Автор: FRAGNATIC 11.12.2005, 19:40
Код

var
  btns: array [1..10] of TButton;
  i: integer;
begin
  for i:=low(btns) to high(btns) do
  begin
    btns[i]:=TButton.Create(form1);
    btns[i].Width:=10;
    btns[i].Height:=10;
    btns[i].Top:=10*i;
    btns[i].Left:=10;
    form1.InsertControl(btns[i]);
  end;
end;

что-то типа этого
тока не забудь их потом все удалить (free )
а для этого масив лучше сделать глобальной переменой )

Автор: Poseidon 11.12.2005, 21:40
Цитата(Nikolasha @ 11.12.2005, 19:08)
можно ли создать массив из TSpeedButton'ов

Цитата(FRAGNATIC @ 11.12.2005, 19:40)
btns: array [1..10] of TButton;
...
btns[i]:=TButton.Create(form1);
smile
Наверное правельнее будет
Код
btns: array [1..10] of TSpeedButton;

Код
btns[i]:=TSpeedButton.Create(form1);


Автор: FRAGNATIC 11.12.2005, 22:23
Poseidon
а разница?
я пример привёл
а там уже хоть из чего угодно делай)

Автор: Nikolasha 13.12.2005, 22:10
Спасибо за ответы. Только вот нужен двумерный массив.
Еще один вопрос. у меня случайным образом генериться массив кораблей следующего типа:
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1
0 0 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0 0 0
1 0 1 1 1 1 0 0 1 0
0 0 0 0 0 0 0 0 1 0
1 0 1 0 1 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0

В нем, соответственно, еденички отвечают за палубы у корабликов. На форме лежат 10х10(=100 ) кнопок. Как можно организовать чтобы на кнопочках кот. соответствует еденичка появилась определенная картинка?

Автор: Rennigth 13.12.2005, 22:14
Nikolasha
ну если чтоб попроще то создавай массив из кнопок 10X10 и у них есть property Tag, в нем можешь хранить значения 0/1(палуба/море) .
Добавлено @ 22:15
ну и соответственно картикнки грузить в зависимости от этого значения.

Автор: Nikolasha 13.12.2005, 22:28
А каким образом этот массив разместиться на форме где мне нужно?

Автор: YurikGL 13.12.2005, 22:53
Цитата
А каким образом этот массив разместиться на форме где мне нужно?


уже было....

Цитата
btns[i].Width:=10;
btns[i].Height:=10;
btns[i].Top:=10*i;
btns[i].Left:=10;

Автор: sexton 14.12.2005, 08:50
Думаю в данной ситуации StringGrid бы вполне подошел вместо такго дикого количесвта кнопок.

Автор: Nikolasha 14.12.2005, 17:03
Спасибо, все получилось.
Еще один вопрос: как можно теперь обрабатывать события onclick для этих кнопок (можно ли как нибудь использовать as Sender)?
Добавлено @ 17:05
Код

for i:=low(btns) to high(btns) do
  begin
    btns[i]:=TSpeedButton.Create(form1);
    btns[i].Width:=33;
    btns[i].Height:=33;
    btns[i].Top:=(33*(((i-1) div 10)+1));
    btns[i].Left:=33*(i-(((i-1) div 10)*10)) ;
    form1.InsertControl(btns[i]);
  end;

Вот код для того, чтобы кнопочки встали в квадрат 10x10.

И еще вопрос. Как с этот массив убрать из памяти? с помощью free можно? Если да, то как?

Автор: FRAGNATIC 14.12.2005, 18:20
Код

procedure TForm1.BtnClick(Sender: TObject);
begin
  showmessage(IntToStr(TButton(sender).Tag ));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  btns: array [1..10] of TButton;
  i: integer;
begin
  for i:=low(btns) to high(btns) do
  begin
    btns[i]:=TButton.Create(form1);
    btns[i].Width:=10;
    btns[i].Height:=10;
    btns[i].Top:=10*i;
    btns[i].Left:=10;
    btns[i].Tag:=i;
    btns[i].OnClick:=BtnClick;
    form1.InsertControl(btns[i]);
  end;
end;


TButton(sender) делай с ним что хош
насчёт освобождения поидеи должен сам освобождатся тк кнопки лежат на форме
ну или просто мож в цикле FRee

Автор: Nikolasha 14.12.2005, 19:55
Не пашет, на стадии компиляции выдает ошибку следущего содержания:
Expected an identifier but invalid character character #160 found

smile
Что не так? smile

Автор: Демо 14.12.2005, 22:08
Я бы рекомендовал использовать TImage - 100 штук. либо TImageList.
В этом случае ты без проблем на TImsage можешь рисовать все, что угодно, на каждом обрабатывать OnClick.
Да и выглядеть будет красивее, по-моему.

Автор: THenry 14.12.2005, 22:42
Писал такую штуку тока на С++ в StringGrid. Удобно и проще некуда.

P.S. А как насчет того что вокруг корабля на расстоянии одной клетки не может быть другого корабля? А твоя маска поля боя это не предусматривает, добавь еще вокруг каждого корабля "оградку" к примеру -1

Автор: Nikolasha 14.12.2005, 22:47
Цитата
А как насчет того что вокруг корабля на расстоянии одной клетки не может быть другого корабля? А твоя маска поля боя это не предусматривает

Если ты глянешь на массив, то увидишь, что все корабли стоят как надо. Никто ни с кем не соприкасается.
Цитата
Я бы рекомендовал использовать TImage - 100 штук. либо TImageList.

Это у меня был первый вариант, но слишком уж муторно работать с таким количеством рисунков.
Цитата
StringGrid.

Они выглядят не очень симпатично, к тому же хотелось бы ставить картинки...

Ну так что насчет ошибки? Чем она может быть вызвана?

Автор: THenry 14.12.2005, 22:53
Они то стоят как надо но динамичсеки тебе с 1 и 0 будет тяжело создавать маску smile)

Автор: Nikolasha 14.12.2005, 23:05
Цитата
Они то стоят как надо но динамичсеки тебе с 1 и 0 будет тяжело создавать маску

Поживем увидим, мне главное с этим вопросом разобраться.

Автор: Akella 15.12.2005, 10:05
Цитата(Nikolasha @ 14.12.2005, 19:55)
Не пашет, на стадии компиляции выдает ошибку следущего содержания:
Expected an identifier but invalid character character #160 found


так на какую строку ругается компилятор, а, надо же сразу "говорить"

Автор: Демо 15.12.2005, 14:35
Цитата(Nikolasha @ 14.12.2005, 23:47)
Это у меня был первый вариант, но слишком уж муторно работать с таким количеством рисунков.


А принципы ООП для чего?-)

Автор: FRAGNATIC 15.12.2005, 18:47
Nikolasha
посмотрел твой код)
[Error] Unit1.pas(126): Illegal character in input file: ' ' ($A0)
всё дело как я понял в том что когда ты копировал код с форума и вставлял в свой модуль скопировался левак вообщем просто поудаляй пробелы всякие которые у тя там были перед теми строками на которых ошибку выдаёт)

Автор: Staruha 15.12.2005, 21:43
Создаю программно 10 переключателей и объединяю в группу .Нажимаю переключатель создается программно другой GroupButton и четыре переключателя. Нажимаю один из четырех и получается,что у меня не две группы ,а одна. Так же нажимаю следующую кнопку в первой группе- вылетает ошибка. Я так понимаю не хочет создавать повторно уже созданный GroupButton. Наверно его надо сначала удалить. Но как пробежаться по объектам не знаю. Делфи изучаю меньше месяца. smile

Автор: FRAGNATIC 16.12.2005, 00:29
Цитата
Но как пробежаться по объектам не знаю.

пробежатся просто
for i:=0 to ControlCount-1 do
if Controls[i] is TSomeComponent (например TButton) then ....

а так я не совсем понял сути вопроса
и ещё не плохо былобы код выложить

Автор: Staruha 16.12.2005, 11:46
Код

RGroup:=TRadioGroup.Create(Form1);
RGroup.Parent := Form1;
RGroup.Name:='RGR1';
RGroup.font.Size:=10;
RGroup.caption := 'Âîïðîñ';
RGroup.Height:=41*10+50;
RGroup.Width:=300;
RGroup.Left:=20;
RGroup.Top:=10;


  For i:=1 To 10 do
  Begin
RBut[i]:=TRadioButton.Create(Form1);
RBut[i].Parent := Form1;
RBut[i].Name:='Rbut1'+IntToStr(i);
RBut[i].font.Size:=10;
RBut[i].Width:=250;
RBut[i].caption := VoprOtv[i][1];
RBut[i].Left:=30;
RBut[i].Top:=10+i*41;

RBut[i].OnClick:=clik;
   End;

end;
  procedure TForm1.clik(Sender: TObject);
begin

RGroup2:=TRadioGroup.Create(Form1);
RGroup2.Parent := Form1;
RGroup2.Name:='RGR2';
RGroup2.font.Size:=10;
RGroup2.caption := 'Îòâåò';
RGroup2.Height:=41*4+50;
RGroup2.Width:=200;
RGroup2.Left:=350;
RGroup2.Top:=10;

      For i:=1 To 10 do
        Begin
           For rw:=2 To 5 do
        Begin
    If sender = RBut[i] Then
    Begin
RBut2[rw]:=TRadioButton.Create(Form1);
RBut2[rw].Parent := Form1;
RBut2[rw].Name:='RBut2'+IntToStr(rw);
RBut2[rw].caption := VoprOtv[i][rw];
RBut2[rw].Width:=100;
RBut2[rw].Left:=360;
RBut2[rw].Top:=10+(rw-1)*41;
RBut2[rw].OnClick:=clkk;
end;
   end;

     end;
     end;


Нажимаю RBut[i] загружаются 4 перекл Rbut[rw]
Нажимаю RBut2[rw] почему-то отключается RBut[i] и когда нажимаю следующий RBut[i] вылетает ошибка

Автор: Romikgy 16.12.2005, 12:03
В этом примере при каждом нажатии на RBut[i] создаются объекты с одним и темже именем, что недопустимо,
ЗЫ также при нажатии другой RBut[i] память не освобождается
ИМХО мелгче накидать 4 TRadioButton и менять их в зависимости он необходимости чем создавать динамически

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