Страница 2 из 3

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:23
finsoftrz
Вот, дернул код для примера.
Размещаем локальный map в модуле оконной процедуры.

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

    MAP
      CSubClassFunc(UNSIGNED,UNSIGNED,UNSIGNED,LONG),LONG,PASCAL
    END
Затем, после открытия окна размещаем такой код.

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

SavedProc = window{PROP:WndProc}
window{PROP:WndProc} = ADDRESS(CSubClassFunc)
Собственно, сама локальная процедура.

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

CSubClassFunc     PROCEDURE(UNSIGNED shWnd,UNSIGNED swMsg,UNSIGNED swParam,LONG slParam)
LOC:WM_QUERYENDSESSION EQUATE(0011h)
LOC:WM_ENDSESSION      EQUATE(0016h)
LOC:WM_PAINT           EQUATE(000Fh)
LOC:WM_ERASEBKGND      EQUATE(0014h)
Nerr UNSIGNED
  CODE
  CASE swMsg
  OF LOC:WM_QUERYENDSESSION
    RETURN(True)
  OF LOC:WM_ENDSESSION
    POST(Event:CloseDown,,1)
    POST(MSERV_ICONTRAY,,1)
    RETURN(True)
  OF MSERV_ICONTRAY
    IF slParam=202h
      POST(MSERV_ICONTRAY,,1)
    End
    RETURN(0)
  ELSE
    IF INRANGE(swMsg,MSERV_GETNAME,MSERV_RECV)
      MSrv.SubClassFuncMServ(shWnd,swMsg,swParam,slParam)
    END
  END
  RETURN(CallWindowProc(SavedProc,shWnd,swMsg,swParam,slParam))

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:27
kreator
Про этот сабклассинг. Внутри Клаши есть всё. Только я воспользоваться этим не могу. Причём здесь Винда? Условно говоря. Конкретно. Вы ведёте мышкой над листом. Таймера нет. Лист же понимает где Вы ведёте? Понимает. Тултипсы же отображаются корректно. Я тоже хочу понимать. Хорошо бы без сабклассинга и ВинАПИ.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:27
finsoftrz
В догонку, прототипы, которые могут пригодиться.

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

MODULE('Windows') 
  CallWindowProc(LONG,UNSIGNED,UNSIGNED,UNSIGNED,LONG),LONG,PASCAL,NAME('CallWindowProcA')
  Shell_NotifyIcon(ULONG,LONG),RAW,PASCAL,NAME('Shell_NotifyIconA')
  LoadIcon(UNSIGNED,*CSTRING),UNSIGNED,PASCAL,RAW,NAME('LoadIconA')
  SetForegroundWindow(UNSIGNED),SIGNED,PASCAL
  ShowWindow(UNSIGNED,SIGNED),SIGNED,PASCAL,PROC
END

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:33
finsoftrz
kreator писал(а): 23 Ноябрь 2021, 10:27 Про этот сабклассинг. Внутри Клаши есть всё. Только я воспользоваться этим не могу. Причём здесь Винда? Условно говоря. Конкретно. Вы ведёте мышкой над листом. Таймера нет. Лист же понимает где Вы ведёте? Понимает. Тултипсы же отображаются корректно. Я тоже хочу понимать. Хорошо бы без сабклассинга и ВинАПИ.
Понимает не list, а accept. Он получает события от винды и обрабатывает некоторые из них внутри себя автоматически, не передавая управление в структуру case event(). Поэтому Вы и не можете отследить это в своем коде. С помощью сабклассинга это ограничение обходится, и Вы можете отработать у себя в коде подобные события до того, как начнет свою стандартную работу accept.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:36
finsoftrz
В справке можно поискать по PROP:WndProc.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 10:42
finsoftrz
К слову, про аля эксель. Вот тут коллеги реализовали нечто похожее для редактирования табличных бланков. Думаю, не будут в претензии, если кину скриншот. Насчет реализации не уверен, думаю, можно обойтись обычными средствами клариона, без win api. Мне когда-то очень понравилось и хотел у себя во фреймворке реализовать нечто подобное, но так и не придумал ситуаций, когда это может быть практически полезно.
tab.jpg

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 15:05
Губин Игорь
Не оно?

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 15:37
Игорь Столяров
finsoftrz писал(а): 23 Ноябрь 2021, 10:42 реализовали нечто похожее
Разве это LIST Clarion ? Всё можно объяснить огромным объёмом работы ... кроме ячейки {D13}. :(

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 16:33
finsoftrz
Игорь Столяров писал(а): 23 Ноябрь 2021, 15:37
finsoftrz писал(а): 23 Ноябрь 2021, 10:42 реализовали нечто похожее
Разве это LIST Clarion ? Всё можно объяснить огромным объёмом работы ... кроме ячейки {D13}. :(
Нет, конечно. Я это привел к фразе сделать как в эксель. Там выделение строк и столбцов мышкой работает.
То есть, в принципе, если очень захотеть, можно реализовать свою встроенную электронную таблицу чисто на кларионе. Не обязательно во все окно, можно и вариации на тему контрола. Я представляю, как это внутрях реализуется, только не вижу практического смысла. У меня все отчеты выводятся в list, а затем их можно автоматом сохранить в xls в том виде, как на экране. А дальше делать все, что нужно уже в экселе или калке. Есть и в обратном порядке, вставить в список товары для отбора в отчете из электронной таблицы или модифицировать какие-то данные на основании содержания электронной таблицы. Читал, что Микрософт в Аксапте тоже использует активно интеграцию с экселем, у них это фишка такая.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 16:43
Игорь Столяров
finsoftrz писал(а): 23 Ноябрь 2021, 16:33 Нет, конечно.
Фух ! А я уже приготовился дивиться, чего люди умеют в Clarion ... :)
Была когда-то идея стырить идею у 1С и выводить все отчёты в ячейки,
что бы любой отчёт легко сохранялся в XLSX ... но не сложилось что-то. :)

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 17:00
finsoftrz
Самое забавное, что в 1с вывести встроенную таблицу работает медленнее, чем в кларионе вывести в эксель.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 17:08
Игорь Столяров
finsoftrz писал(а): 23 Ноябрь 2021, 17:00 чем в кларионе вывести в эксель
Ну это только после того, как RaFael подарил нам праздник с LibXLSX ... ;)
А до этого с OLE Excel была полная жопа (ну нет другого слова).
Хотя некоторым это нравится. В смысле OLE. :)

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 17:54
finsoftrz
До xlsx давным давно был dexcel Олега Руденко. В виде опенсорса, чистый кларион. Работает существенно быстрее, чем вывод в xlsx. Есть ограничения, если не выпендриваться с оформлением, то для обычных задач хватает. Я знаю также пару коммерческих проектов с прямым выводом в xls более позднего формата, чем у dexcel.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 19:01
kreator
finsoftrz писал(а): 23 Ноябрь 2021, 16:33 Я представляю, как это внутрях реализуется, только не вижу практического смысла. У меня все отчеты выводятся в list, а затем их можно автоматом сохранить в xls в том виде, как на экране. А дальше делать все, что нужно уже в экселе или калке.
Не мой случай. Хотелка по работе как в Экселе. В данном (моём) случае, это копирование значений в другие записи.
finsoftrz писал(а): 23 Ноябрь 2021, 17:54 До xlsx давным давно был dexcel Олега Руденко. В виде опенсорса, чистый кларион. Работает существенно быстрее, чем вывод в xlsx. Есть ограничения, если не выпендриваться с оформлением, то для обычных задач хватает. Я знаю также пару коммерческих проектов с прямым выводом в xls более позднего формата, чем у dexcel.
MS Office не всегда открывает старые xls. Да и устарел этот формат.

Выделить ячейки в листе мышью а-ля Excel

Добавлено: 23 Ноябрь 2021, 19:50
finsoftrz
В последних версиях мс офиса сделали настройку разрешения открытия файлов разных форматов. И некоторые форматы, в том числе biff4, который генерит dexcel, по умолчанию не включены. А так никаких проблем с открытием в офисах нет. Во всяких веб почтах может не поддерживаться встроенными просмотрщиками. Это касается именно biff4, более поздние версии xls открываются без проблем. Xlsx формируется медленнее в несколько раз и есть проблема с совместимостью у разных версий офисов и разных просмотрщиков. Поэтому я в настоящее время остаюсь на xls. Если нужно отправить по почте, то после формирования пересохраняю в более свежий формат, это много времени не занимает.