Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

27 апр. 2021 г.

NB! Об использовании TCreator и других VB классов

Важное предварительное замечание: отладчик Гедымина вносит существенные искажения в исходный код скрипт-функций из-за чего сборка мусора может работать не так, как ожидает этого программист, и не так, как она будет работать в режиме без отладочной информации. Всегда проверяйте код в режиме без отладки перед передачей в промышленную эксплуатацию.

Особенности классов VBScript

  1. Событие Terminate вызывается только в процессе удаления из памяти последнего экземпляра данного класса.
  2. Наличие кольцевых ссылок, в т.ч. цепочек кольцевых зависимостей любой длины, приведет к тому, что ни один из экземпляров не будет удален сборщиком мусора и останется в памяти до конца работы программы.

Как мы столкнулись с проблемой неудаления объектов из памяти

В одной из задач с помощью TCreator создавалось модальное окно, которое оставалось на экране в течение всей рабочей смены. Оператор взаимодействаовал с окном сотни раз вызывая различные функции приложения. В процессе выполнения каждой функции выделялись ресуры (транзакции, запросы к базе данных и т.п.). Ресурсы не удалялись по завершении функции, так как локальный TCreator не уничтожался сборщиком мусора из-за наличия TCreator в месте создания модального окна. В конце концов исчерпывалась доступная оперативная память и приложение завершалось с ошибкой.

Возникает вопрос, как бороться с вышеуказанной частной ситуацией и как правильно работать с классами VBScript, чтобы максимально обезопасить себя от утечек памяти?

Использовать Designer.CreateObject -- Designer.DestroyObject

В описанном выше примере программист изначально понимает, что созданный экземпляр TCreator будет существовать до закрытия модального окна, а значит будет удерживать все последующие TCreator. В данном случае можно предложить решение с выделением и уничтожением ресурсов напрямую через глобальный объект Designer.

Создать копию класса TCreator

Вы автор подсистемы на платформе Гедымин. Код протестирован на корректную работу с ресурсами. Но, как обезопасить себя от ситуации, когда другая подсистема создаст долгоживущий TCreator и заблокирует все ваши механизмы очистки памяти? 

Следует создать полную копию класса TCreator в рамках своей подсистемы и использовать ее для выделения ресурсов.

А надо ли каждый раз выделять-уничтожать ресуры?

В указанном выше приложении сотни раз за рабочую смену выделялись и уничтожались одни и те же ресурсы -- транзакции и запросы к базе данных. Одно из решений -- пул ресурсов. Нужные объекты создаются единожды и привязываются к окну (у нас есть соответствующее свойство Objects у формы). Остается только стартовать/комитить транзакции в нужных местах и выполнять/закрывать запросы к базе данных, без уничтожения самих объектов. 

Альтернативный вариант в случае с экранной формой -- не создавать объекты для пула из программного кода, а просто разместить соответствующие компоненты на форме и обращаться к ним через метод GetComponent.

Принудительно уничтожить ресурсы в TCreator

В крайнем случае, ресуры выделенные через TCreator можно уничтожить принудительно, вызвав метод DestroyAllObjects. Теперь, даже если сборщик мусора не сможет удалить экземпляр TCreator, то в памяти останется только он, но не связанные с ним ресурсы.

Уничтожать TCreator как можно раньше

Стандартная практика -- TCreator уничтожается по завершении функции или процедуры. Если код процедуры или функции объемный и ресурсы нужны только в одной его части, то рекомендуется уничтожать экземпляр TCreator вручную, присваивая переменной значение Nothing.

...
Dim Creator
Set Creator = New TCreator
...
здесь работаем с ресурсами
...
больше нам выделенные ресурсы не нужны
Set Creator = Nothing
...
продолжается код функции/процедуры
...

28 июл. 2017 г.

DATABASE TRIGGERS в Гедымине

Буквально на днях появится возможность создавать в Гедымине DATABASE TRIGGERS. Такие триггеры могут быть назначены на следующие события:
  • CONNECT
  • DISCONNECT 
  • TRANSACTION START
  • TRANSACTION COMMIT 
  • TRANSACTION ROLLBACK
Один из возможных сценариев использования. Представим программу гостиничного бронирования с которой одновременно работают несколько операторов. Бронирование происходит в диалоговом окне, где выбирается номер, период, условия оплаты, дополнительные пожелания. Здесь же вводятся паспортные данные гостей.

Окно работает на своей транзакции, которая по итогу или комитится -- кнопка Ок, или отменяется.

Периоды бронирования заносятся в отдельную таблицу (назовем её BOOKINGS). Здесь хранятся начало, окончание, ссылка на номер и ссылка на клиента. Перед добавлением записи происходит проверка не занят ли уже данный интервал.

