Форум программистов, компьютерный форум, киберфорум
Delphi: Графика, звук, видео
Войти
Регистрация
Восстановить пароль
 
4 / 4 / 3
Регистрация: 25.04.2015
Сообщений: 95
1

Почему в Debug Rectangle есть, а в релизе - нет?

30.04.2015, 21:19. Показов 385. Ответов 1
Метки нет (Все метки)

Помогите, пожалуйста )
Следующая ситуация:
Есть игра, Delphi XE5, целевые платформы Win32/Android/IOs.
Запускается. Появляется Табконтрол с первым табом - логотип, таймер на фейд-аут, появляется меню. Три кнопки - новая, состязание, поделиться.
Новая - меняется таб. В нем меню Тулбар с двумя кнопками, остальное место ректангл Field1. В нем динамически создается array of rectangle (parent:=field1), рассчитываются координаты, присваивается onmousedown и все такое.
Теперь вопрос: в режиме дебага все работает отлично, а в режиме релиза - филд1 грузится (проверил изменением цвета), а массив ректанглов нет. Как так? Релиз для Вин32. На андройд залил дебаг-версию, та же ситуация - не грузится. Через гуглстор даже не пробовал.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
unit gAndroid;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
  FMX.TabControl, FMX.StdCtrls, FMX.Layouts, FMX.Ani;
 
type
  TGameAndroid = class(TForm)
    TabControl1: TTabControl;
    TabMenu: TTabItem;
    TabGame: TTabItem;
    ImageLogo: TImage;
    LayoutMenu: TLayout;
    BtnNew: TSpeedButton;
    Timer1: TTimer;
    ToolBar2: TToolBar;
    BackGround: TImage;
    Field1: TRectangle;
    Procedure New_Game;
    procedure Timer1Timer(Sender: TObject);
    procedure BtnNewClick(Sender: TObject);
    procedure MenuCalculate;
    procedure FormCreate(Sender: TObject);
    procedure FieldCalculate;
  private
    { Private declarations }
  public
    { Public declarations }
end;
 
const
 max=5;
 Color1=$FF0000FF;
 Color2=$FFE0E0E0;
 
var
  GameAndroid: TGameAndroid;
  Pole,RecPole:array[1..max,1..max] of integer;
  RectPole:array[1..max,1..max] of TRectangle;
  sWidth,sHeight,CorectInt:integer;             //ширина и высота клетки
  cx,cy:integer;
  Field1: TRectangle;
 
procedure TGameAndroid.MenuCalculate;
var btnWidth, BtnHeight:integer;
begin
 with GameAndroid do
  begin
   LayoutMenu.Width:=ClientWidth;   LayoutMenu.Height:=ClientHeight;
 
   btnWidth:=Trunc(LayoutMenu.Width-LayoutMenu.Width*0.3);
   BtnLink.Width:=btnWidth;   BtnLink.Position.X:=round(LayoutMenu.Width*0.15);
   BtnNew.Width:=btnWidth;    BtnNew.Position.X:= BtnLink.Position.X;
   BtnCash.Width:=btnWidth;   BtnCash.Position.X:= BtnLink.Position.X;
 
   BtnHeight:=Trunc((LayoutMenu.Height-LayoutMenu.Height*0.3-2*5)/3);
   BtnLink.Height:=BtnHeight;   BtnNew.Position.Y:=round(LayoutMenu.Height*0.15);
   BtnNew.Height:=BtnHeight;    BtnCash.Position.Y:= BtnNew.Position.Y+BtnHeight+5;
   BtnCash.Height:=BtnHeight;   BtnLink.Position.Y:= BtnCash.Position.Y+BtnHeight+5;
 end;
end;
 
procedure TGameAndroid.Timer1Timer(Sender: TObject);
begin
 imagelogo.Visible:=False;
 layoutmenu.Visible:=true;
end;
 
procedure TGameAndroid.FieldCalculate;
var i,a,j:shortint ;
   CorectInt,x,y,border:integer;
begin
 sWidth:=0;
 sHeight:=0;
 Field1.Width:=GameAndroid.Width;
 Field1.Height:=GameAndroid.Height;
 border:=5;                                        //расстояние между клетками
 sWidth:=Trunc((Field1.Width-(max+1)*border)/max); //ширина прямоугольника
 sHeight:=Trunc((Field1.Height-(max+1)*border)/max); //высота прямоугольника
  if sHeight<Swidth then sWidth:=sHeight            //для маленьких экранов - выбираем меньшее из ширины/высоты
  else sHeight:=sWidth;
 CorectInt:=Trunc((Field1.Height-max*sHeight-(max+1)*border)/2);   // вычисляем середину Филд1. Отступ сверху и снизу будет равный.
 x:=-sWidth;                  //начинаем за экраном. В первой итерации увеличиваем до начала экрана.
  for i :=1 to max do
   for j := 1 to max do
     begin
      with RectPole[i,j] do
       begin
        Parent:=Field1;       //родитель
        Height:=sHeight;
        Width :=sWidth;
        Inc(x,sWidth+border);  //увеличиваем х на ширину клетки+расстояние
         if x+border<GameAndroid.ClientWidth then //размещаем вдоль одной линии
          begin
           Position.X:=x;
           Position.Y:=y+CorectInt+border;    //увеличиваем на высоту+расстояние+середину экрана
          end
         else
          begin   //новый ряд фигур
           x:=border;
           Position.X:=x;
           inc(y,sHeight+border);
           Position.Y:=y+CorectInt+border;
          end;
         if pole[i,j]=1 then RectPole[i,j].Fill.Color:=Color2
         else RectPole[i,j].Fill.Color:=Color1;
       end;
     end;
end;
 
Procedure TGameAndroid.New_Game;
var i,j:integer;
begin
 Randomize;
  for i := 1 to Max do                          //randomizing
   for j := 1 to Max do
    begin
     Pole[i,j]:=Random(100);
      if pole[i,j]<=50 then  Pole[i,j]:=-1
      else Pole[i,j]:=1;
     RecPole[i,j]:=Pole[i,j];                   //это резервный аррэй, для реплея стадии
    end;
 TabControl1.ActiveTab:=TabGame;
 FieldCalculate;
end;
 
procedure TGameAndroid.BtnNewClick(Sender: TObject);
begin
 TabControl1.ActiveTab := TabGame;
 New_Game;
end;
 
procedure TGameAndroid.FormCreate(Sender: TObject);
var i,j:integer;
begin
 MenuCalculate;
 TabControl1.ActiveTab := TabMenu;
  for i :=1 to max do
   for j := 1 to max do
    begin
     RectPole[i,j]:=TRectangle.Create(Self);
    end;
end;
Несущественное поудалял, влияния не имеет на это. Также создания TRectangle переносил в FieldCalculate, без разницы.Грешил на Onmousedown - может, из-за андройда как одной из целевых Mouse не прокатит, но закомментировал - не помогло. Вообщем, помогите кто может
0
Миниатюры
Почему в Debug Rectangle есть, а в релизе - нет?   Почему в Debug Rectangle есть, а в релизе - нет?  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2015, 21:19
Ответы с готовыми решениями:

Почему в Debug программа работает, а в Release нет?
Почему в Debug программа работает, а в Release нет?

При debug исключения нет, но в программе есть.
Добрый вечер. Столкнулся со следующей проблемой. Запускаю с помощь background_Worker некоторую...

В дебагере всё ок в релизе нет
Добрый день, такая вот интересная проблема. Есть задача. Есть картинки по ним кликаешь они...

Нет иконок кнопок в релизе
Задаю кнопкам иконки. Но не из ресурсов, а читаю программно с базы данных. В режиме отладки иконки...

1
4 / 4 / 3
Регистрация: 25.04.2015
Сообщений: 95
01.05.2015, 17:12  [ТС] 2
Поменял 92 строку на следующую:
Delphi
1
Parent:=GameAndroid;
Рисуется данное поле с самого начала игры, поверх логотипа, меню и прочего. Но суть не в этом...
Рисуется только в режиме дебага. Если переключить в релиз, то опять ничего, как на второй картинке. Чего за мистика? о_О

Добавлено через 19 часов 9 минут
Проблему решил. Нужно было инициализировать переменную одну.
Наткнулся на форуме vc++ на след.вещь

А связано это с тем, что компилятор VC++ считает себя слишком умным и в Debug версии неявно инициализирует объявленные переменные. Сейчас не вспомню как именно, но думаю все видели в отладчике указатели типа 0xcccccccc или другие "говорящие" значения.
Ну так вот, а в Release, в целях оптимизации, никакой такой неявной инициализации не происходит.
Причем это происходит не только с указателями, но и со скалярными типами. Кажется, они (int, double, etc.) по умолчанию инициализируются нулем.
Решил проблему. Собственно, про не инициализированные переменные: обнулил в Procedure FieldCalculate, добавил "y:=0" в 76 строчке, перед дальнейшим использованием. Теперь все заработало. Спасибо всем, кто не ответил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2015, 17:12

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

В гугле нет бэков а в яндексе есть. Почему?
Добрый день помогите разобраться. В яше есть бэки около 100 колеблются то вниз то вверх. В яху...

Ну почему у jdbTextField метод setText есть а setDate нет?
Вопрос вполне возможно глупый. Заранее прошу меня простить - я в самом начале пути. А вопрос мой...

Почему загруженные страницы есть, а страниц в поиске нет?
Сабж, давно не был в сео, отстал от жизни... Такова ситуация с новым сайтом. Уже который ап, 49...

На сайте нет кнопки Забыли пароль?. В html коде есть. Почему?
Здравствуйте! Столкнулся с такой проблемой. Собирал сайт на CMS Joomla 2.5 + Vitruemart 2. Вывел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.