Delphi runtime 216 error 216

I have a random Runtime Error 216 that appears on application close. I have debugged as far as I can and the error is thrown in SysUtils.FinalizeUnits. I have gone over the code and ensure all

I have a random Runtime Error 216 that appears on application close.

I have debugged as far as I can and the error is thrown in SysUtils.FinalizeUnits.

I have gone over the code and ensure all created objects are freed.

The number on the runtime error, 0040054A, is not present in the mapfile. Do you know what this means?

Can anyone tell me how to find out what is throwing the error?

asked Mar 17, 2011 at 7:09

Jackie's user avatar

This is VERY OLD Delphi problem — wrong exception handling in unit initialization/finalization process.

The problem easy to reproduce — just make any program error/exception (division by zero for instance) in initialization block of any unit. The exception will be created correctly. But then, before the exception rise, the unit finalization process destroy the exception object. And thus, when the exception object accessed, the «runtime error 216» occured.

answered Mar 2, 2016 at 12:38

Vasily Ivanov's user avatar

1

I’d suspect a memory leak (all Runtime Errors 216 I’ve encountered so far were) and use a profiler (visual inspection is never as good as a tool). Since you’re using Delphi XE, you should give AQTime a try (it’s included), see also

Delphi — Check if memory is being released «on time»

Kind regards, Frank

Community's user avatar

answered Mar 17, 2011 at 7:20

Frank Schmitt's user avatar

Frank SchmittFrank Schmitt

29.7k11 gold badges71 silver badges107 bronze badges

1

Since runtime error 216 is an access violation, this may indicate that you’re attempting to use something that you’ve already freed.

Addresses in the map file are based at 0, but that’s not where your EXE file gets loaded into memory. Your EXE gets loaded at its preferred base address, which is usually $400000. Subtract that from the address you have. The address you’re looking for in the map file is $0000054a.

David Heffernan's user avatar

answered Mar 17, 2011 at 7:32

Rob Kennedy's user avatar

Rob KennedyRob Kennedy

161k21 gold badges276 silver badges463 bronze badges

2

I suggest you try the FastMM Full Debug Mode, and either statically link that into your app, or use it as a package (if your app uses packages).

answered Mar 17, 2011 at 19:11

Warren  P's user avatar

Warren PWarren P

64.1k39 gold badges178 silver badges313 bronze badges

2

You can use the method I used to fix mine.

I commented out the main program, and added code back until it failed.

Turns out that it did not want me to call couninitialize at all. Did not throw an error at the time, but failed after program termination with a 216. Removing the offending statement fixed it.

Since this was maybe 6 statements before end. statement, I don’t imagine it will matter.

This method is easy if you are consistent about using // for comments. I moved IO statements that needed curly brackets to a procedure.

answered May 20, 2021 at 18:21

Russell Styles's user avatar

On Microsoft’s oficial web site it is mentioned that, this issue can occur if your computer is infected with a SubSeven Trojan virus.

Antivirus software and windows registry cleaner should help.

answered Sep 27, 2013 at 6:54

Jiemurat's user avatar

JiemuratJiemurat

1,57919 silver badges20 bronze badges

Содержание

  1. что за Runtime error 216 в Delphi
  2. Delphi runtime 216 error 216
  3. В поисках ошибки (runtime 216)
  4. Комментарии
  5. Delphi runtime 216 error 216

что за Runtime error 216 в Delphi

значит пишу я игру, все идет гладко, и в один прекрасный момент, случилось чтото, что при каждом выходе из игры дает
Runtime error 216.
Но компилятор проходит весь код, даже «end.»
Может кто поможет чемто.

Loriol
Google: что за Runtime error 216 в Delphi -> Вторая ссылка

Еще проще — справка, Index, runtime errors

Loriol
Ошибка 216 — нарушение доступа. В справочнике Лишнера по этому поводу говорится, что эта ошибка возникает при повреждении данных во время работы с указателями и памятью.
Так может произойти, например, при установке некорректного значения какого-либо дескриптора, и последующей попытке освобождения ресурсов, связанных с этим дескриптором. Если выдаётся внешний код ошибки вместо исключительной ситуации, то можно попробовать подключить модуль SysUtils, который попытается преобразовать код ошибки в ИС какого-либо класса. Может быть, ИС будет более информативна.

