OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 26 Апрель, 2024 02:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2
Автор Сообщение
СообщениеДобавлено: Четверг, 11 Октябрь, 2007 12:18 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Да поставьте по якорю отложенный Action, с временем now. Будет как раз то, что нужно. И никакой Винды :-)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 11 Октябрь, 2007 14:50 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1429
Иван Кузьмицкий писал(а):
Тут возник нюанс - охранник якоря срабатывает в момент, когда окно ещё не закрыто, а повторное открытие окна в этот же момент не срабатывает, т.к. OpenAuxDialog не даст открыть окно с тем же именем.

Тае это надо не в охраннике делать.
Код:
MODULE TestAnc;
IMPORT Dialog,StdCmds;
  VAR s*:INTEGER;
 
  PROCEDURE Notify*;
  BEGIN
    IF s=0 THEN StdCmds.OpenAuxDialog('Test/Rsrc/Form', 'Проба') END;
  END Notify;
 
  PROCEDURE Guard* (VAR par: Dialog.Par);
  BEGIN
    par.disabled := s<2
  END Guard;

BEGIN
  s:=0;
END TestAnc.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 29 Октябрь, 2007 20:50 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Есть более изящный способ отлова и отмены закрытия окна. Я создал свой класс Window унаследовав его от HostWindows.Window, и переопределил метод Close своим, в котором я вызываю функцию-коллбэк типа BOOLEAN и на основе её значения решаю, выполнять супервызов метода HostWindows.Window.Close или нет...
Потом я переписал некоторые общие процедулы из модулей StdCmds, StdApi и StdDialog и сделал экспортированные методы, идентичные методам StdCmds, но уже с заданием процедуры-коллбэка.

Процедура коллбэка описывается как:
Код:
PROCEDURE ProcName*(): BOOLEAN;
вы описываете её в своём модуле
и передаёте как параметр при открытии окна вызовом
Код:
SternCmds.OpenAuxDialog("Stern/Rsrc/Form","Test",[b]ProcName[/b]);


При попытке закрыть окно выполняется процедура ProcName и возвращает TRUE -- если нужно закрыть форму, и FALSE -- если нельзя...
Также присутствуют процедуры OpenAuxDub и OpenToolDub -- позволяют открыть экземпляр формы если форма с таким названием уже существует.


Вложения:
Комментарий к файлу: Подсистема Stern, внутри модуль SternCmds и демка
Stern.zip [17.47 КБ]
Скачиваний: 348
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Октябрь, 2007 08:32 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Petryxa писал(а):
Есть более изящный способ отлова и отмены закрытия окна. Я создал свой класс Window .....


Чувствую, скоро народ рассекать будет.....
Супер!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 30 Октябрь, 2007 21:35 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
info21 писал(а):
Petryxa писал(а):
Есть более изящный способ отлова и отмены закрытия окна. Я создал свой класс Window .....

Чувствую, скоро народ рассекать будет.....
Супер!

Теперь только - не уйти по сторонам каждому со своей "единственно правильной" версией тех или иных "подправленных" своих классов...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 31 Октябрь, 2007 15:44 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Цитата:
Теперь только - не уйти по сторонам каждому со своей "единственно правильной" версией тех или иных "подправленных" своих классов...


Это же всё следствия... А причина в отсутствии такой, да и многих других, кому-то необходимых функций. Расширить стандартный набор функций необходимыми -- значит избавиться от причины. И разброда не будет вообще в принципе.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 12 Февраль, 2008 22:07 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Тема, конечно, старая... Да и ковыряние в Host не приветствуется, но, может кому пригодится:

Код:
Hook* = POINTER TO ABSTRACT RECORD (HostWindows.Hook)
END;

StdHook = POINTER TO RECORD (Hook);
END;
<И далее...>
PROCEDURE (hk: Hook) Activate* (on: BOOLEAN), ABSTRACT;
PROCEDURE (hk: Hook) Focus* (on: BOOLEAN),  ABSTRACT;
PROCEDURE (hk: Hook) Resize* (w, h: INTEGER),  ABSTRACT;

PROCEDURE NewHook(w : HostWindows.Window);
VAR
   hk : StdHook;
BEGIN
 ASSERT(w#NIL, 21);
 NEW(hk);
 w.hook:=hk;
END NewHook;

PROCEDURE (hk: StdHook) Activate (on: BOOLEAN);
BEGIN
Эта Ваша процедура вызывается обработчиком окна при (де-)активизации окна.
END Activate;

PROCEDURE (hk: StdHook) Focus (on: BOOLEAN);
BEGIN
Эта при фокусировке.
END Focus;
   
PROCEDURE (hk: StdHook) Resize (w, h: INTEGER);
BEGIN
Ну а эта, собственно, при изменении размера(так же при разворачивании и сворачивании). Во входных параметрах по сути передаётся размер HostWindows.Window
END Resize;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB