1 (изменено: amber8706, 01.06.2020 в 16:01)

Тема: Использование Delphi SDK for KolibriOS 2020-05

Приветик! Зашёл к вам только из-за  Delphi для KolibriOS. Пытаюсь его использовать, так сказать. Заметил, что не хило так обрезали модуль System. Отсюда вопрос:  как теперь конвертировать строку в число и на оборот? Попытался использовать стандартную функцию Str. Компилятор пожаловался на отсутствие функций _StrLong и _Str0Long. Скопировал их из оригинального System. Всё откомпилировалось, но в Kolibri тестовая программа вместо числа (конвертированного в строку) выдала мусор. Видимо этим функциям нужен другой код для работы в Kolibri. Есть решение данной проблемы? P.S. В идеале, я так полагаю, нужно _StrLong и _Str0Long переписать. Да многое другое, хорошо бы. А то System пока выглядит очень скудным.

P.P.S. К стати, Колибри отлично работает с типом ShortString из Delphi. Пока это единственный "человеческий" способ использования строк в Колибри.

P.P.P.S. Да ёлы-палы! Как же всё урезано. Простая вещь, объединение строк: a:=a+'blabla' - не работает! Компилятор жалуется на отсутствие LStrFromString. Я вообще не понимаю, как можно писать хоть сколь нибудь серьёзные вещи. Да да же калькулятор не напишешь, поскольку обязательно потребуется конвертация строки в число.

Добавлено 2020-06-01 в 15:49

Яху! Нашёл на просторах интернета рабочий год для Колибри. Теперь можно в Delphi конвертировать строку в число:

function StrToInt(S:PKolibriChar):Integer;
label atoi,top,done;
asm
mov edx, S // our string
atoi:
xor eax, eax // zero a "result so far"
top:
movzx ecx, byte [edx] // get a character
inc edx // ready for next one
cmp ecx, '0' // valid?
jb done
cmp ecx, '9'
ja done
sub ecx, '0' // "convert" character to number
imul eax, 10 // multiply "result so far" by ten
add eax, ecx // add in current digit
jmp top // until done
done:
mov result, eax
end;

Проверил - работает без проблем. Протестировал пока только на целых положительных числах. Так как не знал, как вывести результат функции, то менял ей положение окна и "линейкой" замерял расстояние.