решением проблемы столо то, что я переименовал масив. %-(
Хотя здесь нет НИКАКОЙ связи.
ето уже третяя маразматическає проблема за последние два года!

Loriol
> решением проблемы столо то, что я переименовал масив. %-(
>Хотя здесь нет НИКАКОЙ связи.
>ето уже третяя маразматическає проблема за последние два года!

А примерчик в студию можно? Т.е. первоначальное имя массива и изменённое. А то что-то я слабо представляю подобную ситуацию(зависимость от имени массива). Может быть, Вы использовали имя какой-либо системной переменной? Хотя, всё равно никаких конфликтов быть не должно — модули-то разные.

пропасквилянт
Пример не можно, я не буду 200 МБ вешать, да он и не полезет.
Разкажу немного больше о проблемах:
1) была давно, суть — некоректно выводился лейбел
сначало загружались текстовые даные из тхт файла в масив (имя совершенно не важно) а с масива в лейбл
Пример (до) файл «Пример» — лейбл «Пр(какойто странный симфол)и» и все.
Решение: взял масив и переместил его в var немного выше по списку с многих значений.
вобще то разницы, где стоит в оглавлении масив — нет, но все работает нормально
2) теперь была ошыбка что все работает нормально, а после закрытия — рнтайм еррор.
Решение: а) переименовую масив — не помогло
б) создаю ниже идентичный масив с другим именем, и его использую место предыдущего. Результат — ошыбки нет.
Было еще куча проблем, что при исполненнии програмы она сама вписывала в последнюю ячейку масива (который чемто понравился компилятору) значением, которое я не задавал, например a[last]:=0; а получаю при дебугинге a[last]=6546514
Решение: разшыряю масив на одну ячейку, пусть пишет в нее что захочет.

Вот такой скромный опыт.

Loriol
>Вот такой скромный опыт.
Я на 100% уверен, глюк в твоём днк, а не в компиляторе. Код в студию; а иначе это трёп на пустом месте.

ну если хочеш почитать 250-300 страниц!?
Или тебе просто так я должен выставить свой двухлетний проект? Все файлы разработки??
Низачто.

Loriol
>Низачто.
Та мне фиолетово. Не хочешь — не надо. Думай что это глюк компилятора, или звёзды не так сошлись, или бесы шутят.

> куча проблем, что при исполненнии програмы она сама вписывала в последнюю ячейку масива (который чемто
> понравился компилятору) значением, которое я не задавал, например a[last]:=0; а получаю при дебугинге a[last]
> =6546514
> Решение: разшыряю масив на одну ячейку, пусть пишет в нее что захочет.

Типичная «псевдопроблема» с программистами, не умеющими работать с «zero-bazed массивами».
Таковые наиболее «натуральны» для компьютера. Их же придерживается дельфевый динамический array of .
Видимо кто-то не совсем вник во все эти темы.
Вот только кто. =)

не нужен мне твой двухлетний проэкт.
если глюк происходит в пределах одной(ну или двух) функций, то почему бы её(их) не показать?

NULL_PTR
Ты что, это великая тайна, человек написал 200Мб исходников (это в архиве? тогда ск-ко сами исходники?)

>>ну если хочеш почитать 250-300 страниц!?
Зачем столько? Сделай тестовый пример и покажи. Если на тестовом ошибка не проявляется — значит 100% твой глюк.

Loriol
1) СТО ПУДОВО засирал место после массива — т.е. писал в массив данных больше чем размер массива. А когда переместил выше — засирались переменные, объявленные после массива, поэтому баг «пропал»
2) Небось та же причина, или в коде что-то поправил.

Loriol, ты только что прокричал во весь голос, что ты ламер. Нельзя так. Сначала надо подумать — правильно тут сказали — написать тестовый пример. На компилятор надо ругаться в самом последнем случае, когда ВСЕ перепробовал. И даже в этом случае компилер вряд ли при чём. Ибо испытан 1.000.000 раз.

Источник

Delphi runtime 216 error 216

Наваял программу на Delphi7, которая читает RFID карты и пишет их в БД FireBird. Использую компоненты IBExpress и сторонние компоненты JediVCL.
На моем компе (где писал прогу — XP SP3) все работает как часы.

А вот на компе клиента (тоже XP SP3) сразу же при запуске выдает окно:
Инструкция по адресу XXXX обратилась по адресу YYYY. Память не может быть Read.
Жмем Ок.
Выпадает окно «Runtime error 216 at ZZZZZ».

Может что на компе клиента установить надо? Хотя FireBird сервер там стоит и успешно работает. Куда копать?
Мне завтра уже кровь из носа надо ставить туда эту прогу. Помогите, плиз!

Это я уже проверял — Connected := False;

Для проверки сейчас скопировал свою прогу вообще на другой комп тоже с XP SP3. На этом компе нет Delphi и не установлен FireBird Server. Запускаю свою прогу — вылетаем сообщение о необходимости установки vcredist_x86 (нужна какая-то MSVC100.DLL — вроде так). Ставлю этот редист. Перезапускаю свою прогу — она мне пишет, что ошибка в компоненте IBExpress, т.к. нет GDS32.DLL. Беру эту DLL-ку и просто копирую в папку со своей прогой. Снова запускаю свою прогу — и вуаля — все работает как надо!

