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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение 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))
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4346
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

Про этот сабклассинг. Внутри Клаши есть всё. Только я воспользоваться этим не могу. Причём здесь Винда? Условно говоря. Конкретно. Вы ведёте мышкой над листом. Таймера нет. Лист же понимает где Вы ведёте? Понимает. Тултипсы же отображаются корректно. Я тоже хочу понимать. Хорошо бы без сабклассинга и ВинАПИ.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение 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
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

kreator писал(а): 23 Ноябрь 2021, 10:27 Про этот сабклассинг. Внутри Клаши есть всё. Только я воспользоваться этим не могу. Причём здесь Винда? Условно говоря. Конкретно. Вы ведёте мышкой над листом. Таймера нет. Лист же понимает где Вы ведёте? Понимает. Тултипсы же отображаются корректно. Я тоже хочу понимать. Хорошо бы без сабклассинга и ВинАПИ.
Понимает не list, а accept. Он получает события от винды и обрабатывает некоторые из них внутри себя автоматически, не передавая управление в структуру case event(). Поэтому Вы и не можете отследить это в своем коде. С помощью сабклассинга это ограничение обходится, и Вы можете отработать у себя в коде подобные события до того, как начнет свою стандартную работу accept.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

В справке можно поискать по PROP:WndProc.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

К слову, про аля эксель. Вот тут коллеги реализовали нечто похожее для редактирования табличных бланков. Думаю, не будут в претензии, если кину скриншот. Насчет реализации не уверен, думаю, можно обойтись обычными средствами клариона, без win api. Мне когда-то очень понравилось и хотел у себя во фреймворке реализовать нечто подобное, но так и не придумал ситуаций, когда это может быть практически полезно.
tab.jpg
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 1627
Зарегистрирован: 16 Сентябрь 2005, 15:35
Откуда: Москва

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

Сообщение Губин Игорь »

Не оно?
Вложения
ListF.zip
(1011.73 КБ) 13 скачиваний
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

Сообщение Игорь Столяров »

finsoftrz писал(а): 23 Ноябрь 2021, 10:42 реализовали нечто похожее
Разве это LIST Clarion ? Всё можно объяснить огромным объёмом работы ... кроме ячейки {D13}. :(
«V» значит Вендетта !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

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

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

Сообщение Игорь Столяров »

finsoftrz писал(а): 23 Ноябрь 2021, 16:33 Нет, конечно.
Фух ! А я уже приготовился дивиться, чего люди умеют в Clarion ... :)
Была когда-то идея стырить идею у 1С и выводить все отчёты в ячейки,
что бы любой отчёт легко сохранялся в XLSX ... но не сложилось что-то. :)
«V» значит Вендетта !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

Самое забавное, что в 1с вывести встроенную таблицу работает медленнее, чем в кларионе вывести в эксель.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 5650
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-ДоМу

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

Сообщение Игорь Столяров »

finsoftrz писал(а): 23 Ноябрь 2021, 17:00 чем в кларионе вывести в эксель
Ну это только после того, как RaFael подарил нам праздник с LibXLSX ... ;)
А до этого с OLE Excel была полная жопа (ну нет другого слова).
Хотя некоторым это нравится. В смысле OLE. :)
«V» значит Вендетта !
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

До xlsx давным давно был dexcel Олега Руденко. В виде опенсорса, чистый кларион. Работает существенно быстрее, чем вывод в xlsx. Есть ограничения, если не выпендриваться с оформлением, то для обычных задач хватает. Я знаю также пару коммерческих проектов с прямым выводом в xls более позднего формата, чем у dexcel.
C6/C11, ШВС, tps/btrieve.
kreator
✯ Ветеран ✯
Сообщения: 4346
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

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

Сообщение kreator »

finsoftrz писал(а): 23 Ноябрь 2021, 16:33 Я представляю, как это внутрях реализуется, только не вижу практического смысла. У меня все отчеты выводятся в list, а затем их можно автоматом сохранить в xls в том виде, как на экране. А дальше делать все, что нужно уже в экселе или калке.
Не мой случай. Хотелка по работе как в Экселе. В данном (моём) случае, это копирование значений в другие записи.
finsoftrz писал(а): 23 Ноябрь 2021, 17:54 До xlsx давным давно был dexcel Олега Руденко. В виде опенсорса, чистый кларион. Работает существенно быстрее, чем вывод в xlsx. Есть ограничения, если не выпендриваться с оформлением, то для обычных задач хватает. Я знаю также пару коммерческих проектов с прямым выводом в xls более позднего формата, чем у dexcel.
MS Office не всегда открывает старые xls. Да и устарел этот формат.
We are hard at work… for you. :)
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 2941
Зарегистрирован: 06 Ноябрь 2014, 12:48

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

Сообщение finsoftrz »

В последних версиях мс офиса сделали настройку разрешения открытия файлов разных форматов. И некоторые форматы, в том числе biff4, который генерит dexcel, по умолчанию не включены. А так никаких проблем с открытием в офисах нет. Во всяких веб почтах может не поддерживаться встроенными просмотрщиками. Это касается именно biff4, более поздние версии xls открываются без проблем. Xlsx формируется медленнее в несколько раз и есть проблема с совместимостью у разных версий офисов и разных просмотрщиков. Поэтому я в настоящее время остаюсь на xls. Если нужно отправить по почте, то после формирования пересохраняю в более свежий формат, это много времени не занимает.
C6/C11, ШВС, tps/btrieve.
Ответить