Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2010, 12:38   #1
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию Динамический интерфейс.

В своем проекте создаю динамический графический интерфейс. Примитивы рисования уже создал, и теперь могу нарисовать на экране картинку в нужном месте одной процедурой. В таймере идет отрисовка буфера, так что с графикой проблем нет. Теперь над этим уровнем строю следующий уровень организации - динамическое меню. Т.е. что-бы можно было создать кнопку одной процедурой.

Сделал, получилось. Теперь осталось разобраться, как вызвать нужную процедуру при нажатии кнопки.

Система у меня такая -
1) CreateButton(X, Y, Caption);
В динамическом массиве в конец приписывается элемент, который содержит запись ( в ней координаты, area для подсветки и проч).
2) На OnMouseMove и OnMouseDown идет процедура такого типа:
Код:
GetCursorPos(P)
... // Проверка на вхождение в area глобальных частей интерфейса
В цикле проверка на вхождение в массиве "кнопок".
При "попадании" вызывается процедура CMP {Click Menu Point} Там кейсятся значения для глобальных объектов интерфейса и так кейсится массив:
Код:
1..19 : Begin Light(ButtonArr[Num - 1].MP); End;
Это о внутреннем строении. Процедура, ответственная за какой-то пункт вызывается так:
Код:
 Procedure Normal(Var P : TMenuPoint);
 Begin
  P.Tr := P.Tr + P.Tm;
  If P.Tr = 20 Then
   Begin
    P.Tr := 0;
    P.Tm := 0;
    SPoint := P.Nm;
   End;
  If P.Mi = 0 Then
   Begin
    If P.Tag < 4 Then P.Tag := P.Tag + P.Vec;
    If P.Tag = 4 Then Begin P.Vec := -1; P.Tag := 3; End;
    If P.Tag = 0 Then Begin P.Vec := 0; End;
   End;
 End;
А отрисовка на экран идет по SPoint (там ряд констант). В общем в данный момент шикарно отрисовываются (несколько мелочей еще поправить и будет зашибись). А вот тем кнопкам, которые в массиве процедуру присвоить не выходит по причине того, что в процедуре Normal (котоая вызывается по таймеру) можно назначить только управление глобальным интерфейсом (Spoint), но никак не вызвать процедуру. Як исправить это недоразумение?

Мне кажется, что тут два пути:
1) Либо перестроить всю процедуру Normal, чтобы она вызывала процедуру, в которую спускать P.Nm а там кейсить все и вся.
2) Либо создать еще десятка два констант, которые будут отправляться в Spoint. Придется в таймере увеличить Case с 8-ми элементов до 100500.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.08.2010, 13:34   #2
Impuls1989
Форумчанин
 
Аватар для Impuls1989
 
Регистрация: 16.08.2008
Сообщений: 276
По умолчанию

Не совсем понял что написано((( Но если у Вас есть процедура CMP, которая вызывается при клике, и если у Вас есть массив кнопок, которые, в свою очередь, имеют координаты. Ищите по массиву кнопки, координаты которых совпадают, и вызывайте их обработчик... Или я чего-то не понимаю?
Искусственный интеллект - фигня по сравнению с естественной глупостью
Impuls1989 вне форума Ответить с цитированием
Старый 02.08.2010, 13:40   #3
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Дело в том, что между моментом нажатия и выполнением процедуры по клику проходит 20 тактов таймера (< 1 сек). Это время дается на обработку анимации. Т.е. инициатором начала анимации является процедура Light, в которой включается счетчик. А исполнитель - Normal, который "активирует" нужный пункт, если таймер "тикнул" достаточно (по коду это можно увидеть).
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.08.2010, 13:48   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Если ты не можешь выполнить процедуру - отдай распоряжение тому, кто сможет (таймер может?). Сделай структуру куда помещается адрес процедуры и ее параметры.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.08.2010, 13:57   #5
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Цитата:
Сделай структуру куда помещается адрес процедуры и ее параметры.
Ясно, влеплю проверку в Normal на то, откуда MenuPoint - стационарный, или из массива. Параметры процедуре не нужны, только адрес.

Подскажите, как правильно будет создать указатель на процедуру, чтобы по нему потом вызвать её?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 02.08.2010, 15:20   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Код:
type
  TProc = procedure (X, Y: Integer);

var
  P: TProc;

begin
      P:=Alex_Cones_Procedure(X, y: Integer);
     P(0, 666);
end;
Что-то вроде этого.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.08.2010, 15:25   #7
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ясно, спасибо.
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейс masterlomaster Помощь студентам 3 22.10.2009 11:42
COM-интерфейс Rekky Общие вопросы Delphi 2 16.09.2009 06:05
Интерфейс [Smarik] Общие вопросы Delphi 16 18.06.2008 10:37
Интерфейс!!! Oleg Romanchuk Свободное общение 8 25.10.2007 18:13