Архивы автора: Evgeny Stefanenko


Очередь класса в качестве From для List

PS>> Имеется некий класс…
PS>> Если прописать одну из его очередей в качестве источника для List,
PS>> т.е. в поле From написать AnyClass.AnyQueue — компилятор,
PS>> естественно, глотает, но в runtime при открытии окна имеем:
PS>> Internal error 01: WSLDIAL
PS>> Do you want to GPF?

VS> Это просто RTL так реагирает на нарушение принципа инкапсуляции данных
VS> Мол нефиг — мемберы не должны быть публичными…
VS> И может быть в этом и заключена вся серомяжная правда? 😉

PS>> Естественно, клас проинициализирован на момент открытия
PS>> окна и очереди созданы, но увы…
PS>> А так хочется прописать напрямую… AnyClass.AnyQueue
PS>> Кто-нибудь решал эту проблему? Решил?

VS> См. выше… Понятно, что если компилер допускает использование
VS> нерекомендуемых конструкций, от их можно использовать. Но нужно ли?

Не, Вадим, ты немного неправ. Можно. И вполне на законных основаниях. Только такую очередь надо «пристегивать» к листу НЕ на этапе дизайна, А ПОСЛЕ ОТКРЫТИЯ ОКНА!
Т.е., в данном случае, в дизайнере необходимо поле FROM оставить пустым. А во вставке «После открытия окна» надо написать: Читать далее

QUEUE в качестве параметра

OAR>> А что здесь непонятно?!
OAR>> QueRef обьявлен как УКАЗАТЕЛЬ НА ОЧЕРЕДЬ.
OAR>> При передаче его как ANY компилятор предполагает, что
OAR>> в процедуру передается БУФЕР ЗАПИСИ ОЧЕРЕДИ на которую
OAR>> указывает QueRef.
OAR>> И, соответственно, его действия следующие:
OAR>> — по указателю QueRef читает заголовок очереди, на которую
OAR>> ссылается QueRef
OAR>> — из заголовка выбирает указатель на буфер записи этой
OAR>> очереди
OAR>> — по выбраному указателю создает UFO-обьект типа GROUP
OAR>> — передает его в процедуру

AA> …
AA> QueRef &= NULL
AA> MyProc(QueInst, QueRef)
AA> …

AA> каков будет результат? QueRef ведь ИНИЦИАЛИЗИРОВАН???

OAR>> Как видно, уже на первом шаге произойдет GPF, т.к. перед
OAR>> вызовом процедуры QueRef НЕ ИНИЦИАЛИЗИРОВАН, т.е.,
OAR>> грубо говоря, QueRef &= NULL!!!

AA> ну ежели компилятору самому в облом инициализировать указатели
AA> каким-либо значением (пусть даже NULL), то уж как-то он (runtime)
AA> должен отслеживать валидность указателей…

Я, очевидно, неверно обьяснил.
Под ИНИЦИАЛИЗАЦИЕЙ понимается присвоение указателю значения ОТЛИЧНОГО от нуля, т.е. от NULL.
Я же написал, что согласно принятой схеме превращения указателя на очередь в ANY-обьект, сначала производится чтение заголовка очереди на которую ссылается QueRef. А так как QueRef &= NULL, то, соответственно, получим чтение из ячейки памяти с НУЛЕВЫМ АДРЕСОМ, что, естественно, приведет к GPF! Читать далее

Match и его возможности

AA> Нужно ОЧЕНЬ!
AA> ! Вот только, не слишком-ли бедный получится регэксп?
AA> ! Учитывая возможности MATCH от Клариона и возможности
AA> ! стандартного регэкспа?

AA> Это СТАНДАРТНЫЙ регэксп, именно его и хочется.
AA> Если тебя не затруднит, подскажи хотя бы, где копать.

Если уж так срочно, и умеешь нормально ориентироваться в асме, и знаешь хорошо ядро Клары, то загляни в код функции Cla$REGULAR. Вот ее надо переписать на Кларионе. Ничего сложного нет. Тем более, что ВСЮ работу по поиску выполняет экспортируемая функция _7RegExpr__find@… А тебе прийдется только написать код для инициализации и завершения. И взять результат из временного буфера, который этой функции и подсунешь. Читать далее

CREATE

DmVB> В том-то и прикол, что введённые тобой значения прекрасно сохраняются!
DmVB> Т.е. было

DmVB> NewControl#{prop:use}—>88
DmVB> NewControl#{prop:value}—>88

DmVB> ввели ручками 89, стало

DmVB> NewControl#{prop:use}—>89
DmVB> NewControl#{prop:value}—>89

DmVB> Чудо!

Никакого чуда. Если у контрола нет своей физической переменной, то ядро привязывает к такому контролу неявно созданный UFO-обьект типа STRING. По умолчанию длина = 20. Но ее легко можно изменить с помощью {PROP:Text} = ‘@S???’.
Т.е., другими словами, с помощью свойства {PROP:Text} в любой момент времени выполнения можно создавать UFO-обьект ЛЮБОГО типа с ЛЮБЫМИ параметрами. Старый UFO-обьект, естественно, уничтожается.

Такие «фокусы» с изменением типа и параметров ENTRY-поля доступны, естественно, ТОЛЬКО для полей, у которых нет явно заданной физической переменной.

ASTRING

YF> Здравствуйте, Олег.
YF> Вы писали 4 декабря 2002 г., 3:25:23:

ОАР>> Здравствуйте!
ОАР>>> А после этого опять пробежать по очереди и сравнить оригинальные
ОАР>>> строки и значения из ASTRING.
ОАР>>> Если получим где-то несовпадения, то значит были сгенерены
ОАР>>> несколько одинаковых Hash-ключей.

YF> Любой порядочный алгоритм хеширования должен иметь средства
YF> разрешения коллизий (Д.Кнут, Искусство программирования для

Учитывая, что в моих тестах повторений не было, то SV так-же читают его книги:)

YF> ЭВМ, т.1). Я не думаю, что в SV об этом не знают. Кстати, как это
YF> соотносится с их заявлениями об использовании ATOM-фукнций WinAPI?

Явно никак. По крайней мере, в блоке работы с ASTRING-ами. Хотя, конечно, реализация ASTRING от SV сильно напоминает виндусовые Атомы.

У меня вообще давно уже сложилось впечатление, что SV никак еще не отойдет от практики разработки языка времен Виндов3.11 Когда в WinAPI многого не хватало и TopSpeed недостающее делал сам в ядре Клары. Может просто они таким образом пытаются застраховаться от возможных нестыковок и несовместимостей между API различных версий Винды? Читать далее

Прерывания цикла LOOP

ОАР>> Ну кто-же использует в Виндах обычные циклы для обработки
ОАР>> больших массивов данных?!

ВД> А что надо пользовать?
ВД> Если есть база данных на фоксе, мне надо выбрать из нее записи
ВД> удовлетворяющие определенному условию и поместить записи в мою базу.
ВД> Подсчитать исходя из моей базы некоторые данные и поместить в другие базы.
ВД> Как правильно организовать? Организовал на окне,
ВД> по Ок срабатывает цикл, который обрабатывет первую базу и помещает
ВД> записи в мою. Обыкновенный цикл LOOP. Его нужно прервать в любой
ВД> момент по нажатию Esc.( ну хотелось бы).
ВД> Может правильней было бы пользоваться виртуальными файлами.
ВД> Но я ими никогда не пользовался. И не знаю, где объявлять.
ВД> А потом как виртуальный файл загнать в реальный?
ВД> А пока получается что обработка идет довольно долго.
ВД> Если не сложно всем кто может помочь мне в моей проблеме.
ВД> Можно мылом на меня.

Во-первых, необходимо определиться с использованием ключей. Если есть подходящий ключ, который позволит сузить область сканируемых записей, то следует использовать его. Если мне не изменяет память, то ты писал, что другая програ, написанная на Фоксе, довольно шустро делает необходимую выборку. Если это так, то, скорее всего, подходящий ключ есть.

Ну, а дальше — стандартная выборка. Простенький пример с использованием View и моего класса организации Виндовых циклов.

ScanView  VIEW(FoxFile)
          END
Process   BasicProcessType

Clear(GLO:Order_PaySum)
BIND(‘FirstDate’,GLO:FirstDate)
BIND(‘LastDate’,GLO:LastDate)
BIND(‘MinSum’,GLO:MinSum)
BIND(‘MaxSum’,GLO:MaxSum)

Process.Init(True,’Выборка…’,,,,True,50,Records(FoxFile))
ScanView{PROP:Filter} = ‘(FOX:Date => FirstDate) AND ‘& |
‘(FOX:Date MinSum) AND (FOX:PaySum

Ресурсы из другого модуля

ПВА> Добрый день.
ПВА> Вопрос к О.Руденко:

>>были некоторые глюки, связанные, в частности, еще и со «сьездом»
>>по-горизонтали отчетов.

ПВА> можно поподробнее о «съезде» отчетов.
ПВА> Есть один отчет, который иногда съезжает вправо. Причем это уже видно в
ПВА> препросмотре.
ПВА> Оператору приходиться закрывать и формировать еще раз. Где рыть — непонятно?

ПВА> C4,ШВС

ПВА> Понамарев Виталий Александрович
ПВА> Банк Москва-Сити

С чем это связано я не разбирался. Но, если мне память не изменяет, кто-то из коллег в данной рассылке уже (правда давно) давал обьяснение данному глюку. Там что-то было связано с MDI-аттрибутом последнего открытого окна. Или что-то подобное.

Я, как уже писал, решил эту проблему просто — достаточно обьявить окошко, например глобальное, и открыть/закрыть его ПЕРЕД открытием отчета:

DummyWin WINDOW,AT(,,0,0),CENTER,NOFRAME.
...
Open(DummyWin); Close(DummyWin)
...
Open(Report)
...

С тех пор никаких подобных проблем больше не было.

А для вставки этого кода я себе написал небольшой глобальный шаблончик, который подобный код вставляет во все REPORT-процедуры:

#!------------------------------------------------------------------------------
#!------------------------------------------------------------------------------
#EXTENSION(NoShiftReport,'Предотвращение горизонтального сдвига отчетов'),APPLICATION
#!------------------------------------------------------------------------------
#BOXED('')
  #DISPLAY('Данный шаблон предотвращает возможный')
  #DISPLAY('горизонтальный сдвиг рабочего поля отчета')
  #DISPLAY('вправо.')
  #DISPLAY('Для этого в начало каждого отчета вставляется')
  #DISPLAY('код открытия и закрытия пустого окна:')
  #DISPLAY('     OPEN(DummyWin)')
  #DISPLAY('     CLOSE(DummyWin)')
  #DISPLAY('Данный шаблон обрабатывает только те процедуры,')
  #DISPLAY('в которых явно присутствует структура REPORT.')
  #DISPLAY('В других случаях вышеприведенный код надо явно')
  #DISPLAY('вставлять перед открытием отчета.')
#ENDBOXED
#!
#AT(%GlobalData),FIRST
!===============================================================================
DummyWin WINDOW,AT(,,0,0),CENTER,NOFRAME
         END
!===============================================================================
#ENDAT
#!
#AT(%ProcedureSetup),WHERE(%Report)
OPEN(DummyWin)
CLOSE(DummyWin)
#ENDAT
#!------------------------------------------------------------------------------

Некоторая информация об ANY-полях

bdr> Приветствую тебя Олег!
bdr> Ты писал:

>> Fld ANY
>> Fld &= WHAT(tst,1)
>> Если это действительно тебе или кому другому необходимо, то
>> могу бросить в эху письмо с кодом.
>> Oleg_Rudenko@mail.ru
>> Oleg_Rudenko@mailru.com

bdr> Извени, что с запозданием, но что то никто не захотел, а мне это
bdr> необходимо.
bdr> Если тебе не составит труда, то я бы не отказался от такой информации.
bdr> С уважением Бирюков Александр

ВНИМАНИЕ!!!
Все нижесказанное справедливо ТОЛЬКО для C55!
В версии C50 есть некоторые, незначительные, отличия.
Которые, впрочем, запросто могут привести к GPF!
Правда, надо заметить, что эти отличия касаются ТОЛЬКО правильного определения адреса UFO-обьекта, который в C55 определяетя просто через Address(Any).

В C50 необходимо немного «извратиться».
Если кому необходимо именно для С50 — пишите, подскажу.
Что-же касается описания INTERFACE и всех остальных структур, то они идентичны для обеих версий. Читать далее

Лентяи из SV

Разработчики из SV меня не перестают удивлять!
Они или лентяи, или там вообще планирование  разработок новых версий/исправление ошибок  поставлено «из рук вон плохо».

Начал вот перевод некоторых своих приложений с C50 на C55. И сразу на «H» релиз.
Кстати, что-бы не забыть — после перевода не обнаружил никаких проблем с полями файлов, в именах которых есть символ «_». О чем тут как раз шло обсуждение.

Да и вообще — переход прошел настолько гладко, что даже как-то не посебе:) Так и жду, что где-то  рано или поздно вылезет какая-либо гадость.  Приложения очень большие и практически невозможно их  протестировать за приемлемое время.

Проблема обнаружилась только одна — в одном месте  производится переадресация колонок List-а на разные  поля очереди. И, в связи с тем, что в C55 немного  по другому производится нумерация полей групп/очередей,  то переадресация попала на поля-массивы. Читать далее

С+Clarion

В продолжение обсуждения передачи группы в C-функции  как константы а не по ссылке.  Как удалось выяснить, такие группы действительно  копируются на стек по полям и делает это вызывающая программа.  Так что, увы, нет нормального способа использовать такие  функции из Клариона! Если нет возможности «развернуть»  такие группы по полям, то единственный выход — использовать  переходник.

Кстати! Оказывается есть возможность работы с C-функциями,  которые возвращают в качестве результата структуру.
Типа:

my_struct MyFunc();

Данная функция возвращает структуру my_struct.  На самом деле компилятор С генерит вызов такой функции как Clarion-аналог:

MyFunc(*MY_STRUCT _Struct),LONG,RAW,C,NAME('_MyFunc')

Т.е. в качестве первого (скрытого) параметра такая функция  получает указатель на принимающую структуру и одновременно  такая функция возвращает еще и указатель на эту структуру. Читать далее