Недавно добавленные исходники

•  DeLiKaTeS Tetris (Тетрис)  159

•  TDictionary Custom Sort  3 336

•  Fast Watermark Sources  3 087

•  3D Designer  4 846

•  Sik Screen Capture  3 340

•  Patch Maker  3 552

•  Айболит (remote control)  3 657

•  ListBox Drag & Drop  3 014

•  Доска для игры Реверси  81 692

•  Графические эффекты  3 944

•  Рисование по маске  3 248

•  Перетаскивание изображений  2 628

•  Canvas Drawing  2 751

•  Рисование Луны  2 579

•  Поворот изображения  2 188

•  Рисование стержней  2 168

•  Paint on Shape  1 568

•  Генератор кроссвордов  2 235

•  Головоломка Paletto  1 767

•  Теорема Монжа об окружностях  2 229

•  Пазл Numbrix  1 685

•  Заборы и коммивояжеры  2 057

•  Игра HIP  1 282

•  Игра Go (Го)  1 230

•  Симулятор лифта  1 475

•  Программа укладки плитки  1 216

•  Генератор лабиринта  1 548

•  Проверка числового ввода  1 365

•  HEX View  1 497

•  Физический маятник  1 358

 
скрыть


Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Библиотеки пользовательских функций UDF для Interbase на Free Pascal



Автор: Кубанычбек Тажмамат уулу

Всем известно, что возможности interbase можно расширить за счет написания пользовательских функций UDF. Но почему на Free Pascal?

Есть ряд веских причин.

  • 1. При переносе Вашего сервера на другую платформу, например, с win32 на FreeBSD или Linux, возникает проблема переноса также и UDF. Как известно, есть дистрибутивы Free Pascal на эти платформы.
  • 2. В Pascal имеется очень удачная концепция библиотеки (library). При переносе на другую платформу достаточно перекомпилировать библиотеку, и она будет работать. При написании аналогичной библиотеки на с приходится переделывать make файл.
  • 3. Вы имеете возможность выбора: сделать или на с, или на паскале.
  • 4. Free Pascal - хорошее подспорье для программиста на Delphi. Знакомый синтаксис, наверное, поможет многим сделать шаг в изучении Unix и использовании серверных возможностей платформ FreeBSD и Linux.
Приведем небольшой пример такой библиотеки. Все примеры приведены не в отдельном файле, а на одной странице для удобства чтения.
library libosh;
{$MODE objfpc}
{$PACKRECORDS C}
const
  // Чтобы не было проблем с распознаванием кодировок на разных платформах
  rus_chars: pChar = #197#210#211#206#208#192#205#202#213#209
  + #194#204#229#243#232#238#240#224#234#245#241#236
    ;
  lat_chars: pChar = 'ETYOPAHKXCBMeyuopakxcm';
  small_chars: pChar =
  #113#119#101#114#116#121#117#105#111#112#97#115#100#102#103
    + #104#106#107#108#122#120#99#118#98#110#109#233#246#243#234
    + #229#237#227#248#249#231#245#250#244#251#226#224#239#240#238
    + #235#228#230#253#255#247#241#236#232#242#252#225#254#184
    ;
  cap_chars: pChar =
  #81#87#69#82#84#89#85#73#79#80#65#83#68#70#71#72#74#75#76#90
    + #88#67#86#66#78#77#201#214#211#202#197#205#195#216#217#199
    + #213#218#212#219#194#192#207#208#206#203#196#198#221#223#215
    + #209#204#200#210#220#193#222#168
    ;
  cp1251: pChar =
  #233#246#243#234#229#237#227#248#249#231#245#250#244#251#226
    + #224#239#240#238#235#228#230#253#255#247#241#236#232#242#252
    + #225#254#184#201#214#211#202#197#205#195#216#217#199#213#218
    + #212#219#194#192#207#208#206#203#196#198#221#223#215#209#204
    + #200#210#220#193#222#168
    ;
  cp866: pChar =
  #169#230#227#170#165#173#163#232#233#167#229#234#228#235#162
    + #160#175#224#174#171#164#166#237#239#231#225#172#168#226#236
    + #161#238#241#137#150#147#138#133#141#131#152#153#135#149#154
    + #148#155#130#128#143#144#142#139#132#134#157#159#151#145#140
    + #136#146#156#129#158#240
    ;
  koi8: pChar =
  #202#195#213#203#197#206#199#219#221#218#200#223#198#217#215#193
    + #208#210#207#204#196#214#220#209#222#211#205#201#212#216#194#192
    + #163
    + #234#227#245#235#229#238#231#251#253#250#232#255#230#249#247#225
    + #240#242#239#236#228#246#252#241#254#243#237#233#244#248#226#224
    + #179
    ;