А на компе клиента все такие же действия не избавляют меня от Runtime 216 при запуске, млин

Сейчас скопировал эту прогу на комп с Win2003Server.
Вообще не запустилась. Появляется в процессах и через секунду исчезает. Никаких сообщений не выдает.
Блин. Че за фигня?

Да я даже не представляю где там что проверять, т.к. моего кода там практически нет — в основном просто логика и вызовы чужих функций из чужих DLL-ек. Ну и использование компонентов Jedi и InterBase.

Я просто не пойму — почему на других компах запускается и работает?

Итак, проблема решена.

Установил я все-таки дельфи на тот комп, где вылетал рантайм. При запуске приложения из дельфи выяснилось, что Jedi при инициализации в модуле JclSysInfo при определении частоты проца выдавал деление на ноль. Подправил немного модуль и все отлично заработало.

Источник

В поисках ошибки (runtime 216)

Эту небольшую заметку я посвящу рассказу о поиске ошибки (runtime error 216) в проекте при его закрытии. Как оказалось ошибка была тривиальна в своей сути, но необычна своими последствиями.

строка application.run() реализует цикл обработки сообщений, и пока наше приложение запущено, то этот цикл продолжается. При закрытии приложения данный цикл прерывается, и если мы установим точку останова на ключевом слове end то попадем в процедуру system._halt0. Существует также процедура halt() которая используется в консольных приложениях для закрытия приложения с ошибкой, а код 0 используется обычно для обозначения корректного завершения приложения. Поэтому рассматриваем суффикс 0 в конце имени процедуры как знак того, что пока что все правильно (: Если упростить то смысл работы данной процедуры в том чтобы освободить все загруженные библиотеки и модули, и вызвать обработать секции finalization для всех юнитов (секции initialization, напротив, выполняются до запуска приложения (т.е создания объекта application)). Дак вот опытным путем было установлено что ошибка возникала при вызове метода FinalizeUnits(). В данном методе проводится последовательный циклический вызов метода финализации для юнитов. Причем метод рекурсивный, рекурсия запускается в случае возникновения исключительной ситуации, чтобы отработать finalization для оставшихся модулей. Суть беды была в том, что в моих юнитах секции finalization отсутствовали как класс в принципе. Однако в подключаемых юнитах TMS их было не мало. В очередной раз обновили TMS. Ошибка не исчезла. Печально (: После того как была определена итерация цикла на которой возникала ошибка, я углубился еще дальше, перейдя в метод System._FinalizeArray. Судя по названию метода, мы очищали память какого то массива. Если предыдущий шаг мне был не совсем понятен, то на данном этапе код функции представлял ассемблерный код, что посеяло еще большие сомнение в успешности поисков. Далее переход по цепочке вызовов _WStrArrayClr() и _LStrArrayClr(), что видимо описывало очистку массива строк. Функция _LStrArrayClr() была последней стадией отладки. В данном методе реализован цикл очистки, каждая итерация которого завершается вызовом _freeMem. Основываясь на комментариях к коду можно было сделать заключение что в регистр EDX передает адрес буфера строки. Добавив pChar(EDX) в WatchList при первой итерации цикла я наблюдал имя исполняемого файла, при второй полный путь с именем исполняемого файла. После чего наблюдалось появление ошибки в секции

на строке dec ESI если мне память не изменяет, что показалось странным. Тут я понял, что зашел в тупик, и мои знания программирования не способны решить данную задачу стандартными методами отладки. Когда ошибка не очевидна, то первым, что можно сделать это сократить объем кода, чтобы попытаться таким образом ее как либо локализовать. Так что я создал копию проекта и начал удалять юниты один за другим, проверяя возникновение ошибки. В конечном счете осталось 3 юнита: главная форма приложения, модуль данных, модуль описания глобальных переменных и типов. Третий модуль не выполнял никаких действий, так что влиять теоретически не мог. Модуль данных и главная форма создавались в приложении автоматически. Помня о том что секции finalization есть только в юнитах TMS, а ошибка возникает где то в FinalizeUnits() начал удалять компоненты с главной формы, на этом правда не остановился. главная форма в итоге осталась пустая, и на ней был расположен лишь ADOConnection (не спрашивайте почему объект подключения к БД на главной форме а не в модуле данных (: ) Вот тут фокус, в секции uses не осталось ни одного юнита от TMS. Откуда же тогда ошибка в FinalizeUnits() ? Следующим шагом была очистка модуля данных (вобще то они выполнялись одновременно). В конечном счете все приложение состояло из 4х функций которые были максимально упрощены. Главная форма содержала обработчик события onCreate() в к котором был вызывался метод Connect() [см. код] модуля данных.

Итак, глобальный массив regionExists был определен как

переменная id имела значение явно не из интервала 0..1. (28 было). Следовательно происходила запись в чужую память. Отметим так же, что после объявления массива далее была определена переменная region — структура вида:

Память при этом выделяется последовательно т.е адрес элемента regionExists[28] ссылался куда то на начало строки name переменной reg. В принципе чего страшного? Записали данные в чужой буфер, но он ведь статичен, и был пуст на тот момент. Установка требуемого значения id решила проблему. Однако, оставим все без изменений. В чем же необычность?.

  1. В силу каких то магических обстоятельств, если мы закомментируем вызов loadOkvedNames() то программа закрывается без ошибок.
  2. Если мы в коде функции LoadOkvedNames закомментируем, например, строку inc(i) то программа вылетает при запуске. То же самое касается всего содержимого между with adoQuery1 do begin и end;

Обычно ли такое поведение? Нет, вряд ли. Какие можно сделать выводы? —

  1. Лучше лишний раз написать код инициализации переменной начальным значением, чем потом долго искать ошибку. Это правда не касается членов классов, которые инициализируются нулевыми значениями.
  2. Стоит использовать Range check в настройках компиляции, хотя бы в DEBUG варианте сборки.

Комментарии

Была такая же ошибка (runtime error 216) при выходе из программы — причина оказалась в том, что при некоторых условиях одна из форм не уничтожалась и сбивала работу всего приложения.

А вообще, подобное «магическое поведение кода» встречается регулярно — ошибки, на появление которых влияют совершенно левые строчки из другой части проекта, либо странное поведение отладчика, и перескок выполнения текущей команды в неожиданное место.

Если вижу подобные признаки — значит надо где-то искать неинициализированную либо неправильно уничтоженную переменную.

Самое обычное повреждение памяти. Повреждение памяти — причина больше половины случаев для run-time error 216.

И про опцию range-check многие забывают (или не знают?). Печально.

Источник

Delphi runtime 216 error 216

Да вот проверяю проверяю-и не чего не нахожу(
я там использую TStringList , но вроде все как положенно креатю и потом фри
КОД в ЕХЕ:

procedure TForm1.StringGrid1DblClick(Sender: TObject);
var FILES: TInfo;
begin
if stringgrid1.Row>0 then
begin
FILES:=CreateInfo;

R_BNS(FILES, fi);
BN_EN(FILES, fi, ‘q’, inttostr(form1.StringGrid1.Row) ,’c:1’);

function CreateInfo:TInfo; stdcall;
begin
result.name:=TStringList.Create;
result.size:=TStringList.Create;
end;

procedure FreeInfo(I:TInfo); stdcall;
begin
I.name.Free;
I.size.Free;
end;

но хочу заметить что происходит это ПО ЗАВЕРШЕНИИ ПРИЛОЖЕНИЯ
а пока я форму не закрыл — все ок

неа))) я вобще первый раз использую библиотеки))
а как это делается?

