Переприсваивание картинок в Bitbtn

  • Автор темы nattaella
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

nattaella

У меня есть массив ArBB[0..3] - массив типа TBitBtn, в котором есть 4 кнопки BitBtn. Одни из этих кнопок имеют картинки, другие не имеют, то есть у них свойство Glyph=nil;
Сами элементы массива располагаются вертикально, т.е. так:
bitbtn1
bitbtn2
bitbtn3
bitbtn4
Мне нужно сделать так, что если кнопка не имеет картинки, то она получает картинку вышележащего квадрата, а тот квадрат получает картинку ещё вышележащего квадрата и так далее. Выходит, что если есть «пустота» на месте картинки , то её заполняют вышележащие квадраты, то есть «падают».
Вот эта процедура:
Код:
procedure TForm1.BitBtn25Click(Sender: TObject);
var i1,p,k:integer;
begin
for i:=3 downto 0 do begin
if ArBB[i].Glyph=nil then
begin
for i1:=i-1 downto 0 do
p:=ArBB[i1].Glyph.Width;
for k:=0 to 6 do
if ArWidth[k]=p then Case_(ArBB[i1+1],k);  
end;
end;
end;

Насчёт Case_: эта процедура в кнопку bb загружает рисунок под «номером» m.
Код:
procedure TForm1.Case_(bb:TBitBtn; m:integer);
begin
case m of
0: bb.Glyph.LoadFromFile('zvonok.bmp');
1: bb.Glyph.LoadFromFile('banan.bmp');
2: bb.Glyph.LoadFromFile('grusha.bmp');
3: bb.Glyph.LoadFromFile('sliva.bmp');
4: bb.Glyph.LoadFromFile('jagoda.bmp');
5: bb.Glyph.LoadFromFile('dgekpot.bmp');
6: bb.Glyph.LoadFromFile('sim.bmp');
end;
end;

ArWidth – это массив с ширинами картинок. Каждая из 7 картинок имеет свою ширину – от 45 до 51. Я таким образом их отличаю.
ArWidth: array [0..6] of integer = (50,51,49,48,47,45,46);
где 50 –это ширина 'zvonok.bmp'….. 46 – это ширина 'sim.bmp'.

Почему при нажатии на BitBtn25 ничего не происходит?
 
D

Dock1100

Можете выложить весь проэкт архивом?
 
N

nattaella

Я просто выбрала лишь кусочек из всего проэкта, потому что я пишу игру. Но я оформлю в виде проэкта то, что меня интересует и скоро вышлю вложение
 
N

nayke

Я просто выбрала лишь кусочек из всего проэкта, потому что я пишу игру. Но я оформлю в виде проэкта то, что меня интересует и скоро вышлю вложение
Может сформулируете задачу вобщем и мы подскажем более оптимальное решение, отслеживание картинки на кнопке помоему не лучший вариант.
 
D

Dock1100

Главная ошибка тут: Case_(ArBB[i1+1],k);
Вы передаёте в процедуру не ту кнопку которая на форме, а та которая в масиве.
ArBB[] - это масив который содержит кнопки.
когда вы пишете ArBB[0]:=bitbtn1;
Вы заносите иформацию о bitbtn1 в масив ArBB[], и когда обращаетесь к елементу масиву ArBB то получаете элемент с такимиже свойствами, но этот елемент не будет той кнопкой что на экране.
Вообшем выше написан бред, а ниже нормальным языком
К примеру:
Код:
var a,b:array[1..2] of integer;
begin
a[1]:=5;
a[2]:=7;
b[1]:=a[1];
b[2]:=a[2];
b[1]:=3;
b[2]:=4;
//в результате 
//a[1]=5
//a[2]=7
//b[1]=3
//b[2]=4
//а не
//a[1]=3
//a[2]=4
//b[1]=3
//b[2]=4
end;

если вы хотите обращатся к кнопкам на форме через отдельный масив, используйте масив указателей.
 

Вложения

  • Project1.zip
    18,8 КБ · Просмотры: 188
S

sinkopa

спс :rolleyes: всё получилось!)
Это радует... :)
Мне вот только непонятна эта заморочку с ArWidth массив фейсконтроль... :)
И... почему бы вместо массивов не использовать списки?
Вот посмотрите (в прикрепленном файле)... я гдето так... приблизительно это вижу...
Может и Вам подойдет... :)
 

Вложения

  • ButtonRain.rar
    230,1 КБ · Просмотры: 172
D

Dock1100

А в идеале лучше ,как по мне, создать масив TBitBtn с Parent=Form1 вручную вбить все свойства через цикл, и не парится.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!