понедельник, марта 23, 2009

суббота, марта 14, 2009

Ошибка компиляции на ровном месте

Если у класса или записи определить вложенный энумератор, который будет иметь поля "управляемых" типов (string, interface, dynamic array, variant), то при попытке использования в операторе for-in-do мы получим ошибку компиляции на несоответствие типов. Воспроизводится, и на Turbo Delphi Explorer, и на Delphi 2009 Update 1. Репорт #72213.

понедельник, февраля 02, 2009

Обновлен Common.Encodings.pas

На домашней страничке выложен обновленный Common.Encodings.pas

Добавлены классы кодировок UTF-32 и UTF-32BE (только Delphi 2009), добавлен метод определения кодировки по BOM. Добавлены функции-аналоги WideCharToMultiByte и MultiByteToWideChar для кодировок UTF-16, UTF-16BE, UTF-32, UTF-32BE. Функции приведены к единым сигнатурам. Определен процедурный тип с сигнатурой кодирующей и декодирующей функций. Добавлен воркараунд для корректного определения доступности кодировок UTF-7, UTF-8 под Windows NT 4.0

суббота, января 31, 2009

Утечки на интерфейсных параметрах

Теряются объекты передаваемые в качестве параметров интерфейсных типов в случае, когда не происходит кастинга с проверкой (as) к определенному интерфейсу. Для кода:

 Test(TMyObject.Create('1')); // will not be destroyed
Test(IInterface(TMyObject.Create('2'))); // will not be destroyed
Test(TMyObject.Create('3') As IInterface);

утечки будут в первых двух вызовах. Воспроизводится, и на Turbo Delphi, и на Delphi 2009. Отчет #71015.

пятница, января 16, 2009

QC, в чем магия?

Только вчера "ругался" на неторопливость правки багов в компиляторе, а сегодня глянул на свой  отчет №70529 и удивился -- он получил статус Internally Opened (как я понимаю, над ошибкой уже работают). Так вот, в чем магия? Неужели голос Алексея был решающим? ;)

четверг, января 15, 2009

Ошибка в Delphi 2009 Update 1

Передача односимвольной строки в диспетчеризируемый метод приводит к передаче кода символа, а не строки. Лечится приведением строки к строке :) т.е. вот так: String('1'). Репорт номер 70529, поддержите, кому не лень.

пятница, октября 31, 2008

Приемчик

Потребовалось символ юникод строки проверить на предмет вхождения в суррогатную пару (а конкретно, является ли символ младшим суррогатом). Все бы ничего, но индекс символа вычисляемый и вычислять его для каждого сравнения (коих собственно два) не кошерно. Есть варианты решения:

1. Сохранить индекс в переменной. Просто, но нужна переменная.

2. Сделать функцию и заинлайнить ее. Нужна функция.

3. Извернуться.

Собственно, я о третьем варианте:

     With WordRec(AContent[ACharIndex + CharCount]) Do
If (Word(Bytes) >= $DC00) And (Word(Bytes) <= $DFFF) Then;

воскресенье, октября 26, 2008

Оперативность QC

Все шесть моих репортов прошли во внутреннюю базу в среднем через 2 недели после подачи. Шустро. Правда с одним лажа вышла, отрепортил о баге пофикшеном в релизе :(

пятница, октября 10, 2008

Полный QCец...

Только я отрепортил о нескольких ошибках, как меня снова перестало пускать к сервису... Плавающие баги, они самые милые, ага :)

p.s.

Ой блин... Снял галку DN Authentification и все снова заработало. Сплошные воркараунды :))

среда, октября 08, 2008

понедельник, октября 06, 2008

Val в Delphi 2009