ругается! говорит дай дку!

library BNE;
uses
sharemem,windows,SysUtils, Classes;
<$R *.res>.

unit DLL_EX;
interface
uses sharemem, Dialogs, Controls, StdCtrls, FileCtrl, Grids, ComCtrls, Classes
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ComCtrls, FileCtrl, Tabs;
.

MESSAGES: File not found: ‘sharemem.dcu’

Есть кнопка «Правка». И в правилах про нее написано. Ибо это есть флуд — налепливание постов друг за дружкой.

Источник

18.11.2012, 08:24. Показов 14930. Ответов 4


Есть проект,
Если его просто открыть/закрыть то ошибки нет. Но при выполнениии действие в Баттон2, при закрытии вылетает ошибка Runtime Error 216.

Код:

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, ComCtrls, OleCtrls, SHDocVw, ExtCtrls, eff_button,
  TranComp;
 
 
type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Panel1: TPanel;
    TransEdit1: TTransEdit;
    TransEdit2: TTransEdit;
    TransEdit3: TTransEdit;
    TransEdit4: TTransEdit;
    TransEdit5: TTransEdit;
    TransEdit6: TTransEdit;
    Button3: TButton;
    Edit1: TEdit;
    Button1: TButton;
    Button4: TButton;
    Button2: TButton;
    EffectButton1: TEffectButton;
    Timer1: TTimer;
    Timer2: TTimer;
    Memo3: TMemo;
    Memo2: TMemo;
    Memo1: TMemo;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure EffectButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  nick:string;
 
  boi:array [1..1000] of string;
  rim: array [1..1000] of string;
  nb,nr:integer;
  z:array[1..1000] of string;
  level:array [1..1000] of real;
  battle:array [1..1000] of real;
  buf : array  of Integer;
buf1 : array of Integer;
implementation
 
{$R *.dfm}
 
 procedure TForm1.Button3Click(Sender: TObject);
begin
  nick:=edit1.text;
  WebBrowser1.Navigate('http://worldoftanks.ru/community/accounts/named/'+nick+'/');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var Doc, El: Variant;
    i,j:integer;
bc,dmg,obn,des,cap,det:real;
s,x,a,n,m:string;
b:array [1..100] of string;
 
v:array [1..100] of string;
begin
memo1.clear;
  Doc := WebBrowser1.OleObject.Document.GetElementsByTagName('tr');
  for i := 0 to Doc.Length - 1 do
    begin
      El := Doc.Item(i);
        Memo1.Lines.Add(El.InnerText);
   end;
for i:=1 to 15 do
begin
b[i]:= Memo1.Lines.Strings[i];
end;
memo1.clear;
x:='';
for i:=1 to 15 do
begin
s:=b[i];
for j:=1 to length(s) do begin
if (s[j]='0') or  (s[j]='1') or (s[j]='2') or (s[j]='3') or (s[j]='4') or (s[j]='5') or (s[j]='6') or (s[j]='7') or (s[j]='8') or (s[j]='9') then
x:=x+s[j];
end;
v[i]:=x;
x:='';
end;
a:=v[2];
delete(a,length(a)-1,2);
v[2]:=a;
n:=v[3];
delete(n,length(n)-1,2);
v[3]:=n;
m:=v[4];
delete(m,length(m)-1,2);
v[4]:=m;
 
for i:=1 to 15 do
Memo1.Lines.Add(v[i]);
 
 bc:=strtofloat(v[1]);
 transedit1.text:=floattostr(bc);
 des:=strtofloat(v[6])/bc;
 transedit2.text:=floattostr(des);
 dmg:=strtofloat(v[9])/bc;
 transedit3.text:=floattostr(dmg);
 det:=strtofloat(v[10])/bc;
 transedit4.text:=floattostr(det);
cap:=strtofloat(v[12])/bc;
transedit5.text:=floattostr(cap);
 obn:=strtofloat(v[7])/bc;
 transedit6.text:=floattostr(obn);
     end;
 
 
 
 
procedure TForm1.Button4Click(Sender: TObject);
var Doc, El: Variant;
    i: Integer;
begin
memo1.clear;
Doc := WebBrowser1.OleObject.Document.GetElementsByTagName('td');
for i := 0 to Doc.Length - 1 do
begin
El := Doc.Item(i);
Memo1.Lines.Add(El.InnerText) end;
for i:=0 to Memo1.Lines.Count - 1 do
begin
Memo1.Lines.Delete(i);
while (memo1.Lines[i]<>'I  ') and(memo1.Lines[i]<>'II  ') and (memo1.Lines[i]<>'III  ') and(memo1.Lines[i]<>'IV  ') and(memo1.Lines[i]<>'V  ') and(memo1.Lines[i]<>'VI  ') and(memo1.Lines[i]<>'VII  ') and(memo1.Lines[i]<>'VIII  ') and(memo1.Lines[i]<>'IX  ') and(memo1.Lines[i]<>'X  ') do  memo1.Lines.Delete(i); exit;
 // Возможно or, перенести эти события в 1 кнопку, переменные: док1, ел1. Записывать в мемо2
end;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
i,j:integer;
pr:string;
begin
// вместо мемо1 мемо2, вместо мемо 2 мемо3 , мемо3 - мемо4
SetLength(buf, 0);
for I := 0 to Memo1.Lines.Count - 1 do
if (I mod 4 = 0) then
begin
SetLength(buf, Length(buf) + 1);
buf[Length(buf) - 1] := I;
end;
for I := 0 to Length(buf)  - 1 do
Memo2.Lines.Add(Memo1.Lines[buf[I]]);
for i:=0 to Memo2.Lines.Count - 1  do
rim[i]:= Memo2.Lines.Strings[i];
 
SetLength(buf1, 0);
for I := 0 to Memo1.Lines.Count - 1 do
    if (I mod 2 = 0) and (I mod 4 <> 0) and (I <> 0) then
    begin
      SetLength(buf1, Length(buf1) + 1);
      buf1[Length(buf1) - 1] := I;
    end;
          for I := 0 to Length(buf1)  - 1 do
    Memo3.Lines.Add(Memo1.Lines[buf1[I]]);
    for i:=0 to Memo3.Lines.Count - 1  do
boi[i]:= Memo3.Lines.Strings[i];
 
 for i:=0 to Memo3.Lines.Count - 1 do
begin
pr:=boi[i];
for j:=1 to length(pr) do
begin
if pr[j]=' ' then
delete(pr,j,1);
end;
boi[i]:=pr;
pr:='';
 end;
for I := 0 to Memo3.Lines.Count - 1 do
battle[i]:=strtofloat(boi[i]);
 
 
for i:=0 to   Memo2.Lines.Count - 1 do
begin
if (rim[i])='I  ' then
begin
delete(rim[i],1,3);
insert('1', rim[i],1);
end;
if rim[i]='II  ' then
begin
delete(rim[i],1,4);
insert('2',rim[i],1);
end;
if rim[i]='III  ' then
begin
delete(rim[i],1,5);
insert('3',rim[i],1);
end;
if rim[i]='IV  ' then
begin
delete(rim[i],1,4);
insert('4',rim[i],1);
end;
if rim[i]='V  ' then
begin
delete(rim[i],1,3);
insert('5',rim[i],1);
end;
if rim[i]='VI  ' then
begin
delete(rim[i],1,4);
insert('6',rim[i],1);
end;
if rim[i]='VII  ' then
begin
delete(rim[i],1,5);
insert('7',rim[i],1);
end;
if rim[i]='VIII  ' then
begin
delete(rim[i],1,6);
insert('8',rim[i],1);
end;
if rim[i]='IX  ' then
begin
delete(rim[i],1,4);
insert('9',rim[i],1);
end;
if rim[i]='X  ' then
begin
delete(rim[i],1,3);
insert('10',rim[i],1);
end;
end;
for I := 0 to Memo2.Lines.Count - 1 do
level[i]:=strtofloat(rim[i]);
 
end;
procedure TForm1.EffectButton1Click(Sender: TObject);
begin
 
form1.close;
 
end;
 
 
 
 
end.

вот событие из второго баттона:

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
procedure TForm1.Button2Click(Sender: TObject);
var
i,j:integer;
pr:string;
begin
// вместо мемо1 мемо2, вместо мемо 2 мемо3 , мемо3 - мемо4
SetLength(buf, 0);
for I := 0 to Memo1.Lines.Count - 1 do
if (I mod 4 = 0) then
begin
SetLength(buf, Length(buf) + 1);
buf[Length(buf) - 1] := I;
end;
for I := 0 to Length(buf)  - 1 do
Memo2.Lines.Add(Memo1.Lines[buf[I]]);
for i:=0 to Memo2.Lines.Count - 1  do
rim[i]:= Memo2.Lines.Strings[i];
 
SetLength(buf1, 0);
for I := 0 to Memo1.Lines.Count - 1 do
    if (I mod 2 = 0) and (I mod 4 <> 0) and (I <> 0) then
    begin
      SetLength(buf1, Length(buf1) + 1);
      buf1[Length(buf1) - 1] := I;
    end;
          for I := 0 to Length(buf1)  - 1 do
    Memo3.Lines.Add(Memo1.Lines[buf1[I]]);
    for i:=0 to Memo3.Lines.Count - 1  do
boi[i]:= Memo3.Lines.Strings[i];
 
 for i:=0 to Memo3.Lines.Count - 1 do
begin
pr:=boi[i];
for j:=1 to length(pr) do
begin
if pr[j]=' ' then
delete(pr,j,1);
end;
boi[i]:=pr;
pr:='';
 end;
for I := 0 to Memo3.Lines.Count - 1 do
battle[i]:=strtofloat(boi[i]);
 
 
for i:=0 to   Memo2.Lines.Count - 1 do
begin
if (rim[i])='I  ' then
begin
delete(rim[i],1,3);
insert('1', rim[i],1);
end;
if rim[i]='II  ' then
begin
delete(rim[i],1,4);
insert('2',rim[i],1);
end;
if rim[i]='III  ' then
begin
delete(rim[i],1,5);
insert('3',rim[i],1);
end;
if rim[i]='IV  ' then
begin
delete(rim[i],1,4);
insert('4',rim[i],1);
end;
if rim[i]='V  ' then
begin
delete(rim[i],1,3);
insert('5',rim[i],1);
end;
if rim[i]='VI  ' then
begin
delete(rim[i],1,4);
insert('6',rim[i],1);
end;
if rim[i]='VII  ' then
begin
delete(rim[i],1,5);
insert('7',rim[i],1);
end;
if rim[i]='VIII  ' then
begin
delete(rim[i],1,6);
insert('8',rim[i],1);
end;
if rim[i]='IX  ' then
begin
delete(rim[i],1,4);
insert('9',rim[i],1);
end;
if rim[i]='X  ' then
begin
delete(rim[i],1,3);
insert('10',rim[i],1);
end;
end;
for I := 0 to Memo2.Lines.Count - 1 do
level[i]:=strtofloat(rim[i]);
 
end;

Если кому нужен проект пишите

Для теста, кто скачает проект :
1. вводите ник:xako;
2. затем кнопку соединямсяж
3. затем 4 баттон;
4. затем 2 баттон;
5. закрываем.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



