<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x410;&#x43D;&#x43E;&#x43D;&#x438;&#x43C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;</title><link>https://fire-monkey.ru/forum/278-%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B/</link><description>&#x410;&#x43D;&#x43E;&#x43D;&#x438;&#x43C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B; &#x43F;&#x43E;&#x441;&#x43B;&#x435;&#x434;&#x43D;&#x438;&#x445; &#x432;&#x43E;&#x43F;&#x440;&#x43E;&#x441;&#x43E;&#x432;</description><language>ru</language><item><title>&#x41E;&#x448;&#x438;&#x431;&#x43A;&#x430; InputQuery &#x43D;&#x430; Windows</title><link>https://fire-monkey.ru/topic/4746-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-inputquery-%D0%BD%D0%B0-windows/</link><description><![CDATA[<p>
	Мультиплатформенное приложение. Delphi Tokyo.
</p>

<p>
	указываю 2 параметра для VAL и передаю это в TDialogService.InputQuery
</p>

<p>
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">procedure TfmMain.Send(id: integer);
Var
  val: array of string;
  cap: string;
begin
// запускаем диалог ввода имени

  SetLength(val, 2);
  val[0] := VarToStr(qCalls.Lookup('ID', id, 'name'));
  val[1] := id.ToString;
  cap    := 'Введите имя';

  TDialogService.InputQuery(cap, ['Имя клиента: '], Val, InputDialogHandlerGetShotName);
end;
</span></pre>

<p>
	 
</p>

<p>
	В итоге, в недрах TDialogService.InputQuery получаю исключение:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		Цитата
	</div>

	<div class="ipsQuote_contents">
		<p>
			Project raised exception class EArgumentOutOfRangeException with message 'Argument out of range'.
		</p>
	</div>
</blockquote>

<p>
	 
</p>

<p>
	На андроиде ошибки нет.
</p>

<p>
	 
</p>

<p><a href="https://fire-monkey.ru/uploads/monthly_2018_02/Screenshot_4.png.935700dc84cef75cdfdfefc423aad292.png" class="ipsAttachLink ipsAttachLink_image"><img data-fileid="3627" src="https://fire-monkey.ru/applications/core/interface/js/spacer.png" class="ipsImage ipsImage_thumbnailed" alt="Screenshot_4.png" data-src="https://fire-monkey.ru/uploads/monthly_2018_02/Screenshot_4.png.935700dc84cef75cdfdfefc423aad292.png" width="348" data-ratio="38,51"></a></p>]]></description><guid isPermaLink="false">4746</guid><pubDate>Thu, 01 Feb 2018 17:52:45 +0000</pubDate></item><item><title>&#x412;&#x44B;&#x437;&#x432;&#x430;&#x442;&#x44C; &#x444;&#x43E;&#x440;&#x43C;&#x443;, &#x441;&#x434;&#x435;&#x43B;&#x430;&#x442;&#x44C; &#x432;&#x44B;&#x431;&#x43E;&#x440; &#x438; &#x432;&#x435;&#x440;&#x43D;&#x443;&#x442;&#x44C; &#x440;&#x435;&#x437;&#x443;&#x43B;&#x44C;&#x442;&#x430;&#x442;</title><link>https://fire-monkey.ru/topic/4664-%D0%B2%D1%8B%D0%B7%D0%B2%D0%B0%D1%82%D1%8C-%D1%84%D0%BE%D1%80%D0%BC%D1%83-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B2%D1%8B%D0%B1%D0%BE%D1%80-%D0%B8-%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D1%82%D1%8C-%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82/</link><description><![CDATA[
<p>
	Т.к. у FMX/Android нет модальных форм, то я взял за пример работу с диалогами.
</p>

<p>
	Есть работающий пример
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">TDialogService.InputQuery(cap, ['Введите имя: '], Val, InputDialogHandlerEditTelName);

....
....
....
procedure TfmEditObject.InputDialogHandlerEditTelName(const AResult: TModalResult; const AValues: array of string);
begin
...
...
end;</span></pre>