Знаете как работает Val с юникодом? Рассматриваются лишь младшие байты символов :( Для проверки прогоните цикл от lo(Char) до high(Char) и посмотрите, сколько символов будет "успешно" преобразовано в число. Грустно. Если кто-то это читает, заQCите плиз...

пятница, октября 03, 2008

Обновился Common.Encodings

В метод GetEncoding добавлен параметр со значением по умолчанию позволяющий указывать на возможность использования стандартных (определенных в классе TEncoding) кодировок. Скажем, код GetEncoding('utf-16') создаст новый объект класса TUnicodeEncoding, а код GetEncoding('utf-16', True) вернет существующий объект TEncoding.Unicode;

среда, сентября 24, 2008

Delphi 2009 aka Tiburon. TEncoding.

На домашней страничке выложен модуль Common.Encodings расширяющий возможности стандартного класса TEncoding. Модуль содержит class helper для TEncoding и несколько вспомогательных advanced records.

Примеры использования: 

1.) Перечисление доступных кодировок

Var

ei : TEncodingInfo;

Begin

For ei In TEncoding.Encodings Do
If ei.IsAvailable Then
WriteLn('codepage: ', ei.CodePage, ' name: ', ei.Name);

End;

2.) Создание кодировки по имени:

 TEncoding.Encodings.ByName('utf-16').GetEncoding;

или

 TEncoding.GetEncoding('utf-16');

3.) Создание кодировки по номеру кодовой страницы:

 TEncoding.Encodings.ByCodePage(CP_UTF16_BE).GetEncoding;

или

 TEncoding.GetEncoding(CP_UTF16_BE);

4.) Получение информации о существющей кодировке:

 With TEncoding.UTF8.GetInfo Do
WriteLn('codepage: ', CodePage, ' name: ', Name, ' display name: ', DisplayName);

пятница, сентября 19, 2008

Delphi 2009. Вкратце.

Юникод+дженерики+анонимные методы это все понятно.

Порадовала скорость среды! И особенно скорость CodeInsight (несмотря на то, что я его все равно всегда отключаю)

Наконец-то они научились различать Implicit и Explicit для записей в нативе (2007 не пробовал, может и там уже было). Но вот редактор сильно подкачал, разучившись (в 2006 он и не сильно-то умел) перемещаться по Ctrl+Shift+Up/Down между декларацией и реализацией перегруженных операторов записи (правда, я тестировал на 12.0.3155.16733, может в релизе и поправили), а также разучился (для перегруженных операторов опять же) по Ctrl+Shift+C создавать макет метода по описанию.

Появился UInt64 -- беззнаковое 64битное число.

BeginThread и TInterfaceList по-прежнему имеют потенциальные утечки.

Неработает передача Int64 в параметре диспетчеризуемого метода (вызов метода от вариантной переменной). Точнее, если передавать переменную типа Int64 все работает, а если значение Int64(1024) -- нет.

Exception обзавелся потенциальной поддержкой стек-трейсинга, но только потенциальной :)

Очень порадовал {$POINTERMATH}

В комментариях исходников встречается sysmac.h. Интересно, это то о чем я думаю...?

Порадовал хелпер для TRTLCriticalSection (syncobjs.pas)

Порадовал обновленный ZLib

Огорчает нелепость использования системных InterlockedCompareExchangePointer (и прочих Interlocked...) при наличии нативных в system.pas

Ribbon огорчил неаккуратными скинами (ждем редактора :) или сторонних, качественных скинов) и моргающей отрисовкой. DoubleBuffered Ribbon-контрола  не помогает, а буферизовать форму то еще извращение.

TLinkLabel неюзабельна совершенно, т.к. на системах младше XP, линки распознаваться не будут и пользователь будет видеть разметку.

понедельник, мая 12, 2008

Embarcadero + CodeGear

О покупке CodeGear компанией Embarcadero, стало известно почти неделю тому назад. А вот обращение к клиентам CodeGear, в котором, в частности, говорится о том, что дальнейшая разработка будет нацелена на гетерогенные платформы и различные СУБД. Ребята, идем на Linux и MacOS? :)