В редких случаях возможна ситуация, когда два оператора одновременно распределят один и тот же номер на пересекающиеся интервалы. Так как в момент проверки транзакция не увидит запись, добавленную в BOOKINGS другой, еще не подтвержденной, транзакцией.

В такой ситуации на помощь приходит триггер на комит транзакции. Сначала, триггером на добавление/изменений записей в таблице бронирования мы выставим флаг о необходимости проверки при комите текущей транзакции:

CREATE OR ALTER TRIGGER after_ins_update
  FOR bookings
  ACTIVE
  AFTER INSERT OR UPDATE
  POSITION 32000
AS BEGIN
  RDB$SET_CONTEXT('user_transaction', 'check_tr', 1);
END

Затем, если флаг выставлен, сделаем проверку корректности данных:

CREATE OR ALTER TRIGGER transaction_check
  ACTIVE
  ON TRANSACTION COMMIT
  POSITION 32000
AS BEGIN
  IF (RDB$GET_CONTEXT('user_transaction', 'check_tr') = 1) THEN
  BEGIN
     --   проверяем не пересекаются ли интервалы
     --   если пересекаются, то вызываем EXCEPTION
  END
END

В тексте исключения можно подробно указать пользователю с каким именно бронированием возник конфликт.

2 авг. 2016 г.

GS.MulDiv

Для правильного округления введена функция MulDiv, которая доступна из макросов и из FastReport4. Теперь, вместо кода:

'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = round(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate) / 1000 + 1/100000, 3)

пишем:

'По реализации по розн. ценам (сумма НДС, гр9 )
S95 = GS.MulDiv(acc_CalcTaxPosition("148725640_116707345", GS.NG(BeginDate), EndDate), 1, 1000, 1, 3)

13 янв. 2014 г.

"Это подобно дошумерской цивилизации," – говорит Брэд Кокс, который написал ПО для компьютера Стива Джобса NeXT и профессор университета имени Джорджа Меэйсона. "Тот способ, которым мы создаем ПО – это эра охотников и собирателей".

...

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

1 сент. 2013 г.

Построение списка зависимых объектов

Замечательная задача для проверки программиста на знание SQL и реляционных БД. Пусть в одной таблице хранится список объектов. Объекты могут зависеть друг от друга. Связи хранятся в другой таблице ввиде пар ключей: объект - объект, от которого зависит данный объект. Требуется построить упорядоченный список, чтобы для любого объекта в нем, все объекты, от которых он зависит, располагались перед ним.

Решение с использованием рекурсивного CTE:

WITH RECURSIVE
  ns_tree AS (
    SELECT
      n.filename AS headname,
      0 AS usescount,
      CAST((n.xid || '_' || n.dbid) AS VARCHAR(1024)) AS path,
      n.filename
    FROM
      at_namespace_file n

    UNION ALL

    SELECT
      t.headname,
      (t.usescount + 1) AS usescount,
      (t.path || '-' || n.xid || '_' || n.dbid) AS path,
      n.filename
    FROM
      ns_tree t
      JOIN at_namespace_file_link l
        ON l.filename = t.filename
      JOIN at_namespace_file n
        ON l.uses_xid = n.xid and l.uses_dbid = n.dbid
    WHERE
      POSITION ((n.xid || '_' || n.dbid) IN t.path) = 0
    )
SELECT
  t.headname, sum(t.usescount)
FROM
  ns_tree t
GROUP BY
  1
ORDER BY
  2
В приведенном запросе at_namespace -- список объектов, а at_namespace_link -- связи между ними. Вычисление пути (path) и дополнительная проверка через функцию POSITION позволяют избежать зацикливания на кольцевых ссылках, если такие попадутся в исходных данных.

11 дек. 2012 г.

YAML vs XML

В плане лаконичности и читабельности YAML чудо, а не формат. Ниже одна и та же информация в XML:
<?xml version="1.0" encoding="utf-8"?>
<GS:GEDEMIN_FILES VERSION="1.0" 
  xmlns:GS="http://gsbelarus.com/gedemin_files">
  <GS:DIRECTORY>
    <GS:NAME>INTL</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:DIRECTORY>
    <GS:NAME>UDF</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:DIRECTORY>
    <GS:NAME>HELP</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
  </GS:DIRECTORY>
  <GS:FILE>
    <GS:NAME>gudf.dll</GS:NAME>
    <GS:PATH>UDF</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>101888</GS:SIZE>
    <GS:DATE>2012-11-19T18:05:06</GS:DATE>
    <GS:VERSION>2.5.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbintl.conf</GS:NAME>
    <GS:PATH>INTL</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>6758</GS:SIZE>
    <GS:DATE>2010-07-22T14:51:12</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbintl.dll</GS:NAME>
    <GS:PATH>INTL</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>909312</GS:SIZE>
    <GS:DATE>2011-03-23T07:47:08</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fr24rus.chm</GS:NAME>
    <GS:PATH>HELP</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>792209</GS:SIZE>
    <GS:DATE>2002-09-14T14:44:22</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>vbs55.chm</GS:NAME>
    <GS:PATH>HELP</GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>492103</GS:SIZE>
    <GS:DATE>2000-06-21T15:51:00</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>gedemin.exe</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>19511296</GS:SIZE>
    <GS:DATE>2012-12-11T14:01:06</GS:DATE>
    <GS:VERSION>2.5.17.7594</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>fbembed.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>3772416</GS:SIZE>
    <GS:DATE>2011-03-23T07:47:02</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>firebird.msg</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>148556</GS:SIZE>
    <GS:DATE>2011-03-23T07:43:38</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>ib_util.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>7680</GS:SIZE>
    <GS:DATE>2011-03-23T07:46:02</GS:DATE>
    <GS:VERSION>2.5.1.26242</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icudt30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1568768</GS:SIZE>
    <GS:DATE>2010-07-23T09:03:42</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icuin30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>417792</GS:SIZE>
    <GS:DATE>2010-07-22T15:38:46</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>icuuc30.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>675840</GS:SIZE>
    <GS:DATE>2010-07-22T15:38:36</GS:DATE>
    <GS:VERSION>3.0.0.0</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>midas.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>444928</GS:SIZE>
    <GS:DATE>2010-11-04T00:55:00</GS:DATE>
    <GS:VERSION>15.0.3953.35171</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>midas.sxs.manifest</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1002</GS:SIZE>
    <GS:DATE>2010-11-21T19:06:48</GS:DATE>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>msvcp80.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>554832</GS:SIZE>
    <GS:DATE>2009-07-12T08:55:22</GS:DATE>
    <GS:VERSION>8.0.50727.4053</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>msvcr80.dll</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>632656</GS:SIZE>
    <GS:DATE>2009-07-12T08:55:50</GS:DATE>
    <GS:VERSION>8.0.50727.4053</GS:VERSION>
  </GS:FILE>
  <GS:FILE>
    <GS:NAME>Microsoft.VC80.CRT.manifest</GS:NAME>
    <GS:PATH></GS:PATH>
    <GS:EXISTS>true</GS:EXISTS>
    <GS:FLAGS>AlwaysOverwrite</GS:FLAGS>
    <GS:SIZE>1870</GS:SIZE>
    <GS:DATE>2009-07-12T02:10:18</GS:DATE>
  </GS:FILE>
</GS:GEDEMIN_FILES>
и в YAML:
Version: 1
Items: 
  - 
    Type   : Directory
    Name   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : Directory
    Name   : UDF
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : Directory
    Name   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
  - 
    Type   : File
    Name   : gudf.dll
    Path   : UDF
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 101888
    Date   : 2012-11-19 18:05:06Z
    Version: 2.5.0.0
  - 
    Type   : File
    Name   : fbintl.conf
    Path   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 6758
    Date   : 2010-07-22 14:51:12Z
  - 
    Type   : File
    Name   : fbintl.dll
    Path   : INTL
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 909312
    Date   : 2011-03-23 07:47:08Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : fr24rus.chm
    Path   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 792209
    Date   : 2002-09-14 14:44:22Z
  - 
    Type   : File
    Name   : vbs55.chm
    Path   : HELP
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 492103
    Date   : 2000-06-21 15:51:00Z
  - 
    Type   : File
    Name   : gedemin.exe
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 19511296
    Date   : 2012-12-11 14:01:06Z
    Version: 2.5.17.7594
  - 
    Type   : File
    Name   : fbembed.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 3772416
    Date   : 2011-03-23 07:47:02Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : firebird.msg
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 148556
    Date   : 2011-03-23 07:43:38Z
  - 
    Type   : File
    Name   : ib_util.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 7680
    Date   : 2011-03-23 07:46:02Z
    Version: 2.5.1.26242
  - 
    Type   : File
    Name   : icudt30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1568768
    Date   : 2010-07-23 09:03:42Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : icuin30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 417792
    Date   : 2010-07-22 15:38:46Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : icuuc30.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 675840
    Date   : 2010-07-22 15:38:36Z
    Version: 3.0.0.0
  - 
    Type   : File
    Name   : midas.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 444928
    Date   : 2010-11-04 00:55:00Z
    Version: 15.0.3953.35171
  - 
    Type   : File
    Name   : midas.sxs.manifest
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1002
    Date   : 2010-11-21 19:06:48Z
  - 
    Type   : File
    Name   : msvcp80.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 554832
    Date   : 2009-07-12 08:55:22Z
    Version: 8.0.50727.4053
  - 
    Type   : File
    Name   : msvcr80.dll
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 632656
    Date   : 2009-07-12 08:55:50Z
    Version: 8.0.50727.4053
  - 
    Type   : File
    Name   : Microsoft.VC80.CRT.manifest
    Exists : True
    Flags  : AlwaysOverwrite
    Size   : 1870
    Date   : 2009-07-12 02:10:18Z

28 сент. 2012 г.

Compare file version strings

На всякий случай код функции сравнения строк с номерами версий файлов. А то в интернете находятся только какие-то монстры.
function CompareVersionStrings(const V1, 
  V2: String): Integer;

  function ExtractInt(const V: String; 
    var B: Integer): Integer;
  var
    E: Integer;
  begin
    E := B + 1;
    while (B <= Length(V)) and (E <= Length(V)) 
      and (V[E] <> '.') do Inc(E);
    Result := StrToIntDef(Copy(V, B, E - B), 0);
    B := E + 1;
  end;

var
  B1, B2: Integer;
begin
  B1 := 1; B2 := 1;
  repeat
    Result := ExtractInt(V1, B1) - ExtractInt(V2, B2);
  until (Result <> 0) or 
    ((B1 > Length(V1)) and (B2 > Length(V2)));
end;

24 авг. 2012 г.

Ветка HTTPSRV

Создал ветку HTTPSRV на основе текущих исходников с компонентами Indy 9. Цель -- встроить в Гедымин HTTP сервер. Первый шаг:
  • Сделать нить с низким приоритетом в которую поместить компонент TidHTTPServer.
  • При обращении клиента запрашивать логин и пароль, а затем генерировать страничку с информацией о системе (такой, как в окне О программе...)
Второй шаг:
  1. Подумать как подключать скрипт-функции для обработки событий HTTP сервера.
  2. Реализовать вызов скрипт-функции из нити HTTP сервера.
  3. Реализовать формирование странички и взаимодействие с браузером в скрипт-функции.

5 авг. 2012 г.

Виртуальная машина для компиляции Гедымина

Сколько там обещанного ждут? Трех лет точно не прошло, а виртуальная машина для компиляции Гедымина уже тут. Образ под Oracle VM Virtual Box включает:
  • Borland Delphi 5
  • Tortoise SVN
  • Firebird 2.5
  • Исходный код платформы Гедымин
  • Тестовую базу данных
  • IBExpert
  • Файловый менеджер FAR
Теперь любая кухарка сможет управлять государством каждый желающий сможет с минимальными усилиями "выпекать" для себя свежайший экзешник.

UPD: Исходный код Гедымина располагается на диске c: в папке Golden. Для его обновления до текущей версии следует на папке нажать правую кнопку мыши и выбрать команду SVN Update.

30 апр. 2012 г.

Компонент gsComScaner

До сих пор компонент TgsComScaner корректно принимал только данные, переданные устройством в строковом виде с оговоренным символом-маркером конца строки. Некоторые устройства просто передают последовательность байт и не позволяют задать концевой символ. Для работы с ними в компонент добавлено свойство PacketSize — размер ожидаемого пакета в байтах. Данное свойство задействуеся только если указаны нулевые коды начального и конечного символов-ограничителей, а также свойства CRSuffix и LFSuffix установлены в False. Полученный результат побайтово преобразуется в строку шестнадцатеричных чисел и записывается в свойство BarCode. Дополнительно, если PacketSize <= SizeOf(Integer), результат копируется в новое свойство IntCode.

11 окт. 2011 г.

Dart programming language

Не успел JavaScript закрепиться в статусе ассемблера современности, как Google спешит заменить его новым языком Dart. Учитывая, что большинство современных веб приложений на стороне клиента выглядят как адский набор скриптов, связанных между собой честным словом индийских разработчиков, новая инициатива вполне может иметь успех. PS: "индийские разработчики" тут ни в коем случае не несут никакого шовинистического оттенка. Просто констатация факта, что большая часть кода сегодня пишется в индии, или индусами на рабочих визах в развитых странах.

20 февр. 2010 г.

Старческое :)

Современному поколению, развращенному джавой и нетом, не понять всех прелестей структур указатель на указатель.

  ...
  fs.BlobID :=
    Qry.FieldByName(Field.FieldName).AsQUAD;
  PISC_QUAD(@Buff[PRecordData(Buff)^.rdFields[
      FMappedFieldPosition[Field.FieldNo - 1]
    ].fdDataOfs])^ := fs.BlobID;
  ...