Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Столкнулся с проблемой. Надо портировать прогу, работающую с FB, под Linux.

Компоненты IBX из XE2, немного допиленные в части совместимости. D10.3, ОС Debian 10, FB 3

Подключение проходит, но при выполнении любого запроса вылетает "EIBClientError: Unknown SQL Data type (0)". Протрейсив, понимаю, что ошибка кидается в TIBXSQLDA.Initialize, когда SqlDef неожиданный (0).
Код простейший

// Загрузить клиентскую библиотеку Firebird
function LoadFBLib(const Path: string): Boolean;
const
  LibString = 'IBServer';
var
  iLib: IGDSLibrary;
  tmpLibString: String;
begin
  tmpLibString := LibString;
  iLib := GetGDSLibrary(tmpLibString);
  iLib.SetLibraryPath(Path + FB_DLL);
  Result := iLib.TryIBLoad;
end;

procedure TestDB;
const
  TransParamsRO = 'wait;read;read_committed;rec_version';
var
  db: TIBDatabase;
  q: TIBSQL; 
begin
  if not LoadFBLib('') then
    raise Err('Load fail %s %s', [FBLibPath, LastErrMsg]);
  try
    db:= TIBDatabase.Create(nil);
    db.LoginPrompt := False;
    db.ServerType := 'IBServer';
    db.Params.Values[DPBConstantNames[isc_dpb_lc_ctype]] := 'UTF8';
    db.DatabaseName := 'localhost:someDB';
    db.Params.Values[DPBConstantNames[isc_dpb_user_name]] := 'SYSDBA';
    db.Params.Values[DPBConstantNames[isc_dpb_password]] := 'masterkey';
    db.Connected := True;

    q := TIBSQL.Create(nil);
    q.Database := DB;
    q.Transaction := TIBTransaction.Create(q);
    q.Transaction.Params.Delimiter := ';';
    q.Transaction.DefaultAction := TARollback; // Для всех транзакций - откат в случае неполадок
    q.Transaction.DefaultDatabase := q.Database;
    q.SQL.Text := 'select CURRENT_USER from Rdb$Database;';
    q.Transaction.Params.DelimitedText := TransParamsRO;
    q.Transaction.StartTransaction;
    q.ExecQuery; // ! BOOM
    q.Transaction.Commit;
  finally
    if (q <> nil) and q.Transaction.InTransaction then
      q.Transaction.Rollback;
    FreeAndNil(q);
    FreeAndNil(db);
  end;
end;


Может, кто-нибудь сталкивался с такой проблемой и решал ее?
2 апр 21, 12:35    [22303324]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

02.04.2021 12:35, Fr0sT-Brutal пишет:
>
> Компоненты IBX из XE2,

возьми лучше из Лазаря.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 12:40    [22303328]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Мимопроходящий

02.04.2021 12:35, Fr0sT-Brutal пишет:
>
> Компоненты IBX из XE2,

возьми лучше из Лазаря.

Попробую, спс. Надеюсь, не сильно заточены под Лазарь.
Еще вариант взять из RTL 10.3.
2 апр 21, 13:18    [22303356]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

фиг его знает что лучше.
кроссплатформенность в Delphi весьма условна -
если (утрируя) кнопочки и формочки ещё можно "туда-сюда",
то всё остальное обычно фигушки...

Posted via ActualForum NNTP Server 1.5

2 апр 21, 13:26    [22303361]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Fr0sT-Brutal,

Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?
2 апр 21, 13:29    [22303364]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3831
Romka-Fes
Fr0sT-Brutal,
Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?

Примерно как поставить в Запорожец двигатель от BMW. Наверно можно. Но зачем?
2 апр 21, 13:31    [22303366]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
makhaon
Примерно как поставить в Запорожец двигатель от BMW.
а кто из них who?
2 апр 21, 13:35    [22303371]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

Romka-Fes
Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine.

То есть процесс "перевода" свёлся к "установить WINE, запустить готовый экзешник".
РосНаноРаспил.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 13:35    [22303372]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Romka-Fes
Fr0sT-Brutal,

Есть знакомые люди, которые переводили с Win на Linux проект. Но всё делали через Wine. И работает нормально. Это не вариант?

У меня либа, которую тягают другие проекты... и в целом Wine не особо стабилен и быстр для прода.

Попробовал с IBX из RTL - есть контакт! Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
2 апр 21, 13:35    [22303373]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207
Fr0sT-Brutal
Попробовал с IBX из RTL - есть контакт! Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
дык, питарасы, сэр! ©
2 апр 21, 13:36    [22303374]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Dimitry Sibiryakov,

Была задача - запустить проект на Linux. Самый простой способо - Wine. Никто код не менял вообще. Никаких распилов. As is.
2 апр 21, 13:55    [22303385]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Romka-Fes
Member

Откуда: Kyiv
Сообщений: 476
Dimitry Sibiryakov,

Но потом таки делали переход с VCL на FireMonkey. И там вроде бы было веселей с доступом к FB. Но не менее чем 3.0 кажись.
Тут вопрос - нужен только IBX - или другие компоненты доступа к БД приемлемы?
2 апр 21, 13:57    [22303387]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Fr0sT-Brutal
Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
Добавить кастомный ServerType - пол часа работы
2 апр 21, 14:15    [22303396]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Поковырял IBX от Лазаря - там много всяких веселостей предвидится. Уже наткнулся на TRTLCriticalSection и модуль Registry (в линуксе-то он накой??).
2 апр 21, 14:34    [22303402]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
Fr0sT-Brutal
Хотя эти динозавры до сих пор "не знают" о существовании Firebird :(
Добавить кастомный ServerType - пол часа работы

Сделал за две минуты, добавив метод SetLibraryPath в исходники IBX. Знаешь метод без модификации либо копирования исходников IBX? Поделись, как. Эти собаки спрятали класс TIBServerLibrary внутрь юнита, и от него не наследуешься.
2 апр 21, 14:37    [22303404]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

02.04.2021 14:37, Fr0sT-Brutal пишет:
> Сделал за две минуты, добавив метод SetLibraryPath в исходники IBX.
> Знаешь метод без модификации либо копирования исходников IBX? Поделись, как.
> Эти собаки спрятали класс TIBServerLibrary внутрь юнита, и от него не наследуешься.

у них всё так.
сделай форк и не парься.

Posted via ActualForum NNTP Server 1.5

2 апр 21, 14:42    [22303405]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Fr0sT-Brutal
Поделись, как
1. Копируешь класс TIBServerLibrary в TFBServerLibrary
2. Изменяешь метод LibraryName
3. В конце модуля пишешь
procedure AddLib;
var
  LLib: IGDSLibrary;
begin
  LLib := TFBServerLibrary.Create;
  AddIBInterface(CFBServerType, LLib);
  LLib := TFBEmbeddedLibrary.Create;
  AddIBInterface(CFBEmpeddedServerType, LLib);
end;

initialization
  AddLib;

finalization
  IBClientInterface.Remove(CFBServerType);
  IBClientInterface.Remove(CFBEmpeddedServerType);

end.
3. Модуль загоняешь в пакет, пакет инсталлируешь в среду

Можно еще добавить в пакет такой класс
type
  TIBDatabaseSelectionEditor = class(TSelectionEditor)
  public
    procedure RequiresUnits(AProc: TGetStrProc); override;
  end;

{ TIBDatabaseSelectionEditor }

procedure TIBDatabaseSelectionEditor.RequiresUnits(AProc: TGetStrProc);
var
  Li: Integer;
  LDB: TIBDatabase;
begin
  for Li := 0 to Designer.Root.ComponentCount - 1 do begin
    if Designer.Root.Components[Li] is TIBDatabase then begin
      LDB := TIBDatabase(Designer.Root.Components[Li]);
      if (LDB.ServerType = CFBServerType) or (LDB.ServerType = CFBEmpeddedServerType) then begin
        AProc('UFBIntfImpl');
        Exit;
      end;
    end;
  end;
end;

procedure Register;
begin
  RegisterSelectionEditor(TIBDatabase, TIBDatabaseSelectionEditor);
end;
2 апр 21, 16:56    [22303466]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 834
Мимопроходящий

фиг его знает что лучше.
кроссплатформенность в Delphi весьма условна -
если (утрируя) кнопочки и формочки ещё можно "туда-сюда",
то всё остальное обычно фигушки...
обоснуй.
Делфи позволяет не только десктопные приложения собирать под Linux, но еще и системные демоны (по аналогии с виндовскими сервисами). Также работает доступ к железу, например к COM-портам и USB.
2 апр 21, 17:45    [22303475]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
_Vasilisk_
1. Копируешь класс TIBServerLibrary в TFBServerLibrary
2. Изменяешь метод LibraryName

Вариант, спасибо. Не нравится, что нужно дублировать, хотя возможность применения совместно со стоковой либой - это плюс.
Пока сделал через форк и добавление
procedure TIBServerLibrary.SetLibraryPath(const Path: string);
begin
  FLibPath := Path;
end;

function TIBServerLibrary.LibraryName: String;
begin
  // empty custom path - use default filename
  if FLibPath = '' then
    Result := IBASE_DLL
  // custom path is directory - add default filename
  else if DirectoryExists(FLibPath) then
    Result := IncludeTrailingPathDelimiter(FLibPath) + IBASE_DLL
  // full custom path - use it
  else
    Result := FLibPath;
end;
2 апр 21, 17:49    [22303477]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
Fr0sT-Brutal
q := TIBSQL.Create(nil);
q.Database := DB;
q.Transaction := TIBTransaction.Create(q);

вроде как не ошибка, но нафиг такое надо - вообще-то должно быть наоборот - запрос должен принадлежать транзакции.
то есть, в коннекте есть транзакциИ, в транзакции есть запросЫ.
3 апр 21, 01:08    [22303596]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kdv
нафиг такое надо
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы
3 апр 21, 12:28    [22303685]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
_Vasilisk_
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы

што??? у клиента хэндл соединения и есть "хэндл базы". У клиента вообще нет никакого "хэндла базы" и не может быть, ни в обычном клиент-сервере, ни в embedded.
3 апр 21, 12:55    [22303699]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
kdv,

автор
у клиента хэндл соединения и есть "хэндл базы".

если непонятно, то не "есть и есть", а хэндл соединения = соединение с конкретной БД. "Хэндла базы" у клиента нет как такового. Оно есть только у сервера.
3 апр 21, 12:58    [22303702]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

_Vasilisk_
isc_dsql_alloc_statement2

А за его применение к переменным в динамической памяти надо отдельно бить по голове.

Posted via ActualForum NNTP Server 1.5

3 апр 21, 13:00    [22303703]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
_Vasilisk_
Но isc_dsql_alloc_statement2 принимает параметром хендл соединения, а не базы
Читать "а не транзакции"

kdv
хэндл соединения = соединение с конкретной БД. "Хэндла базы" у клиента нет как такового.
Некорректно выразился. Конечно же хендл соединения

Т.е. для создания стейтмента нужна и транзакция (prepare, execute) и соединение (alloc). И соединение из транзакции не извлекается.
4 апр 21, 15:13    [22304097]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
_Vasilisk_
Т.е. для создания стейтмента нужна и транзакция (prepare, execute) и соединение (alloc). И соединение из транзакции не извлекается.

и ? В любом случае схема связей древовидная:
Соединение->Транзакции->Запросы
Запрос работает в какой-то транзакции какого-то соединения.
5 апр 21, 01:01    [22304160]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

kdv
В любом случае схема связей древовидная:
Соединение->Транзакции->Запросы

Авотфиг. Двухфазные транзакции по прежнему поддерживаются, так что это треугольник: запрос
привязан к соединению, но для выполнения ему нужна транзакция, к которой привязано в том
числе и это соединение. Можно даже попытаться выполнить его в транзакции, которая совсем с
левого соединения. Будет весело.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 01:11    [22304162]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
kdv
Fr0sT-Brutal
q := TIBSQL.Create(nil);
q.Database := DB;
q.Transaction := TIBTransaction.Create(q);

вроде как не ошибка, но нафиг такое надо - вообще-то должно быть наоборот - запрос должен принадлежать транзакции.
то есть, в коннекте есть транзакциИ, в транзакции есть запросЫ.

*исправлено - утро, понедельник, не проснулся еще*
Хм, тут неоднозначно - запрос выполнится и останется, а транзакция закроется. АПИ-подход не очень ложится на ООП, т.к. хэндлы создаются и закрываются, а объекты остаются

Сообщение было отредактировано: 5 апр 21, 10:17
5 апр 21, 10:22    [22304230]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
Fr0sT-Brutal
тут неоднозначно - запрос выполнится и останется, а транзакция закроется.

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

А вот тут мысль неправильная. Если завершается транзакция, то как "экземпляр объекта" она должна кончиться, потому что ее уже не существует. Но ведь никто в здравом уме не уничтожает IBTransaction (например) по ее закрытии.
Ну или IBDatabase - в закрытом коннекте ничего не существует, коннекта нет. Так что я тут никакого конфликта не вижу.
Поэтому в состоянии Closed хэндла нет, а в Open - хэндл есть.

p.s. насчет двухфазных транзакций - это скорее исключение, связанное с "фишкой C", когда в функцию можно передать произвольное количество параметров (хэндлов транзакций).
5 апр 21, 10:42    [22304247]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
kdv
А вот тут мысль неправильная. Если завершается транзакция, то как "экземпляр объекта" она должна кончиться, потому что ее уже не существует. Но ведь никто в здравом уме не уничтожает IBTransaction (например) по ее закрытии.
Ну или IBDatabase - в закрытом коннекте ничего не существует, коннекта нет. Так что я тут никакого конфликта не вижу.
Поэтому в состоянии Closed хэндла нет, а в Open - хэндл есть.

Ну, тут сама либа диктует структуру. Из sql есть ссылка на транзакцию, а не наоборот. Или ты про то, чтобы отдельно создать транзакцию, ее где-то хранить и присваивать sql-ям? Это ведь надо организовывать хранение. В моей структуре sql:транзакция 1:1, т.ч. иерархия не нарушена, зато кода меньше
5 апр 21, 11:26    [22304292]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

kdv
в функцию можно передать произвольное количество параметров (хэндлов транзакций).

Хэндлов коннектов. Ибо это коннекты добавляются в транзакцию, а не наоборот.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 12:39    [22304350]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
Fr0sT-Brutal,

ну что за ... А как еще узнать, к какой транзакции прилеплен запрос? В каком коннекте работает транзакция?
Потому у sql ссылка на ОДНУ транзакцию, а у транзакции - СПИСОК привязанных к ней sql (и у коннекта тоже список транзакций, а не одна, как в тех серверах, которые такое не умеют).
Ну посмотри хоть в mon$, там что, запросы первоочередные? Нет
mon$attachments->mon$transactions->mon$statements.
всё точно так же, как я рассказываю.
5 апр 21, 13:37    [22304401]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

kdv
у транзакции - СПИСОК привязанных к ней sql (и у коннекта тоже список транзакций

Не совсем. У транзакции - список курсоров, а не запросов. И список коннектов. Связь
коннекты-транзакции это многие-ко-многим.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 13:40    [22304402]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4539
Странный спор какой-то.
Есть соединение, к нему привязаны стейтменты.
Чтобы создать (препарировать) стейтмент, нужна транзакция, и чтобы выполнить его - тоже нужна транзакция (не обязательно та, что использовалась при создании).
Довольно удобно, когда к объектам типа TIBSQL привязан объект TIBTransaction. Когда транзакция закроется - привязка не уйдет, и когда она снова откроется (на самом деле, внутри TIBTransaction создастся новая транзакция) - не надо ничего снова привязывать, стейтмент автоматически может выполниться уже с новым хэндлом транзакции.
Но можно и менять транзакцию стэйтменту, просто переприсвоением объекта TIBTransaction, если это удобно.
Не вижу тут никакой особой разницы с принципом работы API. Наоборот, только упрощение и удобство.
5 апр 21, 14:40    [22304486]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
kdv
Fr0sT-Brutal,

ну что за ... А как еще узнать, к какой транзакции прилеплен запрос? В каком коннекте работает транзакция?
Потому у sql ссылка на ОДНУ транзакцию, а у транзакции - СПИСОК привязанных к ней sql (и у коннекта тоже список транзакций, а не одна, как в тех серверах, которые такое не умеют).
Ну посмотри хоть в mon$, там что, запросы первоочередные? Нет
mon$attachments->mon$transactions->mon$statements.
всё точно так же, как я рассказываю.

А можешь накидать хотя бы примерно кодом свой идеальный вариант? А то что-то я не вкурю, как ты предлагаешь делать...
5 апр 21, 15:11    [22304525]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 29662
Fr0sT-Brutal,

я предложил в том куске кода поменять направленность логики. Не от запроса к транзакции, а наоборот.
По связям объектов - чем IBX не устраивает?
5 апр 21, 15:14    [22304530]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
kdv
Fr0sT-Brutal,

я предложил в том куске кода поменять направленность логики. Не от запроса к транзакции, а наоборот.
По связям объектов - чем IBX не устраивает?

Хм. То есть предлагаешь создать тр-ю, создать sql, присвоить тр-ю sql-ю? Можно, конечно... список тр-ий, как я посмотрел, все равно сидит у database внутре.
5 апр 21, 16:44    [22304645]     Ответить | Цитировать Сообщить модератору
 Re: IBX под Linux  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 32207

всё это спор ниобчём.
какая разница что и как там на клиенте?
да пофигу!

Posted via ActualForum NNTP Server 1.5

5 апр 21, 16:47    [22304650]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить