OberonCore
https://forum.oberoncore.ru/

Дополнительные команды
https://forum.oberoncore.ru/viewtopic.php?f=47&t=2524
Страница 1 из 1

Автор:  Иван Кузьмицкий [ Воскресенье, 04 Апрель, 2010 15:49 ]
Заголовок сообщения:  Дополнительные команды

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

Код:
   PROCEDURE SortSelected*;
      VAR c: FormControllers.Controller; sel: FormControllers.List;
   BEGIN
      c := FormControllers.Focus();
      IF (c # NIL) & c.HasSelection() THEN
         sel := c.GetSelection();
         WHILE sel # NIL DO
            IF sel.next # NIL THEN c.form.PutAbove(sel.next.view, sel.view) END;
            sel := sel.next
         END
      END
   END SortSelected;

Автор:  Иван Горячев [ Воскресенье, 04 Апрель, 2010 23:19 ]
Заголовок сообщения:  Re: Дополнительные команды

в первой части

Автор:  Иван Кузьмицкий [ Четверг, 12 Август, 2010 14:27 ]
Заголовок сообщения:  Простейший таймер с текстовым интерфейсом

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

Интерфейс текстовый - надо написать длительность периода в секундах, выделить и выбрать пункт "Запустить таймер".
Можно и коммандером: ^Q"SternTimer2.Start(5)"

Код:
MODULE SternTimer2;

   IMPORT Dialog, Log := StdLog, Strings, Services, TextControllers, TextModels;

   TYPE
      Action = POINTER TO RECORD (Services.Action)
         period: INTEGER
      END;

   VAR
      a: Action;

   PROCEDURE (a: Action) Do;
   BEGIN
      Dialog.Beep;
      Services.DoLater(a, Services.Ticks()+a.period*Services.resolution);
   END Do;

   PROCEDURE Start (period: INTEGER);
   BEGIN
      ASSERT(period # 0, 20);
      Services.RemoveAction(a);
      NEW(a); a.period := period;
      Services.DoLater(a, Services.Ticks()+period*Services.resolution);
   END Start;

   PROCEDURE ReadPeriod*;
      VAR c: TextControllers.Controller; r: TextModels.Reader; period, res, i, beg, end: INTEGER; ch: CHAR; s: ARRAY 50 OF CHAR;
   BEGIN
      c := TextControllers.Focus();
      IF c # NIL THEN
         c.GetSelection(beg, end);
         IF end > beg THEN
            r := c.text.NewReader(NIL); r.SetPos(beg); s := ''; i := 0;
            r.ReadChar(ch);
            WHILE (r.Pos() <= end) & ~r.eot DO
               s[i] := ch; INC(i);
               r.ReadChar(ch);
            END;
            s[i] := 0X;
            IF s # '' THEN
               Strings.StringToInt(s, period, res);
               IF res = 0 THEN Start(period) END
            END
         END
      END;
   END ReadPeriod;

   PROCEDURE Stop*;
   BEGIN
      Services.RemoveAction(a); a := NIL
   END Stop;

   PROCEDURE StopGuard* (VAR par: Dialog.Par);
   BEGIN
      par.disabled := a = NIL
   END StopGuard;

END SternTimer2.

Меню

   "Запустить таймер"   ""   "SternTimer2.ReadPeriod"   "TextCmds.SelectionGuard"
   "Остановить таймер"   ""   "SternTimer2.Stop"   "SternTimer2.StopGuard"

Автор:  Info21 [ Четверг, 12 Август, 2010 16:44 ]
Заголовок сообщения:  Re: Простейший таймер с текстовым интерфейсом

Иван Кузьмицкий писал(а):
Простейшая дзынькалка.
У меня похожая штука через заданный интервал че-нить веселенькое играет (Мы красные кавалеристы и т.п.), типа move your ass buddy.

Отдельный маленький ББ-проект в отдельной папке, в ней запускается отдельный ББ с соотв. конфигурацией окон, в которых команды с интервалами и файлами мелодий по погоде.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/