#1 2018-03-26 03:07:43

ToRag
Member
Registered: 2018-03-26
Posts: 7

Runtime error 216 in SynGdiPlus Finalization

Hi,

using Delphi XE and SynPDF v1.18 on Windows 10:

PDF creation works fine but after closing my application I get runtime error 216.
I traced it down to the finalization of unit SynGdiPlus.

finalization
  Gdip.Free;
  Windows.DeleteCriticalSection(GdipCS);
end.

Gdip.Free causes the problem, so Windows.DeleteCriticalSection(GdipCS) is skipped when debugging.

Any help appreciated.

Regards,
Tom

#2 2018-03-26 08:02:59

ab
Administrator
From: France
Registered: 2010-06-21
Posts: 13,511
Website

Re: Runtime error 216 in SynGdiPlus Finalization

I don’t get which kind of problem Gdip.Free may trigger, and never seen it in practice…

Do you have any more information about the context?
Most of the time, a «Runtime error 216» comes from a wrongly used of library resources in the program, IIRC.
An exception is probably raised in the initialization section of your code, or the framework code.
See https://stackoverflow.com/a/35747477/458259

#3 2018-03-26 15:18:49

Chaa
Member
Registered: 2011-03-26
Posts: 230

Re: Runtime error 216 in SynGdiPlus Finalization

This may be due to use the SynPDF in a DLL.

To avoid error you can call FreeAndNil(Gdip) before DLL will be unloaded.

#4 2018-03-26 15:43:21

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

Thanks for your help.

I’m using the PDF engine together with the «Print Preview» component (DelphiArea.com website).
I included the {$DEFINE SYNOPSE} compiler directive in the project options.
This should be enough for the Print Preview component to take care of everything if I understood correctly.
In my own project units I don’t have any link to SynPDF.
Printing a PDF works fine, the error occurs after closing the application.
If I remove the compiler directive (in other words, when I don’t use the PDF engine), no error occurs.

Where should I put the «FreeAndNil(Gdip)»?

#5 2018-03-27 07:14:24

ab
Administrator
From: France
Registered: 2010-06-21
Posts: 13,511
Website

Re: Runtime error 216 in SynGdiPlus Finalization

Did you try to ask on the «Print Preview» component support?

Did you try with our mORMotReport.pas component, which has a print preview feature?

#6 2018-03-27 09:41:07

MtwStark
Member
From: Italy
Registered: 2016-01-05
Posts: 27

Re: Runtime error 216 in SynGdiPlus Finalization

Are you building/working with an ISAPI?
In this case your initializations/finalizations can be called for each execution (thread) but global vars are shared across the DLL so gdip could be freed when it is already free.

try to change finalization with:

finalization
  if Gdip<>nil then
    FreeAndNil(Gdip);
  Windows.DeleteCriticalSection(GdipCS);
end.

Last edited by MtwStark (2018-03-28 10:04:51)

#7 2018-03-27 17:00:01

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

Yesterday I posted my question on the DelphiArea forum but no answer yet.

My application is a VCL Forms application.

I din’t try mORMotReport.pas since I’m using Print Preview for many years now. I prefer to keep using Print Preview if possible.

I changed the finalization without success.
If I debug trace into (F7) the finalization I enter the TGDIPlus.Destroy destructor.
fStartupHook.UnHook(fStartupHookToken) is the command that causes the problem.

destructor TGDIPlus.Destroy;
begin
  if fToken<>0 then begin
    if Assigned(fStartupHook.UnHook) then // may be nil e.g. for Win64
      fStartupHook.UnHook(fStartupHookToken);
    Shutdown(fToken);
    fToken := 0;
  end;
  UnLoad;
  inherited Destroy;
end;

#8 2018-03-27 18:01:47

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

I distributed the application on a Windows 7, same problem.

#9 2018-03-28 09:51:51

MtwStark
Member
From: Italy
Registered: 2016-01-05
Posts: 27

Re: Runtime error 216 in SynGdiPlus Finalization

Looking the Gdiplus Startup Output structure documentation it says that using the wrong token in the unhook function will cause resource leaks, cleaned up when the process exits.
This should not produce a runtime error.

I think the problem could be in the TGDIPlus.Create, maybe the token received in the hook function was invalid?
The hook function should returns a status (TGdipStatus) but it is not tested in TGDIPlus.Create

it is possible that the call of Startup(fToken,Input,fStartupHook) returns an error (<>stOk) but puts something dirt in fStartupHook?
In this case during the Destroy the fStartupHook.UnHook could result Assigned (<>nil) but invalid.
Try to clear the fStartupHook record when Startup fails in the TGDIPlus.Create:

  if Startup(fToken,Input,fStartupHook)<>stOk then begin
    FillChar(fStartupHook, SizeOf(fStartupHook), 0); // MTW 2018-03-28 - Be sure Hook/UnHook are unassigned
    fToken := 0;
    UnLoad;
    exit;
  end;

