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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массив из кнопок. Можно ли создать? 
:(
    Опции темы
Nikolasha
Дата 11.12.2005, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


..::Свирепый Кодер::..
**


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

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



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


Это сообщение отредактировал(а) FRAGNATIC - 11.12.2005, 19:32
PM MAIL   Вверх
FRAGNATIC
Дата 11.12.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Код

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 )
а для этого масив лучше сделать глобальной переменой )
PM MAIL   Вверх
Poseidon
Дата 11.12.2005, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Цитата(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);




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
FRAGNATIC
Дата 11.12.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Poseidon
а разница?
я пример привёл
а там уже хоть из чего угодно делай)
PM MAIL   Вверх
Nikolasha
Дата 13.12.2005, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за ответы. Только вот нужен двумерный массив.
Еще один вопрос. у меня случайным образом генериться массив кораблей следующего типа:
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 ) кнопок. Как можно организовать чтобы на кнопочках кот. соответствует еденичка появилась определенная картинка?
PM MAIL   Вверх
Rennigth
Дата 13.12.2005, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



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


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Nikolasha
Дата 13.12.2005, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А каким образом этот массив разместиться на форме где мне нужно?
PM MAIL   Вверх
YurikGL
Дата 13.12.2005, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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


уже было....

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

--------------------
 
PM MAIL WWW ICQ   Вверх
sexton
Дата 14.12.2005, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sexton=Пономарь (eng)
**


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

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



Думаю в данной ситуации StringGrid бы вполне подошел вместо такго дикого количесвта кнопок.
PM MAIL WWW ICQ   Вверх
Nikolasha
Дата 14.12.2005, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, все получилось.
Еще один вопрос: как можно теперь обрабатывать события 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 можно? Если да, то как?
PM MAIL   Вверх
FRAGNATIC
Дата 14.12.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Код

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
PM MAIL   Вверх
Nikolasha
Дата 14.12.2005, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

smile
Что не так? smile
PM MAIL   Вверх
Демо
Дата 14.12.2005, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



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



--------------------
    
PM MAIL ICQ Skype   Вверх
THenry
Дата 14.12.2005, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Писал такую штуку тока на С++ в StringGrid. Удобно и проще некуда.

P.S. А как насчет того что вокруг корабля на расстоянии одной клетки не может быть другого корабля? А твоя маска поля боя это не предусматривает, добавь еще вокруг каждого корабля "оградку" к примеру -1
PM MAIL   Вверх
Nikolasha
Дата 14.12.2005, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

Ну так что насчет ошибки? Чем она может быть вызвана?
PM MAIL   Вверх
THenry
Дата 14.12.2005, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Они то стоят как надо но динамичсеки тебе с 1 и 0 будет тяжело создавать маску smile)
PM MAIL   Вверх
Nikolasha
Дата 14.12.2005, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Они то стоят как надо но динамичсеки тебе с 1 и 0 будет тяжело создавать маску

Поживем увидим, мне главное с этим вопросом разобраться.
PM MAIL   Вверх
Akella
Дата 15.12.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



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


так на какую строку ругается компилятор, а, надо же сразу "говорить"
PM MAIL   Вверх
Демо
Дата 15.12.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

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



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


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


--------------------
    
PM MAIL ICQ Skype   Вверх
FRAGNATIC
Дата 15.12.2005, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Nikolasha
посмотрел твой код)
[Error] Unit1.pas(126): Illegal character in input file: ' ' ($A0)
всё дело как я понял в том что когда ты копировал код с форума и вставлял в свой модуль скопировался левак вообщем просто поудаляй пробелы всякие которые у тя там были перед теми строками на которых ошибку выдаёт)
PM MAIL   Вверх
Staruha
Дата 15.12.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

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



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


--------------------
Возмездие настигнет
PM MAIL   Вверх
FRAGNATIC
Дата 16.12.2005, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


..::Свирепый Кодер::..
**


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

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



Цитата
Но как пробежаться по объектам не знаю.

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

а так я не совсем понял сути вопроса
и ещё не плохо былобы код выложить
PM MAIL   Вверх
Staruha
Дата 16.12.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

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



Код

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] вылетает ошибка


--------------------
Возмездие настигнет
PM MAIL   Вверх
Romikgy
Дата 16.12.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

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



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


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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