P.S. С отрицательными числами не работает - надо думать(

2

Re: Использование Delphi SDK for KolibriOS 2020-05

amber8706, если тебе нужна StrToInt, то вон в том примере http://board.kolibrios.org/viewtopic.ph … 469#p68754 она используется.
Только сам пример собирается другим способом.
Если у тебя есть желание, то можешь сам переделать его и собрать.

3

Re: Использование Delphi SDK for KolibriOS 2020-05

amber8706 пишет:

P.P.P.S. Да ёлы-палы! Как же всё урезано. Простая вещь, объединение строк: a:=a+'blabla' - не работает! Компилятор жалуется на отсутствие LStrFromString. Я вообще не понимаю, как можно писать хоть сколь нибудь серьёзные вещи. Да да же калькулятор не напишешь, поскольку обязательно потребуется конвертация строки в число.

Это только первый выпуск. Его задачей было собрать воедино все подходящие примеры, отформатировать и упростить, сделав похожими на примеры, и собрать SDK, позволяющий всё компилировать и запускать в Колибри без скачивания чего-то дополнительного и плясок с бубном. На форуме Колибри совершенно справедливо жаловались на полуфабрикаты. Мы выпустили продукт.

Библиотечные функции Borland нельзя копировать в модуль System и выкладывать на GitHub. Требуется написать лицензионно чистые реализации. На это нужно время. Нужно подождать. Можно написать их и самостоятельно, потом отправить pull request.

Все ли функции API Колибри реализованы в модуле KolibriOS, может ответить 0CodErr.

Это проект — хобби. Немедленного решения или поддержки онлайн никто не обещал. Надеюсь на понимание.

4 (изменено: 0CodErr, 02.06.2020 в 00:05)

Re: Использование Delphi SDK for KolibriOS 2020-05

это вот то, о чём я говорил

0CodErr пишет:

была идея, чтобы сначала хоть чем-то это заполнить.
Ну чтобы те, кто потенциально может заинтересоваться, пришёл не на "пустое место".

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

Добавлено 2020-06-02 в 02:04

Freeman пишет:

Библиотечные функции Borland нельзя копировать в модуль System и выкладывать на GitHub. Требуется написать лицензионно чистые реализации. На это нужно время.

там же GNU GPL v2
{ *********************************************************************** }
{                                                                         }
{ Delphi / Kylix Cross-Platform Runtime Library                           }
{ System Unit                                                             }
{                                                                         }
{ Copyright (c) 1988, 2001 Borland Software Corporation                   }
{                                                                         }
{  This file may be distributed and/or modified under the terms of the    }
{  GNU General Public License version 2 as published by the Free Software }
{  Foundation and appearing at http://www.borland.com/kylix/gpl.html.     }
{                                                                         }
{  Licensees holding a valid Borland No-Nonsense License for this         }
{  Software may use this file in accordance with such license, which      }
{  appears in the file license.txt that came with this software.          }
{                                                                         }
{ *********************************************************************** }

5

Re: Использование Delphi SDK for KolibriOS 2020-05

0CodErr пишет:

amber8706, если тебе нужна StrToInt, то вон в том примере http://board.kolibrios.org/viewtopic.ph … 469#p68754 она используется.
Только сам пример собирается другим способом.
Если у тебя есть желание, то можешь сам переделать его и собрать.

Для SDK, хорошо бы, что бы стандартные функции Delphi входили в его состав. В идеале, он должен полностью повторять набор функций RTL Delphi. Это позволит пользователям тратить меньше времени на изучение и добавит кросс-платформенности. Согласитесь, удобно, когда один и тот же код, вида: ShowMessage('blabla'); - отобразит диалоговое окно с текстом хоть в Kolibri, хоть в Windows. Конечно, внутренности функции ShowMessage для Kolibri будут свои, но для конечного пользователя - это станет мега простым и лёгким способом, не требующего дополнительных знаний.

Добавлено 2020-06-02 в 09:43

Народ, всё хорошо! Это первая вещь на моей памяти, где я написал хоть что-то для этой ОС. Да, оно ещё сырое. Много чего не хватает. Но думаю, в будущем эта задумка станет мощным инструментом в разработке программ под Kolibri. Только не забрасывайте идею. Знающих ассемблер, сегодня не так много. И этой ОС не хватает как воздух, лёгких, простых и понятных в использовании инструментов. Думаю, вам следует сосредоточиться на реализации базовых вещей, вроде той же StrToInt. По сути, это в каком-то смысле "переписать Delphi". Создать, так сказать "свою среду". Но эффект, от успешной реализации этой затеи, может стать грандиозным.

6

Re: Использование Delphi SDK for KolibriOS 2020-05

amber8706 пишет:

Для SDK, хорошо бы, что бы стандартные функции Delphi входили в его состав. В идеале, он должен полностью повторять набор функций RTL Delphi.

Да, всё верно, ты прав. Именно это и планируется реализовать по возможности. Сейчас это только начало.

amber8706 пишет:

Но думаю, в будущем эта задумка станет мощным инструментом в разработке программ под Kolibri. Только не забрасывайте идею. Знающих ассемблер, сегодня не так много. И этой ОС не хватает как воздух, лёгких, простых и понятных в использовании инструментов.

Да, было бы здорово, если бы заинтересованных людей было больше.
Как в разработке, так и в тестировании.
Если у тебя есть желание, то ты также можешь поучаствовать в этом.
Как я понял, ты в Delphi разбираешься.

7 (изменено: amber8706, 02.06.2020 в 15:08)

Re: Использование Delphi SDK for KolibriOS 2020-05

0CodErr пишет:

Если у тебя есть желание, то ты также можешь поучаствовать в этом.
Как я понял, ты в Delphi разбираешься.

Чем смогу - помогу. В Delphi опыт есть, а вот в Ассемблере - не очень шарю. Хотел было сделать функцию конвертации в кодировку Kolibri. Но строковые операции, увы не работают. Сейчас, если строка содержит русские буквы - она не корректно отображается внутри Kolibri. Я плохо знаком с внутренностями этой ОС, но если там кодировка отличная от Windows, придётся во ВСЕХ строковых функциях делать предварительную конвертацию строк в формат кодировки, используемой в Kolibri. Иначе, это будет дополнительная головная боль тем, кто решит использовать этот SDK. Тот же DrawWindow, если использовать русские буквы в качестве Caption - на выходе получаем мусор, вместо строки в заголовке окна.

Добавлено 2020-06-04 в 16:26

P.S. Некоторые мои идеи, по развитию: https://github.com/vapaamies/KolibriOS/pull/2

8

Re: Использование Delphi SDK for KolibriOS 2020-05

Вообще идея модуля KolibriOS изначально была в том, чтобы по возможности однозначно отобразить системное API KolibriOS безо всякой отсебятины.
Таких хелперов можно при желании хоть 100500 наделать.
Но это имхо лучше вынести в отдельный модуль.
По поводу типов тоже: если необходимости нет, то в этом модуле это делать не нужно.

Да, встречается и такое

GetPixel
function GetPixel(X, Y: LongInt): LongWord; stdcall;
asm
        push   ebx
// at first need to know Screen.Width
        mov    eax, 61
        mov    ebx, 1
        int    $40
// at now eax = (Width << 16) | Height
// need to make ebx = Y * Screen.Width + X
        shr    eax, 16
        mul    Y
        add    eax, X
        mov    ebx, eax
// and now GetPixel
        mov    eax, 35
        int    $40
        pop    ebx
end;

Но уж тут по-другому никак.
Системное API было изначально кривое. Нельзя узнать цвет пикселя, не узнав Screen.Width.
Но я как раз такую отсебятину и имею в виду, такого не должно быть, если можно без этого обойтись.
А всё остальное(хелперы, etc..) это в отдельный модуль.
Возможно, стоит сделать в модуле KolibriOS

uses
  Helpers;

либо наоборот, при необходимости делать так

uses
  KolibriOS, Helpers;

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

9 (изменено: amber8706, 04.06.2020 в 21:03)

Re: Использование Delphi SDK for KolibriOS 2020-05

В этом есть смысл. Я заметил, чем больше пытаешься что-то упростить, с точки зрения кода - тем больше на выходе размер программы. Думаю, в такой ситуации, будет лучше, если проект станет состоять из множества маленьких модулей, чем из пары тройки огромных монстров. Но вот как всё это красиво разделить... К стати, как в этой ОС отобразить два, три и больше окон одновременно? DrawWindow - видимо только одно окно может создать и всё.

10 (изменено: Freeman, 14.06.2020 в 17:14)

Re: Использование Delphi SDK for KolibriOS 2020-05

amber8706 пишет:

К стати, как в этой ОС отобразить два, три и больше окон одновременно? DrawWindow - видимо только одно окно может создать и всё.

Для этого нужно использовать несколько потоков(один поток — одно окно).

И вот как это можно сделать
program CreateThreadExample;

uses
  KolibriOS;

const
  STACK_SIZE = 256;

var
  Window: TBox;
  Screen: TSize;

  StackMemoryForSecondThread: array [0..STACK_SIZE - 1] of Byte;

procedure SecondThreadEntry;
begin
  while True do
    case WaitEvent of
      REDRAW_EVENT:
        begin
          BeginDraw;
          with Window do
            DrawWindow(100, 50, Width, Height, 'CreateThread Example Second Window', $00FFEEFF,
              WS_SKINNED_FIXED + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
          EndDraw;
        end;
      KEY_EVENT:
        GetKey;
      BUTTON_EVENT:
        if GetButton.ID = 1 then
          TerminateThread;
    end;
end;

begin
  Screen := GetScreenSize;

  with Window do
  begin
    Width  := Screen.Width div 3;
    Height := Screen.Height div 3;
  end;

   CreateThread(@SecondThreadEntry, Pointer(LongWord(@StackMemoryForSecondThread) + STACK_SIZE));

    while True do
      case WaitEvent of
        REDRAW_EVENT:
          begin
            BeginDraw;
            with Window do
              DrawWindow(500, 175, Width, Height, 'CreateThread Example First Window', $0011FF11,
                WS_SKINNED_FIXED + WS_CLIENT_COORDS + WS_CAPTION, CAPTION_MOVABLE);
            EndDraw;
          end;
        KEY_EVENT:
          GetKey;
        BUTTON_EVENT:
          if GetButton.ID = 1 then
            TerminateThread;
      end;

end.
результат

misc.php?action=pun_attachment&amp;item=24&amp;download=0

Post's attachments

Иконка вложений CreateThreadExample.PNG 41.32 Кб, 80 скачиваний с 2020-06-04