<p>
	Я решил пойти по тому же пути. Есть некая главная форма с кнопкой, которую пользователь нажимает, выбирает на другой форме что-то и, по идее, должна выполниться какая процедура на первой форме.
</p>

<p>
	Главных форм несколько, т.к. во многих местах приложения пользователь что-то выбирает. А форма выбора для всех одна.
</p>

<p>
	 
</p>

<p>
	Я добавил в проект модуль, где написал:<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">type
  TCallBackProcSelectRef = reference to procedure(idRegion: integer; constsFullRegion: string);

...

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);

implementation

procedure CallBackProcSelect(idRegion: integer; const sFullRegion: string);
begin
  fmMain.lbSelRegion.Text := sFullRegion;
  fmMain.idRegion := idRegion;
end;
</span></pre>

<p>
	 
</p>

<p>
	На форме выбора есть процедура<br />
	 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">private

  procedure SelRegion2(CallBackProcSelectRef: TCallBackProcSelectRef);

...

...

procedure TfmTree.SelRegion2(CallBackProcSelectRef: TCallBackProcSelectRef);
begin
  CallBackProcSelectRef(TreeView1.Selected.Tag, TreeView1.Selected.Text);
end;
</span></pre>

<p>
	здесь же, на форме выбора, на кнопке выбора есть строка:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">SelRegion2(CallBackProcSelect);</span></pre>

<p>
	вроде бы всё так же, как и с диалогами, но компилятор ругается:
</p>

<p>
	Incompatible types: 'TCallBackProcSelectRef' and 'Procedure'
</p>

<p>
	что я не правильно понял в анонимных процедурах, что я делаю не так?
</p>
]]></description><guid isPermaLink="false">4664</guid><pubDate>Sat, 30 Dec 2017 13:58:14 +0000</pubDate></item><item><title>&#x41F;&#x43E;&#x43B;&#x443;&#x447;&#x438;&#x442;&#x44C; &#x43C;&#x435;&#x442;&#x43E;&#x434; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;&#x430; &#x43F;&#x43E; &#x443;&#x43A;&#x430;&#x437;&#x430;&#x442;&#x435;&#x43B;&#x44E; &#x43D;&#x430; &#x438;&#x43D;&#x442;&#x435;&#x440;&#x444;&#x435;&#x439;&#x441;, &#x43D;&#x430; &#x433;&#x43E;&#x442;&#x43E;&#x432;&#x43E;&#x43C; &#x43F;&#x440;&#x438;&#x43C;&#x435;&#x440;&#x435; &#x43F;&#x440;&#x438;&#x43B;&#x43E;&#x436;&#x435;&#x43D;&#x438;&#x44F; DirectX</title><link>https://fire-monkey.ru/topic/4111-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0-%D0%BF%D0%BE-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8E-%D0%BD%D0%B0-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81-%D0%BD%D0%B0-%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BE%D0%BC-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-directx/</link><description><![CDATA[
<p>
	Привожу пример готового FMX приложения, которое рисует на форме с помощью интерфейса IDirect3DDevice9.
</p>

<p>
	В примере реализован вызов анонимного метода Present() интерфейса IDirect3DDevice9, имея ссылку на интерфейс и порядковый номер метода.
</p>

<p>
	Данная реализация пригодится при установке ловушек (Hooks).
</p>

<p>
	 
</p>

<p>
	Вкратце, суть реализации такая:
</p>

<p>
	Объявляю процедурный тип нужного метода
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">type
  TPresent9 = function(pSourceRect, pDestRect: PRect; hDestWindowOverride: HWND; pDirtyRegion: PRgnData): HResult of object; stdcall;
</span></pre>

<p>
	Объявляю переменную этого типа
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">var
  PPresent: TPresent9;
begin
  ...
  IntRefToMethPtr(d3d9Dev, PPresent, 17);
  PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);
</span></pre>

<p>
	Реализую процедуру получения метода интерфейса по номеру
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
type
  TVtable  = array [0 .. 999] of Pointer;
  PVtable  = ^TVtable;
  PPVtable = ^PVtable;
begin
  // QI=0, AddRef=1, Release=2, etc
  TMethod(MethPtr).Code := PPVtable(IntRef)^^[MethNo];
  TMethod(MethPtr).Data := Pointer(IntRef);
end;
</span></pre>

<p>
	А теперь получаем метод интерфейса по его порядковому номеру и вызываем его
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">  IntRefToMethPtr(d3d9Dev, PPresent, 17);
  PPresent(nil, nil, DParametrs.D3DPP.hDeviceWindow, nil);
</span></pre>

<p>
	Благодарю за оценку этого решения <a href="https://ru.stackoverflow.com/questions/656699/%D0%9A%D0%B0%D0%BA-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C-%D0%B0%D0%B4%D1%80%D0%B5%D1%81-%D1%81%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B8%D0%BB%D0%B8-%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D0%B5%D0%BB%D1%8C-%D0%BD%D0%B0-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%B0-%D0%B2-delphi" rel="external nofollow">на StackOverflow</a>.
</p>

<p>
	 
</p>

<p>
	Скачать пример: <a class="ipsAttachLink" href="https://fire-monkey.ru/applications/core/interface/file/attachment.php?id=3026" data-fileid="3026" rel="">D3DDemo.zip</a>
</p>
]]></description><guid isPermaLink="false">4111</guid><pubDate>Sat, 22 Apr 2017 22:52:04 +0000</pubDate></item><item><title>&#x423;&#x442;&#x435;&#x447;&#x43A;&#x430; &#x43F;&#x440;&#x438; &#x438;&#x441;&#x43F;&#x43E;&#x43B;&#x44C;&#x437;&#x43E;&#x432;&#x430;&#x43D;&#x438;&#x438; &#x430;&#x43D;&#x43E;&#x43D;&#x438;&#x43C;&#x43D;&#x43E;&#x433;&#x43E; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x430; &#x438;&#x43B;&#x438; &#x430;&#x43D;&#x43E;&#x43D;&#x438;&#x43C;&#x43D;&#x44B;&#x435; &#x43C;&#x435;&#x442;&#x43E;&#x434;&#x44B;, &#x446;&#x438;&#x43A;&#x43B;&#x438;&#x447;&#x435;&#x441;&#x43A;&#x438;&#x435; &#x441;&#x441;&#x44B;&#x43B;&#x43A;&#x438; &#x438; ARC</title><link>https://fire-monkey.ru/topic/3901-%D1%83%D1%82%D0%B5%D1%87%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8-%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%B0-%D0%B8%D0%BB%D0%B8-%D0%B0%D0%BD%D0%BE%D0%BD%D0%B8%D0%BC%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%86%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5-%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-%D0%B8-arc/</link><description><![CDATA[
<p>
	Это касается ARC компиляторов, Android, iOS и будущего Linux.
</p>

<p>
	Если контейнер владелец, содержит классы, которые используют анонимный метод для общения с ним (классом владельцем), то такая конструкция порождает утечку памяти из-за появления циклической ссылки. Т.к. при присваивании анонимного метода инкрементируется счетчик ссылок и не меняется. Причем это не указано в хелпе.
</p>

<p>
	<br />
	А дело было так - при вызове <strong>MyCore.Free</strong> класс не уничтожался - не вызывался деструктор из за того, что после вызова Free, счетчик ссылок (reference Count) был равен 1. Приходилось пользоваться  DisposeOf. Решил разобраться.
</p>

<p>
	Для этого перекрыл виртуальные методы TObject отвечающие за изменения счетчика объекта (см. также полный пример ниже).
</p>

<p>
	function __ObjAddRef: Integer; override;<br />
	function __ObjRelease: Integer; override;
</p>

<p>
	 
</p>

<p>
	Итак TCore содержит класс TTestClass - у которого есть событие OnMyEvent. <br />
	Прототип описан как анонимная процедура - <strong>TAnonymProc = reference to procedure;</strong>
</p>