#10 2018-03-28 15:41:50

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

Thanks for your suggestion.
It didn’t solve the problem.
Debugging learns me that Startup(fToken,Input,fStartupHook) = stOk. This begin-end block is not executed.

#11 2018-03-29 08:11:42

MtwStark
Member
From: Italy
Registered: 2016-01-05
Posts: 27

Re: Runtime error 216 in SynGdiPlus Finalization

you are welcome.
Are you sure the error is raised on fStartupHook.UnHook(fStartupHookToken), and not on Shutdown(fToken)?
In any case, I think the problem could be related to gdi objects not released before the TGDIPlus.Destroy
Shutdown procedure must be called only after all gdi objects are released…
Try to place a breakpoint in TPrintPreview.Destroy, TThumbnailPreview.Destroy and TPaperPreview.Destroy and see if the runtime error is raised before the destroy of you «Print Preview» component.
If it does not release all gdi objects before destruction it could bring to this kind of problems.

I have taken a brief look into preview.pas and I see it has its own gdiplus support.. maybe the problem is a conflict between the two.
In preview.pas, I would check also TGDIPlusSubset.Create and _gdiPlus.Free in finalization (TGDIPlusSubset.Destroy)

Finally..
I’m still using Delphi 2007 so, I’m not sure about that, but I have read here that in XE2 the calls to “GdiplusStartup” and “GdiplusShutdown” are only performed if not IsLibrary is True to avoid hangs in shutdown..

Last edited by MtwStark (2018-03-29 08:43:28)

#12 2018-03-30 17:06:59

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

The runtime error is raised before reaching the TPrintPreview.Destroy and TPaperPreview.Destroy breakpoints. 
TGDIPlusSubset.Destroy is executed before the SynPDF, SynCrypto, SynCommons and SynGDI finalization.

I made a small video showing the debugging. The runtime error itself isn’t shown because only the Delphi Environment window was captured.
http://173.236.46.37/Runtime216.mp4

#14 2018-04-03 23:51:51

ToRag
Member
Registered: 2018-03-26
Posts: 7

Re: Runtime error 216 in SynGdiPlus Finalization

This seems to do the trick! Tomorrow I do some more testing to be absolutely sure.
Thanks you so much.

#15 2018-04-04 10:18:01

MtwStark
Member
From: Italy
Registered: 2016-01-05
Posts: 27

Re: Runtime error 216 in SynGdiPlus Finalization

you are welcome smile

I’m happy to hear you have solved

Dear Experts,

[cross-posted to www.nldelphi.com]

I’m troubled by an annoying but otherwise harmless run-time error 216 that my application generates on closing. The source code is too long to post, and I am unable to locate the code that causes the error, so I will try to just give a short description of the program:

— DB application, uses MS Access and Delphi built-in data aware components and own db-aware components. One of these (the only ‘non-cosmetic’ descendant) is a data-aware twebbrowser descendant.
— Uses subforms by docking other forms into the mainform
— Uses gsapi (ghostscript dll) and wingraphvi (com component).
— Uses interfaces for most interobject communication

The vague thing is that the error seems to disappear and reappear as I continue to work on the application, even if I add or remove things that seem completely unrelated. However, if the error occurs restarting the application never changes that. The only thing that seems to have effect is not connecting to the access database, which (usually) causes the error not to appear. I am using a win2k machine with D6 and D7 installed, both versions generate the error.

The nasty thing is that if I trace my closing code (even with the VCL components in the search path) the error seems to occur *after* the last line of code, which is de finalization of ADODB. It traces through the whole Form.DoneApplication down to the last ‘end;’, then into ADODB. After hitting f7 on the last ‘end;’ there, it gives an Access Violation followed by a Runtime Error if I hit f7 again.

Most forums on the Net seem to hint that I might be trying to free an object that the VCL will want to free later, or free an object multiple times. However, commenting out all lines that free objects (except for the obvious StringLists, Inifiles etc.) does not solve the problem. Freeing or not freeing my datamodule also does not seem to do anyting. Actually, commenting out my entire ‘onclose’ code does not seem to change anything at all.

<edit> Since I suspected my own data-aware web browser (the only component not previuosly used in applications) I removed it from the form it was in. This did not change anythign </edit>

I realize that similar questions have been asked before, but I could not find any hints on these threads that solved my problem. I hope anybody can help me out here.

Kind regards,

Wouter van Atteveldt

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Delphi richedit line insertion error
  • Delphi raise error
  • Default backend 404 как исправить
  • Delphi out of memory как исправить
  • Delphi internal error sy576

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии