tag:blogger.com,1999:blog-330576552024-03-05T22:00:13.420+03:00Разное от программиста...Разное, оно и есть разноеKazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.comBlogger136125tag:blogger.com,1999:blog-33057655.post-45991115024412106032016-08-14T15:30:00.002+03:002016-08-14T15:34:15.723+03:00Ubuntu 16.04.1 LTS<div dir="ltr" style="text-align: left;" trbidi="on">
Я уже около двух лет сижу на Ubuntu 14.04. Система мне нравится, пользоваться удобно. Примерно неделю назад получил оповещение о доступности релиза 16.04.1, и позавчера, наконец, обновился на новую версию. Обновление длилось около 8 часов. Трафика, в моём случае, потребовалось примерно 2.7Gb. Всё прошло гладко. <br />
<br />
<b>После обновления</b>:<br />
<br />
<b>0</b>. Пришлось проверить все сторонние репозитории подключенные к APT на предмет поддержки новой версии. Тут ясно, без этого никуда. <br />
<br />
<b>1</b>. Начал отваливаться Wi-Fi. Выяснил, что дело в управлении энергосбережением сетевого адаптера - он перестал просыпаться. Вылечилось отключением энергосбережения для Wi-Fi.<br />
<br />
<b>2</b>. Явно изменился рендеринг шрифтов. Шрифт Ubuntu Mono 11, используемый мною в терминале, стал выглядеть слишком широким. Пробовал использовать шрифты из версии 14.04 - не помогло. Заменил его на Hack 9 (версия 2.010. Текущая версия 2.020, но он выглядит немного приплюснутым). Этот же шрифт я использую и в Delphi IDE.<br />
<br />
<b>3</b>. Новый Software Center не понравился, старый был лучше, хоть и тормознее.<br />
<br />
<b>4</b>. Ускорились анимации в Unity, и в целом система кажется более отзывчивой.<br />
<br />
<b>5</b>. Файловый менеджер лучше справляется с большим количеством файлов в директориях.<br />
<br />
<b>6</b>. MC, внезапно, перестал считать запятую разделителем паттернов в диалоге поиска файлов. Теперь в качестве разделителя используется символ вертикальной линии "|". <br />
<br />
<b>7</b>. В том же MC появилась поддержка скинов, что позволяет подобрать цвета и оформление под себя, а также выбрать отдельное оформление для рута.<br />
<br />
<b>8</b>. gnome-terminal перестал поддерживать параметр --title. Как теперь заголовок-то поменять?<br />
<br />
<b>9</b>. Можно поменять положение таскбара в Unity. Впрочем, я делать этого не стал. После винды я, наконец, понял, как можно работать со скрывающимся таскбаром.<br />
<br />
В целом я доволен и обновлением и тем как оно прошло.</div>
Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-61242884908390697602016-03-11T17:06:00.000+03:002016-03-11T17:14:59.694+03:00Delphi ARC такой ARC...<div dir="ltr" style="text-align: left;" trbidi="on">
Проверил на Андроиде. Delphi 10 Seattle Update 1.<br />
<br />
<pre>Procedure Run;
Var
Proc : Procedure Of Object;
Begin
TObj.Create('1'); // will be destroyed
TObj.Create('2').Test; // <span style="color: red;">will be never destroyed</span>
Proc := TObj.Create('3').Test; // <span style="color: red;">will be never destroyed
</span>
End; </pre>
<br />
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Paris_Tuileries_Garden_Facepalm_statue.jpg/220px-Paris_Tuileries_Garden_Facepalm_statue.jpg" /><br />
А будущий компилятор для линукса обещает быть ARC enabled по дефолту...<br />
<a href="https://quality.embarcadero.com/browse/RSP-13934" target="_blank">[RSP-13934]</a><br />
<br /></div>
Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com7tag:blogger.com,1999:blog-33057655.post-34935530918363228942016-03-08T16:26:00.000+03:002016-03-08T16:26:30.049+03:00Позитивчик из стана FreePascal<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://lists.freepascal.org/pipermail/fpc-devel/2016-March/036768.html" target="_blank">Вчера появилась новость</a> о том, что во FreePascal реализованы перегружаемые операторы класса для инициализации и финализации. Ждём скорейшего интегрирования в транк, а также возможность перегрузки оператора копирования. Ура! Кстати, запрос на аналогичную функциональность в Delphi уже <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=21729" target="_blank">10 лет висит в QC</a>.</div>
Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-42639606900175223792014-11-06T18:20:00.000+03:002014-11-06T18:20:27.533+03:00Пространства имен. Неработающая фича Delphi.<div dir="ltr" style="text-align: left;" trbidi="on">
В процессе очередного рефакторинга обнаружилось, что пространства имен в Delphi, которые для нативных дельфей стали доступны еще в Delphi 2006, если не раньше, попросту не работают. Как именно они не работают я отписал в <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=128737" target="_blank">QC#128737.</a> А также оформил небольшой фич-риквест <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=128740" target="_blank">QC#128740</a>. Не сочтите за труд, поддержите голосованием.</div>
Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-21760644526934694542014-04-13T00:10:00.001+04:002014-04-13T00:10:03.257+04:00Эмуляция перегружаемых дефолтных свойств во FreePascal 2.7.1<p>В настоящий момент FreePascal не поддерживает перегружаемые дефолтные свойства (<a href="http://bugs.freepascal.org/view.php?id=15384" target="_blank">на что есть соответствующий запрос</a>), поддержка которых появилась в Delphi после седьмой версии. Нельзя сказать, что это киллер-фича, но иногда она бывает очень полезной. Однако, с появлением поддержки улучшенных записей (<font color="#808080">advanced records</font>) и перегрузки операторов появилась возможность немного сгладить этот досадный недостаток. От слов к коду:</p> <pre>program project1;<br /><br />{$IFNDEF FPC}<br /><br /> {$APPTYPE CONSOLE}<br /> {$DEFINE HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br />{$ELSE}<br /><br /> {$MODE DELPHI}<br /><br />{$ENDIF}<br /><br />Type<br /><br /> //<br /> TContainer = Record<br /><br /> {$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br /> Strict Private<br /><br /> Type<br /><br /> //<br /> StringNameOrIntegerId = Record<br /><br /> FKind : (ikName, ikId);<br /> FName : String;<br /> FId : Integer;<br /><br /> Class Operator Implicit(Const AName : String) : StringNameOrIntegerId;<br /> Class Operator Implicit(Const AId : Integer) : StringNameOrIntegerId;<br /><br /> End;<br /> //<br /><br /> {$ENDIF}<br /><br /> Private<br /><br /> Function GetItemByName(Const AName : String) : TObject;<br /> Function GetItemById(Const AId : Integer) : TObject;<br /><br /> {$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br /> Function GetItem(Const ANameOrId : StringNameOrIntegerId) : TObject;<br /><br /> {$ENDIF}<br /><br /> Public<br /><br /> {$IFDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br /> Property Items[Const AName : String] : TObject Read GetItemByName; Default;<br /> Property Items[Const AId : Integer] : TObject Read GetItemById; Default;<br /><br /> {$ELSE}<br /><br /> Property Items[Const ANameOrId : StringNameOrIntegerId] : TObject Read GetItem; Default;<br /><br /> {$ENDIF}<br /><br /> End;<br /><br />{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br /> { TContainer.StringNameOrIntegerId }<br /><br /> //<br /> Class Operator TContainer.StringNameOrIntegerId.Implicit(Const AName : String) : StringNameOrIntegerId;<br /> Begin<br /><br /> Result.FKind := ikName;<br /> Result.FName := AName;<br /><br /> End;<br /> //<br /><br /> //<br /> Class Operator TContainer.StringNameOrIntegerId.Implicit(Const AId : Integer) : StringNameOrIntegerId;<br /> Begin<br /><br /> Result.FKind := ikId;<br /> Result.FId := AId;<br /><br /> End;<br /> //<br /><br />{$ENDIF}<br /><br />{ TContainer }<br /><br />//<br />Function TContainer.GetItemByName(Const AName : String) : TObject;<br />Begin<br /><br /> Result := TObject(1); // stub<br /><br />End;<br />//<br /><br />//<br />Function TContainer.GetItemById(Const AId : Integer) : TObject;<br />Begin<br /><br /> Result := TObject(2); // stub<br /><br />End;<br />//<br /><br />{$IFNDEF HAS_OVERLOADABLE_DEFAULT_PROPERTIES}<br /><br /> //<br /> Function TContainer.GetItem(Const ANameOrId : StringNameOrIntegerId) : TObject;<br /> Begin<br /><br /> Case ANameOrId.FKind Of<br /><br /> ikName : Result := GetItemByName(ANameOrId.FName);<br /> ikId : Result := GetItemById(ANameOrId.FId);<br /><br /> End;<br /><br /> End;<br /> //<br /><br />{$ENDIF}<br /><br />Var<br /><br /> cnt : TContainer;<br /><br />begin<br /><br /> Assert(cnt['name'] = TObject(1));<br /> Assert(cnt[1024] = TObject(2));<br /><br /> WriteLn('Overloadable default properties works fine!');<br /> ReadLn;<br /><br />end.</pre><br /><br /><p> </p><br /><br /><p>Это готовый пример который можно собрать в Delphi и FreePascal 2.7.1. Из кода видно, что проблему решает новый тип – улучшеная запись выступающий в качестве типа индекса дефолтного свойства и инкапсулирующий реальный тип индекса. Прикладной код, при этом, остается полностью совместимым с Delphi и возможной поддержкой перегружаемых дефолтных свойств во FreePascal в будущем.</p><br /><br /><p>Данный метод также может пригодится в случае, когда некое свойство (<font color="#808080">не обязательно перегружаемое и дефолтное</font>) должно принимать значения ограниченного числа типов, т.е. это может быть полезно не только для FreePascal, но и для Delphi.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-53308328251651528222014-03-20T01:51:00.001+04:002014-03-20T01:51:03.132+04:00QPS в действии?<p>18 марта, баг-репорт <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=121566" target="_blank">QC#121566</a>, которому были посвящены четыре поста “с ассемблером”, получил статус Resolved. Это, конечно, еще не Closed, но... Будем надеяться :) Хотя сам по себе факт решения проблемы довольно будничный, но не упомянуть о нем после широкой огласки было-бы несправедливо. Хочу поблагодарить всех, кто проголосовал, а также тех, кто способствовал распространению информации о данной проблеме. Спасибо.</p> <p>Напомню, что в <a href="http://edn.embarcadero.com/article/43677" target="_blank">обновленной дорожной карте RAD Studio, Delphi and C++Builder на 2014 год</a>, одним из пунктов декларируется QPS (Quality, Performance, Stability). Давно пора!</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-24927965397180682042014-03-11T02:15:00.001+04:002014-03-11T02:15:42.291+04:00Delphi. Ненависть. Продолжение истории.<p>В попытках найти решение проблемы с <strike><font color="#c0c0c0">говно</font></strike>кодогенератором Delphi, я понял, что все хуже, чем я предполагал.</p> <a name='more'></a>Оказалось, что компилятору сносит крышу не только при попытке развернуть вызовы методов вложенного класса, но и при разворачивании вызовов обычных функций, при условии, что типы параметров являются управляемыми. Я значительно упростил код демонстрирующий проблему: <p></p> <pre>program inline_bug;<br /><br />{$APPTYPE CONSOLE}<br /><br />{$OPTIMIZATION ON}<br />{$INLINE ON}<br /><br />{$R *.res}<br /><br />Type<br /><br /> TManagedType = Array Of Byte; // checked with: String, IInterface, TBytes and record with field of one of these types;<br /><br />//<br />Function Func(Const ALeft, ARight : TManagedType) : Boolean;<br />Begin<br /><br /> Result := True;<br /><br />End;<br />//<br /><br />//<br />Function CompareVars(Const ALeft, ARight : TManagedType) : Boolean; Inline;<br />Begin<br />End;<br />//<br /><br />//<br />Function CompareVarsAlt(Const ALeft, ARight : TManagedType) : Boolean; Inline;<br />Begin<br /><br /> Result := Func(ALeft, ARight);<br /><br />End;<br />//<br /><br />//<br />Function SameVars(Const ALeft, ARight : TManagedType; AAlternativeWay : Boolean = True) : Boolean; Inline;<br />begin<br /><br /> If AAlternativeWay Then<br /> Result := CompareVarsAlt(ALeft, ARight)<br /> Else<br /> Result := CompareVars(ALeft, ARight);<br /><br />End;<br />//<br /><br />Var<br /><br /> v1, v2 : TManagedType;<br /><br />begin<br /><br /> CompareVarsAlt(v1, v2);<br /> SameVars(v1, v2);<br /> v1 := Default(TManagedType);<br /><br />end.</pre><br /><br /><p>Можете экспериментировать меняя декларацию псевдонима TManagedType. Я проверил все управляемые типы Delphi: String, Interface, Dynamic array, Variant. Проблема воспроизводится на всех типах, кроме варианта. Также проблема воспроизводится на типе Record с полем управляемого типа. Для примера приведу код генерируемый для параметров типа Dynamic array:</p><br /><br /><pre>---------------------------------------------- Delphi XE Update 1 (15.0.3953.35171)<br />inline_bug.dpr.56: CompareVarsAlt(v1, v2);<br />004050D2 8B15789B4000 mov edx,[$00409b78]<br />004050D8 A1749B4000 mov eax,[$00409b74]<br />004050DD E84EF2FFFF call Func<br />inline_bug.dpr.57: SameVars(v1, v2);<br />004050E2 8B15789B4000 mov edx,[$00409b78]<br />004050E8 A1749B4000 mov eax,[$00409b74]<br />004050ED E83EF2FFFF call Func<br />inline_bug.dpr.58: v1 := Default(TManagedType);<br />004050F2 B8749B4000 mov eax,$00409b74<br />004050F7 8B15FC424000 mov edx,[$004042fc]<br />004050FD E8E2E9FFFF call @DynArrayClear<br />---------------------------------------------- Delphi XE5 Update 2 (19.0.14356.6604)<br />inline_bug.dpr.56: CompareVarsAlt(v1, v2);<br />004050F0 8D45EC lea eax,[ebp-$14]<br />004050F3 8B159C9B4000 mov edx,[$00409b9c]<br />004050F9 8B0D74444000 mov ecx,[$00404474]<br />004050FF E898E9FFFF call @DynArrayAsg<br />00405104 8D45E8 lea eax,[ebp-$18]<br />00405107 8B15A09B4000 mov edx,[$00409ba0]<br />0040510D 8B0D74444000 mov ecx,[$00404474]<br />00405113 E884E9FFFF call @DynArrayAsg<br />00405118 33C0 xor eax,eax<br />0040511A 55 push ebp<br />0040511B 685E514000 push $0040515e<br />00405120 64FF30 push dword ptr fs:[eax]<br />00405123 648920 mov fs:[eax],esp<br />00405126 8B55E8 mov edx,[ebp-$18]<br />00405129 8B45EC mov eax,[ebp-$14]<br />0040512C E877F3FFFF call Func<br />00405131 8845DF mov [ebp-$21],al<br />00405134 33C0 xor eax,eax<br />00405136 5A pop edx<br />00405137 59 pop ecx<br />00405138 59 pop ecx<br />00405139 648910 mov fs:[eax],edx<br />0040513C 6865514000 push $00405165<br />00405141 8D45EC lea eax,[ebp-$14]<br />00405144 8B1574444000 mov edx,[$00404474]<br />0040514A E811E9FFFF call @DynArrayClear<br />0040514F 8D45E8 lea eax,[ebp-$18]<br />00405152 8B1574444000 mov edx,[$00404474]<br />00405158 E803E9FFFF call @DynArrayClear<br />0040515D C3 ret <br />0040515E E9EDDFFFFF jmp @HandleFinally<br />00405163 EBDC jmp $00405141<br />inline_bug.dpr.57: SameVars(v1, v2);<br />00405165 8D45E4 lea eax,[ebp-$1c]<br />00405168 8B1574444000 mov edx,[$00404474]<br />0040516E E8EDE8FFFF call @DynArrayClear<br />00405173 8D45E0 lea eax,[ebp-$20]<br />00405176 8B1574444000 mov edx,[$00404474]<br />0040517C E8DFE8FFFF call @DynArrayClear<br />00405181 33C0 xor eax,eax<br />00405183 55 push ebp<br />00405184 6835524000 push $00405235<br />00405189 64FF30 push dword ptr fs:[eax]<br />0040518C 648920 mov fs:[eax],esp<br />0040518F 8D45E4 lea eax,[ebp-$1c]<br />00405192 8B159C9B4000 mov edx,[$00409b9c]<br />00405198 8B0D74444000 mov ecx,[$00404474]<br />0040519E E8F9E8FFFF call @DynArrayAsg<br />004051A3 8D45E0 lea eax,[ebp-$20]<br />004051A6 8B15A09B4000 mov edx,[$00409ba0]<br />004051AC 8B0D74444000 mov ecx,[$00404474]<br />004051B2 E8E5E8FFFF call @DynArrayAsg<br />004051B7 33C0 xor eax,eax<br />004051B9 55 push ebp<br />004051BA 68FD514000 push $004051fd<br />004051BF 64FF30 push dword ptr fs:[eax]<br />004051C2 648920 mov fs:[eax],esp<br />004051C5 8B55E0 mov edx,[ebp-$20]<br />004051C8 8B45E4 mov eax,[ebp-$1c]<br />004051CB E8D8F2FFFF call Func<br />004051D0 8845DD mov [ebp-$23],al<br />004051D3 33C0 xor eax,eax<br />004051D5 5A pop edx<br />004051D6 59 pop ecx<br />004051D7 59 pop ecx<br />004051D8 648910 mov fs:[eax],edx<br />004051DB 6804524000 push $00405204<br />004051E0 8D45E4 lea eax,[ebp-$1c]<br />004051E3 8B1574444000 mov edx,[$00404474]<br />004051E9 E872E8FFFF call @DynArrayClear<br />004051EE 8D45E0 lea eax,[ebp-$20]<br />004051F1 8B1574444000 mov edx,[$00404474]<br />004051F7 E864E8FFFF call @DynArrayClear<br />004051FC C3 ret <br />004051FD E94EDFFFFF jmp @HandleFinally<br />00405202 EBDC jmp $004051e0<br />00405204 0FB645DD movzx eax,[ebp-$23]<br />00405208 8845DE mov [ebp-$22],al<br />0040520B 33C0 xor eax,eax<br />0040520D 5A pop edx<br />0040520E 59 pop ecx<br />0040520F 59 pop ecx<br />00405210 648910 mov fs:[eax],edx<br />00405213 683C524000 push $0040523c<br />00405218 8D45E4 lea eax,[ebp-$1c]<br />0040521B 8B1574444000 mov edx,[$00404474]<br />00405221 E83AE8FFFF call @DynArrayClear<br />00405226 8D45E0 lea eax,[ebp-$20]<br />00405229 8B1574444000 mov edx,[$00404474]<br />0040522F E82CE8FFFF call @DynArrayClear<br />00405234 C3 ret <br />00405235 E916DFFFFF jmp @HandleFinally<br />0040523A EBDC jmp $00405218<br />inline_bug.dpr.58: v1 := Default(TManagedType);<br />0040523C B89C9B4000 mov eax,$00409b9c<br />00405241 8B1574444000 mov edx,[$00404474]<br />00405247 E814E8FFFF call @DynArrayClear</pre><br /><br /><p>Напомню, за лечение бага вы можете проголосовать в <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=121566" target="_blank">QC#121566</a></p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-49088126074717680682014-02-05T18:50:00.001+04:002014-02-05T18:50:50.277+04:00Delphi. Ненависть 2. 64-битная версия<p>Пост-продолжение <a href="http://kazav.blogspot.ru/2014/01/delphi-2.html" target="_blank">Delphi. Ненависть 2.</a></p> <p>------------------------------ Delphi XE2 Update 4 Hotfix 1 x64: <br />Project1.dpr.68: Utils.Namespace.CompareString(S1, S2); <br />0000000000426680 488D4D58         lea rcx,[rbp+$58] <br />0000000000426684 488B15BDEB0000   mov rdx,[rel $0000ebbd] <br />000000000042668B E86020FEFF       call @UStrLAsg <br />0000000000426690 488D4D50         lea rcx,[rbp+$50] <br />0000000000426694 488B15B5EB0000   mov rdx,[rel $0000ebb5] <br />000000000042669B E85020FEFF       call @UStrLAsg <br />00000000004266A0 488B4D58         mov rcx,[rbp+$58] <br />00000000004266A4 488B5550         mov rdx,[rbp+$50] <br />00000000004266A8 E82349FFFF       call CompareStr <br />Project1.dpr.69: Utils.Namespace.SameString(S1, S2); <br />00000000004266AD 488D4D48         lea rcx,[rbp+$48] <br />00000000004266B1 488B1590EB0000   mov rdx,[rel $0000eb90] <br />00000000004266B8 E83320FEFF       call @UStrLAsg <br />00000000004266BD 488D4D40         lea rcx,[rbp+$40] <br />00000000004266C1 488B1588EB0000   mov rdx,[rel $0000eb88] <br />00000000004266C8 E82320FEFF       call @UStrLAsg <br />00000000004266CD 488D4D38         lea rcx,[rbp+$38] <br />00000000004266D1 488B5548         mov rdx,[rbp+$48] <br />00000000004266D5 E81620FEFF       call @UStrLAsg <br />00000000004266DA 488D4D30         lea rcx,[rbp+$30] <br />00000000004266DE 488B5540         mov rdx,[rbp+$40] <br />00000000004266E2 E80920FEFF       call @UStrLAsg <br />00000000004266E7 488B4D38         mov rcx,[rbp+$38] <br />00000000004266EB 488B5530         mov rdx,[rbp+$30] <br />00000000004266EF E8DC48FFFF       call CompareStr <br />------------------------------ Delphi XE5 Update 2 x64: <br />Project1.dpr.68: Utils.Namespace.CompareString(S1, S2); <br />0000000000426F94 488D4D78         lea rcx,[rbp+$78] <br />0000000000426F98 488B1581F20000   mov rdx,[rel $0000f281] <br />0000000000426F9F E88C23FEFF       call @UStrLAsg <br />0000000000426FA4 488D4D70         lea rcx,[rbp+$70] <br />0000000000426FA8 488B1579F20000   mov rdx,[rel $0000f279] <br />0000000000426FAF E87C23FEFF       call @UStrLAsg <br />0000000000426FB4 90               nop <br />0000000000426FB5 488B4D78         mov rcx,[rbp+$78] <br />0000000000426FB9 488B5570         mov rdx,[rbp+$70] <br />0000000000426FBD E86E34FFFF       call CompareStr <br />0000000000426FC2 89453C           mov [rbp+$3c],eax <br />0000000000426FC5 90               nop <br />0000000000426FC6 488D4D78         lea rcx,[rbp+$78] <br />0000000000426FCA E8411EFEFF       call @UStrClr <br />0000000000426FCF 488D4D70         lea rcx,[rbp+$70] <br />0000000000426FD3 E8381EFEFF       call @UStrClr <br />Project1.dpr.69: Utils.Namespace.SameString(S1, S2); <br />0000000000426FD8 488D4D58         lea rcx,[rbp+$58] <br />0000000000426FDC 488B153DF20000   mov rdx,[rel $0000f23d] <br />0000000000426FE3 E84823FEFF       call @UStrLAsg <br />0000000000426FE8 488D4D50         lea rcx,[rbp+$50] <br />0000000000426FEC 488B1535F20000   mov rdx,[rel $0000f235] <br />0000000000426FF3 E83823FEFF       call @UStrLAsg <br />0000000000426FF8 488D4D68         lea rcx,[rbp+$68] <br />0000000000426FFC E80F1EFEFF       call @UStrClr <br />0000000000427001 488D4D60         lea rcx,[rbp+$60] <br />0000000000427005 E8061EFEFF       call @UStrClr <br />000000000042700A 488D4D48         lea rcx,[rbp+$48] <br />000000000042700E E8FD1DFEFF       call @UStrClr <br />0000000000427013 488D4D40         lea rcx,[rbp+$40] <br />0000000000427017 E8F41DFEFF       call @UStrClr <br />000000000042701C 90               nop <br />000000000042701D 488D4D68         lea rcx,[rbp+$68] <br />0000000000427021 488B5558         mov rdx,[rbp+$58] <br />0000000000427025 E80623FEFF       call @UStrLAsg <br />000000000042702A 488D4D60         lea rcx,[rbp+$60] <br />000000000042702E 488B5550         mov rdx,[rbp+$50] <br />0000000000427032 E8F922FEFF       call @UStrLAsg <br />0000000000427037 90               nop <br />0000000000427038 488B4D68         mov rcx,[rbp+$68] <br />000000000042703C 488B5560         mov rdx,[rbp+$60] <br />0000000000427040 E8EB33FFFF       call CompareStr <br />0000000000427045 894534           mov [rbp+$34],eax <br />0000000000427048 90               nop <br />0000000000427049 488D4D68         lea rcx,[rbp+$68] <br />000000000042704D E8BE1DFEFF       call @UStrClr <br />0000000000427052 488D4D60         lea rcx,[rbp+$60] <br />0000000000427056 E8B51DFEFF       call @UStrClr <br />000000000042705B 837D3400         cmp dword ptr [rbp+$34],$00 <br />000000000042705F 0F94C0           setz al <br />0000000000427062 88453B           mov [rbp+$3b],al <br />0000000000427065 90               nop <br />0000000000427066 488D4D58         lea rcx,[rbp+$58] <br />000000000042706A E8A11DFEFF       call @UStrClr <br />000000000042706F 488D4D50         lea rcx,[rbp+$50] <br />0000000000427073 E8981DFEFF       call @UStrClr <br />0000000000427078 488D4D68         lea rcx,[rbp+$68] <br />000000000042707C E88F1DFEFF       call @UStrClr <br />0000000000427081 488D4D60         lea rcx,[rbp+$60] <br />0000000000427085 E8861DFEFF       call @UStrClr <br />000000000042708A 488D4D48         lea rcx,[rbp+$48] <br />000000000042708E E87D1DFEFF       call @UStrClr <br />0000000000427093 488D4D40         lea rcx,[rbp+$40] <br />0000000000427097 E8741DFEFF       call @UStrClr <br />------------------------------ FreePascal 2.7.1. x64: <br />project1.lpr:68                           Utils.Namespace.CompareString(S1, S2); <br />000000010000158A 488b157fda0100           mov    0x1da7f(%rip),%rdx        # 0x10001f010 <br />0000000100001591 488b0d68da0100           mov    0x1da68(%rip),%rcx        # 0x10001f000 <br />0000000100001598 e843e40000               callq  0x10000f9e0 <SYSUTILS_$$_COMPARESTR$ANSISTRING$ANSISTRING$$LONGINT> <br />project1.lpr:69                           Utils.Namespace.SameString(S1, S2); <br />000000010000159D 488b156cda0100           mov    0x1da6c(%rip),%rdx        # 0x10001f010 <br />00000001000015A4 488b0d55da0100           mov    0x1da55(%rip),%rcx        # 0x10001f000 <br />00000001000015AB e830e40000               callq  0x10000f9e0 <SYSUTILS_$$_COMPARESTR$ANSISTRING$ANSISTRING$$LONGINT> <br />00000001000015B0 85c0                     test   %eax,%eax <br />00000001000015B2 0f94c0                   sete   %al</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com3tag:blogger.com,1999:blog-33057655.post-59903001791128101532014-01-31T15:11:00.001+04:002014-01-31T15:11:08.615+04:00Firemonkey, которая гуляет сама по себе.<p>В одном из прошлых <a href="http://kazav.blogspot.com/2013/12/delphi-xe5-update-2-ssdd.html" target="_blank">постов</a> я упоминал о фантомных срабатываниях сенсорного экрана в Firemonkey-приложениях. Ввиду того, что воспроизвести это не так просто, а на слово верить в такое не хочется, пару дней назад я заснял этот эффект на <a href="http://kazantsev.nm.ru/video/fmx_device_info_on_huawei_ascend_mate_android_4_1_2_emotion_ui_1_5.mp4" target="_blank">видео</a>. Прошу прощения за качество, делалось впопыхах.</p> <p>Воспроизведено на устройстве Huawei Ascend Mate, Android 4.1.2, ланчер EmotionUI 1.5.</p> <p>Проект на котором очень хорошо воспроизводятся эти эффекты можно взять <a href="http://delphifmandroid.blogspot.ru/2014/01/device-information.html" target="_blank">тут</a> (<a href="https://drive.google.com/file/d/0BwEZB8sRo0DSUU1SSU14aWhONUk/edit?usp=sharing" target="_blank">прямая ссылка</a>). </p> <p>На видео видно, что несмотря на фантомные срабатывания, когда к устройству даже не прикосаешься, само приложение никак не реагирует на прикосновения пальца (<font color="#808080">это бывает не всегда, и иногда оно таки реагирует</font>). Более того, перестают реагировать даже системные навигационные кнопки. Все это безобразие можно прекратить только нажатием аппаратной кнопки выключения.</p> <p>Нужно заметить, что ни в одном другом приложении, ни основанных на SDK, ни на NDK таких эффектов не наблюдается. К телефону вообще нет ни малейших претензий. Воспроизводится это только в Firemonkey-приложениях.</p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=122138" target="_blank">QC#122138</a></p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-2797869003113970072014-01-20T16:31:00.001+04:002014-01-20T16:31:25.751+04:00Если хочешь быть здоров…<p>…закаляйся!</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIK0e2vz2SYDz5krl-i9GgStz8L8p8fl-S027gPU9KRjZkb2dYZ0inbECoTND1nj3HewEIMHKSOEO_ssfv3fWncnXU_2oHrKd0JFJvKt9k70eYnhPpu_IN94OCqLZZ-1JU8H-z5g/s1600-h/IMG_20140119_115636%25255B4%25255D.jpg" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_20140119_115636" border="0" alt="IMG_20140119_115636" src="http://lh3.ggpht.com/-7iYElFB5UqU/Ut0WkWIAMkI/AAAAAAAAALM/qj4UVbzFfmk/IMG_20140119_115636_thumb%25255B2%25255D.jpg?imgmax=800" width="240" height="180" /></a> </p> <p><a href="http://lh3.ggpht.com/-o6YSsox4oGA/Ut0XEAcZRRI/AAAAAAAAALU/s_3xEMO-8Iw/s1600-h/IMG_20140119_115645%25255B4%25255D.jpg" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="IMG_20140119_115645" border="0" alt="IMG_20140119_115645" src="http://lh4.ggpht.com/-akep8Ab2Irk/Ut0XGpTMMgI/AAAAAAAAALc/ooX8x0VdVC0/IMG_20140119_115645_thumb%25255B2%25255D.jpg?imgmax=800" width="240" height="180" /></a> </p> <p>Уже пятый год, на Крещение, ходим с друзьями купаться. Вчера было здорово. Погода прекрасная: легкий морозец (<font color="#808080">-22 градуса</font>) и едва заметный снежок.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-14977093164129003882014-01-06T02:45:00.001+04:002014-01-06T02:45:20.578+04:00Delphi. Ненависть 2.<p>В посте <a href="http://kazav.blogspot.com/2013/05/delphi.html" target="_blank">Delphi. Ненависть.</a> я показал как деградировал кодогенератор дельфей. Сегодня покажу еще раз, только уже с кодом на котором проблема воспроизводится.</p> <a name='more'></a>Итак, код: <p></p> <pre>program inline_bug;<br /><br />{$APPTYPE CONSOLE}<br /><br />{$OPTIMIZATION ON}<br />{$INLINE ON}<br /><br />{$R *.res}<br /><br />uses<br /> SysUtils;<br /><br />Type<br /><br /> Utils = Class<br /><br /> Type<br /><br /> Namespace = Class<br /><br /> Class Function CompareString(Const ALeft, ARight : String) : Integer; Static; Inline;<br /> Class Function CompareText(Const ALeft, ARight : String) : Integer; Static; Inline;<br /><br /> Class Function SameString(Const ALeft, ARight : String; ACaseSensitive : Boolean = True) : Boolean; Static; Inline;<br /><br /> End;<br /><br /> End;<br /><br />{ Utils.NameSpace }<br /><br />//<br />Class Function Utils.Namespace.CompareString(const ALeft, ARight : System.String) : Integer;<br />Begin<br /><br /> Result := SysUtils.CompareStr(ALeft, ARight);<br /><br />End;<br />//<br /><br />//<br />Class Function Utils.Namespace.CompareText(Const ALeft, ARight : String) : Integer;<br />Begin<br /><br /> Result := SysUtils.CompareText(ALeft, ARight);<br /><br />End;<br />//<br /><br />//<br />Class Function Utils.Namespace.SameString(Const ALeft, ARight : String; ACaseSensitive : Boolean) : Boolean;<br />begin<br /><br /> If ACaseSensitive Then<br /> Result := Utils.Namespace.CompareString(ALeft, ARight) = 0<br /> Else<br /> Result := Utils.Namespace.CompareText(ALeft, Aright) = 0;<br /><br />End;<br />//<br /><br />Var<br /><br /> s1, s2 : String;<br /><br />begin<br /><br /> Utils.Namespace.CompareString(S1, S2);<br /> Utils.Namespace.SameString(S1, S2);<br /> s1 := '';<br /><br />end.</pre><br /><br /><p>Теперь выхлопы разных версий компиляторов:</p><br /><br /><pre>Delphi 2006 - XE:<br />-----------------------------------------------------------------<br />inline_bug.dpr.68: Utils.Namespace.CompareString(S1, S2);<br />0040915A 8B1524E24000 mov edx,[$0040e224]<br />00409160 A120E24000 mov eax,[$0040e220]<br />00409165 E8F2C7FFFF call CompareStr<br />inline_bug.dpr.69: Utils.Namespace.SameString(S1, S2);<br />0040916A 8B1524E24000 mov edx,[$0040e224]<br />00409170 A120E24000 mov eax,[$0040e220]<br />00409175 E8E2C7FFFF call CompareStr<br />0040917A 85C0 test eax,eax<br />0040917C 0F94C0 setz al<br /><br />Delphi XE2 Update 4 (16.0.4429.46931):<br />-----------------------------------------------------------------<br />inline_bug.dpr.68: Utils.Namespace.CompareString(S1, S2);<br />0041B3AB 8D45EC lea eax,[ebp-$14]<br />0041B3AE 8B15D82E4200 mov edx,[$00422ed8]<br />0041B3B4 E84BA4FEFF call @UStrLAsg<br />0041B3B9 8D45E8 lea eax,[ebp-$18]<br />0041B3BC 8B15DC2E4200 mov edx,[$00422edc]<br />0041B3C2 E83DA4FEFF call @UStrLAsg<br />0041B3C7 8B55E8 mov edx,[ebp-$18]<br />0041B3CA 8B45EC mov eax,[ebp-$14]<br />0041B3CD E8F28FFFFF call CompareStr<br />inline_bug.dpr.69: Utils.Namespace.SameString(S1, S2);<br />0041B3D2 8D45E4 lea eax,[ebp-$1c]<br />0041B3D5 8B15D82E4200 mov edx,[$00422ed8]<br />0041B3DB E824A4FEFF call @UStrLAsg<br />0041B3E0 8D45E0 lea eax,[ebp-$20]<br />0041B3E3 8B15DC2E4200 mov edx,[$00422edc]<br />0041B3E9 E816A4FEFF call @UStrLAsg<br />0041B3EE 8D45DC lea eax,[ebp-$24]<br />0041B3F1 8B55E4 mov edx,[ebp-$1c]<br />0041B3F4 E80BA4FEFF call @UStrLAsg<br />0041B3F9 8D45D8 lea eax,[ebp-$28]<br />0041B3FC 8B55E0 mov edx,[ebp-$20]<br />0041B3FF E800A4FEFF call @UStrLAsg<br />0041B404 8B55D8 mov edx,[ebp-$28]<br />0041B407 8B45DC mov eax,[ebp-$24]<br />0041B40A E8B58FFFFF call CompareStr<br />0041B40F 85C0 test eax,eax<br />0041B411 0F94C0 setz al<br /><br />Delphi XE5 Update 2 (19.0.14356.6604):<br />-----------------------------------------------------------------<br />inline_bug.dpr.68: Utils.Namespace.CompareString(S1, S2);<br />0041B3F4 8D45EC lea eax,[ebp-$14]<br />0041B3F7 8B15BC2E4200 mov edx,[$00422ebc]<br />0041B3FD E85EACFEFF call @UStrLAsg<br />0041B402 8D45E8 lea eax,[ebp-$18]<br />0041B405 8B15C02E4200 mov edx,[$00422ec0]<br />0041B40B E850ACFEFF call @UStrLAsg<br />0041B410 33C0 xor eax,eax<br />0041B412 55 push ebp<br />0041B413 684AB44100 push $0041b44a<br />0041B418 64FF30 push dword ptr fs:[eax]<br />0041B41B 648920 mov fs:[eax],esp<br />0041B41E 8B55E8 mov edx,[ebp-$18]<br />0041B421 8B45EC mov eax,[ebp-$14]<br />0041B424 E8DB79FFFF call CompareStr<br />0041B429 8945CC mov [ebp-$34],eax<br />0041B42C 33C0 xor eax,eax<br />0041B42E 5A pop edx<br />0041B42F 59 pop ecx<br />0041B430 59 pop ecx<br />0041B431 648910 mov fs:[eax],edx<br />0041B434 6851B44100 push $0041b451<br />0041B439 8D45EC lea eax,[ebp-$14]<br />0041B43C E803A9FEFF call @UStrClr<br />0041B441 8D45E8 lea eax,[ebp-$18]<br />0041B444 E8FBA8FEFF call @UStrClr<br />0041B449 C3 ret <br />0041B44A E901A0FEFF jmp @HandleFinally<br />0041B44F EBE8 jmp $0041b439<br />inline_bug.dpr.69: Utils.Namespace.SameString(S1, S2);<br />0041B451 8D45E4 lea eax,[ebp-$1c]<br />0041B454 8B15BC2E4200 mov edx,[$00422ebc]<br />0041B45A E801ACFEFF call @UStrLAsg<br />0041B45F 8D45E0 lea eax,[ebp-$20]<br />0041B462 8B15C02E4200 mov edx,[$00422ec0]<br />0041B468 E8F3ABFEFF call @UStrLAsg<br />0041B46D 8D45DC lea eax,[ebp-$24]<br />0041B470 E8CFA8FEFF call @UStrClr<br />0041B475 8D45D8 lea eax,[ebp-$28]<br />0041B478 E8C7A8FEFF call @UStrClr<br />0041B47D 8D45D4 lea eax,[ebp-$2c]<br />0041B480 E8BFA8FEFF call @UStrClr<br />0041B485 8D45D0 lea eax,[ebp-$30]<br />0041B488 E8B7A8FEFF call @UStrClr<br />0041B48D 33C0 xor eax,eax<br />0041B48F 55 push ebp<br />0041B490 6838B54100 push $0041b538<br />0041B495 64FF30 push dword ptr fs:[eax]<br />0041B498 648920 mov fs:[eax],esp<br />0041B49B 8D45DC lea eax,[ebp-$24]<br />0041B49E 8B55E4 mov edx,[ebp-$1c]<br />0041B4A1 E8BAABFEFF call @UStrLAsg<br />0041B4A6 8D45D8 lea eax,[ebp-$28]<br />0041B4A9 8B55E0 mov edx,[ebp-$20]<br />0041B4AC E8AFABFEFF call @UStrLAsg<br />0041B4B1 33C0 xor eax,eax<br />0041B4B3 55 push ebp<br />0041B4B4 68EBB44100 push $0041b4eb<br />0041B4B9 64FF30 push dword ptr fs:[eax]<br />0041B4BC 648920 mov fs:[eax],esp<br />0041B4BF 8B55D8 mov edx,[ebp-$28]<br />0041B4C2 8B45DC mov eax,[ebp-$24]<br />0041B4C5 E83A79FFFF call CompareStr<br />0041B4CA 8945C4 mov [ebp-$3c],eax<br />0041B4CD 33C0 xor eax,eax<br />0041B4CF 5A pop edx<br />0041B4D0 59 pop ecx<br />0041B4D1 59 pop ecx<br />0041B4D2 648910 mov fs:[eax],edx<br />0041B4D5 68F2B44100 push $0041b4f2<br />0041B4DA 8D45DC lea eax,[ebp-$24]<br />0041B4DD E862A8FEFF call @UStrClr<br />0041B4E2 8D45D8 lea eax,[ebp-$28]<br />0041B4E5 E85AA8FEFF call @UStrClr<br />0041B4EA C3 ret <br />0041B4EB E9609FFEFF jmp @HandleFinally<br />0041B4F0 EBE8 jmp $0041b4da<br />0041B4F2 837DC400 cmp dword ptr [ebp-$3c],$00<br />0041B4F6 0F9445CB setz byte ptr [ebp-$35]<br />0041B4FA 33C0 xor eax,eax<br />0041B4FC 5A pop edx<br />0041B4FD 59 pop ecx<br />0041B4FE 59 pop ecx<br />0041B4FF 648910 mov fs:[eax],edx<br />0041B502 683FB54100 push $0041b53f<br />0041B507 8D45E4 lea eax,[ebp-$1c]<br />0041B50A E835A8FEFF call @UStrClr<br />0041B50F 8D45E0 lea eax,[ebp-$20]<br />0041B512 E82DA8FEFF call @UStrClr<br />0041B517 8D45DC lea eax,[ebp-$24]<br />0041B51A E825A8FEFF call @UStrClr<br />0041B51F 8D45D8 lea eax,[ebp-$28]<br />0041B522 E81DA8FEFF call @UStrClr<br />0041B527 8D45D4 lea eax,[ebp-$2c]<br />0041B52A E815A8FEFF call @UStrClr<br />0041B52F 8D45D0 lea eax,[ebp-$30]<br />0041B532 E80DA8FEFF call @UStrClr<br />0041B537 C3 ret <br />0041B538 E9139FFEFF jmp @HandleFinally<br />0041B53D EBC8 jmp $0041b507<br />-----------------------------------------------------------------</pre><br /><br /><p>Добавить тут нечего - леденящий душу пиздец :( Голосуем за багу в <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=121566" target="_blank">QC#121566</a> Кстати, баги описанные в <a href="http://kazav.blogspot.com/2013/12/delphi-xe5-update-2-ssdd.html" target="_blank">прошлом посте</a> значатся под номерами <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=121483" target="_blank">QC#121483</a> и <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=121484" target="_blank">QC#121484</a>.</p><br /><br /><p>Ради интереса попробовал откомпилировать код на FreePascal 2.7.1. Результат:</p><br /><br /><pre>inline_bug.dpr:68 Utils.Namespace.CompareString(S1, S2);<br />00401535 8b1510604100 mov 0x416010,%edx<br />0040153B a100604100 mov 0x416000,%eax<br />00401540 e82bbc0000 call 0x40d170 <sysutils_ $$_COMPARESTR$ANSISTRING$ANSISTRING$$LONGINT><br />inline_bug.dpr:69 Utils.Namespace.SameString(S1, S2);<br />00401545 8b1510604100 mov 0x416010,%edx<br />0040154B a100604100 mov 0x416000,%eax<br />00401550 e81bbc0000 call 0x40d170 <sysutils_ $$_COMPARESTR$ANSISTRING$ANSISTRING$$LONGINT><br />00401555 85c0 test %eax,%eax<br />00401557 0f94c0 sete %al</pre><br /><br /><p> </p><br /><br /><p>Устыдись абракадабра пред бесплатным компилятором.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com30tag:blogger.com,1999:blog-33057655.post-42608432124671058212013-12-29T03:20:00.001+04:002013-12-29T03:20:28.076+04:00Delphi XE5 Update 2. S.S.D.D.<p>Вот, наконец-то, и я добрался (<font color="#808080">несколько припозднился, но на то были причины</font>) до ощупывания Delphi с поддержкой Android. С самого начала было ясно, что качественной эта поддержка не будет, а потому нет смысла сразу кидаться покупать какое-либо Android-устройство. Но в планах уже значиналось приобретение нового смартфона на замену дышавшей на ладан старенькой Nokia. С <a href="http://www.ixbt.com/mobile/huawei-ascend-mate.shtml" target="_blank">моделью</a> я определился через несколько дней после выхода Delphi XE5 (<font color="#808080">стимул всё-таки</font>), и как выяснилось практически сразу, с выбранной моделью у Delphi <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=119607" target="_blank">проблемы</a> (<font color="#808080">точнее с графическим процессором используемом в данном аппарате</font>). Но, телефон должен нравится мне, а не Delphi, поэтому выбора своего я решил не менять (<font color="#808080">хотя посматривал и на Lenovo K-900, но с тем у Delphi вообще фатальная несовместимость</font>) и надеяться на скорый фикс этого бага. В Update 2 баг таки пофиксили. Ура. Тестируем новую обезьяну, ой, простите, теперь это уже FM Platform (<font color="#808080">не хухры-мухры, но попробуйте кроссплатформенно послать SMS’ку или погудеть виброй, так сразу поймете ценность этого “Platform” :)</font>)</p> <a name='more'></a> <p>Сначала об общих впечатлениях. IDE поломали. Под Android собирает по-адски долго. Примитивные приложения “весят” как приличные 3D-игрушки и запускаются так-же долго. Состояние - бета.</p> <p>Теперь подробнее. В IDE сломали редактор стилей. Совсем. То есть вообще. И это не студенческая опен-сурсная поделка, а продукт продающийся за нескромные деньги. Но это не всё. Еще сломали - точнее переделали, но так, что всё равно что сломали – IDE Insight. Помните то замечательное оконце открывающееся по нажатию F6? Теперь его нет. Вместо него теперь поисковое поле на тулбаре (<font color="#808080">а что, все так делают</font>) с выпадающим списком без прокрутки. То есть вот так просто, раз и вырезали удобное оконце в угоду каким-то модным веяниям. Видимо делать больше нечего, открытых багов нет, осталось только улуЧЧЧЧЧЧшать. Ну переделали, ладно, но проверить работу можно было… В чем, собственно, косяк. По умолчанию поисковое поле расположено в правом верхнем углу окна IDE. Теперь простой кейс. Ищите вы какой-нибудь компонент или команду. Часть написали правильно, в списке успели отобразиться результаты поиска, продолжаете писать, но уже то, что IDE найти не может и выпадающий список с последними результатами уезжает за границу экрана. Это только кажется, что налететь на такое очень сложно, меня первое время это добивало. Хорошо, что обходится это легко, достаточно перенести поисковое поле от края экрана :)</p> <p>Теперь об Android’е. Новый компилятор ну о-о-очень тормозной. Тестировать новые фичи сущий ад. Если каждое маленькое изменение кода проверять на телефоне, можно сдохнуть в ожидании, от нервов или передозировки кофе, кому что ближе. Это еще ладно, если пишется код независимый от системы, такой можно тестировать и на Win32, но если это что-то системно-специфическое то все очень грустно. Не, правда, с этим нужно что-то делать.</p> <p>Собранные файлы получаются весьма увесистыми, apk что-то в районе 5-6 мегабайт. После установки они занимают значительно больше:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_JFncROIm_CVrMnUGGAz1x-3siyFlLc6phyiVRCOdBQ4UgM1ZUWJdyUShqpqlb9gWjL4yY-BQo8bylQGVK2v8azMqdEFEg-jZTnH0JJEzzSfU5M19MqeFpr1_hT_HzK6RPq52jQ/s1600-h/fmx_vs_oxygen%25255B7%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="fmx_vs_oxygen" border="0" alt="fmx_vs_oxygen" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDNbjXFjBUqASiE5kQV7lJ31bUrbm2ifoZ-OKzOXw2yJxN7WRgstZ32qed08vFmPjSdx2uAvHfVJH8hw7m8cr02gQhpsoi9NC8uCESZpHfXC0WtH3qc-mjH-xASYM94lmBvgJHWg/?imgmax=800" width="217" height="240" /></a> </p> <p>Сравните обезьяньи демки с приложениями Lunar Lander и OpenGL Application, демонстрашками из RemObjects Oxygen. Ну и раз я говорил о сравнимости с 3D-игрушками:</p> <p><a href="http://lh3.ggpht.com/-OzUKX2i__IY/Ur9cTbXmAOI/AAAAAAAAAIs/JUyEZEobZXQ/s1600-h/riptide%25255B5%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="riptide" border="0" alt="riptide" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXUupy2BQ-PKMVOqTF-kmM2NzgHZszXxYgb9vEZVBjd0s2m1L66pL3EkACX6aRgMZnIgAS3GN1ikxq3MYuSEzwg5XWtRl9pi6YL6InCNow-FMAXBbL74kGViWAgET8nHIdKS2q6g/?imgmax=800" width="240" height="104" /></a> </p> <p>Riptide GP - красочная, захватывающая, яркая игра – гонки на водных мотоциклах. Уложилась всего в 41 мегабайт, тогда как демка TabletMasterDetailwithSearch из Delphi хочет 30 мегабайт. Борзо, однако :)</p> <p>Но размер это не самое печальное, и если бы все остальное работало хорошо это был-бы успех. Но, увы. Самый первый косяк на который я налетел было отсутствие сглаживания у линий (<font color="#808080">свойство формы Quality выставлено ccHighQuality, но пофигу</font>). Шрифт рисуется сглаженным, а вот линии c лесенками. Допускаю, что это проявляется только на изначально нелюбимых Delphi GPU Vivante. Вот как это выглядит. В дизайнере:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtGSvQy84hdZL5uX4byXj7UA2hPoZRLAp5XBr5UwMpSQUWOjDQHvQaA3ZpXokYJj4TEbpZNc6x-ziHV7rB5uk_g5ln8O2CvSLCdI-9c28YDoWB20i6vdJMgy4aqs0_Wni2JKQpdg/s1600-h/designer%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="designer" border="0" alt="designer" src="http://lh3.ggpht.com/-IpztAEgWM0k/Ur9cae_qX7I/AAAAAAAAAJE/BE41oA29yXs/designer_thumb%25255B2%25255D.png?imgmax=800" width="207" height="240" /></a> </p> <p>На устройстве:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguQzOuQqGh5jYZ8EJ2S34yZn9WS_nutzhEFjK69O-I3xRxjMWuAwVgoj89n2P0xRw9wcI32TVEKhZRsfAH9OQ9jRYjA56QxtRKglCfDojo0U1PCkJCeEwZY6OuF4dn_cOvFjkVMg/s1600-h/Screenshot_2013-12-28-13-50-29%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-50-29" border="0" alt="Screenshot_2013-12-28-13-50-29" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZoM0MmR_LmXLhsP0a4mkFzMxV0de7hvr8Jn35f6e3hGS9e-hoNSQZWW8hBvkockPP_Ep9d45nC6UhsV39Y_1k0IYj9iyGOgGdH_W14_dM8VD__4ynAMYBGWEGJCRSL7DWlgLNtA/?imgmax=800" width="135" height="240" /></a> </p> <p>Не смотря на хороший PPI лесенки режут глаза. </p> <p>Вторым косяком было неумение обезьяны реагировать на изменение разрешения экрана. Казалось бы, какие еще изменения на смартфонах и планшетах, ан нет. Посмотрите на навигационную панель на предыдущем скриншоте. Слева видно маленькую стрелочку вниз, она позволяет скрыть панель. Умные китайцы догадались об удобстве этой фичи раньше чем Google, которые собираются или уже добавили эту возможность в новых версиях ОС. Собственно, что происходит после скрытия панели? Приложению выделяются дополнительные несколько десятков пикселей, что для него равносильно изменению разрешения экрана. Так вот на подобные изменения обезьяна реагировать не умеет, более того, они напрочь выносят ей мозг. Итак, скрываем панель:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCiZXQgSVZYTZ9HAA5ia6dMXMK7UQnXr66jXS5hAPu5fuCrDFWlBPrG3fBXOo3GgZ-vNfWjEDAduhFtFOLUWxVbFa1fQidOQvwZpHawtC__3nEScfvBgioQLpdoBqk6jJL-PCKBg/s1600-h/Screenshot_2013-12-28-13-50-29%25255B9%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-50-29" border="0" alt="Screenshot_2013-12-28-13-50-29" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2tr1Mp0BlxFnnJxxPZfxYwxuUpzn5RdjtGEBzpeBPALz80oE29npUBv6d-hSv6yb00DFJQVS_410jyd4OpcPv-EqG-bh3ce3AQJcTBdsnp5MHnznzBLgiViLdfBVQYkRo4aqQlQ/?imgmax=800" width="135" height="240" /></a> <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlc4TsBGdx7FZlnb53w5OMN2bOdEGy0BXMWmJLrUtzuV0IpbEU4KQesAlkvCRaU3DLuuPvTcHMiMBeAl8O4FqnhW2R9rIKWx2nZHiybet6RiA3cWffDKSxofmOXUwsacFdonOtaw/s1600-h/Screenshot_2013-12-28-13-50-42%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-50-42" border="0" alt="Screenshot_2013-12-28-13-50-42" src="http://lh6.ggpht.com/-aFCFwl6kIV0/Ur9ciw-r8aI/AAAAAAAAAJ0/Zub-VdwhA_A/Screenshot_2013-12-28-13-50-42_thumb%25255B2%25255D.png?imgmax=800" width="135" height="240" /></a> </p> <p>Из-за черного фона не видно, что клиентская область не увеличилась на высоту навигационной панели (<font color="#808080">со светлым фоном снизу была зияющая чернота</font>), но это именно так. Логотип Delphi отцентрован и должен был сместиться немного вниз, но как видно, на обеих картинках он находится на одинаковом уровне.</p> <p>Теперь поворачиваем устройство:</p> <p><a href="http://lh3.ggpht.com/-aoq0qtrpShc/Ur9ckNO75jI/AAAAAAAAAJ8/oo5xuOwCaSs/s1600-h/Screenshot_2013-12-28-13-50-51%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-50-51" border="0" alt="Screenshot_2013-12-28-13-50-51" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqZi44qlw6465H2JBilx1zSjpCCiRqhzuYA257NndUOe9b6ZftdPZIrtEKX0aCo27kHUrFOSrWUVcBQVe_co-uO1x8iC4hpfoVhpRtXC9QvNZ_pL2COAG9lpHSXl-GoXVTX1ERDA/?imgmax=800" width="240" height="135" /></a> </p> <p>и обратно:</p> <p><a href="http://lh4.ggpht.com/-kP9QMjEcjIU/Ur9cmz0NvwI/AAAAAAAAAKM/N_C04oINzAw/s1600-h/Screenshot_2013-12-28-13-50-58%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-50-58" border="0" alt="Screenshot_2013-12-28-13-50-58" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMSH4x5U-YsVn7R8U7t3G4UOvRycjCsAhkX3LSulAhmfUUlzmk3rwCVCVrdNIC6S6xne-6HHUjqVOeogtVRvkPlQEsfGl-uR2zOVUfmdbO5EnfRjhHtNfP_6smd2xwAMEOxEQCjg/?imgmax=800" width="135" height="240" /></a> </p> <p>Снова поворачиваем и восстанавливаем панель:</p> <p><a href="http://lh4.ggpht.com/-qg9gYVVJDak/Ur9cqLno1rI/AAAAAAAAAKc/bWJysa7ct4Y/s1600-h/Screenshot_2013-12-28-13-51-29%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-51-29" border="0" alt="Screenshot_2013-12-28-13-51-29" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmYLkatK11SJJxZhDKArAg8mhN_-NeVAUpkYaPcgFM5Q5BmqD0L8I4RwOL-BeG_IZ0rUNRVpCD4R_GRF_mj6oXFcmcHDEIkIPtPlFELVOOGgC_w6D9VKobyUPcbA5a60rhw9acbA/?imgmax=800" width="240" height="135" /></a> </p> <p></p> <p></p> <p></p> <p>поворачиваем с восстановленной панелью:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguGM3x_m3vJDY_MbRRG13gjSPmyg9uE2uOydWCyCCSHylmTds2AKWGrMLHZ5kyyFXKfep4xLGhAjs_iq5WiTJ6dmLIlq-EdYj6BsSGnELu9Hme5zIHKmJ63pnjxyrYDKKb7saz_A/s1600-h/Screenshot_2013-12-28-13-51-37%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Screenshot_2013-12-28-13-51-37" border="0" alt="Screenshot_2013-12-28-13-51-37" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBrDitv4h7IuaUMloHWsocZrBSzvOrSKxPf5zdBIu3MpUdWjE6dRoFVhSfqwleQhpJVbpB-mBGQFtNKSN1DuqGJPwEdPF1A5HiXVMGgG8hyphenhyphenYRxRq3CHlvQ3QgjKOxZY9T2HNfV9w/?imgmax=800" width="135" height="240" /></a> </p> <p>В общем, вертел я его и так и сяк, но нормального расположения элементов управления так и не добился. Кстати, Asus уже давно выпускает <a href="http://www.ixbt.com/portopc/asus-new-padfone-infinity.shtml" target="_blank">гибрид смартфона и планшета</a> (<font color="#808080">в статье описана новая модель, первые устройства появились значительно раньше</font>), где вся начинка сосредоточена в смартфоне, а планшет является своеобразной док-станцией. Так вот там разрешение тоже меняется, и софт адаптируется. А буквально вчера <a href="http://4pda.ru/2013/12/28/132460/" target="_blank">пришла новость</a> о том, что еще и Samsung будет делать свою версию Asus’овского Padfone.</p> <p>Теперь о впечатлении от тестирования дельфийских демок. Как и ожидалось, интерфейс родным не выглядит (<font color="#808080">ну да, этим грешит огромное количество Android-софта</font>). На моем устройстве производитель слегка изменил внешний вид некоторых элементов управления, сделав их более легкими по восприятию, а в Delphi имитируется стандартный Holo. Разница видна невооруженным глазом, и это неприятно. Одно дело, когда у приложения полностью собственный стиль (<font color="#808080">передаем привет загнувшемуся редактору стилей</font>), как например, у новых версий Antutu, и совсем другое, когда вроде бы и цветовая гамма используется системная, а переключатели выглядят по другому. Возможно, эту досадную мелочь можно нивелировать сторонними компонентами, вроде <a href="http://sourceforge.net/projects/dpfdelphiandroid/" target="_blank">DPFDelphiAndroid</a>, которые используют системные элементы управления, но я пока не пробовал.</p> <p>Теперь о совсем странных вещах, объяснить которые я не могу и воспроизвести которые удается с большим трудом. Тестируя, а точнее играясь, с демками из Delphi я несколько раз заметил неприятный эффект – фантомные срабатывания сенсора экрана т.е. фантомные жесты и нажатия, когда устройства руками даже не касаешься. Несколько раз это проявлялось непосредственно в самих демках, а несколько раз проявлялось даже в ланчере, когда какая-либо из демок работала в фоне. Но как только фоновая демка закрывалась, так сразу пропадали и фантомные срабатывания сенсора. Нужно заметить, что ни до, ни после запусков демок я таких эффектов не наблюдал ни в одном другом приложении. Вместе с тем, в демках, особенно из сниппетов, где делается переход скроллингом по страницам TabControl, элементы управления вяло отзывались на сенсор. И вот как такое описывать в QC? Надеюсь, это попадется на глаза кому нибудь из команды работающей над обезьяной. А я пока подожду Delphi XE6, 7, 8…</p> <p> </p> <p>Всех с Новым Годом!</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-54597692287926257892013-10-12T23:53:00.001+04:002013-10-16T17:03:08.895+04:00Кушайте, не обляпайтесь.<p>Сегодня в ридере появилась статья “<a href="http://www.vr-online.ru/content/delphi-shturmuet-android-beseduem-s-vsevolodom-leonovym-o-delphi-xe5-8893" target="_blank">Delphi штурмует Android. Беседуем с Всеволодом Леоновым о Delphi XE5</a>” рассказывающая о победах и завоеваниях. Такое всегда интересно почитать. Я позволю себе процитировать оттуда небольшой фрагмент:</p> <p><quote><strong>- Технологии FireMonkey уже несколько лет. Вроде все более менее становится стабильным и уже не так страшно применять новинку для продакшн приложений. По прошествии этого временного промежутка вы можете сказать, что технология удалась? Нашла ли она свою аудиторию и какие нововведения следует ожидать в обозримом будущем?</strong></p> <p><em>Что технология удалась, стало заметно, к сожалению, лишь сейчас, если мы смотрим на неё глазами разработчиков. Только сейчас программисты стали реально интересоваться Платформой приложений FM (бывшая FireMonkey), когда увидели всю её мощь для мобильной разработки под Android. И это несмотря на то, что архитектурно она была заложена и технологически реализована в релизе XE2. Например, российский проект <a href="http://www.sphere-online.ru/" target="_blank">www.sphere-online.ru</a> – многоцелевая платформа онлайн-коммуникаций. Команда выбрала Платформу FM, т.к. изначально хотела сделать мульти-платформенное решение для Windows и Mac OS, причем с интерфейсом высшего качества. На следующем после XE2 релизе XE3 данная компания сделала мульти-платформенную систему, а что может быть лучшим доказательством успешности технологии, как ни реализация на её основе реального проекта!? Теперь данная команда благодарит сама себя за правильный выбор средства разработки в своё время и готовит мобильную поддержку.</quote></em></p> <p> </p> <p>В общем, я сходил по данной ссылке… Никакой многоцелевой платформы онлайн-коммуникаций там нет, есть редирект на онлайн-игру “Сфера-перерождение”. Думаю, ну мало-ли, может их сейчас принято называть многоцелевыми коммуникационными платформами. В общем, скачал клиент дабы посмотреть чего там на FMX наваяли. Оказалось, что FMX’ом там и не пахнет. Исполняемые модули, коих две штуки, собраны компилятором MS VC++, и россыпь dll’ей тоже ни коим боком к FMX не относится. Так то. А народ в комментариях радуется, дескать жива курилка. Хотел прямо там вопрос задать – что мол за дела - да у них для этого регистрироваться нужно. В общем вот. В меню сегодня лапша.</p> <p> </p> <p>Обновление от 16.10.2013.</p> <p>Так, похоже имела место быть чья-то невнимательность, из-за которой в статье была указана неправильная ссылка. А я уже успел о Всеволоде плохо подумать :) Спасибо Роману Янковскому за изыскания. Правильная ссылка вот <a href="http://www.sphere-live.com/" target="_blank">http://www.sphere-live.com/</a> и там действительно коммуникационный софт с FMX-интерфейсом.</p> <p> </p> <p>Но я же не зря ходил по тем ссылкам, я хотел посмотреть на интерфейс высшего качества о котором говорится в статье. Итак, кратко - под интерфейсом высшего качества имеется ввиду FMX-стиль “Jet” из Premium Style Pack (<font color="#808080">это тот, где все черное-черное</font>). Кому-то сливающаяся чернота нравится, кому-то нет.</p> <p>Теперь по порядку. Первый запуск на хостовой машине c Windows 7 x64 закончился ничем:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcbhfNBRbc4Ea4p1ygtis0KPyyusgH3vPkqhAytGMH8Iqd25FUkhQusf1HvVytUdYP3dj4lhFRoawJ-4zFVCu_zy4PVTJQ8PoCeVbrOFsmc7wweoMs77HgIdEF76aQcGQF0eRh_w/s1600-h/sphere_at_start_on_host%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sphere_at_start_on_host" border="0" alt="sphere_at_start_on_host" src="http://lh5.ggpht.com/-ok9_DZLn-Ak/Ul6OCKxmoII/AAAAAAAAAHc/VF1hp_TZJ1A/sphere_at_start_on_host_thumb%25255B2%25255D.png?imgmax=800" width="240" height="158" /></a> </p> <p>Следующие попытки я делал уже под виртуальной Windows 7 x86. Запуск прошел успешно. Но в окне регистрации, после выбора русского языка, снова сюрприз:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAxbdaoPqKwapakx3kUb4umhTBzRAqpKtI_7-id290ViffAvoO6RoLTDvkIh0mwRJxZ-xdLA1HcINLaMdFAuLL6BCSYDAShoPAKrH7nUfQ9ZK-j3V7pUat5Bx7wow4LRjMrfHd3g/s1600-h/sphere_av%25255B12%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sphere_av" border="0" alt="sphere_av" src="http://lh4.ggpht.com/-ziBWeqTB2nY/Ul6OYP7t0LI/AAAAAAAAAHs/TvQhg3MjhBQ/sphere_av_thumb%25255B10%25255D.png?imgmax=800" width="240" height="199" /></a> </p> <p>Дальше открывается основное окно с кучей элементов управления. Походив по меню (<font color="#808080">кстати, в этом стиле совершенно не понятно, какой пункт меню активен, а какой пассивен, т.е. какой может быть выбран, а какой нет</font>) поймал еще один глюк (<font color="#808080">два одновременно открытых выпадающих меню</font>):</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiY01MpLnudL0kwDQ2m3o57qSd3V2kR1NS72vyXsFD_89r7GZckaZ-vxjvNdy48qAXbiOIpMCe2i3dKmANSX3RsXzLDwFzFpd7DM6Hzlg4FvVs0ZLj2ZRr4pElaP9B7uLk44eN3kA/s1600-h/sphere_gui%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sphere_gui" border="0" alt="sphere_gui" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6fy2HtGm2sswq0Vh1uADD-5obHq8MJqBKQ1HNbL6tuH5wl9WX-l7uWkb26FjwGjgAm1YRj4FLqVpmPOXOeNDVoieiY9mO8kg6RUzrpr4GnWIf84wRJ_GB2VMsWylkskEnilkX2Q/?imgmax=800" width="240" height="126" /></a> </p> <p>Потребление памяти на этом этапе составляло примерно 140MB, что довольно много для такого софта, особенно если учесть, что пользоваться я им даже не начал. Реакция интерфейса на действия пользователя по FMX-овски неспешная, если не сказать тормозная. Это уж точно не высший класс. В конце-концов приложение пришлось прибить т.к. при выходе случилось страшное (<font color="#808080">я долго ждал завершения, но так и не дождался</font>):</p> <p><a href="http://lh3.ggpht.com/-qrx9OY4X4T8/Ul6OgfCDkyI/AAAAAAAAAIE/Upa-s0QoZNc/s1600-h/sphere_at_exit%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sphere_at_exit" border="0" alt="sphere_at_exit" src="http://lh3.ggpht.com/-k3gD97hqYsU/Ul6Oippi6KI/AAAAAAAAAIM/fR0dN-gpYnw/sphere_at_exit_thumb%25255B2%25255D.png?imgmax=800" width="240" height="187" /></a></p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com3tag:blogger.com,1999:blog-33057655.post-3311875762309464462013-05-10T21:09:00.001+04:002013-05-10T21:09:49.318+04:00Delphi. Ненависть.<p>Код (вызов представляющий собой каскад двух <strong>inlined</strong> методов):</p> <pre>xv.Initialize(bin.Instance);</pre><br /><br /><p><strong>Turbo Delphi 2006 Explorer</strong> генерирует:</p><br /><br /><pre>XmlRpcDeserializerTest.pas.2634: xv.Initialize(bin.instance);<br />00526489 8D9524FFFEFF lea edx,[ebp-$000100dc]<br />0052648F 8D45E8 lea eax,[ebp-$18]<br />00526492 E88DA8FAFF call XmlRpcBinary.GetInstance<br />00526497 8B8524FFFEFF mov eax,[ebp-$000100dc]<br />0052649D 8945B0 mov [ebp-$50],eax<br />005264A0 A154784C00 mov eax,[$004c7854]<br />005264A5 50 push eax<br />005264A6 8D8558FFFFFF lea eax,[ebp-$000000a8]<br />005264AC B107 mov cl,$07<br />005264AE 8B55B0 mov edx,[ebp-$50]<br />005264B1 E89E37FAFF call XmlRpcValue.SetValueIntf</pre><br /><br /><p><strong>Delphi XE2 - XE4</strong> генерирует:</p><br /><br /><pre>XmlRpcDeserializerTest.pas.2634: xv.Initialize(bin.instance);<br />006C9E77 8D955CFFFEFF lea edx,[ebp-$000100a4]<br />006C9E7D 8D85C4FFFEFF lea eax,[ebp-$0001003c]<br />006C9E83 E8683DF6FF call XmlRpcBinary.GetInstance<br />006C9E88 8B9D5CFFFEFF mov ebx,[ebp-$000100a4]<br />006C9E8E 8D85E4FFFEFF lea eax,[ebp-$0001001c]<br />006C9E94 E8973FD4FF call @IntfClear<br />006C9E99 33C0 xor eax,eax<br />006C9E9B 55 push ebp<br />006C9E9C 684D9F6C00 push $006c9f4d<br />006C9EA1 64FF30 push dword ptr fs:[eax]<br />006C9EA4 648920 mov fs:[eax],esp<br />006C9EA7 8D85E4FFFEFF lea eax,[ebp-$0001001c]<br />006C9EAD E87E3FD4FF call @IntfClear<br />006C9EB2 33C0 xor eax,eax<br />006C9EB4 55 push ebp<br />006C9EB5 682D9F6C00 push $006c9f2d<br />006C9EBA 64FF30 push dword ptr fs:[eax]<br />006C9EBD 648920 mov fs:[eax],esp<br />006C9EC0 8D85E4FFFEFF lea eax,[ebp-$0001001c]<br />006C9EC6 8BD3 mov edx,ebx<br />006C9EC8 E87B3FD4FF call @IntfCopy<br />006C9ECD 33C0 xor eax,eax<br />006C9ECF 55 push ebp<br />006C9ED0 680D9F6C00 push $006c9f0d<br />006C9ED5 64FF30 push dword ptr fs:[eax]<br />006C9ED8 648920 mov fs:[eax],esp<br />006C9EDB A10C3B6200 mov eax,[$00623b0c]<br />006C9EE0 50 push eax<br />006C9EE1 8D85A0FFFEFF lea eax,[ebp-$00010060]<br />006C9EE7 B107 mov cl,$07<br />006C9EE9 8B95E4FFFEFF mov edx,[ebp-$0001001c]<br />006C9EEF E898C7F5FF call XmlRpcValue.SetValueIntf</pre><br /><br /><p>Это п#$%&ц. Зарепортить не могу т.к. воспроизвести на другом коде не получается. Но подобное есть еще в паре мест, и тоже с разворачиванием <strong>inlined</strong> методов.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com4tag:blogger.com,1999:blog-33057655.post-2496821263346739782013-05-02T13:20:00.001+04:002013-05-02T13:20:17.403+04:00Delphi XE4. Чем дальше, тем страшнее.<p>Кажется, у Embarcadero уже вошло в привычку выпускать сырые бета-версии и называть их релизами. Чтож, они испекли еще один. Судя по всему, делался он в дикой спешке – иначе объяснить настолько отвратительное качество просто нечем.</p> <p> </p> <p><strong>Firemonkey. Одно лечим, другое калечим.</strong></p> <p>В обезьяне произошли некоторые приятные изменения – анимация стала работать заметно лучше – и дело тут не в увеличенном вдвое фреймрейте - спасибо разделяемому RTTI-кэшу. Однако, для отсчетов временн<u>ы</u>х интервалов по прежнему используется тип с малой точностью, поэтому на системах с большим аптаймом снова будут рывки.</p> <p>Padding и Margins поменяли поведение на противиположное. Некоторые контролы переехали в другое пространство имен. В общем, переделки пользователям FMX, если такие отчаянные есть, обеспечены.</p> <p>Формы FMX разучились сворачиваться в панель задач – клик по кнопке в панели ни к чему не приводит. Сворачивать можно только кнопкой в заголовке окна, но при этом форма сворачивается не в панель задачь, а в левый нижний угол над панелью.</p> <p>В дизайнере не меняется шрифт у TText и TLabel. То есть изменение размера действует, а вот изменение названия нет.</p> <p>Поправили TPath, теперь он справляется с довольно сложными контурами. Однако, TPath.WrapMode = pwFit работает некорректно. Сглаживание контуров под XP так и не сделали (<font color="#808080">она хоть и старушка, но все же третья по популярности ОС</font>). Кстати, со сглаживанием вообще странность. В редакторе свойства TPath.Data контур оказывается сглаженным:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGCMghbhyG1lW50FRWnAE8SibwVUxaB_U4G-eACpFdxC34tyNc3Ig9eAh0Xn21ix_AT7T1jLt23MRRFbj4hQUZZXGWg_h5eZz8V9t94ro5G9JL5GNNH5rLyuDocpFYcTys8CZ3tg/s1600-h/data_editor_normal%25255B9%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="data_editor_normal" border="0" alt="data_editor_normal" src="http://lh5.ggpht.com/-dsTugP-vi_4/UYIvm32DVYI/AAAAAAAAAGg/i3hZCCGd9_4/data_editor_normal_thumb%25255B7%25255D.png?imgmax=800" width="240" height="175" /></a> </p> <p>но стоит изменить размер окна, как сглаживание исчезает:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiISXPlhwmwEi3b3te046JELAoQXZKDq5fU4mmbbDspErUqHtq9kqrDRQUAa-ISkPW_9QJH5jnOAVD2Eg0cIHeXPZQDGH8-QiMLPtLDKYOYbezsr4sO8LQVf6JqoUI068OPa6Zbsg/s1600-h/data_editor_resized%25255B5%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="data_editor_resized" border="0" alt="data_editor_resized" src="http://lh6.ggpht.com/-5QYVHljU0yc/UYIvs8-MVpI/AAAAAAAAAGw/Ae58p_hkVpY/data_editor_resized_thumb%25255B3%25255D.png?imgmax=800" width="195" height="240" /></a> </p> <p>Поломали TreeView. Если у дерева вызвать метод TreeView.ExpandAll список узлов превращается в кашу (<font color="#808080">слева пример собранный в XE3, справа в XE4</font>):</p> <p><a href="http://lh6.ggpht.com/-LCn4s7V7bEY/UYIvxG0TkSI/AAAAAAAAAG4/HnLtgE6_VEc/s1600-h/expanded_treeviews%25255B13%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="expanded_treeviews" border="0" alt="expanded_treeviews" src="http://lh5.ggpht.com/-gmHVoQ-HK48/UYIvzdwddMI/AAAAAAAAAHA/UsATnYhTdhg/expanded_treeviews_thumb%25255B11%25255D.png?imgmax=800" width="240" height="70" /></a> </p> <p>Плюс еще множество мелких косяков, вроде визуальных артефактов, которые просто лень документировать. По общим ощущениям FMX становится все более неюзабельной. Небольшие улучшения ни коим образом не влияют на картину вцелом.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com1tag:blogger.com,1999:blog-33057655.post-78880110690644847092012-12-07T18:57:00.001+04:002012-12-07T19:07:41.868+04:00Блеск и нищета Firemonkey²<h4></h4> <h4>Блеск</h4> <p>В Delphi XE3 у Firemonkey появилась возможность стилизовать неклиентскую область окон приложения. Для этого используются новые имена стилей: для Windows это <strong>windowborderstyle</strong> и <strong>toolwindowstyle</strong>, для Mac OS используется единственный стиль <strong>macborderstyle</strong>. Информации, как создать такие стили нет, во всяком случае я не нашел, поэтому всё что будет написано дальше является результатом исследования кода класса <strong>TWindowBorder</strong> и его потомков под каждую платформу. В общем, можно сказать, что создать собственный стиль неклиентской области дело довольно простое. Стиль подразумевает наличие некоторых предопределенных элементов (<font color="#808080">например ‘client’ отвечает за клиентскую область окна, а ‘title’ за его текстовый заголовок</font>) из которых формируется внешний вид окна. Так же имя элемента стиля отвечает за обозначение действия какой-либо области окна. Например элементы c именем стиля ‘left’ и ‘right’ отвечают за изменение горизонтального размера окна, а ‘caption’ за его перемещение (<font color="#808080">элементов с одинаковым именем стиля может быть несколько, что в результате даст несколько зон отвечающих за одно и то же действие</font>) То есть при клике на этих элементах будет выполняться соответствующее им действие. В общем, кто имел опыт работы с WinAPI, в части обработки оконных сообщений, наверняка провели параллель с такой вещью, как HITTEST, и оказались правы – механизм работает один-в-один. Это был блеск. Теперь о нищете.</p> <h4>Нищета</h4> <p>Воодушевившись открывшимися новыми возможностями я решил сделать стиль имитирующий окна Mac OS X Leon. За основу был взят незамысловатый скриншот:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWy1Ixaicr9XXx30XdljEe0IW20I5WaVbh8QTNlVikuR4Gk8cbIL2hlEYJhx62CioPoMHUv26lIxoVr9GZCk0TqPzkZEXw7Xm1cH3dBgJBf7V8ayrSHFTSMJ3ZJWn7a5Av4Nz0-w/s1600-h/pic14%25255B4%25255D.jpg" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="pic14" border="0" alt="pic14" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzMkje5MtHfhB6qq40IxklLf6QaQ-0GsBEKmMDED6e-51ZIze82OslHhxfZ72Gs1X1uAz33Ol1vFFB6DQkWhoL8Y0JC6VrLLbJwsg9cjbHgAQLdjHm_JciwfjMpnqBjm1QQbT70Q/?imgmax=800" width="240" height="124" /></a> </p> <p>и еще несколько изображений окон, где присутствовали кнопки в заголовке окна. Я не ставил себе целью сделать сразу полнофункциональный стиль, для начала хотелось добиться схожести с оригиналом. Вооружившись дизайнером стилей и в очередной раз убедившись, что пользоваться оным невозможно, было решено дизайнить стиль прямо на форме (<font color="#808080">ведь любой стиль это просто набор компонентов</font>). Затем с формы стиль был скопирован в файл macosx.style и загружен в компонент класса TStyleBook, который был назначен форме. В редакторе стилей созданный стиль выглядел вот так:</p> <p><a href="http://lh4.ggpht.com/-AXiWvBA1VEU/UMIDbE_BFKI/AAAAAAAAAFY/rkv8jBCSZbQ/s1600-h/styledesigner%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="styledesigner" border="0" alt="styledesigner" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCskNUwfQAE0KM9gZLyZjg1GwvrOISjyelqs1bFAL06H37VyYPcuNZSjbXAehVOSLC3M46oSCxE1-caysmYSCU39y3zCh6D6IDshfYzBW4G83Eatk0g7uhL8jvN_JT-jHWBJm9kA/?imgmax=800" width="240" height="174" /></a> </p> <p>Сглаживания на кнопке нет т.к. делал я все под Windows XP, а у Firemonkey на этой ОC сглаживание не работает (<font color="#808080">работало до Delphi XE2 Update 4 hotfix 1, но хотфиксом его сломали да так и не починили</font>). Для создания эффекта тени пришлось генерировать картинку в GIMP т.к. стандартный эффект TShadowEffect такую тень отрисовать не способен (<font color="#808080">при значении свойства Softness равном единице тень уже имеет видимую глазу структуру, а при значениях больше единицы и вовсе превращается в клетчатое пятно</font>). Но с картинкой возникает проблема. При изменении размера окна тень должна растягиваться без артефактов поэтому просто масштабировать картинку нельзя, её нужно делить на области: четыре имеющих постоянный размер (<font color="#808080">расположены в углах</font>), две растягивающиеся горизонтально и две растягивающие вертикально. Итого получается восемь частей. Каждую такую часть можно было представить компонентом TImage в который был бы загружен файл соответствующей части изображения. Однако, в Delphi XE3, для поддержки растровых стилей Firemonkey, появился класс TSubImage способный отрисовывать указанную область изображения на которое он ссылается. Это удобнее, чем делать множество файлов. Но, этот класс не доступен в дизайнере, поэтому мне пришлось установить в IDE пакет регистрирующий его. В общем, после некоторого непредвиденного траха с пакетом, тень была готова. Заголовок с кнопкой и клиенсткую область сделать труда не составило. Хотя нет, подобрать градиент для кнопки было сложно т.к. элементы выделения (<font color="#808080">белые кружочки для изменения размеров</font>) полностью перекрывали маленькую кнопку и изменяющийся градиент было не видно :) В результате схожесть не попиксельная, но довольно близка к оригиналу. Итак, стиль готов, первый запуск:</p> <p><a href="http://lh6.ggpht.com/-TXsptMVQ2mM/UMIDiv0x7aI/AAAAAAAAAFo/ewdOabU4PuM/s1600-h/styledwindowblackshadow%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="styledwindowblackshadow" border="0" alt="styledwindowblackshadow" src="http://lh4.ggpht.com/-__GGyJWERO0/UMIDlyeWGPI/AAAAAAAAAFw/q_PoyAGc-BY/styledwindowblackshadow_thumb%25255B2%25255D.png?imgmax=800" width="240" height="190" /></a> </p> <p>Легкое недоумение. Пробую максимизировать окно, оно максимизируется так, как будто тень является клиентской областью т.е. я вижу не распахнутую на весь экран клиентскую область, а клиентскую область в окружении черной рамки. Хорошо, с максимизацией разберемся как нибудь позже, но почему тень не прозрачная… Я же помню, что у меню были прозрачные тени. Ищу в файле стилей стиль для меню (<font color="#808080">menuviewstyle</font>). Вижу, что тень сделана с помощью эффекта TShadowEffect, но место под неё зарезервировано с помощью свойств Margin и Padding у элементов стиля. Попробовал и я у своей тени выставить отрицательный Padding, вот что из этого вышло:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBi4mLngx3MBQlktEKxoIXlh4xKYAjm_R6I6ySUiFo8l-zmGkFWzCiSyc1sECR35wJ6rUqViuWjZvzrSGwylrZcvlV4dJgrf6YIm-F-czDcmyNB9CLgcsUY9iY7tPmJJRF6-iIlw/s1600-h/styledwindow%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="styledwindow" border="0" alt="styledwindow" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhToK4qYLBnKQgTOO-VynPV6ae_KIEhK3BP0mUNA19OCqgsNs8n4mO5LEdfQxE5nBS2Q8DzwP2FG3d4vN1RKh19RLCHBbKvX6OOTynQ4TR0rW1OaDMhIJDJWgOFGtjOWq2OqCk4zQ/?imgmax=800" width="240" height="161" /></a> </p> <p>Тень совсем пропала, а кроме этого на каждое изменение размеров окна генерируется четыре исключительных ситуации EZeroDivide. В общем трюк не сработал. Начал смотреть, что же там происходит под капотом модуля FMX.Platform.Win отвечающем за взаимодействие с платформой Windows. А там все печально. Оказалось, что по изображению полученному отрисовкой стиля формируется регион (<font color="#808080">регион в терминологии Win32</font>) и назначается окну. Всё, прощай прозрачная тень, прощайте сглаженные уголки окна и да здравствуют зазубрины :( Но, как же, тогда отрисовывается тень у меню? А для меню используются композитные окна (<font color="#808080">см. TFrom.Transparency</font>). В общем, тоска зеленая :(</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-60569805128300475202012-12-03T13:52:00.001+04:002012-12-03T13:52:44.869+04:00iPhone “slide to unlock” animation средствами Firemonkey. DelphiXE2.<p>Как бы кто ни относился к Apple, одно признают все – эти парни умеют делать красиво. Их “красота” заключается в не пергруженных деталями интерфейсах и изысканных мелочах. Одной из таких мелочей является анимация элемента разблокировки экрана (<font color="#808080">кто не видел, погуглите slide to unlock animation</font>). Как только вышла Delphi XE2 я сразу попробовал сделать подобный эффект средствами Firemonkey. Тогда, получив удовлетворительный результат, я не стал описывать его т.к. думал, что следующая версия Firemonkey позволит реализовать этот эффект не написав ни строчки кода. Этого, увы, не случилось. Более того, в Delphi XE3, классы TText и TLabel лишились свойства Fill, что сделало невозможным применение каких-либо вариантов раскраски текста. Поэтому публикую вариант для <strong>Delphi XE2</strong>.</p> <p>Вот что у меня вышло:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitECgYS2bO6U9QWMsUnkRyCctNj5k-44sKwBFQzFJcU8_DukCB-6LyeX9oC_QndhDzSCgq1s0WLLNCRyY4AiBAxDFoBxEWE_mtHUcT8S0acY_WnUp_CwdbQIa7Hn3v9x_Y75TJWg/s1600-h/spotlight_effect%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="spotlight_effect" border="0" alt="spotlight_effect" src="http://lh6.ggpht.com/-GbwjBEcJZZI/ULx2WPCdvDI/AAAAAAAAAE4/REv0e-SKf0g/spotlight_effect_thumb%25255B2%25255D.png?imgmax=800" width="240" height="194" /></a> </p> <p>Реализация очень простая. В качестве “раскраски” текста применяется битмап в который отрисовывается прямоугольник серого цвета с анимированным градиентом имитирующим пятно света. Все это делается в дизайнере, за исключением отрисовки контрола в битмап т.к. TBushGrab, являющаяся одним из вариантов использования кисти, корректно не работает.</p> <p> </p> <p>Исходник и скомпилированный пример можно скачать <a href="http://kazantsev.nm.ru/slide_to_unlock.zip" target="_blank">тут</a>.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-46928491016839424352012-09-28T20:40:00.001+04:002012-09-28T20:40:55.479+04:00Delphi XE3.FireMonkey: Фиксим рваную анимацию<p>О проблемах с анимацией в FireMonkey я уже неоднократно писал. Причина кроется в недостаточной точности используемого типа - Single. С переработкой FireMonkey на архитектуру сервисов, произошедшую в Delphi XE3, появилась возможность очень просто этот косяк пофиксить. В общем, фикс можно скачать <a href="http://kazantsev.nm.ru/FMX_AnimationFixer.zip" target="_blank">отсюда</a>.</p> <p> </p> <p>p.s. Достаточно подключить модуль к проекту. Работает начиная с Delphi XE3. Будем надеяться, что с первым апдейтом этот фикс станет ненужен.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com9tag:blogger.com,1999:blog-33057655.post-79832969854254037262012-09-25T21:01:00.001+04:002012-09-26T11:13:42.109+04:00Delphi XE3.FireMonkey: куда ни кинь – всюду клин.<p>Это просто ужас какой-то – за что-бы ни взялся, ну просто все глючит :( После предыдущего подхода закончившегося серией QC-отчетов и серьезно охладившего пыл, сегодня решил еще поиграться с новым редактором стилей (<font color="#808080">о нем писать не буду – он ужасен. Даже элементарных действий по изменению Z-order для объектов нет, а Copy/Past умудряются глючить. Впрочем не удивительно, Крюков же говорил, что ему удобнее с текстовым представлением работать, видимо и нам нефиг расслабляться</font>) и сделать небольшое т.н. gloat-logo наподобие такого:</p> <p><a href="http://lh5.ggpht.com/-xu332nnX--4/UGHiy9CMEsI/AAAAAAAAADo/W0PxbqtPv3Q/s1600-h/firebird%25255B5%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="firebird" border="0" alt="firebird" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi01av3-0zcqCfMqcsWZRc6_oVdWJoJPYy3IdwgcLJsiOTVZPyBS_yOgFbF5bWL8r5adG3Y7WuFNbCqnNUKPIwFlae0fF9t9rny2HH33F0gr8qeufWUjq6qAcVh1U-tRuN4QcvbyA/?imgmax=800" width="233" height="70" /></a> </p> <p>Для этого я векторизовал в Inkscape изображение шлема с картинки для TLiveTile. Получилось довольно не плохо:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrgvb2qBMJmBg4iXlQfYbscrPO3R6aK1QLm97EblhcLn8wSRiG0hR49lPXjLQ6lLn_MzRlGJhy6jyUaf_alMsh4r-KP3bVaq6_HH1jsEXVnfTG5S4PNgyaH1wNdHug2jE86sar2w/s1600-h/delphi_logo%25255B17%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="delphi_logo" border="0" alt="delphi_logo" src="http://lh4.ggpht.com/-DSydS0__XIk/UGHi5SwRO5I/AAAAAAAAAEA/a4PiFz_X-PI/delphi_logo_thumb%25255B15%25255D.png?imgmax=800" width="222" height="240" /></a> </p> <p>А вот так это отображается посредством TPath:</p> <p><a href="http://lh5.ggpht.com/-9KJ1aD8ZwHQ/UGHi-DsHyII/AAAAAAAAAEI/Hhnlca6Q8GE/s1600-h/dxe3%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dxe3" border="0" alt="dxe3" src="http://lh6.ggpht.com/-kc3cSqDbIIk/UGHjECc8wVI/AAAAAAAAAEQ/Jgo1NIwo3a4/dxe3_thumb%25255B2%25255D.png?imgmax=800" width="240" height="158" /></a> </p> <p>Для сравнения скриншот Delphi XE2 Update 4:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgD1HcSi9dzNc9ZVfpIZ4N23SXO7BUsuzlYHkD2QjBy43DgSLN01qW1jyP7zYLj0e8KGZYfppkXJYvG1uXaDeE6XJfb59JtmCipnBiinHVU0ngQrqYNrkO1TsN-nhcwekpfBKlNRA/?imgmax=800" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="dxe2" border="0" alt="dxe2" src="http://lh3.ggpht.com/-2K8-tOMmjY4/UGHjWmR_ulI/AAAAAAAAAEg/q3GNyfwT_Uw/dxe2_thumb%25255B2%25255D.png?imgmax=800" width="240" height="190" /></a> </p> <p>В общем, пользоваться этим нельзя.</p> <p> </p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=109005" target="_blank">QC#109005</a></p> <p>Update: 26.09.2012 11:07</p> <p>Пришлось залить на QC два готовых проекта демонстрирующих баги компонента. Кстати, имеет значение каким образом будет заполняться путь: через инспектор объектов или через редактор компонента. Глючат оба варианта. Кому интересно скачайте приложенные проекты.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-40145480830845002832012-09-09T16:02:00.001+04:002012-09-12T23:59:11.896+04:00Delphi XE3. Очередной сырой релиз Firemonkey.<p>Багу с анимацией не поправили, она как была рваная так таковой и осталась. Причины они, похоже, поняли. Типу Single, используемому для счетчика тиков таймера (<font color="#808080">и кому в голову такая идея пришла, для счетчика использовать нецелочисленный тип</font>) не хватает точности если у системы большой аптайм. В IFMXTimerService.GetTick они заменили его на Extended, а вот в реализации класса TAnithread забыли.</p> <p><a href="http://lh4.ggpht.com/-TFs9_LZimkQ/UEyQy5qEgHI/AAAAAAAAACQ/GyXsfvXb3BM/s1600-h/ani_bug%25255B5%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ani_bug" border="0" alt="ani_bug" src="http://lh6.ggpht.com/-ptQxlIGxLP8/UEyQ3BcF_5I/AAAAAAAAACY/BvC3eBnPQtk/ani_bug_thumb%25255B3%25255D.png?imgmax=800" width="240" height="232" /></a> </p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=108614" target="_blank">QC#108614</a></p> <p> </p> <p>TreeView стало сильно нагружать CPU. Для дерева с одной тысячей элементов загрузка доходит до 100% в состоянии покоя. Мне не понятно, они там вообще ничего не тестируют что-ли?</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJv1gKm-pf9TxMpUv-9D1W4TWvaFAG2ynXDk7DJqsIgmccuUC7QieE-bMDupJhBFb9DdKjDkEvniEm4YhgfrmZ7ftBY0nxKaCtwITGNtwXrYq0YTm7BRdzD0_soYNYaPsq8_k8Gg/s1600-h/treeview_bug%25255B7%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="treeview_bug" border="0" alt="treeview_bug" src="http://lh5.ggpht.com/-rkXnkp0hN_s/UEyQ-CGAcAI/AAAAAAAAACo/r_7ZLV4Jek8/treeview_bug_thumb%25255B5%25255D.png?imgmax=800" width="240" height="114" /></a> </p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=108615" target="_blank">QC#108615</a></p> <p> </p> <p>Еще вылез косяк с пропадаением/мерцанием шейдерной тени в 3D. Но тут без репорта, ибо надоело.</p> <p> </p> <p>Регрессию с отсутствием сглаживания на XP тоже не пофиксили, а ведь <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=106226" target="_blank">она висит</a> с выхода XE2 Update 4 Hotfix 1.</p> <p> </p> <p>Update: 20:17 09.09.2012</p> <p>Налетел еще на один косяк с тенью. Тень привязанная к объекту, который в свою очередь привязан якорями к своему контейнеру, не обновляется при изменении его размеров, а, похоже, просто подгоняется под размер.</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH7uyRhlPSqc4IKyzYDDHG4dEhXfes66eRalQY-ific-vhdC-KjwS_UqbpdOUIXEmByFOVJWi0jOfA7rCYWTsuuRF7ATUryuItjzDLpnCH07AUMmAsOLuff0uOKEWgRXYwSgfyNg/s1600-h/shadow_bug%25255B4%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="shadow_bug" border="0" alt="shadow_bug" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeKhIxiL4d4b03VBMaARiWmCtu3hPLoISCCFxzbEK41_SpeH5hMXLta6766h63pqyRovm05Z6Xu1LFNd1PVnOvdvgjuC0STr4B_UQqGzj3aMUEWglpGGldasTEpGldnMQZpHudyQ/?imgmax=800" width="240" height="175" /></a> </p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=108620" target="_blank">QC#108620</a></p> <p> </p> <p>Update: 23:46 12.09.2012</p> <p>Удалось воспроизвести еще один косяк с эффектом тени. На TForm3D размещен прозрачный TLayer3D с объектом внутри. Объекту назначен эффект тени. Тень пропадает, когда активизируется другой шейдерный эффект (это, кстати, регрессия, на XE2 такого небыло):</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgeMNKksXxLCRTvgyZuCgzDZH4lZg9bAXVlQgDgIMm80qKhHBHFiPOIQYWE_5lhKYOq7-3RDpIZIXTTXR2jBHzijtV20x0omsK0q0HsaFyUgL3-INg-s96tN5I5KLoVrGlyp2LWA/s1600-h/shadow_bug2%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="shadow_bug2" border="0" alt="shadow_bug2" src="http://lh4.ggpht.com/-025CSF6FJn4/UFDpjZKyr4I/AAAAAAAAADY/H8TOmgA4nVA/shadow_bug2_thumb%25255B2%25255D.png?imgmax=800" width="240" height="173" /></a> </p> <p><a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=108719" target="_blank">QC#108719</a></p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com4tag:blogger.com,1999:blog-33057655.post-16281897349282344272012-08-30T16:10:00.001+04:002012-08-30T16:10:31.173+04:00Lazarus 1.0. Релиз.<p>Свершилось. Lazarus 1.0 <a href="http://lazarus.freepascal.org/index.php/topic,18019.html" target="_blank">релизнулся</a>. Поздравляем команду работавшую над этой замечательной средой со столь важной вехой. Буду постепенно адаптировать свои наработки под FreePascal, чтоб в перспективе полностью слезть с Delphi. Абракадабра, похоже, совсем <a href="http://www.deltics.co.nz/blog/?p=1097" target="_blank">берега потеряла</a>.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-87461984343816598012012-07-18T13:25:00.001+04:002012-07-18T13:25:51.038+04:00Евангелисты врут. FireMonkey - отстой.<p>Вы, наверное, в курсе, что Embarcadero активно продвигает свое новое видение создания кроссплатформенного гуя – FireMonkey (<font color="#808080">они это называют фреймвоком, но для её нынешнего состояния это слишком круто звучит</font>). В рунете анонсируется один конкурс за другим, проводятся вебинары, и пусть качество последних оставляет желать лучшего, но активность радует.  Теперь, собственно, к теме. В рамках последнего конкурса было предложено разработать какое-нибудь приложение для обучения. И вот вчера появилась <a href="http://echmel.ru/2012/07/program-presented-at-the-contest-firemonkey-to-study/" target="_blank">очередная работа</a> за авторством Евгения Чмеля (<font color="#808080">не знаю, склоняется эта фамилия или нет</font>). В отличии от виденных ранее, простеньких “одноформочек”, тут была сделана попытка подергать обезьяну за все конечности: стилизация, 3D, шейдерные эффекты (<font color="#808080">о GPU accelerated graphics очень любят говорить евангелисты Embarcadero :)) </font>). Давайте посмотрим, что из этого вышло. Для тех, кто не смотрел вебинары сделаю маленькое отступление. На одном из вебинаров, евангелист Embarcadero, Всеволод Леонов рассказал душещипательную историю о том, как ему пришлось “компьютер перегрузить, конкретно, жестко” (<font color="#808080">это цитата</font>), из-за того, что Silverlight SDK и эмулятор Windows Phone 7 “не cработали” (<font color="#808080">это цитата</font>) на его компьютере т.к. им не понравился видеоадаптер или настройки графического процессора. А вот приложения разработанные с использованием FireMokey, продолжает Всеволод, совершенно не требовательны к аппаратному обеспечению. Давайте посмотрим, как он нам врал. Беспристрастным свидетелем нам будет Process Explorer v15.05 от Марка Русиновича. Итак, <a href="http://echmel.ru/files/echmel_funny_english_install.zip" target="_blank">качаем приложение</a> Евгения и запускаем (<font color="#808080">скриншотов приложения Евгения не привожу, они есть по ссылке на его работу. Обратите внимание на размытость шрифтов</font>).</p> <p>Запустили приложение. Смотрим на потребление:</p> <p><a href="http://lh5.ggpht.com/-0bfZjOoFWEs/UAaA04E_gPI/AAAAAAAAABI/5CJ3GtNlbzM/s1600-h/afterstart_memory%25255B5%25255D.png" target="_blank"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="afterstart_memory" border="0" alt="afterstart_memory" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik54OvxJWfmVrYu1TWewMSUh25pXKtdHiXtEn5BENjIVLOmtaQ0pfgMnh-jHREASmEDmbZzz4cZxrGSMsrN3qZl3LmzAqFmCyJlljEQ03thZDqNKM_26YvgB_-QQ1v97AXJCxVMw/?imgmax=800" width="154" height="240" /></a> </p> <p>Нескромно, но можно простить “передовой технологии”. Переходим к разделу “Уроки” и выбираем “Урок 5”. Начинается подготовка сцены. Процесс этот длительный (<font color="#808080">у меня заняло чуть больше минуты, на четырехядерном Phenom II с частотой 3.3GHz</font>), запаситесь терпением. Сцена построена. Смотрим на потребление:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9AaDrjAk3Y_V5ZG6r8kYoTppfoom5O_ftM95mWnpl24u0X4EUwpaVZYRwF6y0_jnnIS3J9F9OWpyXXeX0p3W7erlwfuQ9wrd44CsAzFUPeiCdUwiZiNHAghLHhrOSyh1zqYIeNg/s1600-h/opened_lesson%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="opened_lesson" border="0" alt="opened_lesson" src="http://lh4.ggpht.com/-JaDvfoXeCmY/UAaA88jGF0I/AAAAAAAAABg/hwm-E1YwTGs/opened_lesson_thumb%25255B2%25255D.png?imgmax=800" width="150" height="240" /></a> </p> <p>Обезьяна хорошо подкрепилась. Даже очень хорошо. Теперь попробуйте подвигать мышку над кнопками вариантов ответов. Ощущение, что GUI реагирует ну о-о-очень вяло, не так-ли? Смотрите на график использования CPU (<font color="#808080">я имею ввиду, что вы должны сами это попробовать, на своем компьютере</font>) – в эти моменты его загрузка приближается к 100% (<font color="#808080">у меня было ~21.5% для четырехядерного процессора, что эквивалетно 86% для одноядерного</font>). А ведь нам кто-то рассказывал про GPU accelerated graphics. Ладно, идем дальше. Отвечаем на все вопросы урока. Смотрим потребление:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Ta6haNUUyOBmxxzQ77owxvrMZUv4TcZuayyPcSFcqbE_BOTDfTYGPX8fFronuoJ2zUvUDDnr9ZSg8NwMr-MtHPu1Ber8k3tADM2Gq-2Tfa_MrgcU_H4C2xmNY5l60gzUVryOMA/s1600-h/after_lesson%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="after_lesson" border="0" alt="after_lesson" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu9K0AXg-8BtHZVKAMVvSAYN7LEEs3eAdbgM7aPXNmRFQvRNoK4leuCWmzy6zMoaJVasR7Ug4PAtblqxm8ZahUha4Bl3pmO0RsfeFZOZ11l7C_H7jtR9gBl1lVxYO-fMSF-q1Cnw/?imgmax=800" width="162" height="240" /></a> </p> <p>Глаза не округлились? Теперь посмотрите, для сравнения, сколько потребляет 3D-стрелялка FarCry с активным игровым процессом (<font color="#808080">уровень называется Фабрика, если кому, вдруг, интересно</font>) запущенная в полноэкранном режиме 1440x900:</p> <p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO40Bi4I2pf8g21JVmupbs4ORokRuw4wXH5A4QNhMR1me6XFSJiDMyX8KHKRUE-Pur8ygybT2PcDrMFuT5yiOJmFo0WTBf8J3zpsb6b_oy-o4pT8Vj1j1by0oynkFrrFl0Wf4Tbw/s1600-h/farcry%25255B4%25255D.png" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="farcry" border="0" alt="farcry" src="http://lh6.ggpht.com/-23NyE7bI8fQ/UAaBHBYTxPI/AAAAAAAAACA/CnpS37-zwo8/farcry_thumb%25255B2%25255D.png?imgmax=800" width="161" height="240" /></a> </p> <p>Выводы делайте сами.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com4tag:blogger.com,1999:blog-33057655.post-4490943039301303052012-07-05T15:33:00.001+04:002012-07-06T02:05:46.526+04:00Delphi XE2 Update 4 HotFix 1. А с дженериками до сих пор проблемы :(<p>Хотите получить Access Violation на абсолютно ровном месте, без намека на ухабы? Велком, как говорится:</p> <p>program array_of_generic_record; <br /> <br />{$APPTYPE CONSOLE} <br /> <br />Uses <br /> <br />TypInfo; <br /> <br />Type <br /> <br />TRec<T><t> = Record <br />  FField : T; <br />End; <br /> <br />Var <br /> <br />a : Array Of TRec<TObject><tobject>; <br />i : Integer; <br />r : TRec<TObject><tobject>; <br /> <br />begin <br /> <br />WriteLn(SizeOf(TRec<TObject><tobject>)); // 4 <br />WriteLn(GetTypeData(TypeInfo(TRec<TObject><tobject>))^.elSize); // 4 <br /> <br />SetLength(A, 1000000); // but system.DynArraySetLength.elSize = 1; line 28288 <br />                        // (DelphiXE2 update 4 hotfix 1); look at attached screenshot: bug.png <br /> <br />// absolutely normal code lead to access violation error <br />For i := Low(a) To High(a) Do <br />  a[i] := r; <br /> <br />end. <br /></p> <p> </p> <p>В общем, из описания понятно, что в системном модуле неверно получается размер элемента динамического массива. Из-за чего, понятное дело, памяти выделяется меньше и попытки работать с таким массивом приводят к краху. На дворе 2012 год. Блин, когда они уже нормальный компилятор осилят написать. Лучи ненависти вам, абракадабры :E</p> <p> </p> <p>p.s. <a href="http://qc.embarcadero.com/wc/qcmain.aspx?d=106917" target="_blank">QC #106917</a></p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0tag:blogger.com,1999:blog-33057655.post-58040825303006986622012-04-18T21:26:00.001+04:002012-04-18T21:26:26.565+04:00Firemonkey. Анимммммация.<p>Полюбуйтесь:</p> <p><a href="http://lh4.ggpht.com/-AokQj5WT6IE/T475NqKzxaI/AAAAAAAAAA4/SGkBYL1_F2I/fmx_animmmmmation%25255B5%25255D.png?imgmax=800"><img style="display: inline" title="fmx_animmmmmation" alt="fmx_animmmmmation" src="http://lh6.ggpht.com/-_x5BVTQASxU/T475Pt-NIVI/AAAAAAAAABA/fqE0eGpgPU0/fmx_animmmmmation_thumb%25255B3%25255D.png?imgmax=800" width="330" height="489" /></a></p> <p>Параметры анимации:</p> <ul> <li>Продолжительность 0.5 сек </li> <li>Стартовое значение 6 </li> <li>Конечное значение 64 </li> </ul> <p>В уголочке приложение работающее под виртуальной машиной с Windows XP и приложение работающее на хост-машине с Windows 7. Приложение пишет в Memo-лог изменения свойства Step на которое настроена анимация.</p> <p>Обнаруженных косяков два:</p> <ol> <li>Дважды приходит стартовое значение </li> <li>Разное количество “шагов” анимации при идентичных параметрах </li> </ol> <p>А я думаю чего это у меня анимашка так дергается на семерке, и отчего кажется более плавной на виртуализированной XP. Ужас, блин.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com2tag:blogger.com,1999:blog-33057655.post-17797262711519900442011-12-26T13:53:00.001+04:002011-12-26T13:53:17.050+04:00Firemonkey это сырая пре’альфа технолоджи превью.<p>Как такое можно было релизить, вообще не понятно.</p> Kazantsev Alexeyhttp://www.blogger.com/profile/14086309924481739588noreply@blogger.com0