Мое творчество. Игра Шахматный сапёр

Видео, книги, журналы, научные статьи, (по тематике форума), наше творчество
Михаил Киселев
Сообщения: 703
Зарегистрирован: 22 дек 2017, 13:55
Благодарил (а): 154 раза
Поблагодарили: 66 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение Михаил Киселев »

BDK писал(а): предостерегаю от использования строк типа string и динамических массивов.
Похоже так и случилось процедура

Код: Выделить всё

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 - кнопочка благополучно окрашивается без всяких ошибок.
Михаил Киселев
Сообщения: 703
Зарегистрирован: 22 дек 2017, 13:55
Благодарил (а): 154 раза
Поблагодарили: 66 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение Михаил Киселев »

ошибка.JPG
Даю вот скриншот.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Андрей
Архитектор
Сообщения: 7381
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 534 раза
Поблагодарили: 462 раза

Re: Мое творчество. Игра Шахматный бой

Сообщение Андрей »

Думаю, дело в присваивании одних переменных другим...
Надо с нуля создать на форме кнопку типа BitBtn и работать с ней.
В общем, пробовать - откуда начинает тянуться ошибка.
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение BDK »

Сам программный код выглядит чисто и ошибок быть не должно. Возможно действительно string и вызывает проблему. Особенно если передавать string как параметр в функцию - я такого очень много раз насмотрелся.

Попробуй заменить string на PChar.

Тогда декларация процедуры будет иметь такой вид:

Код: Выделить всё

procedure SetButtonColor(ABitBtn: TBitBtn; AColor: TColor; Caption : PChar);
А вызов процедуры будет иметь такой вид:

Код: Выделить всё

SetButtonColor (Button95, TColor($7070FF),PChar('X'));
Аватара пользователя
Андрей
Архитектор
Сообщения: 7381
Зарегистрирован: 06 май 2015, 14:10
Откуда: Чехов
Благодарил (а): 534 раза
Поблагодарили: 462 раза

Re: Мое творчество. Игра Шахматный бой

Сообщение Андрей »

BDK, да не, не сбивай человека. На строке присваивания картинки ошибка. Значит проблемы в обращении к памяти данного компонента (Button95). А то начнёт левой работой заниматься...
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение BDK »

. На строке присваивания картинки ошибка.
Но не понятно почему там вылазит ошибка - там написано всё правильно.
Значит проблемы в обращении к памяти
Именно так и проявляются глюки string - ошибки вылазят в совсем других местах программы и отловить их прямым отслеживанием не получается. Всё таки настоятельно рекомендую убрать все string из программы. Как я понимаю в string'е есть какой-то глюк который не корректно выделяет память под строку. И потом это ведет к ошибкам обращения к памяти - уже в совсем других местах программы вообще никак не связанных с тем местом где собственно глюк.
Михаил Киселев
Сообщения: 703
Зарегистрирован: 22 дек 2017, 13:55
Благодарил (а): 154 раза
Поблагодарили: 66 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение Михаил Киселев »

Поменял так как советовал BDK, та же ошибка
Андрей писал(а): Надо с нуля создать на форме кнопку типа BitBtn и работать с ней.
Как оказалось не надо, надо просто в инспекторе объектов сменить класс button95 c TButton на TBitBtn и все работает.
Вот теперь вопрос можно ли в инспекторе объектов выделить сразы несколько объектов - с шифтом выделение не получается. :(
Аватара пользователя
BDK
Сообщения: 3720
Зарегистрирован: 17 май 2015, 23:27
Откуда: Беларусь
Благодарил (а): 152 раза
Поблагодарили: 406 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение BDK »

Поменял так как советовал BDK, та же ошибка
НУ тогда да, дело было в другом. Но всё равно советую от string отказаться. Когда я от них отказался разом пропали все глюки за которые я грешил на другие вещи. И с тех пор я забыл вообще про странные не отлавливаемые ошибки.
Михаил Киселев
Сообщения: 703
Зарегистрирован: 22 дек 2017, 13:55
Благодарил (а): 154 раза
Поблагодарили: 66 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение Михаил Киселев »

Михаил Киселев писал(а): Вот теперь вопрос можно ли в инспекторе объектов выделить сразы несколько объектов - с шифтом выделение не получается.
погуглил нашел - с помощью мышки и ctrl :)
Михаил Киселев
Сообщения: 703
Зарегистрирован: 22 дек 2017, 13:55
Благодарил (а): 154 раза
Поблагодарили: 66 раз

Re: Мое творчество. Игра Шахматный бой

Сообщение Михаил Киселев »

Михаил Киселев писал(а): погуглил нашел - с помощью мышки и ctrl
Ага, правда сменить класс сразу нескольких объектов так не выйдет :( Сейчас сижу по одной кнопке меняю...муторно :(