function replace_it(CString: PChar; scr: PChar; dest: PChar): PChar;

var
  i, j: integer;
begin
  i := 0;
  while (CString[i] <> #0) do
  begin
    j := 0;
    while (scr[j] <> #0) do
    begin
      if CString[i] = scr[j] then
      begin
        CString[i] := dest[j];
        Break;
      end;
      inc(j);
    end;
    inc(i);
  end;

  result := CString;
end;

function latrus(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, lat_chars, rus_chars);
end;

function rupper(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, small_chars, cap_chars);
end;

function rlower(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, cap_chars, small_chars);
end;

function dos2win(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, cp866, cp1251);
end;

function win2dos(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, cp1251, cp866);
end;

function koi82win(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, koi8, cp1251);
end;

function koi82dos(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, koi8, cp866);
end;

function dos2koi8(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, cp866, koi8);
end;

function win2koi8(CString: PChar): PChar; stdcall; export;
begin
  result := replace_it(CString, cp1251, koi8);
end;

function UDF_strcat(dest, source: pchar): pchar; stdcall; export;
begin
  result := strcat(dest, source);
end;

exports
  latrus name 'latrus',
  // преобразование латинских бук, похожих на кирилличесике
  // в кириллические 1251. Иногда надо при переделке существующих
  // баз данных, в которых некоторые русские буквы по ошибке
  // набраны латинницей

  rupper name 'rupper', // перевод русских в верхний и нижний регистры
  rlower name 'rlower',

  dos2win name 'dos2win', // перевод различных кодировок кириллицы
  win2dos name 'win2dos',

  koi82win name 'koi82win',
  koi82dos name 'koi82dos',

  dos2koi8 name 'dos2koi8',
  win2koi8 name 'win2koi8'
  ;
end.
Откомпилированные библиотеки должны иметь названия libosh.dll для win32 и libosh.so для FreeBSD и Linux.
Для подключения этих функций используйте скрипт
CONNECT 'mysvr:/db/test.gdb'
USER 'UZVER' PASSWORD 'uzver';

DECLARE

EXTERNALfunction LATRUS
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'latrus' MODULE_NAME 'libosh';

DECLARE

externalfunction RUPPER
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'rupper' MODULE_NAME 'libosh';

DECLARE

externalfunction RLOWER
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'rlower' MODULE_NAME 'libosh';

DECLARE

externalfunction DOS2WIN
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'dos2win' MODULE_NAME 'libosh';

DECLARE

externalfunction WIN2DOS
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'win2dos' MODULE_NAME 'libosh';

DECLARE

externalfunction KOI82WIN
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'koi82win' MODULE_NAME 'libosh';

DECLARE

externalfunction KOI82DOS
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'koi82dos' MODULE_NAME 'libosh';

DECLARE

externalfunction DOS2KOI8
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'dos2koi8' MODULE_NAME 'libosh';

DECLARE

externalfunction WIN2KOI8
  CSTRING(255)
  RETURNS CSTRING(255)
  ENTRY_POINT 'win2koi8' MODULE_NAME 'libosh';
commit;
В порте freepascal для freeBSD немного недоделан модуль sysutils, и вызов некоторых функций из него приводит к runtime error. Пример использования функций библиотеки
SELECT WIN2KOI8(NAME)FROM PEOPLE и т.д.

Найти freepascal можно по адресу www.freepascal.org





Похожие по теме исходники

Нейросеть для распознавания образов

Механизм станка качалки для нефти

Весы для взвешивания

Кувшины для воды

 

Доска для игры Реверси

Interbase Backup

FreeReg

FreeRAM Firefox

 

Pascal Editor

Sub-Pascal




Copyright © 2004-2024 "Delphi Sources" by BrokenByte Software. Delphi World FAQ

Группа ВКонтакте