Страница 1 из 1

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 12:54
Игорь Столяров
Привет всем !

Возник детский вопрос: как создать процедуру с необязательным параметром <QUEUE> SpisokName ?
Попытка получить значение Omitted(SpisokName) - просто валит программу и всё.

Нашёл странный рабочий, но не документированный вариант:

Код: Выделить всё

MyProc Procedure(<QUEUE> SpisokName)
  Code
 !If Omitted(SpisokName) ! = CRASH
  If Not (SpisokName &= Null)
     Get(SpisokName,1)  ! и т.д. вроде бы всё работает
  end
Я не изобретаю велосипед ? Может быть можно по другому решить вопрос ? Спасибо !

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 14:18
Admin

Код: Выделить всё

MyProc Procedure(<QUEUE SpisokName>)
OMITTED работает.
Clarion 11

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 14:50
Игорь Столяров
Да, действительно с <Queue> работает. Спасибо.
Это я хотел сделать простой пример и не проверил. :(
Не работает с типом данных Queue, т.е.

Код: Выделить всё

Q_Type Queue,Type
Field1  Long
  end
  ...

MyProc Procedure(<Q_Type SpisokName>)
  Code
 !If Omitted(SpisokName) ! = CRASH
  If Not (SpisokName &= Null)
     Get(SpisokName,1)  ! и т.д. вроде бы всё работает
  end
P/S: В обычном коде работает. Не работает из ABC класса в AppGen. ХЗ ! :(

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 15:24
Admin
Игорь Столяров писал(а): 16 Декабрь 2022, 14:50 Не работает из ABC класса в AppGen
Как метод класса или в классе?
И вообще лучше (готовый к запуску) пример давать сразу.

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 15:38
Игорь Столяров
Admin писал(а): 16 Декабрь 2022, 15:24 И вообще лучше (готовый к запуску) пример давать сразу.
Да. Тут что-то явно не то. :( Соберу пример и выложу.

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 15:50
kreator
Я тут недавно столкнулся с фичей.
Объявление функции:

Код: Выделить всё

EmployeeFilter         FUNCTION(GLO:EmployeeQueue, Long, Long, Long, Long), Byte
,где GLO:EmployeeQueue - прототип очереди.
Вот так работает:

Код: Выделить всё

EmployeeFilter PROCEDURE (Q, LOC:X, LOC:Y, LOC:W, LOC:H)
Вот так не работает:

Код: Выделить всё

EmployeeFilter PROCEDURE (LOC:Q, LOC:X, LOC:Y, LOC:W, LOC:H)
Компилятор ругается на LOC:Q. :shock:

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 16:18
ingasoftplus
Игорь Столяров писал(а): 16 Декабрь 2022, 12:54 Omitted(SpisokName) - просто валит программу и всё.
а можно по позиции параметра (2 способ) просто смотреть:

Код: Выделить всё

IF OMITTED(1)  

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 17:33
Игорь Столяров
Admin писал(а): 16 Декабрь 2022, 15:24 Как метод класса или в классе?
Да. Видимо Omitted() воспримается как запрос на параметры метода, а не самой процедуры.
Т.е. проверить наличие параметров процедуры в BROWSE или FORM ABC вообще нельзя. :(

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 18:06
kreator
А вот не такая же проблема - viewtopic.php?p=48124#p48124?

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 19:33
Игорь Столяров
Видимо да. Просто заход с другой стороны. :dizzy:

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 20:37
Игорь Столяров
Вариант с Routine - это эксплуатация глюка RunTime, который может быть прикрыт в любом обновлении. :(
Работает, но очень рискованно.

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 21:21
Дед Пахом
Игорь Столяров писал(а): 16 Декабрь 2022, 20:37 Вариант с Routine - это эксплуатация глюка RunTime
Это не глюк, вызов OMITTED из ROUTINE, объявленной в процедуре = вызов OMITTED из этой процедуры. Метод класса это уже другая область видимости.

Процедура с параметром <QUEUE>

Добавлено: 16 Декабрь 2022, 21:55
Игорь Столяров
Дед Пахом писал(а): 16 Декабрь 2022, 21:21 Метод класса это уже другая область видимости.
Т.е. здесь нет зависимости от точки вызова локальной подпрограммы ... :(
Интересно будет (потом) попробовать перейти из класса в Routine, убить его там и вернуться в точку вызова. :shock: