procedure SetButtonColor(ABitBtn: TBitBtn; AColor: TColor; Caption :string);
var
Bmp: Graphics.TBitmap;
begin
Bmp:=Graphics.TBitmap.Create;
try
Bmp.Width:=ABitBtn.Width-4;
Bmp.Height:=ABitBtn.Height-8;
Bmp.Canvas.Font.Assign(ABitBtn.Font);
// Fill TBitmap by color
Bmp.Canvas.Brush.Color:=AColor;
Bmp.Canvas.Brush.Style:=bsSolid;
Bmp.Canvas.FillRect(Rect(1,1,Bmp.Width,Bmp.Height));
ABitBtn.Caption:=Caption;
// Show color in the middle
Bmp.Canvas.Pen.Color:=ABitBtn.Font.Color;
Bmp.Canvas.TextOut((Bmp.Width-Bmp.Canvas.TextWidth(ABitBtn.Caption)) div 2,
(Bmp.Height-Bmp.Canvas.TextHeight(ABitBtn.Caption)) div 2,
Caption);
ABitBtn.Caption:='';
ABitBtn.Glyph.Assign(Bmp);
finally
Bmp.Free;
end;
end;
procedure TForm1.Button95Click(Sender: TObject);
begin
if (n>=o) then
begin
if xq=0 then
begin
Button95.Caption:=eb[1,1];
c:=eb[1,1][1];
ch:=11;
figura(sender);
buBit:=Button95;
f:=eb[1,1];
SetButtonColor (Button95, TColor($7070FF),'X');
end else Button1.Caption:='Сначала угадайте фигуру!' ;
end;
end;
При клике в игре на Button95 вызывает ошибку: Проект вызвал класс исключения 'External: SIGSEGV ' на строке 'ABitBtn.Glyph.Assign(Bmp);'
причем если указать стороннюю кнопку вместо Button95, (она у меня тоже имеет свойтво TBitBtn) например BitBtn1 - кнопочка благополучно окрашивается без всяких ошибок.
Думаю, дело в присваивании одних переменных другим...
Надо с нуля создать на форме кнопку типа BitBtn и работать с ней.
В общем, пробовать - откуда начинает тянуться ошибка.
Сам программный код выглядит чисто и ошибок быть не должно. Возможно действительно string и вызывает проблему. Особенно если передавать string как параметр в функцию - я такого очень много раз насмотрелся.
BDK, да не, не сбивай человека. На строке присваивания картинки ошибка. Значит проблемы в обращении к памяти данного компонента (Button95). А то начнёт левой работой заниматься...
Но не понятно почему там вылазит ошибка - там написано всё правильно.
Значит проблемы в обращении к памяти
Именно так и проявляются глюки string - ошибки вылазят в совсем других местах программы и отловить их прямым отслеживанием не получается. Всё таки настоятельно рекомендую убрать все string из программы. Как я понимаю в string'е есть какой-то глюк который не корректно выделяет память под строку. И потом это ведет к ошибкам обращения к памяти - уже в совсем других местах программы вообще никак не связанных с тем местом где собственно глюк.
Андрей писал(а): Надо с нуля создать на форме кнопку типа BitBtn и работать с ней.
Как оказалось не надо, надо просто в инспекторе объектов сменить класс button95 c TButton на TBitBtn и все работает.
Вот теперь вопрос можно ли в инспекторе объектов выделить сразы несколько объектов - с шифтом выделение не получается.
НУ тогда да, дело было в другом. Но всё равно советую от string отказаться. Когда я от них отказался разом пропали все глюки за которые я грешил на другие вещи. И с тех пор я забыл вообще про странные не отлавливаемые ошибки.