<p>
	<br />
	При указании анонимной процедуры, т.е. : 
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span class="pln">procedure </span><span>TCore</span><span class="pun">.</span><span>SetEvent</span><span class="pun">;</span><span class="pln">
begin
  fTest</span><span class="pun">.</span><span>OnMyEvent</span><span class="pln"> </span><span class="pun">:=</span><span class="pln"> procedure </span><span class="pun">()</span><span class="pln">
  begin
    fSetFlag </span><span class="pun">:=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  end</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span></pre>

<p>
	счетчик ссылок TCore увеличивается на 1 и не изменяется при выходе из SetEvent.
</p>

<p>
	Теперь при вызове Free TCore - не будет вызван деструктор, который должен уничтожит классы TCore и TTestClass <strong>и произойдет утечка памяти.</strong>
</p>

<p>
	<br /><strong><span style="color:#ff0000;">Решение : </span></strong><br /><strong>1.</strong> Использовать слабые ссылки - weak, в нашем примере добавить атрибут <strong>[weak]</strong>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted">
<span>TTestClass</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">class</span><span class="pln">
strict </span><span class="kwd">private</span><span class="pln">
  </span><span class="pun">[</span><span class="pln">weak</span><span class="pun">]</span><span class="pln">fOnMyEvent</span><span class="pun">:</span><span>TAnonymProc</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">public</span><span class="pln">
  property </span><span>OnMyEvent</span><span class="pun">:</span><span class="pln"> </span><span>TAnonymProc</span><span class="pln"> read fOnMyEvent write fOnMyEvent</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln"> </span></pre>

<p>
	При присваивании объекта в переменную со слабой ссылкой не происходит увеличение счётчика ссылок объекта на единицу. Аналогично, при очистке слабой ссылки не происходит уменьшение счётчика объекта на единицу.
</p>

<p>
	<strong>2.</strong> Не использовать анонимные методы, а использовать обычные указатели на метод: <br />
	Вместо <strong>TAnonymProc = reference to procedure;</strong> используем классический <br />
	      <strong> TAnonymProc = procedure of object;</strong>
</p>

<p>
	<br />
	Демо пример, где можно отследить утечку прикрепил.
</p>

<p>
	Полный код: 
</p>

<div class="ipsSpoiler" data-ipsspoiler="">
	<div class="ipsSpoiler_header">
		<span>Спойлер</span>
	</div>

	<div class="ipsSpoiler_contents">
		<p>
			 
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted">

<span class="pln">unit </span><span>Unit1</span><span class="pun">;</span><span class="pln">

interface

uses
  </span><span>System</span><span class="pun">.</span><span>SysUtils</span><span class="pun">,</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Types</span><span class="pun">,</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>UITypes</span><span class="pun">,</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Classes</span><span class="pun">,</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Variants</span><span class="pun">,</span><span class="pln">
  FMX</span><span class="pun">.</span><span>Types</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>Controls</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>Forms</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>Graphics</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>Dialogs</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>Controls</span><span class="pun">.</span><span>Presentation</span><span class="pun">,</span><span class="pln"> FMX</span><span class="pun">.</span><span>StdCtrls</span><span class="pun">;</span><span class="pln">

type
  </span><span>TAnonymProc</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> reference to procedure</span><span class="pun">;</span><span class="pln">
  </span><span>TTestClass</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">class</span><span class="pln">
  strict </span><span class="kwd">private</span><span class="pln">
    fOnMyEvent</span><span class="pun">:</span><span>TAnonymProc</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln">
    property </span><span>OnMyEvent</span><span class="pun">:</span><span class="pln"> </span><span>TAnonymProc</span><span class="pln"> read fOnMyEvent write fOnMyEvent</span><span class="pun">;</span><span class="pln">
  end</span><span class="pun">;</span><span class="pln">

  </span><span>TCore</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="pun">(</span><span>TObject</span><span class="pun">)</span><span class="pln">
  strict </span><span class="kwd">private</span><span class="pln">
    fTest</span><span class="pun">:</span><span class="pln"> </span><span>TTestClass</span><span class="pun">;</span><span class="pln">
    fSetFlag</span><span class="pun">:</span><span class="pln"> boolean</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln">
    constructor </span><span>Create</span><span class="pun">;</span><span class="pln">
    destructor </span><span>Destroy</span><span class="pun">;</span><span class="pln"> override</span><span class="pun">;</span><span class="pln">
    procedure </span><span>SetEvent</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> __ObjAddRef</span><span class="pun">:</span><span class="pln"> </span><span>Integer</span><span class="pun">;</span><span class="pln"> override</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> __ObjRelease</span><span class="pun">:</span><span class="pln"> </span><span>Integer</span><span class="pun">;</span><span class="pln"> override</span><span class="pun">;</span><span class="pln">
  end</span><span class="pun">;</span><span class="pln">


  </span><span>TForm1</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">class</span><span class="pun">(</span><span>TForm</span><span class="pun">)</span><span class="pln">
    </span><span>Button1</span><span class="pun">:</span><span class="pln"> </span><span>TButton</span><span class="pun">;</span><span class="pln">
    </span><span>Button2</span><span class="pun">:</span><span class="pln"> </span><span>TButton</span><span class="pun">;</span><span class="pln">
    procedure </span><span>Button1Click</span><span class="pun">(</span><span>Sender</span><span class="pun">:</span><span class="pln"> </span><span>TObject</span><span class="pun">);</span><span class="pln">
    procedure </span><span>Button2Click</span><span class="pun">(</span><span>Sender</span><span class="pun">:</span><span class="pln"> </span><span>TObject</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">private</span><span class="pln">
    fCore</span><span class="pun">:</span><span class="pln"> </span><span>TCore</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">public</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span>Public</span><span class="pln"> declarations </span><span class="pun">}</span><span class="pln">
  end</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">var</span><span class="pln">
  </span><span>Form1</span><span class="pun">:</span><span class="pln"> </span><span>TForm1</span><span class="pun">;</span><span class="pln">

implementation

</span><span class="pun">{</span><span class="pln">$R </span><span class="pun">*.</span><span class="pln">fmx</span><span class="pun">}</span><span class="pln">

procedure </span><span>TForm1</span><span class="pun">.</span><span>Button2Click</span><span class="pun">(</span><span>Sender</span><span class="pun">:</span><span class="pln"> </span><span>TObject</span><span class="pun">);</span><span class="pln">
begin
  fCore </span><span class="pun">:=</span><span class="pln"> </span><span>TCore</span><span class="pun">.</span><span>Create</span><span class="pun">;</span><span class="pln">
  fCore</span><span class="pun">.</span><span>SetEvent</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

procedure </span><span>TForm1</span><span class="pun">.</span><span>Button1Click</span><span class="pun">(</span><span>Sender</span><span class="pun">:</span><span class="pln"> </span><span>TObject</span><span class="pun">);</span><span class="pln">
begin
  </span><span>Tag</span><span class="pln"> </span><span class="pun">:=</span><span class="pln"> fCore</span><span class="pun">.</span><span>RefCount</span><span class="pun">;</span><span class="pln">
  fCore</span><span class="pun">.</span><span>Free</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

</span><span class="pun">{</span><span class="pln"> </span><span>TCore</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

constructor </span><span>TCore</span><span class="pun">.</span><span>Create</span><span class="pun">;</span><span class="pln">
begin
  fTest </span><span class="pun">:=</span><span class="pln"> </span><span>TTestClass</span><span class="pun">.</span><span>Create</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

destructor </span><span>TCore</span><span class="pun">.</span><span>Destroy</span><span class="pun">;</span><span class="pln">
begin
  fTest</span><span class="pun">.</span><span>Free</span><span class="pun">;</span><span class="pln">
  inherited</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

procedure </span><span>TCore</span><span class="pun">.</span><span>SetEvent</span><span class="pun">;</span><span class="pln">
begin
  fTest</span><span class="pun">.</span><span>OnMyEvent</span><span class="pln"> </span><span class="pun">:=</span><span class="pln"> procedure </span><span class="pun">()</span><span class="pln">
  begin
    fSetFlag </span><span class="pun">:=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  end</span><span class="pun">;</span><span class="pln">

end</span><span class="pun">;</span><span class="pln">

</span><span class="com">// test it on ARC compilers like Android, iOS</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> </span><span>TCore</span><span class="pun">.</span><span class="pln">__ObjAddRef</span><span class="pun">:</span><span class="pln"> </span><span>Integer</span><span class="pun">;</span><span class="pln">
begin
  </span><span>Result</span><span class="pln"> </span><span class="pun">:=</span><span class="pln"> inherited __ObjAddRef</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> </span><span>TCore</span><span class="pun">.</span><span class="pln">__ObjRelease</span><span class="pun">:</span><span class="pln"> </span><span>Integer</span><span class="pun">;</span><span class="pln">
begin
  </span><span>Result</span><span class="pln"> </span><span class="pun">:=</span><span class="pln"> inherited __ObjRelease</span><span class="pun">;</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">

end</span><span class="pun">.</span></pre>

		<p>
			 
		</p>

		<p>
			 
		</p>
	</div>
</div>

<p>
	 
</p>

<p>
	<a class="ipsAttachLink" data-fileid="2843" href="https://fire-monkey.ru/applications/core/interface/file/attachment.php?id=2843" rel="">AnonMethodsCycle.zip</a>
</p>
]]></description><guid isPermaLink="false">3901</guid><pubDate>Sun, 12 Mar 2017 20:12:00 +0000</pubDate></item><item><title>&#x41F;&#x440;&#x43E;&#x432;&#x435;&#x440;&#x43A;&#x430; &#x441;&#x432;&#x43E;&#x439;&#x441;&#x442;&#x432;-&#x43C;&#x435;&#x442;&#x43E;&#x434;&#x43E;&#x432; &#x43E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43E;&#x432;</title><link>https://fire-monkey.ru/topic/3275-%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D1%81%D0%B2%D0%BE%D0%B9%D1%81%D1%82%D0%B2-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%B2-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BE%D0%B2/</link><description><![CDATA[
<p>
	Собственно вот такая строчка:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted">
<span class="pln">  if TCustomPopupForm(self.PopupForm).OnKeyDown &lt;&gt; KeyDown  then</span></pre>

<p>
	вызывает ошибку при компиляции <em>Not enough actual parameters</em>
</p>

<p>
	Собственно как получить подобное условие?<br />
	И интересен будет комментарий к этому - почему такая ошибка.
</p>
]]></description><guid isPermaLink="false">3275</guid><pubDate>Sat, 08 Oct 2016 01:24:32 +0000</pubDate></item><item><title>&#x41E;&#x431;&#x44A;&#x435;&#x43A;&#x442;&#x43D;&#x430;&#x44F; &#x43C;&#x43E;&#x434;&#x435;&#x43B;&#x44C; &#x434;&#x435;&#x43B;&#x435;&#x433;&#x430;&#x442;&#x43E;&#x432;</title><link>https://fire-monkey.ru/topic/2230-%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%B0%D1%8F-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C-%D0%B4%D0%B5%D0%BB%D0%B5%D0%B3%D0%B0%D1%82%D0%BE%D0%B2/</link><description><![CDATA[
<p>События в Object Pascal имеют следующую сигнатуру</p>
<p>procedure of object</p>
<p>Анонимные методы - reference to procedure (function)</p>
<p>То есть, это различные сущности.</p>
<p>В языке C# эти понятия тождественны, в Java AddListener принимает интерфейс типа ActionListener.</p>
<p> </p>
<p>Что помешало разработчикам отождествить эти понятия?</p>
<p>Исторически унаследованная несовместимость?</p>
<p>Чем отличается procedure of object от reference to procedure? Это важно с точки зрения организации приложения в стиле ООП.</p>
<p>Спасибо большое!</p>
]]></description><guid isPermaLink="false">2230</guid><pubDate>Mon, 25 Jan 2016 20:38:44 +0000</pubDate></item></channel></rss>
