Выложен Lazy Delphi Builder 1.14.14.362 и 364 (альфа)
Выложена версия Lazy Delphi Builder 1.14.14.362.
Исправлен Exception при добавлении пути в Lazy Paths.
В редакторе IDE search paths исправлены ошибки с подсветкой несуществующих папок.
Добавлена новая команда Replace selected with env var (auto) — которая заменяет часть пути на Environment variable (переменные ищутся в Lazy Environment variables и IDE environment variables)
Download
here
Lazy Delphi Builder 1.14.14.364 alpha.
обновлён JCL:
* исправлена ошибка с некорректным ключом dcc32 -N»Snamespace»
* улучшена поддержка версий Delphi XE2+
* другие исправления
Эту версию я ещё не тестировал. Если что-то найдёте — дайте знать.
[[ This is a content summary only. Visit my website for full links, other content, and more! ]]
Как послать доллар через RESTDebugger
Выдали мне партнёры точку доступа к данным и сказали: «Пиши в HTTP-заголовке ‘X-Auth: abracadabraabracadabraabracadabra$abracadabraabracadabraabracadabra’, а то неавторизованный доступ будет».
Я беру Fiddler (я его всегда беру),
Выложен Lazy Delphi Builder 1.14.14.360 (исправления ошибок)
01.04.2016. Lazy Delphi Builder 1.14.14.360: Исправления ошибок. Исправлены ошибки с относительными путями. Как для путей в LazyDBP файле так и для переменной $(BUILTIN_PROFILE_DIR) Консольная версия
Выложен Lazy Delphi Builder 1.14.14.360 (исправления ошибок)
01.04.2016. Lazy Delphi Builder 1.14.14.360:
Исправления ошибок.
Исправлены ошибки с относительными путями. Как для путей в LazyDBP файле так и для переменной $(BUILTIN_PROFILE_DIR)
Консольная версия не возвращала ERRORLEVEL если при удалении или создании папки случалась проблема
Очень тормозило построение дерева после удаления узла
MRU файлы. Последний загруженный отправляется наверх. Наконец-то.
Новый параметр командной строки /MaxProblemCountToStop
Значение BUILTIN_PROFILE_DIR переменной выводится после загрузки профиля в /debug режиме в консольной версии
Скачивать
[[ This is a content summary only. Visit my website for full links, other content, and more! ]]
Почему тип анонимных функций не всегда полезен или о проблема присвоения reference to типу неанонимных функций
Два предыдущих поста:
- Просто баг в коде или особенность счетчика ссылок в замыканиях
- Немного про замыкание ( Одно замыкание на несколько анонимных функций в одном контексте)
Вот код примера:
program ReferenceToProc;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, System.Generics.Collections;
var
eventHandlers: TList<TProc>;
procedure Subscribe(AHandler: TProc);
begin
eventHandlers.Add(AHandler);
end;
function Unsubscribe(AHandler: TProc): Boolean;
begin
Writeln(eventHandlers.IndexOf(AHandler)); // 0
Result := eventHandlers.Remove(AHandler) >= 0;
end;
procedure HandlerProc;
begin
Writeln('Вызов статической процедуры');
end;
var
proc: TProc;
begin
eventHandlers:= TList<TProc>.Create;
proc := procedure()
begin
Writeln('Вызов анонимной функции')
end;
Subscribe(proc); // Подписываемся анонимной функцией
Writeln(Unsubscribe(proc)); // Метод вернул True, Успех:)
Subscribe(HandlerProc); // Подписываемся не анонимной функцией
Writeln(Unsubscribe(HandlerProc)); // Метод вернет False Fail:(
FreeAndNil(eventHandlers);
readln;
end.Вызов Unsubscribe в строке Writeln(Unsubscribe(HandlerProc)); вернет False. Причина впрочем прозаична, вызов метода HandlerProc заворачивается в анонимную функцию и каждый раз новую. Потому функция, которую подписали на событие, будет отличаться от функции, которую пытаемся отписать.
Казалось бы, простая задача — реализовать список с обработчиками и методами подписки и отписки превращается не в самую тривиальную.
Получается, что хранить обработчики лучше как TMethod, но если все же хотим уметь подписывать универсальные обработчики (анонимные и неанонимные), тогда придется для каждого типа писать свою логику сохранения в список и вызова обработчиков. Это будут либо overload методы, либо будем использовать Rtti и методы параметризированные типом.
TEvent = class
events: TList<TMethod>;
class procedure Subscribe(AProc: TProc); overload;
class procedure Subscribe(AProc: TProcedure); overload;
class procedure Subscribe<T>(AProc: T); overload;
end;А для преобразования анонимного метода в TMethod потребуется сочинять что то вроде того, что написано в Spring4D в Springs.Events.pas:
procedure MethodReferenceToMethodPointer(const AMethodReference; const AMethodPointer);
type
TVtable = array[0..3] of Pointer;
PVtable = ^TVtable;
PPVtable = ^PVtable;
begin
// 3 is offset of Invoke, after QI, AddRef, Release
PMethod(@AMethodPointer).Code := PPVtable(AMethodReference)^^[3];
PMethod(@AMethodPointer).Data := Pointer(AMethodReference);
end;
function TEvent.Cast(const handler): TMethod;
begin
if fTypeInfo.Kind = tkInterface then
MethodReferenceToMethodPointer(handler, Result)
else
Result := PMethod(@handler)^;
end;
Lazy Delphi Builder 1.14.14.356 доступен
В этом блоге, последний раз я выкладывал анонс версии 1.10.9.269 от 2014-03-15. Новые версии продолжали выходить, я о них писал на сайте проекта и на
Lazy Delphi Builder 1.14.14.356 доступен
В этом блоге, последний раз я выкладывал анонс версии 1.10.9.269 от
2014-03-15. Новые версии продолжали выходить, я о них писал на сайте проекта и на страничке Lazy Delphi
Builder в Google+.
Пользователям версии 1.10.9.269 от 2014-03-15 настоятельно рекомендую
обновиться – была исправлена критическая ошибка приводившая к раздуванию файла
LazyDBP и торможению работы.
Основные нововведения опишу здесь. За деталями – добро пожаловать в
history_en.txt.
Большие изменения
Добавлена поддержка «portable» инсталляций (нужен только dccXX.exe и папка
Lib)
Поддержка Delphi XE8-Seattle
Добавлен тулбар и горячие клавиши для навигации по build log
Интерфейс больше не блокируется на время компиляции
(Application.ProcessMessages наше всё)
Режим /noop – когда никаких реальных действий с…
[[ This is a content summary only. Visit my website for full links, other content, and more! ]]
Как крутить шарикоподшипник. Ч.3 — именно это.
Как крутить шарик в окружности
Часть 1 — квадратный шарик на плоскостиЧасть 2 — часики
Есть мнение, что настоящая индустриализация и независимость страны начинается с того, что
Как крутить шарикоподшипник. Ч.2 — часики.
предыдущий выпуск
Я уже не помню, как выглядел тот фанерный циферблат с картонными стрелками, который папа сделал, чтобы объяснить мне устройство часов. Помню только то страшное
Как крутить шарикоподшипник. Ч.1 — квадратный шарик на плоскости*.
* аллюзия на «сферический конь в вакууме»
После того как легко и просто удалось мне закрутить шарик, раззадорился я замахнуться на планетарный механизм. Признаюсь, раззадорили меня