Отправлено: 13.01.18 14:28. Заголовок: Haz пишет метод рабо..
Haz пишет
цитата:
метод работает. Я о том что просто не пользуюсь им.
Я тоже не пользуюсь, но с тем что работает, не соглашусь. Если фонты по блоку кода - валится, нет footer вывода ... т.е. для того чтобы заработал, надо делать спец. отображение тсб. с изменениями, простенький вывод есть без адо, длл и др. спец.оборудования.
Vlad04
постоянный участник
Пост N: 758
Зарегистрирован: 13.10.05
Отправлено: 26.01.18 11:36. Заголовок: Tsb_seek ИЗ пример..
Tsb_seek ИЗ примеров c:\MiniGUI\SAMPLES\Advanced\Tsb_seek\
Сегодня обратил на такую странность в отображении. Если стрелкой прокручивать бровс вниз, то экран заполняется одинаковыми данными, не обновляется.
Andrey
постоянный участник
Пост N: 5703
Зарегистрирован: 12.09.06
Отправлено: 26.01.18 13:48. Заголовок: Vlad04 пишет: то эк..
Vlad04 пишет:
цитата:
то экран заполняется одинаковыми данными
Наверное залипла последняя запись в таблице. Такое бывает часто. Нужно добавить разрыв в конец таблицы. Был бы подвал в конце таблицы, можно было бы воспользоваться функцией
oBrw:SetNoHoles() // убрать дырку внизу таблицы
Vlad04
постоянный участник
Пост N: 760
Зарегистрирован: 13.10.05
Отправлено: 26.01.18 14:27. Заголовок: Помогло , без подвал..
Помогло , без подвала
Vlad04
постоянный участник
Пост N: 761
Зарегистрирован: 13.10.05
Отправлено: 26.01.18 14:52. Заголовок: Но не во всех случая..
Но не во всех случаях. Помогло добавить
цитата:
DEFINE TBROWSE Br_zaw AT 10, 1 OF o_test ALIAS "test" WIDTH (zox/2)-10 HEIGHT (zoy-150) ON CHANGE {||inkey(0.03),CorrectionFirstLast( Br_zaw )}
Выкинь эту функцию и забудь про неё ! Её дорабатывать нужно, я тоже её использовал, в каких то случаях помогает, в других вообще мешает. Наz советовал её не пользоваться. Делай высоту таблицы на 1-2 пикселя больше чем высота всех отображаемых ячеек. Это SergKis так рекомендует. У меня залипание пропало в таких случаях.
SergKis
постоянный участник
Пост N: 1713
Зарегистрирован: 17.02.12
Отправлено: 26.01.18 15:42. Заголовок: Vlad04 пишет Но не в..
Очень хорошо ! А (3) , что означает ? И вообще, что этот метод делает ?
SergKis
постоянный участник
Пост N: 1714
Зарегистрирован: 17.02.12
Отправлено: 26.01.18 18:38. Заголовок: Vlad04 пишет что это..
Vlad04 пишет
цитата:
что этот метод делает ?
Метод убирает дырку в низу таблицы, распределяя разницу между присутствующими заголовками\подвалами, если их нет, есть только строки, то подправит размер тсб по высоте
METHOD SetNoHoles( nDelta, lSet ) CLASS TSBrowse
LOCAL nH, nK, nHeight, nHole
DEFAULT nDelta := 2, lSet := .T. ...
nDelta := 2 - поправка для расчетов разницы lSet := .F. - рассчитает величину дырки, вернет из метода не меняя размер
// создать 1-ю колонку ADD COLUMN TO oBrw2 HEADER "Номер"+CRLF+"графы" ; DATA FieldWBlock( "ID", Select() ) ; SIZE nWidth1 PICTURE "@Z 999" ; ALIGN DT_CENTER,DT_CENTER,DT_CENTER // создать 2-ю колонку ADD COLUMN TO oBrw2 HEADER "Наименование"+CRLF+"графы в карточке" ; DATA FieldWBlock( "FHEADER", Select() ) ; SIZE nWidth2 ; ALIGN DT_LEFT,DT_CENTER,DT_LEFT // создать 3-ю колонку ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ; DATA FieldWBlock( "VIEW", Select() ) ; SIZE nWidth3 ; CHECKBOX ; // Editing with Check Box ALIGN DT_CENTER, DT_CENTER ; EDITABLE MOVE DT_MOVE_DOWN oBrw2:aColumns[3]:bPrevEdit := {|| CheckField(), TRUE } // проверка до ввода .... // --------- заменяем колонку CHECKBOX на свои картинки --------- oBrw2:aCheck := { LoadImage("CheckT28"), LoadImage("CheckF28") } ....
Таблица не простая, для ID=0 делаются заголовки в таблице цветом и запрет на редактирование. Нужно убрать в таблице показ чекбокса по условию ID=0. Как это сделать ?
Vlad04
постоянный участник
Пост N: 766
Зарегистрирован: 13.10.05
Отправлено: 30.01.18 08:47. Заголовок: if i =3 ADD..
цитата:
if i =3 ADD COLUMN TO Brw_1 DATA {|| iif(Dogovor->Vid > 0,aVidD[Dogovor->Vid],' Нет ' )} .... ...
А попробуй при формировании колонки установить условия показа чекбокса от значения ID. Т.е. вместо показа чекбокса можешь вывести пустое место.
Andrey
постоянный участник
Пост N: 5707
Зарегистрирован: 12.09.06
Отправлено: 30.01.18 10:13. Заголовок: Vlad04 пишет: А поп..
Vlad04 пишет:
цитата:
А попробуй при формировании колонки установить условия показа чекбокса от значения ID. Т.е. вместо показа чекбокса можешь вывести пустое место.
Покажи как:
ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ; DATA FieldWBlock( "VIEW", Select() ) ;
Таблица не простая, для ID=0 делаются заголовки в таблице цветом и запрет на редактирование. Нужно убрать в таблице показ чекбокса по условию ID=0. Как это сделать ?
Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать. Но думаю грязновато работать будет. В смысле работать будет , но с глючком.
Оптимально - в классе дописать возможность ::aCheck назначать блок кода и добавить проверки на hb_isBlock( ::aCheck ). тогда картинки чекбокса можно будет менять на лету , в том числе и задавать NIL
Andrey
постоянный участник
Пост N: 5709
Зарегистрирован: 12.09.06
Отправлено: 30.01.18 15:02. Заголовок: Haz пишет: Не меняя..
Haz пишет:
цитата:
Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать. Но думаю грязновато работать будет. В смысле работать будет , но с глючком.
Это скорее вариант не прямой выборки. Для редактирования ему как до луны. Но это ни в коем случае не упрёк. Как работает блок выборки_записи, все знают со времен клиппера, и допилить - не вопрос. PS. сам часто использую этот прием, ступор иногда возникает при инкрементальном поиске по таким колонкам
Dima
администратор
Пост N: 6712
Зарегистрирован: 17.05.05
Отправлено: 30.01.18 22:43. Заголовок: Haz пишет: Для реда..
//////////////////////////////////////////////////////////// STATIC FUNCTION CheckField() LOCAL cAlias := oBrw2:cAlias // "XLS_HEADER" LOCAL nID := M->oBrw2:nAt // номер строки и номер для поиска LOCAL aMenuHead := aStatMenuPrn[nID] // строка массива меню LOCAL lVal, cNameField := "VIEW"
IF (cAlias)->ID == 0 // выбор здесь не предусмотрен RETURN .F. ENDIF
IF (cAlias)->VIEW == .T. // значит нужно добавить запись в БД:XLS_GALKI SELECT("XLS_GALKI") APPEND BLANK XLS_GALKI->FNN := RECNO() XLS_GALKI->FNAME := (cAlias)->FHEADER XLS_GALKI->FALIAS := aMenuHead[2] XLS_GALKI->FPOLE := aMenuHead[3] XLS_GALKI->FPICT := aMenuHead[4] XLS_GALKI->FTYPE := aMenuHead[5] XLS_GALKI->FKOD := aMenuHead[6] XLS_GALKI->FRECNO := nID // номер записи из XLS_HEADER->ID XLS_GALKI->FLETTER := CHR(64 + XLS_GALKI->FNN ) ELSE // значит нужно удалить запись в БД:XLS_GALKI SELECT("XLS_GALKI") LOCATE FOR XLS_GALKI->FRECNO == nID IF FOUND() DELETE PACK ENDIF DO WHILE !EOF() XLS_GALKI->FNN := RECNO() XLS_GALKI->FLETTER := CHR(64 + XLS_GALKI->FNN ) SKIP ENDDO ENDIF oBrw1:Reset() oBrw1:Refresh(.T.) oBrw2:DrawSelect()
SELECT(cAlias) RETURN .T.
Vlad04
постоянный участник
Пост N: 768
Зарегистрирован: 13.10.05
Отправлено: 31.01.18 07:53. Заголовок: Haz Такую конструкци..
Haz Такую конструкцию использую только для информационных столбцов, прямое редактирование использую для простых таблиц, типа справочник (1-2 колонки), что сложней - в отдельной форме.
Vlad04
постоянный участник
Пост N: 769
Зарегистрирован: 13.10.05
Отправлено: 31.01.18 07:58. Заголовок: А есть примеры много..
А есть примеры многострочных бровсов ? Вариантов может быть несколько: в одной строке - Поле 1 - Поле 2 или - Часть1(Поле 1) - Часть2(Поле 1)
SergKis
постоянный участник
Пост N: 1715
Зарегистрирован: 17.02.12
Отправлено: 31.01.18 09:37. Заголовок: Vlad04 пишет А есть ..
Vlad04 пишет
цитата:
А есть примеры многострочных бровсов ?
сделать пример не сложно Tsb_array_2 demo.prg
STATIC FUNCTION CreateDatos() ... FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + CRLF + "_123", ; // 3 Date() + i, ; // 4 ...
Haz
администратор
Пост N: 1169
Зарегистрирован: 20.02.11
Отправлено: 31.01.18 11:12. Заголовок: SergKis пишет: А ес..
SergKis пишет:
цитата:
А есть примеры многострочных бровсов ?
В примерах есть только вариант с широкими строками , где в ячейке может быть многострочный текст. Такой вариант удобно использовать в виде календарика с событиями , привычно смотрится и можно каждую ячейку развернуть в окно с подробным описанием. Все остальные случаи многострочного бровса можно поделить условно на 2 вида : 1) когда заранее готовятся многострочные данные для скармливания бровсу , это может быть подготовка массива, временной базы или результат SQL запроса к таблице. Получаем многострочность в однострочном бровсе.
2) когда под задачу пишется свой Skipper() и FieldWblock(). Этот путь не простой , но проходимый.
Я использую вариант 1 , нет желания и времени возиться с 2
PS дополню вариант 1 предпочтителен еще и тем что позволяет фильтровать ( срывать подразделы )
Vlad04
постоянный участник
Пост N: 770
Зарегистрирован: 13.10.05
Отправлено: 01.02.18 11:03. Заголовок: Haz В примерах ес..
Haz
цитата:
В примерах есть только вариант с широкими строками , где в ячейке может быть многострочный текст. Такой вариант удобно использовать в виде календарика с событиями , привычно смотрится и можно каждую ячейку развернуть в окно с подробным описанием.
О каких примерах конкретно идёт речь ?
Haz
администратор
Пост N: 1171
Зарегистрирован: 20.02.11
Отправлено: 01.02.18 17:51. Заголовок: Vlad04 пишет: О как..
Vlad04 пишет:
цитата:
О каких примерах конкретно идёт речь ?
О базовом примере MiniGUI\SAMPLES\Advanced\TsBrowse\demo.exe Menu -> Samples on Windows -> Sample 4 -> колонка Address
Andrey
постоянный участник
Пост N: 5718
Зарегистрирован: 12.09.06
Отправлено: 09.02.18 14:27. Заголовок: Всем привет. Использ..
Всем привет. Использую многострочный Tsbrowse (из 2х строк). Всё работает отлично. При экспорте в Эксель высота строк ставиться почему то как одна строка. И приходиться твблицу в Экселе вручную высоту править... Убийственная работа. Нельзя там в исходниках исправить высоту ячеек, сделать её зависимой от высоты таблицы ячеек ?
Vlad04
постоянный участник
Пост N: 775
Зарегистрирован: 13.10.05
Отправлено: 10.02.18 07:15. Заголовок: в Эксель высота стр..
цитата:
в Эксель высота строк ставиться почему то как одна строка.
А у Эксель для данного столбца нельзя ли установить свойство - ПЕРЕНОСИТЬ ПО СЛОВАМ. Тогда Эксель будет сам высоту строк править
Andrey
постоянный участник
Пост N: 5719
Зарегистрирован: 12.09.06
Отправлено: 10.02.18 09:08. Заголовок: Vlad04 пишет: А у Э..
Vlad04 пишет:
цитата:
А у Эксель для данного столбца нельзя ли установить свойство
Я там исходник глянул .... и ничего не понял...
Haz
администратор
Пост N: 1173
Зарегистрирован: 20.02.11
Отправлено: 10.02.18 10:54. Заголовок: Andrey пишет: Я там..
Andrey пишет:
цитата:
Я там исходник глянул .... и ничего не понял...
Надо внимательнее глядеть . Вся запись в методе ::Excel2() идет в так называемом двоичном формате BIFF. Этот формат был основным форматом Excel до 2007 года. Дальше используется Open XML , а BIFF поддерживается только с целью совместимости. Именно с форматом BIFF связаны все ограничения Excel до 2007 года ( одно из них это 65535 строк , но есть много других)
Так вот про внимательность, Excel в методе заполняется в цикле через вызов BiffRec( opCode , ... ), где этот самый opCode - константа Excel по кодам операций ( в инете ссылок полно ). В самой функции BiffRec() отсутствует обработка кода 8 ( код операции ROWHEIGHT ) и 37 ( код операции DEF_ROWHEIGHT). Видимо автору метода она была не нужна. Но это не мешает ее туда добавить самостоятельно. Функция живет в TSColumn.prg и ее содержимое понятно без каких либо тайных знаний.
PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке. В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml. Пишу с мобильного и точно не помню. Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка. И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)
Haz
администратор
Пост N: 1174
Зарегистрирован: 20.02.11
Отправлено: 10.02.18 16:03. Заголовок: PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устар
И в новое сообщение тоже PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке. В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml. Пишу с мобильного и точно не помню. Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка. И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)
Andrey
постоянный участник
Пост N: 5720
Зарегистрирован: 12.09.06
Отправлено: 10.02.18 16:10. Заголовок: Haz пишет: Но это н..
Haz пишет:
цитата:
Но это не мешает ее туда добавить самостоятельно.
* ============================================================================ * FUNCTION BiffRec() Version 9.0 Nov/01/2009 * Excel BIFF record wrappers (Biff2) * ============================================================================
Шаманом себя не считаю, но проблем не вижу. В понед гляну с компа. И прочитай мое последнее сообщение по поводу BIFF
Andrey
постоянный участник
Пост N: 5721
Зарегистрирован: 12.09.06
Отправлено: 10.02.18 17:40. Заголовок: Haz пишет: И вот в ..
Haz пишет:
цитата:
И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)
Очень хочется иметь этот новый класс в исходниках. Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации.
Тестовые примеры выгрузки в Excel из harbour у меня идут отлично
Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай.
Vlad04
постоянный участник
Пост N: 777
Зарегистрирован: 13.10.05
Отправлено: 11.02.18 11:44. Заголовок: из Tsbrows..
из Tsbrows
Haz
администратор
Пост N: 1176
Зарегистрирован: 20.02.11
Отправлено: 11.02.18 12:24. Заголовок: Vlad04 пишет: Это ..
Vlad04 пишет:
цитата:
Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай.
Это не OLE, до 2007 микрософт отстегивал стороннему разработчику за использование xml позже написал свою компоненту. Поддержка xml была и до 2007. Примеры все в исходниках харбура. Знакомся на здоровье, все в свободном доступе. Ссылки на исходники есть в разделе Harbour на этом форуме
Dima
администратор
Пост N: 6723
Зарегистрирован: 17.05.05
Отправлено: 11.02.18 14:34. Заголовок: Andrey пишет: Я так..
Andrey пишет:
цитата:
Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации.
Глянул с компа. Какие шаманы ??? примитив в 4 строки кода
Чтоб ::Excel2 был зависим от высоты строк бровса нужно всего - то 1) перейти по ссылке которую я давал и найти там установку высоты строки по умолчанию увидеть там код команды, ее длину и прочитать про размерность единицы высоты
3) Открыть исходник Excel2() и задать высоту строк по умолчанию по высоте строки бровса ( про размерность по ссылке конечно прочитали - поэтому *20, но мне точнее показалось на 15 )
Отправлено: 12.02.18 14:49. Заголовок: Haz пишет: PS Кто т..
Haz пишет:
цитата:
PS Кто тут увидел шаманов
Да ты шаман ! Можешь у других спросить... Больше тебя и никто и не написал как делать !
Заодно и подскажи как для шапки таблицы такое же сделать ? А то тоже получается всегда в одну строчку !
Haz
администратор
Пост N: 1179
Зарегистрирован: 20.02.11
Отправлено: 12.02.18 14:52. Заголовок: Кому была интересна выгрузка в Excel через XML
Пересобрал библиотеку hbxlsxml.lib под BCC ( в родной с русским есть глюк) и дополнил свой пример Tsb_cursor выгрузкой в Excel по правой кнопке мышь. Это просто пример, как альтернатива BIFF или OLE Цветная раскраска и формулы поддерживается от автора библиотеки.
по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре click here
Заодно и подскажи как для шапки таблицы такое же сделать ? А то тоже получается всегда в одну строчку !
можно перед записью строки заголовков задать высоту по заголовку, а потом перед записью данных задать высоту данных
Andrey
постоянный участник
Пост N: 5724
Зарегистрирован: 12.09.06
Отправлено: 12.02.18 18:08. Заголовок: Haz пишет: по ссылк..
Haz пишет:
цитата:
по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре
Пример понятен. Наверное всё таки тестовый пример нужно отдельно для этого делать, с разными типами полей. Или прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3
Желательно ещё бы сразу в примере задать многострочный Tsbrowse для экспорта. Суперхидер и подвал так же необходим в экспорте. А цвета наверное нужно как то задавать отдельным параметром в ЭКСПОРТ, тира 0-черно/белый, 1-цвет передать с Tsbrowse, 2-задать свои отдельные цвета. Это как предложение по цвету.
прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3
Я продемонстрировал сам механизм использования xmlxls. По которому можно примерно оценить скорость выгрузки 1000 строк и простейшее оформление. Конечно в этом механизме есть и форматы ячеек и формулы и использование цвета, объединения, задавать шрифты и пр. Конечно не все, но многое в нем есть. Сам по себе экспорт бровса в оригинальном виде в Excel, это как полуфабрикат. Выгрузка документа должна быть законченной, включая оформление. Под офомлением я понимаю вид документа, а не слответствие листа в Excel внешнему виду бровса. Оформление должно включать все реквизиты документа, а не только табличку. Сейчас лучшее оформление можно получить через OLE, но скорость оставляет желать лучшего. Понятно что можно выкинуть в олю массив, а потом наряжать лист, так и это не быстро. Наводить красоту можно и через тот же BIFF, но нет библиотеки, а в кодах по спецификации BIFF можно потеряться. В этом плане xmlxls это компромис с хорошей скоростью и возможностью рисовать почти как хочешь. Я на нем сделал несколько отчётов и могу сказать, что это именно альтернатива OLE для рисования на листе Excel.
Теперь что касается выгрузки именно бровса в Excel. Встраивать сам класс в исходники TSBROWS скорее всго не рационально т. к. бровс потребует библиотеку xmlxls для сборки. А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо. Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.
Вопрос, а надо ли из простого экспорта, городить копию бровса?
Нет не надо, надо только 2 позиции: 1) Просто если шапка таблицы (а это часто бывает) состоит из нескольких строк, то при экспорте надо учитывать высоту шапки. 2) Если данные таблицы 2-3 строки, то при экспорте тоже учитываем высоту данных таблицы.
У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту.
Haz
администратор
Пост N: 1184
Зарегистрирован: 20.02.11
Отправлено: 14.02.18 12:11. Заголовок: Andrey пишет: Нет н..
Andrey пишет:
цитата:
Нет не надо, надо только 2 позиции:
В :Excel2() после этого
FWrite( nHandle, BiffRec( 66, GetACP() ) ) FWrite( nHandle, BiffRec( 12 ) ) FWrite( nHandle, BiffRec( 13 ) ) Следующую строку убираем ( если кто то ужк успел ее суда добавить ) // FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 15) )
А После этого ... If bPrintRow != Nil .and. ! Eval( bPrintRow, nRow ) ::Skip( 1 ) Loop EndIf
Добавляем это If nRow == 2 FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 15) ) END
Andrey пишет:
цитата:
У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту.
может кто и порадуется , а по мне это просто способ схалявить на выгрузке таблицы. НУ чтоб юзер отстал , или для себя бумажку распечатать надо. такую выгрузку до ума еще доводить и доводить ( к примеру форматы ячеек ставить "процентный" или "финансовый" или как принято в фин отчетности - все отрицательные числа в скобках ) Проще уж сразу выгружать нормально
Haz
администратор
Пост N: 1185
Зарегистрирован: 20.02.11
Отправлено: 15.02.18 11:53. Заголовок: Использование ::aCheck
для справки;
Обнаружил неприятную особенность :aCheck , при задании в качестве картинки хендла картинки из внешней переменной ( в моём случаи PUBLIC ) , повторный вызов TS картинку уже не показывал . Беглый просмотр кода исходников показал что при дестрое TS , так же дестроятся и эти хендлы. Т.е. закрытие бровса убивало PUBLIC переменные с хендлами картинок.
Из ситуации вышел без изменения исходников , храня хендлы в самом бровсе через
Логично, но не рискнул. При uBmpCell при этом идёт утечка памяти. В aCheck возможно утечка не проявится... тестировать не стал Хотя uBmpCell я вызвал в блоке...
SergKis
постоянный участник
Пост N: 1743
Зарегистрирован: 17.02.12
Отправлено: 15.02.18 21:35. Заголовок: Haz пишет При uBmpC..
Haz пишет
цитата:
При uBmpCell при этом идёт утечка памяти.
Как я понимаю, uBmpCell это полностью собственное управление, сам поставил, сам снял\освободил. Остальные свойства доводились "до кондиции"Скрытый текст
т.е. в тек. версии утечка есть при oBrw:aBitMaps := {LoadImage(...), ...} на колонках утечки нет
Возможно и а текущей не будет утечки если aBitMaps задавать массивом. Внутренние переменные бровса убьются сборщиком мусора после дестроя самого бровса. А во время работы бровса новые объекты не создаются. В моем же случае было uBmpCell := {¦¦ if( lFllag, Loadimage(), nil)} тоесть при навигации бровса постоянно создаётся новый хендл картинки, не уничтожая старый. GdiPlus при навигации показал утечки. Обнаружил проблему Дима, у него пользователь от скуки гонял курсор вверх вниз и брос падал. С дестроем в твой версии все понятно. Непривычно само поведение - кормишь бровсу переменную, а он ее убивает. Этот момент нужно учитывать. У меня маленькая статусная картинка используется в нескольких модулях и в каждом бровсе, я ее определил в паблик переменной при старте программы сслаюсь на нее везде. т. е. LoadImage() делал один раз. Поскольку aCheck практически не использовал то проблем не видел. Будем считать это особеннстью бровса.
SergKis
постоянный участник
Пост N: 1745
Зарегистрирован: 17.02.12
Отправлено: 16.02.18 10:26. Заголовок: Haz пишет В моем же ..
Haz пишет
цитата:
В моем же случае было uBmpCell := {¦¦ if( lFllag, Loadimage(), nil)}
Это скорее недосмотр кода, т.к. именно для oCol:uBmpCell можно использовать PUBLIC\PRIVATE переменные, т.е. oCol:uBmpCell := {¦¦ if( lFllag, m->hPicture1, nil)} или из массива брать handle image
цитата:
Будем считать это особеннстью бровса
Пара LoadImage() -> DeleteObject() для aChecк, aMitMaps как особенность тсб, просто надо учитывать, а усилить поведение, при необходимости, всегда можно, к примеру :aCheck := { 'PICTURE1', Nil } - будет внутри делать LoadImage('PICTURE1') и DeleteObject() при Dectroy() :aCheck := { hPicture1, Nil } - не будет делать ни LoadImage() ни DeleteObject() при Dectroy() для :aBitMaps аналогично. Надо ли ?
aChecк, aMitMaps как особенность тсб, просто надо учитывать
я про это же . Пока сам не наткнешься- не поймешь )
gfilatov2002
moderator
Пост N: 1238
Зарегистрирован: 11.02.10
Отправлено: 16.02.18 13:31. Заголовок: SergKis пишет: В мо..
SergKis пишет:
цитата:
В моей версии еще такие строки в методе Destroy():
Благодарю за исправление Добавил его в текущий код.
Кстати, уже готов RC 3 для новой сборки. Кратко, что нового см. ниже Скрытый текст
- The RadioGroup control supports an optional AUTOSIZE clause.
- The Report Generator by Roberto Lopez was moved to MiniGUI core.
- Added the command CHECK TYPE [ SOFT ] <var1> AS <type1> [ , <var2> AS <type2> [ , <varN> AS <typeN> ] ] (synchronized with Official HMG).
- The function HttpConnect was modified to use TUrl and TIpClientHttp classes.
- Updated and improved the following libraries: TSBrowse, HbNetIO, SddODBC.
- Updated Harbour Compiler 3.2.0dev to a latest Git-version.
- Added the new interesting samples and updated some Advanced samples.
Andrey
постоянный участник
Пост N: 5731
Зарегистрирован: 12.09.06
Отправлено: 20.02.18 12:38. Заголовок: Haz пишет: А вот от..
Haz пишет:
цитата:
А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо. Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.
Сделал отдельный пример. Отправил на почту. Ждем что выйдет из под руки мастера !
Григорий, мне пришло Андрей хочет выгрузку в Excel из бровса в формате XML увидеть. Я так вывожу отчёты из программ. Качество оформления как OLE, скорость выгрузки как BIFF
gfilatov2002
moderator
Пост N: 1244
Зарегистрирован: 11.02.10
Отправлено: 20.02.18 23:17. Заголовок: Haz пишет: мне приш..
Haz пишет:
цитата:
мне пришло
Понял, буду ждать от Вас выгрузку в Excel из бровса в формате XML
Сделал отдельный пример. Отправил на почту. Ждем что выйде
Андрей, скинул на почту.
Для справки : Под выгрузку немного допиливал библиотеку hbxlsxml, в оригинальной косяки с русским языком и многострочными ячейками в Excel. Библиотека не секрет , могу выложить все исходники.
Теперь немного про особенности XML выгрузки . Для выгрузки необходимо сначала определить все возможные форматы ячеек , которые будут на листе экселя. И в момент экспорта ссылаться на них, в примере это видно. Сама выгрузка должна идти заполнением листа сверху - вниз и слева - направо т.е сначала первая строка , потом вторая и так далее , вернуться на первую уже нельзя ( тоже и по колонкам )
И наконец выгрузка бровса - частный случай. Я рисую морду отчету и гружу из DBF
ЗЫ В примере не стал трогать Excel3() , которую подправил Сергей, а написал Brw2Xml и вставил ее вызов.
1) Заголовок таблицы - косяк: размер фонта не тот.
FUNC Brw2xml( oBrw, cFile, lActivate, hProgress, cTitle ) нужно как сейчас в библиотеке: Excel2( cFile, lActivate, hProgress, aTitle, lSave, bPrintRow ), где aTitle := { cTitle, hFont } // титул со своим фонтом из-за этого я и сделал похожую функцию: Excel3Xml( oBrw, cFile, lActivate, aTitle, lSave ), где aTitle := { cTitle, hFont } // титул со своим фонтом
2) Суперхидера в экспорте НЕТ ! 3) Формат вывода 6-ой колонки не соответствует Tsbrowse 4) Далее нет цветового оформления. Т.е. нужно бы сделать цвета таблицы полностью как в Tsbrowse. Возможно ли такое сделать ? А так - классно получилось !
Haz пишет:
цитата:
Библиотека не секрет , могу выложить все исходники.
Это наверное тоже нужно добавить в проект. Пускай Григорий папку отдельно сделает, чтобы были исходники, откуда плясать можно всем.
P.S. Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи !
Я его и не делал, все для этого есть. Как задать шрифт видно из примера по хидеру и футеру. Опрелить стиль для заголовка дело 3 минут. То же и суперхидер, сделать можно, но зачем? Задачу воспроизводства бровса в Excel один в один, решить то можно, только кому она нужна? Более востребованы быстрые выгрузки в Excel, тем более оформленные как отчёты.
Andrey пишет:
цитата:
Формат вывода 6-ой колонки не соответствует Tsbrowse
Форматы все задаются в функции XMLSetDefault(), специально задал только 2. Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение. Andrey пишет:
цитата:
Далее нет цветового оформления. Т.е. нужно бы сделать цвета таблицы полностью как в Tsbrowse. Возможно ли такое сделать ?
Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру. Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета.
PS Andrey пишет:
цитата:
Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи !
Там правка только карго касается, не гонюсь сразу обновряться, т. к. некоторые библиотеки харбура приходится обновлять (в поставке они старые) Да и сюрпризы в отлаженном коде после обновлений иногда бывают. Обновляюсь когда есть время на ловлю блох в своих проектах после обновлений.
Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример? PS сегодня, внесу мелкие правки
Andrey
постоянный участник
Пост N: 5734
Зарегистрирован: 12.09.06
Отправлено: 22.02.18 13:10. Заголовок: Haz пишет: Ну и гла..
Haz пишет:
цитата:
Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример?
Григорию отправлю пример, как сделаем.
Haz пишет:
цитата:
Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру. Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета.
Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел. Чтобы потом можно было делать на базе этого свою раскраску отчёта. А выгрузка через Excel2() ограничена, из-за чего я и ухватился за твой пример.
Haz пишет:
цитата:
Форматы все задаются в функции XMLSetDefault(), специально задал только 2. Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение.
Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле. Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку.
Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле. Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку.
Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел. Чтобы потом можно было делать на базе этого свою раскраску отчёта.
в примере шапка и так красится, что касается отрицательных чисел , то это задается теми же форматами Excel к примеру так "# ##0,00_ ;[Красный]-# ##0,00\ " на числовой колонке
PS Проверил. Точнее так
XmlSetDefault( oBrw ) // Можно значения по умолчанию переопределять oBrw:aColumns[6]:XML_Format := "00\:00\:00" oBrw:aColumns[9]:XML_Format := "0.00_ ;[Red]\-0.00\ "
Отправлено: 22.02.18 13:32. Заголовок: Haz пишет: А выгруз..
Haz пишет:
цитата:
А выгрузка через Excel2() ограничена
На самом деле если бы была нормальная спецификация пл BIFF2(4) , то выгрузка Excel2() довольно легко дополняется. Видел только англоязычную где то, да и с примерами по BIFF очень скудно.
Andrey
постоянный участник
Пост N: 5735
Зарегистрирован: 12.09.06
Отправлено: 22.02.18 13:53. Заголовок: Haz пишет: в пример..
Отправлено: 22.02.18 14:07. Заголовок: Dima пишет: Не она ..
Dima пишет:
цитата:
Не она ?
Это видел, кто возьмется перевести на "великий и могучий" ?
Andrey
постоянный участник
Пост N: 5736
Зарегистрирован: 12.09.06
Отправлено: 22.02.18 14:26. Заголовок: Я поставил для супер..
Я поставил для суперхидера, шапки и подвала: oStyle:bgColor( '#' + NToC(CLR_HGRAY, 16) ) // only Excel 2003 Пример получился классным. При смене таблицы на одну строку: #define MULTILINE_TSB .F. , то же экспортирует классно.
Остался ОДНА проблема касающаяся METHOD Excel2(). При использовании колонки в Tsbrowse числового формата "@R 99:99:99", то при экспорте всегда лезет такая ошибка:
И колонка остаётся без формата.
Я сделал 6-ю колонку специально для тестирования. Можно как нибудь убрать/починить этот формат для METHOD Excel2() ?
Можно как нибудь убрать/починить этот формат для METHOD Excel2() ?
или полностью переделывать , то есть все предустановки выносить из Excel2() и назначать до экспорта ( у меня для этого служит XMLSetDefault() и переопределения перед экспортом) или навсегда вшивать этот ( никому не нужный формат ) в исходник Excel2(). Сам формат можно подсмотреть у меня в выгрузке.
Andrey
постоянный участник
Пост N: 5737
Зарегистрирован: 12.09.06
Отправлено: 22.02.18 15:45. Заголовок: Haz пишет: или навс..
Haz пишет:
цитата:
или навсегда вшивать этот ( никому не нужный формат ) в исходник Excel2().
Хотя бы так или сделать определение этого формата до вызова Excel2(), как ты сделал у себя:
XmlSetDefault( oBrw ) // Можно значения по умолчанию переопределять oBrw:aColumns[6]:XML_Format := "00\:00\:00" oBrw:aColumns[9]:XML_Format := "0.00_ ;[Red]\-0.00\ "
Наверное ещё что-то нужно сделать, чтобы применить цвет к этой ячейке ?
Стиль нужно определить заранее. С блоками скорее в два прохода придётся. Сначала анализируем весь бровс на возможные форматы по цвету, шрифту и пр. На основе анализа формируем все эти форматы, а потом, при выводе бровса в зависимости от результата блока выбираем нужный формат. Excel читает XML построчно. К момену вывода ячейки формат должен быть определен Из примера куска кода не ясно где он расположен в тексте Ps почитал выше, тут не сработает. Тут идёт вывод и форматы уже определены ранее. Андрей, ты зациклен на воспроизводстве внешнего вида бровса. Либо заранее опрелить цвет которам ты будешь рисовать. Либо взять цвет из каждой ячейки при первомпроходе, сформитовать форматы запомнив координаты. А при выводе брать по координатам. Я же сторонник того, что копия бровса в Excel никому не нужна. Достаточно вывести данные в читаемом и оформленном виде, для маньков путь анализа бровса. Другим способом можно назвать условное ворматирование Excel, но там тоже все не само появится, и нужно как минимум знать как написать условный формат.
Andrey
постоянный участник
Пост N: 5739
Зарегистрирован: 12.09.06
Отправлено: 22.02.18 21:01. Заголовок: Haz пишет: Из приме..
Haz пишет:
цитата:
Из примера куска кода не ясно где он расположен в тексте
Я же сторонник того, что копия бровса в Excel никому не нужна. Достаточно вывести данные в читаемом и оформленном виде, для маньков путь анализа бровса.
Согласен, просто хотелось бы иметь просто пример как это делается (оформление цветами). В качестве примера и сделал меню для повтора цветов:
MENUITEM 'color table white ' ACTION nTsbColor := 1 FONT Font1 MENUITEM 'color table gray ' ACTION nTsbColor := 2 FONT Font1 MENUITEM 'color of the table "ruler"' ACTION nTsbColor := 3 FONT Font1 MENUITEM 'color of the table "columns"' ACTION nTsbColor := 4 FONT Font1 MENUITEM 'color of the table "chess"' ACTION nTsbColor := 5 FONT Font1
Вот я решил сделать цвета в xml и не могу с ходу. Для этого нужно разбираться. А что за пример в котором не показано как можно сделать ! И не маньяк я, а хочу иметь в качестве примера - как нужно правильно делать, а не методом тыка работает/не работает. Т.е. отдельно написать: // секция для цветового оформления таблицы. Шапку, суперхидер и подвал как заполнять цветом уже понятно, осталось только саму таблицу покрасить.
Haz
администратор
Пост N: 1203
Зарегистрирован: 20.02.11
Отправлено: 22.02.18 21:14. Заголовок: Andrey пишет: Вот я..
Andrey пишет:
цитата:
Вот я решил сделать цвета в xml и не могу с ходу. Для этого нужно разбираться.
Определить стиль перед выводом заранее. При выводе указать каким стилем. Ты же пытаешься во время вывода ячеек бровса сунуть цвет непонятно какому стилю. Это как раскраски, хочу фигурку закрасить желтым, беру жёлтый фломастер каторый уже заранее преготовлен. Я же не просто так говорил про варианты : 1 выбирать заранее определенные стили - условные цвета вывода 2 попытаться при прогоне по бровсу сформировать все комбинации цвет, шрифт, рамка, выравнивание. Опрелить их как стили с привязкой к координатам ячейки и при выводе бровса брать эти стили 3 тоже что и 2 но использовать условное форматирование. Мне не сложно еще раз повторить, что Excel читает XML сверху вниз и слева направо. То есть сначала раскладываем фломастеры и их уже не меняем. Потом рисуем тем что разложили. Реализация динамической раскраски начинается с вопроса, а какие фломастеры потребуются.
Ну уж если совсем по простому То обрати внимание что цвет шапки и подвала задаётся в соответствуюших местах кода под коментарием ОПРЕДЕЛЯЕМ СТИЛИ ШАПКИ и ОПРЕДЕЛЯЕМ СТИЛИ ПОДВАЛА. Там же есть и комментарий ОПРЕДЕЛЯЕМ СТИЛИ КОЛОНОК, вот туда свой цвет и пихай. И учти каждый стиль одного цвета, нужен другой цвет - определяй новый стиль.
Andrey
постоянный участник
Пост N: 5742
Зарегистрирован: 12.09.06
Отправлено: 01.03.18 13:34. Заголовок: Haz пишет: На самом..
Haz пишет:
цитата:
На самом деле если бы была нормальная спецификация пл BIFF2(4) , то выгрузка Excel2() довольно легко дополняется. Видел только англоязычную где то, да и с примерами по BIFF очень скудно.
Пример MiniGUI\SAMPLES\Advanced\Tsb_Brw2xml из последней версии МиниГуии - классный получился ! Спасибо Haz ! Экспорт для Excel2() для нескольких строк - то что нужно ! Даже наверное шрифты можно не уменьшать. Но да ладно, пускай остаются в качестве примера, как можно делать. Единственно что не хватает в экспорте для Excel2() рамок в ячейках таблицы. В шапке и подвале таблицы рамки есть, а на ячейках нет ! Можно это как то подправить ?
Единственно что не хватает в экспорте для Excel2() рамок в ячейках таблицы. В шапке и подвале таблицы рамки есть, а на ячейках нет ! Можно это как то подправить ?
Отправлено: 12.03.18 22:36. Заголовок: Прикрутил к этому же..
Прикрутил к этому же проекту ещё один экспорт, через ОЛЮ ! 1) Для одной строки всё прекрасно работает, для многострочных строк нет ! 2) Как задать титул перед шапкой определённым фонтом (также, как для нового oBrw:Excel2() ) ? Как бы исправить исходники ? Проект вот тут - https://cloud.mail.ru/public/JNeH/xGmMBvmVD
Почему не работает в методе oBrw:ExcelOle( cXlsFile, ....) следующее назначение ?
If ! Empty( cXlsFile ) //cXlsFile := AllTrim( StrTran( Upper( cXlsFile ), ".XLS" ) ) поставил // EndIf
Перестало обрезать ! И убрался только верхний регистр ! То что нужно ! Григорий, убери пожалуйста в исходниках эту строку. Или замени её как нужно, для следующих версий МиниГуи ! Заранее спасибо !
Предлагаю новый метод для tsb, для растяжки нескольких колонок до размера тсб по ширине. ..... Использование при ширине tsb > ширины колонок :AdjColumns() - все колонки :AdjColumns({"NAME", "SUMMA"}) - указанные колонки по cName :AdjColumns({3, 4, 5}) - указанные колонки по номеру
А нормально будет работать ? Я при включении предыдущего метода на примере Tsb_Config.prg
oBrw:nAdjColumn := 2 // stretch column 2 to fill the voids in the right Tbrowse
имел хороший баг при изменении ширины окна ! Григорий помог его решить через:
// repartition column 2 (1 + 1 -SELECTOR) - otherwise buggy oBrw:bInit := {|| oBrw:SetColSize( 2, nWidthFirstColumn )} .... ////////////////////////////////////////////////////////////////// FUNCTION ResizeBrowse() .... Eval(oBrw:bInit) // read the second column of the table ...
SergKis
постоянный участник
Пост N: 1787
Зарегистрирован: 17.02.12
Отправлено: 21.03.18 10:52. Заголовок: Andrey пишет А норма..
Andrey пишет
цитата:
А нормально будет работать ? Я при включении предыдущего метода на примере Tsb_Config.prg oBrw:nAdjColumn := 2
SergKis пишет
цитата:
Использование при ширине tsb > ширины колонок
т.е. ты вызываешь метод так (др. вариантов не предполагал пока)
:AdjColumns({3, 4, 5}) // или :AdjColumns()
END TBROWSE
oRpt:SetNoHoles()
возможно при увеличении окна и размера тсб, тоже сработает, если вызвать. Можешь пробовать libу кинул
Отправлено: 22.03.18 20:01. Заголовок: Andrey пишет Погонял..
Andrey пишет
цитата:
Погонял... Не работает...
SergKis пишет
цитата:
:AdjColumns({3, 4, 5}) // или :AdjColumns()
END TBROWSE
а у тебя
:lLockFreeze := .T. // избегать прорисовки курсора на замороженных столбцах :AdjColumns() // растяжка колонок до размера тсб по ширине ... :GetColumn("Name_8"):lEdit := .T.
:HideColumns( {10} ,.t.) // скрыть колонки
TsbColor( oBrw ) // задание цветов таблицы ... т.е. сначала разместили по ширине колонки, потом скрыли. ЗАМЕЧАТЕЛЬНО Убрал в самый низ ... :AdjColumns() // растяжка колонок до размера тсб по ширине
Отправлено: 23.03.18 15:35. Заголовок: Сделал пример ! Tsb ..
Сделал пример ! Tsb кладу на уже готовую форму в другом модуле. Всё показывает нормально, кроме вертикального скролинга. Должен быть, а не показывает при старте. Если стрелками(мышкой) подёргать, то линия скролинга появляется... обгрызанная, без стрелки вверху и внизу. Можно ли как то перерисовать весь вертикальный скролинг ?
Andrey
постоянный участник
Пост N: 5827
Зарегистрирован: 12.09.06
Отправлено: 19.04.18 11:36. Заголовок: Новая версия МиниГуи..
Новая версия МиниГуи - 18.04 Метод oBrw:ExcelOle(). При экспорте в таблице столбец с номерами домов (примерно такой порядок: 1, 2, 5, 9/2 и т.д.) неправильно экспортирует. Превращает этот столбец в 1,2,5, 09 февраля. Григорий, я сделаю тестовый пример с этим и вышлю на почту.
Andrey
постоянный участник
Пост N: 5829
Зарегистрирован: 12.09.06
Отправлено: 19.04.18 23:03. Заголовок: Как указать правильн..
Как указать правильно формат показа в Tsbrowse для текстового поля (значения "123300") по шаблону "@R 99:99:99" ? Для числового поля показ идёт правильный, а как задать такой же шаблон для текстового поля ?
Если создаём aPict := { nil, nil, nil, nil, nil, "@R 99:99:99", nil } и передаём в
Отправлено: 20.04.18 00:17. Заголовок: Andrey пишет Опять г..
Andrey пишет
цитата:
Опять глюк нашёл в Tsb ?
Это от того, что игнорируешь исходники. :SetArrayTo не обрабатывает сложные Picture, а делает расчет ширины колонок для размещения правильно данных header, строк, footer (что бы помещалось все в колонке при просмотре), превращая Picture в простой вид для строки к примеру cPict := Replicate( "X", Len( ::aDefValue[ nI ] ) ). Все что не устраивает, в полученном варианте, правишь сам после создания тсб.
К примеру, в массиве в колонке мах длина всех элементов 20 символов, но в процессе работы может быть 30 длина, тогда можешь регулировать колонкой задав ширину в пикселях или задав aPict[6] := repl('X', 30), ::aDefValue[ 6 ], будет от заданного aPict[6].
Andrey
постоянный участник
Пост N: 5833
Зарегистрирован: 12.09.06
Отправлено: 21.04.18 20:07. Заголовок: Предложение по METHO..
Предложение по METHOD Excel2() - сделать как у METHOD ExcelOle() в самом конце метода:
// Check the file name for the number of points If AtNum( ".", HB_FNameName( cFile ) ) > 0 cMsg := 'Calling from: ' + ProcName(0) + '(' + hb_ntos( ProcLine(0) ) cMsg += ') --> ' + ProcFile(0) + ';;' cMsg += 'Output File Name - "' + HB_FNameName( cFile ) + '";' cMsg += 'contains several signs dot !;' cMsg += 'Excel can "truncate" the file name !;;' cMsg := AtRepl( ";", cMsg, CRLF ) MsgStop( cMsg , "Error" ) Endif
If ::lSelector
Только это обязательно нужно сделать, я ОЧЕНЬ ДОЛГО не мог понять почему у меня режет имя файла, а на некоторых компах нет ! Чтобы потом другим было легче это понять !!!
Если в имени файла использовать несколько точек, то САМ EXCEL "режет" имя файла. Можно конечно сделать немного по другому: переименовать входящее имя файла, но тогда нужно будет потом закрывать Ole-Эксель, и открывать его заново с переименованным файлом. Не очень красивое решение здесь для Экселя. Этот вариант сделал для Экспорта Dbf-файла.
Поддержу Андрея. По первому предложению лишним не будет. В принципе хорошийстиль за собой все проводить в исходное состояние. По второму думаю все сложнее, проблема может быть не только в количестве точек. Как вариант - может сообщать о недопустимости такого имени файла, а со временем критерии могут быть расширены.
SergKis
постоянный участник
Пост N: 1807
Зарегистрирован: 17.02.12
Отправлено: 22.04.18 00:34. Заголовок: Andrey пишет If AtNu..
Andrey пишет
цитата:
If AtNum( ".", HB_FNameName( cFile ) ) > 0 ...
Не уверен, скорее уверен, что этого в ExelOle делать не надо. Как пишет Игорь варианты возможны разные, все не засунешь, да и процедура ExelOle вызывается где то, вот там как надо и лепим имя файла, если очень надо, то и excel можно запустить отдельно не в ExcelOle. Второе предложение это перегруз
процедура ExelOle вызывается где то, вот там как надо и лепим имя файла, если очень надо, то и excel можно запустить отдельно не в ExcelOle. Второе предложение это перегруз
Я проверял поведение Excel. Имя файла с несколькими точками - режется ТОЛЬКО при вызове через OLE ! Если делать вызов Excel по другому, то всё нормально. Меню экспорта 1 и 3 в программе работает нормально.
В конце метода ExcelOle() вызов экселя запускается НЕ ОТДЕЛЬНО !!!
If ! Empty( cXlsFile ) .and. lSave oBook:SaveAs( cXlsFile, xlWorkbookNormal ) // вот здесь и режется...
If ! lActivate CursorArrow() oExcel:Quit() ::Reset() Return Nil EndIf EndIf
Из-за этого я и предлагаю для ЭТОГО варианта разместить предупреждения, чтобы потом кто-то не налетел на ! Я Григория замучил - что режется имя файла, месяца 2 не мог понять почему. А решение оказывается совсем ПРОСТОЕ !
PSP
постоянный участник
Пост N: 1404
Зарегистрирован: 27.01.07
Отправлено: 22.04.18 20:14. Заголовок: Андрей, нужно абстра..
Андрей, нужно абстрагироваться от конкретного случая. Все обработки вариантов нужно делать "до того, как". Методу нужно предоставить данные в том виде, в котором они будут на 100% обработаны предсказуемым образом без всяких MsgStop(...)
Dima
администратор
Пост N: 6817
Зарегистрирован: 17.05.05
Отправлено: 22.04.18 21:24. Заголовок: PSP +1..
PSP +1
Haz
администратор
Пост N: 1229
Зарегистрирован: 20.02.11
Отправлено: 23.04.18 20:38. Заголовок: PSP пишет: Все обра..
PSP пишет:
цитата:
Все обработки вариантов нужно делать "до того, как"
+500 Под конкретный случай, нужно конкретно и решать
Новая версия МиниГуи - 18.04 Метод oBrw:ExcelOle(). При экспорте в таблице столбец с номерами домов (примерно такой порядок: 1, 2, 5, 9/2 и т.д.) неправильно экспортирует. Превращает этот столбец в 1,2,5, 09 февраля.
А как это исправить ? В методе :Excel2(...) выгрузка идёт правильно.
Пробовал задавать явно формат столбца, всё равно не помогает.
// только для 6 и 10 колонки oBrw:aColumns[6]:cPicture := '@R 99:99:99' // без этого нет показа в колонке ":" oBrw:aColumns[10]:cPicture := 'xxxxxxxxx'
Отправлено: 24.04.18 21:28. Заголовок: Спасибо Дима ! Не по..
Спасибо Дима ! Не получается... добавить перед числом апостроф (‘). Например: ’11-53 или ‘1/47. Апостроф не отображается после нажатия клавиши ВВОД; Поставил в колонке 10 апостроф (‘) - выгружате через Оле-Эксель так же ‘3/2 или ‘9/3 Конечно как самый примитив пойдёт, только юзера будут очень недовольны таким номером дома... Можно сделать первым символом знак "_" или "~" ставить. Но потом бы из документа этот знак желательно убрать... Тогда нужно ставить обработку удаления, после вставки из буфера...
А лучше надо бы в конвертацию формата для текстового поля явно в исходниках указать, типа:
oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка
Пытался разобраться сaм, ничего не понял... Там идёт накопление в буфер, а потом идёт вставка из буфера. Как до этого указать формат столбца не знаю.
Andrey
постоянный участник
Пост N: 5839
Зарегистрирован: 12.09.06
Отправлено: 24.04.18 22:13. Заголовок: Ура ! Получилось... ..
Ура ! Получилось... Нужна правка в исходнике h_tbrowse.prg:
For nCol := 1 To Len( ::aColumns ) If aColSel != Nil .and. AScan( aColSel, nCol ) == 0 Loop EndIf
uData := Eval( ::aColumns[ nCol ]:bData )
If ValType( uData ) == "C" oSheet:Cells( nLine, nCol ):SET( "NumberFormat", '@' ) // text cell EndIf
Может не сработать в ряде случаев когда много цифр в ячейке и Excel по своему покажет
Andrey
постоянный участник
Пост N: 5840
Зарегистрирован: 12.09.06
Отправлено: 25.04.18 13:27. Заголовок: Dima пишет: Может н..
Dima пишет:
цитата:
Может не сработать в ряде случаев когда много цифр в ячейке и Excel по своему покажет
В каких случаях ? Я тестировал столбец из номеров домов - вида: 1,2,3/2, 4, 5/3, 6А, 112Б, 94 стр.3 и т.д. ТОЛЬКО для текстового столбца делаю формат :SET( "NumberFormat", '@' ) // text cell Остальные столбцы НЕ ТРОГАЮ.
Dima
администратор
Пост N: 6820
Зарегистрирован: 17.05.05
Отправлено: 25.04.18 13:43. Заголовок: Andrey пишет: В как..
Andrey пишет:
цитата:
В каких случаях ?
Да был случай лет 5 назад , вываливал в Excel коды морозильных камер (штук 500 примерно) В этих кодах были цифры , пробелы , точки и тире. Все коды разные. Из 500 штук , штуки 3 всегда показывало криво , и шаблон подобрать не удалось (руками тоже пробовали) .
PS Это был файл формата CSV
Andrey
постоянный участник
Пост N: 5843
Зарегистрирован: 12.09.06
Отправлено: 26.04.18 07:37. Заголовок: Возвращаюсь опять к ..
Возвращаюсь опять к методу ExcelOle(). При вызов экселя, он запускается, а потом уходит на второй план, т.е. под задачу. У всех так происходит ? Или это только у меня так, из-за Far. Если у всех, то надо бы Эксель на передний план ВСЕГДА переключать. Или ключ ввести для перевода. У кого какие будут соображения ?
Andrey
постоянный участник
Пост N: 5846
Зарегистрирован: 12.09.06
Отправлено: 26.04.18 17:53. Заголовок: Предложение по METHO..
Предложение по METHOD Excel2() - сделать задержку, чтобы бегунок показывался на экране нормально, это в конце метода:
If ! Empty( aRepl ) For nCol := 1 To Len( aRepl ) oSheet:Columns( Chr( 64 + aRepl[ nCol ] ) ):WrapText := .T. Next EndIf
Поясню почему. Если в примере нужно убрать показ суперхидера, то можно назначит ему высоту 1 пиксел. И исходники пересматривать не придётся. Но если у нас суперхидер есть в 1 пиксел, то ! Empty( ::aSuperHead ) выдаст что суперхидер есть и сделает экспорт его на лист Экселя. А If (::lDrawSuperHd) позволит этого избежать.
сделать задержку, чтобы бегунок показывался на экране нормально
Тормозить программу специально? Ради красоты бегунка Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100 То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую.
Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100 То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую.
А как надо правильно ? Подправь пожалуйста исходник, а то в методе :Excel2() нормально рисуется бегунок, а в методе :ExcelOle() - огрызок какой-то.
Andrey
постоянный участник
Пост N: 5848
Зарегистрирован: 12.09.06
Отправлено: 27.04.18 07:26. Заголовок: И ещё одна странност..
И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы ! Там же есть вроде в тексте:
Предложение по METHOD Excel2() - сделать задержку,
Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle() Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents() В конце метода nCount == nTotal ?? при выводе этого
Отправлено: 27.04.18 21:14. Заголовок: Haz пишет: Ты уж оп..
Haz пишет:
цитата:
Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle() Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents()
Да точно, перепутал я. Понял насчёт Sysrefresh() или DoEvents(). Но остальной код я тоже не понимаю, зачем так сделано: nCount -= 15 и т.д. - для меня загадка... Напиши пожалуйста как правильно сделать, а Григорий уже исправит исходники !
И как насчёт подвала таблицы, почему нет в экселе её ?
Haz
администратор
Пост N: 1233
Зарегистрирован: 20.02.11
Отправлено: 28.04.18 11:21. Заголовок: Andrey пишет: И ещ..
Andrey пишет:
цитата:
И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы !
В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml Ищи где намудрил с исходниками
Andrey
постоянный участник
Пост N: 5852
Зарегистрирован: 12.09.06
Отправлено: 28.04.18 12:06. Заголовок: Haz пишет: В версии..
Haz пишет:
цитата:
В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml
Я понял в чём дело. Если увеличить таблицу то 1000 элементов, то подвал в таблице пропадает ! Я пробовал на версии 18.03 - тоже нет подвала.
Сделал в версии 18.04 кол-во строк 240, подвал есть. На 250 строках подвала уже нет и вот такая таблица получается:
Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ? Смотреть последний проект - Tsb_Export8d.7z
Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ?
А ерундит счетчик строк в алгоритме, на твоей картинке ясно виден разрыв ( пустая строка ) и после нее еще 5 строк. Если в примере общее число строк уменьшить на 5 , то разрыв исчезнет и подвал появится. Скорее всего из-за разрыва подвал затирается. Так что ищи причину разрыва, подвал - это следствие
Haz
администратор
Пост N: 1235
Зарегистрирован: 20.02.11
Отправлено: 28.04.18 12:32. Заголовок: Добавлю чуть. В теку..
Добавлю чуть. В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к
Andrey
постоянный участник
Пост N: 5853
Зарегистрирован: 12.09.06
Отправлено: 28.04.18 13:35. Заголовок: Haz пишет: В текуще..
Haz пишет:
цитата:
В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к
А можно сделать замену этой текущей реализации для всех ? Я этого сам не осилю.
Haz
администратор
Пост N: 1236
Зарегистрирован: 20.02.11
Отправлено: 28.04.18 14:10. Заголовок: Andrey пишет: Я это..
Никак не могу понять почему зависает следующий код Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet Следующий код при выборе кнопки записывает слово "Test" в поле, но только в первый раз, во второй раз бровс зависает
после этого можно перейти на использование класса win_oleAuto из библиотеки hbwin, заменив строку
oExcel := CreateObject( "Excel.Application" )
на
win_oleCreateObject( "Excel.Application" )
Используя класс win_oleAuto, можно вместо передачи через буфер обмена передавать в Excel всю таблице одним вызовом __oleVariantNew() В принципе передача через буфер обмена фрагментами по 20к тоже работает быстро, но можно и делать это прямой записью.
SergKis
постоянный участник
Пост N: 1808
Зарегистрирован: 17.02.12
Отправлено: 07.05.18 16:50. Заголовок: Haz пишет Следующий ..
Haz пишет
цитата:
Следующий код при выборе кнопки записывает слово "Test" в поле, но только в первый раз, во второй раз бровс зависает
работает не виснет. Игорь, наверно, примерчик нужен
Сергей, спасибо. Пока обошелся решив по другому. Сейчас не до примерчиков, позже сделаю обязательно ( может дома подготовлю и то не уверен ) ! Тащу два объемных проекта, даже тараканов в них давить некогда. Нужно сдать ! После сдачи видимо будет период оптимизации кода и украшательства. Вот там примерчики начнутся.
Haz
администратор
Пост N: 1239
Зарегистрирован: 20.02.11
Отправлено: 11.05.18 10:42. Заголовок: Сергей работает не ..
Сергей
цитата:
работает не виснет.
Вобщем это я тупанул. Работает конечно при чистом запуске. Я пользуюсь для сборки проектов фришным редактором от Xailer ( xEdit ) Этот редактор , при запуске проекта на исполнение , пытается управлять приложением ( пытается использовать отладку, показать значения переменных, ресурсов и пр.) Возможно и можно его прикрутить как отладчик, но я не пользуюсь. Так вот, при запуске из под редактора , кнопка эта вешает задачу, при запуске нормальном - все ок. Знал же, раньше натыкался и все выяснил. Но время прошло и за неиспользованием этого функционала все забыл ((. Пол дня потратил на старые грабли
gfilatov2002
moderator
Пост N: 1276
Зарегистрирован: 11.02.10
Отправлено: 11.05.18 13:05. Заголовок: Pasha пишет: для на..
Pasha пишет:
цитата:
для начала можно убрать некоторые рудименты
Благодарю за помощь!
Выполнил предложенные правки
цитата:
Используя класс win_oleAuto
для следующей сборки
SergKis
постоянный участник
Пост N: 1809
Зарегистрирован: 17.02.12
Отправлено: 11.05.18 18:34. Заголовок: Haz пишет Есть колон..
Haz пишет
цитата:
Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet
У себя исп. вариант без кнопки, но с назначением клавиш, может будет интересно. Изменения:
CLASS TSColumn ... DATA aKeyEvent INIT {} DATA bKeyEvent ... METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) ... ENDCLASS ... METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) CLASS TSColumn
IF ! empty(oCol:aKeyEvent) oGet := oCol:oEdit:oGet For nK := 1 TO Len(oCol:aKeyEvent) aKey := oCol:aKeyEvent[ nK ] If HB_ISNUMERIC( aKey[1] ) oGet:SetKeyEvent( aKey[1], aKey[2], aKey[3], aKey[4], aKey[5] ) EndIf Next ENDIF
EndIf ... Пример Tsb_addrecord_2\demo.prg ... ADD COLUMN TO oBrw DATA FieldWBlock( "ITG", Select( "base" ) ) ; HEADER "Total" FOOTER hb_ntos(nItg) ; ALIGN DT_RIGHT, DT_CENTER, DT_RIGHT ; SIZE 90
Отправлено: 11.05.18 19:19. Заголовок: PS DATA bKeyEvent н..
PS DATA bKeyEvent надо убрать, остался от опытов
Haz
администратор
Пост N: 1240
Зарегистрирован: 20.02.11
Отправлено: 11.05.18 22:17. Заголовок: SergKis пишет: У се..
SergKis пишет:
цитата:
У себя исп. вариант без кнопки
Сергей. Спасибо. В понедельник поткстирую
Haz
администратор
Пост N: 1241
Зарегистрирован: 20.02.11
Отправлено: 11.05.18 22:58. Заголовок: Сергей : может буде..
Сергей :
цитата:
может будет интересно.
У меня есть очень draft, ну совсем бета альтернативного комбо в ячейке. Руки не доходят довести до ума, но испьзую так как есть. В понедельник скину в форум пример. Глянешь, интересны идеи. Суть в том, что вместо комбика попытался использовать бровс по базе. В последних проектах использую успешно, хоть и бета. А вот времени на осмысление нет. И чтоб совсем точки над ё, я не прошу сделать за меня. Я предлагаю идею и готов выслушать мнение.
SergKis
постоянный участник
Пост N: 1811
Зарегистрирован: 17.02.12
Отправлено: 12.05.18 00:04. Заголовок: Haz пишет Суть в том..
Haz пишет
цитата:
Суть в том, что вместо комбика попытался использовать бровс по базе.
С этого начинал, с combo (и с поиском по букве). В итоге отказался, со временем маленький список -> в большой, + колонки ... Практически везде перехожу на тсб (с hb 2.0 browse, на 3.2 переделываю на тсб)
цитата:
А вот времени на осмысление нет.
Со временем туго, согласен, справочники делаю по такой схеме (с поправками на задачу конечно), как идея (код из задачи, как есть) Скрытый текст
В задаче применяю (окно с тсб и рядом типа карточки) y := nRow x := nCol n := 'KliKod' // код клиента (справочник) @ y, x GETBOX &n OBJ o WIDTH oSt:W(10) HEIGHT oSt:H('G') VALUE space(4) ACTION wPost(91) IMAGE 'view' ; VALID SayGet_Value(.T., .T.) BACKCOLOR BG FONTCOLOR FC o:lOnGotFocusSelect := .T. o:OnEscape := {|og| oView:SetFocus(), .T. } o:OnF5 := {| | wPost(91) } y += This.&(n).Height + b n := 'KliNam' @ y, x GETBOX &n OBJ o WIDTH oSt:W(35) HEIGHT oSt:H('G') VALUE space(10) ; READONLY BACKCOLOR BG FONTCOLOR FC NOTABSTOP ... y += This.&(n).Height + b n := 'KliAgent' // код агента, для клиента (справочник) @ y, x GETBOX &n OBJ o WIDTH oSt:W(10) HEIGHT oSt:H('G') VALUE space(5) ACTION wPost(92) IMAGE 'view' ; VALID SayAgent_Value(.T., .T.) PICTURE '99999' BACKCOLOR BG FONTCOLOR FC o:lOnGotFocusSelect := .T. o:OnF5 := {| | wPost(92) } o:OnEscape := {|og| oView:SetFocus(), .T. } This.&(n).Value := TR0( Alltrim(gProp(Agent)), Len( This.&(n).Value ) ) x += This.&(n).Width n := 'NamAgent' @ y, x GETBOX &n OBJ o WIDTH oSt:W(25) HEIGHT oSt:H('G') VALUE space(30) ; READONLY BACKCOLOR BG FONTCOLOR FC NOTABSTOP ... и события (как я без них) For i := 1 To nCnt :Event( i, {|ow,ky| PressTBar(ow, ky), TsbCreate(ow, ky) } ) Next :Event( 91, {|ow | KliU04(ow) } ) :Event( 92, {|ow | KliAgent(ow) } ) :Event( 98, {|ow | OrdSave(ow) } ) :Event( 99, {|ow | oWnd:Action := .T., ow:Release() } ) END WITH // ---- Window events ...
Haz
администратор
Пост N: 1244
Зарегистрирован: 20.02.11
Отправлено: 14.05.18 18:09. Заголовок: Сергей Haz пишет: У..
Сергей Haz пишет:
цитата:
У меня есть очень draft, ну совсем бета альтернативного комбо в ячейке.
Выдернул из проекта , переписал под CDX вроде работает . Логика похожа на твой пример - те же массивы заголовков, полей и пр. Подчеркиваю это совсем бета , по мере допиливаю понемногу. Но что это понятно из примера Скрытый текст
FUNCTION RandStr( nLen ) LOCAL cSet := "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM" LOCAL cStr := "" LOCAL i := 0 FOR i := 1 TO nLen cStr += SubStr( cSet, Random( 52 ), 1 ) NEXT RETURN cStr
FUNC SeekID(nId) LOCAL xRet := NIL IF BASE2->(dbSeek( nId, FALSE )) xRet := BASE2->NAME END RETURN xRet
FUNC TEST_PrevEdit( xVal, oBrw ) LOCAL cCol := Upper(oBrw:aColumns[oBrw:nCell]:cName ) LOCAL cAlias := oBrw:cAlias LOCAL cSql := "" LOCAL nPos := 0 LOCAL nRecSave := 0 LOCAL nOrdSave := 0 LOCAL lRet := TRUE
FUNC ToRGB(nColor) LOCAL nR := 0 LOCAL nG := 0 LOCAL nB := 0 LOCAL cColor := NTOC(nColor, 16) /* BBGGRR, где XX - число от 00 до FF. */ nR := CTON(SUBSTR( cColor, 5, 2 ), 16) nG := CTON(SUBSTR( cColor, 3, 2 ), 16) nB := CTON(SUBSTR( cColor, 1, 2 ), 16) RETURN {nR, nG, nB }
CREATE CLASS Lbx VAR oBrw VAR oBrwParent VAR oWLbx VAR oLbx VAR aHeaders INIT {} VAR aFooters INIT {} VAR aData INIT {} VAR aAlign INIT {} VAR aFAlign INIT {} VAR aHAlign INIT {} VAR aWidth INIT {} VAR aField INIT {} VAR aFont INIT {}
VAR cAlias INIT "LBX" VAR cRetField INIT "NAME"
VAR bPostBlock INIT nil VAR bSearch INIT nil
VAR nHeightCell INIT 20 VAR nHeightHead INIT 20 VAR nHeightFoot INIT 20
METHOD Lbx:ListBox(oBrw, xVal) LOCAL nRecCount := 0 LOCAL nCol := 0 LOCAL nWidth := 0 LOCAL nHeight := 0 LOCAL nRow := 0 LOCAl oCell LOCAL aWRect := {0,0,0,0} LOCAL aCRect := {0,0,0,0} LOCAL lFlip := FALSE LOCAL i := 0 LOCAL nWh := 0
if !Empty( ::aWidth ) AEval(::aWidth, {|e| nWh += e + 1 }) end
// Поправка на координаты прииспользовании TAB IF __objHasData(oBrw, 'nColShift') IF oBrw:nColShift <> NIL nCol := nCol - oBrw:nColShift END END
IF __objHasData(oBrw, 'nRowShift') IF oBrw:nRowShift <> NIL nRow := nRow - oBrw:nRowShift END END //
// Если правый край выезжает за экрам IF nWh > nWidth IF nCol < aWRect[1] nCol := oCell:nCol + aWRect[1] - Getproperty(oBrw:cParentWnd, oBrw:cControlName, "Col") END
IF nWh + nCol > Getproperty(oBrw:cParentWnd, "Width") nCol := Getproperty(oBrw:cParentWnd, "Width") - nWh - 35 END nWidth := nWh END
// Если выезжает за низ окна IF oMain:ClientHeight - nRow - 130 < Min( ((::cAlias)->(RecCount()) + 2) * ::nHeightCell ,300 ) // Нужно показывать вверх lFlip := TRUE END
IF hb_isArray( ::aWidth ) .AND. Len( ::aWidth ) > 0 FOR i := 1 TO Len(::aWidth) ::oBrw:SetColSize(i, ::aWidth[ i ] ) END ELSE ::oBrw:SetColSize(1, nWidth ) END
IF hb_IsArray( ::aHeaders ) .AND. Len( ::aHeaders ) > 0 FOR i := 1 TO Len(::aHeaders) ::oBrw:aColumns[ i ]:cHeading := ::aHeaders[ i ] END END
nFlg := Nil do case case nKey == VK_RETURN .OR. nKey == VK_SPACE uRet := .F. (::oBrwParent:cAlias )->&( ::oBrwParent:GetColumn(::oBrwParent:nCell):cName ) := (::oBrw:cAlias)->&(::cRetField) oWLbx:Release()
Case nKey < 48 oBrw:SetFocus() otherwise uRet := .F. oBrw:SetFocus() End
RETURN uRet
SergKis
постоянный участник
Пост N: 1812
Зарегистрирован: 17.02.12
Отправлено: 14.05.18 19:08. Заголовок: Игорь Поправь , начи..
Игорь Поправь [ i ], начиная с этого текста и т.д.
IF hb_isArray( ::aWidth ) .AND. Len( ::aWidth ) > 0 FOR i := 1 TO Len(::aWidth) ::oBrw:SetColSize(i, ::aWidth[ i ] ) END ELSE ::oBrw:SetColSize(1, nWidth )
Отправлено: 14.05.18 22:00. Заголовок: Haz пишет Глянешь, и..
Haz пишет
цитата:
Глянешь, интересны идеи. Суть в том, что вместо комбика попытался использовать бровс по базе
1.Таких вариантов поля (Id -> наименование) замена, практически нет в работе, все как то сложнее. 2.Кроме id записи, есть клиентский код, который пользователи любят и вводят его (многие наизусть), а не через наименование. К примеру: - ФИО однозначно не определяет запись, надо ТАБ.НОМЕР и\или персональный код - наименование магазина, так же однозначно на дает запись, надо страну\город\адрес\регистр.номер(ИНН) или клиентский код - группы материалов\товаров могут иметь одинаковые наименования, но разные клиентские коды и др. показатели. ... 3.От ведения на тсб практически отказался, осталось только на совсем простеньких справочниках. Ввод, корректировку делаю на окне типа InputWindow(...) из hmg. Там validы, заполнение доп. полей и т.д. 4. Замену ComboBox-у делаю на GetBox-ах, как показал в примере выше. Если исп. в тсб на колонке вызов справочника, то исп. установку клавиши F5 на колонку (изменеия в MiniGui.lib перед примером выше) и VALID колонки, если значение задают не через вызов справочника, а кодом руками. Есть такое использование (в тсб) на окнах запросов для получения отчетов. 5.Мысли по твоему варианту: - возможность указывать, кол-во строк в тсб, если меньше, то окно меньше - располагать окно с тсб не только сверху\снизу, но и слева\справа, указывая L[eft],R[ight],T[op],B[ottom] - если использовать механизм назначенной клавиши для вызова списка, ввод в само поле можно исп. для поиска в списке или в footer, как у меня в примере
SergKis
постоянный участник
Пост N: 1814
Зарегистрирован: 17.02.12
Отправлено: 14.05.18 22:12. Заголовок: Haz, Dima Как то пр..
Haz, Dima Как то правка не прошла
::oBrw:aColumns[ i ]:cHeading := ::aHeaders[ i ] // тут надо, может и ниже тоже END END
Про назначение клавиш - спасибо. Прикину как прикрутить. В остальном пример сильно кастрирван. Там есть список полей, которые нужно показать в бровсе и поле которое нужно вернуть из справочника. ID и NAME это частный случай. Поиск по справочнику делаю по содержимому getbox через вызов bSearch. В примере не смог его показать т. к. это FTS поиск от ADS, то есть по вхождению в любых полях. Как в CDX сделать не знаю. У меня для поиска клиента, к примеру, можно в Getbox ввести ИНН или КПП или форму собственноси или почтрвый индекс или чего ещё. или через пробел все это сразу сразу. В FTS задается что искать, любое или все. И бровс фильтрует записи по условию поиска. Все уже привыкли не думая набирать или часть наименования или адреса или телефона. А вот до назначения клавиш я не допер. Повешу на них доп инструмент. У меня главный косяк в том что на модальной форме этот бровс ругается что из модала можно только модал. А если бровс сам сделать модальным, то на нем не отыграть потерю фокуса так как модал не его потерять). Твой пример посмотрел, все понятно. Спасибо буду использовать
SergKis
постоянный участник
Пост N: 1816
Зарегистрирован: 17.02.12
Отправлено: 16.05.18 12:19. Заголовок: Haz пишет У меня гла..
Haz пишет
цитата:
У меня главный косяк в том что на модальной форме этот бровс ругается что из модала можно только модал. А если бровс сам сделать модальным, то на нем не отыграть потерю фокуса так как модал не его потерять).
1 Можно делать два типа окна для child и modal имея признак в объекте. - modal делать похожим на справочник и иметь кнопку выхода+Esc - child как сейчас, но можно и одинаково оформлять вызывать с модального окна модальный режим, с др. child 2 GetBox_FTS можно делать с двумя\одной родными кнопками с image для поиска\очистки или еще что то. 3 Исп. не bPrevEdit, а Valid и назн. клавишу для вызова списка, тогда в поле TGETBOX можно не вызывая списка вводить, если был On Change (меняем значение в поле тсб - поиск) по клавише или в valid по Enter вызываем объект списка, переносим значение из TGETBOX в GetBox_FTS с отработкой оного. 4 Иметь метод в объекте установки Row, Col отображения списка относительно родителя и задания кол-ва строк в списке
1 Буду тип задавать по типу родителя. Так решается проблема что из чего вызывать. Вот как быть с потерей фокуса у модала ?? не дает он его терять, а у меня на это событие справочник закрывается с отказом от выбора.
2 - 4 Согласен . это уже детали реализации.
SergKis
постоянный участник
Пост N: 1817
Зарегистрирован: 17.02.12
Отправлено: 16.05.18 17:07. Заголовок: Haz пишет Вот как б..
Haz пишет
цитата:
Вот как быть с потерей фокуса у модала ?? не дает он его терять, а у меня на это событие справочник закрывается с отказом от выбора.
По мне, выбор по Enter, DblClick, Button Ok (выбор сделан, список убираем), а все остальное отказ. Выход базовый по кнопке крестику (своя, работа с NOCAPTION .T.) или Esc (отказ, список убираем). Потеря фокуса - для child режима - частный случай отказа
PS Игорь, вспомнилось, ты вроде занимался морганием модальных окон при потере фокуса, можно туда приблуду вставить типа, по handle окна получить объект (если есть) и получить свойство bBlock := oW:GetProp('LostFocus') и если блок задан, выполнить Do_WindowEventProcedure ( bBlock, oW:Index, oW ) В объект окна списка ставить блок (ThisWindow.Object):SetProp('LostFocus', {|ow| ow:Release() }
Сделал в версии 18.04 кол-во строк 240, подвал есть. На 250 строках подвала уже нет и вот такая таблица получается: ..... Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ?
Предложение по правке этой ошибки (h_tbrowse.prg):
И проблема показа текстовых столбцов вида 3/2, 1/5 и т.д. ТОЖЕ решена в отправленном модуле !
Andrey
постоянный участник
Пост N: 5874
Зарегистрирован: 12.09.06
Отправлено: 17.05.18 18:56. Заголовок: Вспомнил про ещё оди..
Вспомнил про ещё один баг в METHOD ExcelOle() !
После создания xls файла, сам Эксель уходин на второй план, т.е. под окно этого экспорта. Юзера ЗЛЯТСЯ ОЧЕНЬ на это !!! Для исправления этого нужно сделать так:
неверное я что-то не догоняю, с сырцах не нашел метод TOleAuto(): и куда добавлять ...?
Этот код добавляй в свою программу. Я писал про METHOD ExcelOle() который находиться MiniGUI\SOURCE\TsBrowse\h_tbrowse.prg Но этот метод Григорий исправит и будет достен в следующей версии.
Andrey
постоянный участник
Пост N: 5883
Зарегистрирован: 12.09.06
Отправлено: 22.05.18 19:44. Заголовок: Нашёл ещё один баг в..
Нашёл ещё один баг в METHOD ExcelOle():
При многострочном построении Tsbrowsa при экспорте - получается так:
Хотя таблица выглядеть должна примерно так:
Как и где исправить код для этого метода ?
Alex_Cher
Пост N: 57
Зарегистрирован: 18.06.15
Отправлено: 25.05.18 07:56. Заголовок: Andrey пишет: Этот ..
Andrey пишет:
цитата:
Этот код добавляй в свою программу.
Андрей с Excel все получилось ... , почему с Word не получается -
If lActivate oText:HomeKey(wdStory) // в начало текста oWord:Visible := .T. SetWordWindowToForeground(oWord) // окно Word на передний план EndIf
RETURN NIL
////////////////////////////////////////////////////////////////////// // окно Word на передний план FUNCTION SetWordWindowToForeground(oWord) LOCAL hWnd, nVer, cCaption, cTitle
// ------------------- поиск ХЕНДЛА открытого окна документа -------------- hWnd := 0 nVer := VAL( oWord:Version ) // Версия Word IF nVer > 14 // Word 2010 hWnd := oWord:ActiveDocument:ActiveWindow:Hwnd ELSE //hWnd:=oWord:hwnd - так делать нельзя ! cCaption := oWord:Windows[1]:Caption cTitle := cCaption + " - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) IF hWnd == 0 cTitle := cCaption + " [Режим ограниченной функциональности] - MICROSOFT WORD" hWnd := FindWindowEx(,,, cTitle ) ENDIF ENDIF
IF hWnd > 0 ShowWindow( hWnd, 6 ) // MINIMIZE windows ShowWindow( hWnd, 3 ) // MAXIMIZE windows BringWindowToTop( hWnd ) // A window on the foreground ENDIF
Понял ! Спасибо ! Буду у себя так делать. Осталось Григорию у себя в библиотеке поменять...
Andrey
постоянный участник
Пост N: 5928
Зарегистрирован: 12.09.06
Отправлено: 23.06.18 17:55. Заголовок: Всем привет ! Можно ..
Всем привет ! Можно ли как то на лету изменить таблицу с параметром SELECT .T. или вообще без него ? Т.е. строиться таблица с SELECT .T., а потом его нужно удалить/восстановить.
Andrey
постоянный участник
Пост N: 5931
Зарегистрирован: 12.09.06
Отправлено: 27.06.18 19:04. Заголовок: Понял, что нельзя. ..
Понял, что нельзя.
Ещё вопрос про селектор. Нашёл баг по редко встречающему условию.
METHOD ExcelOle() используем таблицу с селектором. При экспорте делаем так:
CursorWait()
If ::lSelector ::aClipBoard := { ColClone( ::aColumns[ 1 ], Self ), 1, "" } ::DelColumn( 1 ) ::lSelector :=.F. // нужно сделать !!! EndIf
Нужно тогда ::lSelector делать .F. - иначе при вызове доп.функции:
If bExtern != Nil Eval( bExtern, oSheet, Self ) EndIf
При проверке ::lSelector будет возвращать всегда .T. - что неправильно !!!
И разместить как я предлагал доп.функцию уже в самом конце:
При бровсе по массиву gopos не выполнится, а перед этим был skip()
Andrey
постоянный участник
Пост N: 5964
Зарегистрирован: 12.09.06
Отправлено: 15.07.18 15:28. Заголовок: Всем привет ! Обнару..
Всем привет ! Обнаружил в методе ExcelOle() баг. Удаляет часть данных из Второй колонке в конце таблицы. Версия МиниГуи последняя. Пробовал в нескольких задачах. Вот так это выглядит, 0-к съедает в последней ячейке 2-ой колонки:
Если стоит 001, то удаляет два нолика. Как бы исправить это ? В Tsb4xlsOle.prg экспорт отрабатывает на отлично.
Andrey
постоянный участник
Пост N: 5965
Зарегистрирован: 12.09.06
Отправлено: 16.07.18 16:14. Заголовок: Ещё обнаружил в мето..
Ещё обнаружил в методе ExcelOle() баг. Если буквы при экспорте в эксель больше Z, т.е. колонок больше 26 - то ломается экспорт. Попробую сделать свою функцию для названия колонок и заменить везде CHR(64 +....
SergKis
постоянный участник
Пост N: 1936
Зарегистрирован: 17.02.12
Отправлено: 16.07.18 16:46. Заголовок: Andrey пишет Попробу..
Andrey пишет
цитата:
Попробую сделать свою функцию для названия колонок и заменить везде CHR(64 +....
Паша тебе дал хорошие функции, зачем велосипед гонять
Function ExcelAdr(nRow, nCol) Return if(nCol>26,Chr(Int((nCol-1)/26)+64),'')+Chr((nCol-1)%26+65) + LTrim(Str(Int(nRow)))
и до кучи еще одну функцию (для адреса диапазона ячеек):
Обрати внимание, что у тебя старая версия этого файла
Да, я брал из предыдущей версии. Буду ждать новую версию МиниГуи.
Andrey
постоянный участник
Пост N: 6019
Зарегистрирован: 12.09.06
Отправлено: 31.08.18 14:30. Заголовок: SergKis пишет: И ещ..
SergKis пишет: И еще, если добавить в TsColumn DATA bDecode // Charset decode or other DATA bEncode // Charset encode or other Не совсем понятно зачем это нужно. Можно пояснить ?
SergKis
постоянный участник
Пост N: 1985
Зарегистрирован: 17.02.12
Отправлено: 31.08.18 15:30. Заголовок: Andrey пишет Можно п..
Отправлено: 17.09.18 00:32. Заголовок: Всем привет ! Пытаюс..
Всем привет ! Пытаюсь понять метод oBrw:DeleteRow() для DBF. Что-то не работает... Модифицировал пример Tsb_linedrag для вставки/удаления записей. Вставка работает, удаление нет. Что не так делаю ?
И ещё пара вопросов: 1) Не отрабатывает вставка вертикального скролинга - oBrw:ResetVScroll(). Почему ? 2) Как сделать заново полное считывание базы для этой программы ? можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?
SergKis
постоянный участник
Пост N: 1999
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 08:26. Заголовок: Andrey пишет Пытаюсь..
Andrey пишет
цитата:
Пытаюсь понять метод oBrw:DeleteRow() для DBF
Для этого определись с режимом работы SET DELETED ON\OFF Если OFF, то записи удаленные так же на экране, только помечаются deleted, :DeleteRow() тогда делает recall для удаленной, для разделения при показе вкл. цвета для удаленных. Если ON и без индекса, то сам управляй переменной :nLen, т.е. уст. блок :bLogicLen для "правильного" счета записей в просмотре. Если с индексом, то делай его FOR ! deleted() - тогда тсб кое что сделает сама, это кое что иногда нужно менять. В этом примере для исчезновения строк при удалении сделать
GO TOP INDEX ON RecNo() TAG ID FOR ! Deleted() GO TOP
If nRow == oBrw:nRowCount() oBrw:PostMsg( WM_KEYDOWN, VK_END, 0 ) EndIf
не решает всех проблем, это только пример варианта, т.к. есть еще значение :nLen его тоже учитывать надо.
Andrey
постоянный участник
Пост N: 6031
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 08:39. Заголовок: SergKis пишет: Для ..
SergKis пишет:
цитата:
Для этого определись с режимом работы SET DELETED ON\OFF
Спасибо большое за разъяснения !
А как быть с : 2) Как сделать заново полное считывание базы для этой программы ? можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?
SergKis
постоянный участник
Пост N: 2002
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 08:49. Заголовок: Andrey пишет Не отра..
Andrey пишет
цитата:
Не отрабатывает вставка вертикального скролинга - oBrw:ResetVScroll()
FUNCTION CreateBrowse() ... // oBrw:ResetVScroll() // показ вертикального скролинга можно не ставить если ставить, то лучше парой строк // oBrw:ResetVScroll() // показ вертикального скролинга // oBrw:oHScroll:SetRange( 0, 0 ) VScroll появляется при :nLen > :nRowCount() и потом остается. При задании ширины тсб это надо учитывать. Если VScroll не нужен в твоем примере, то делаем oBrw:lNoVScroll := .T. // у тебя он уже так стоит и STATIC FUNCTION RecnoInsert(oBrw) ... If oBrw:lNoVScroll oBrw:oVScroll := Nil EndIf oBrw:GoToRec( nRecno ) ... STATIC FUNCTION RecnoDelete(oBrw) ... lDelete := oBrw:DeleteRow() ? "Delete=",nRecno, lDelete If oBrw:lNoVScroll oBrw:oVScroll := Nil EndIf If nRow == oBrw:nRowCount() ...
SergKis
постоянный участник
Пост N: 2003
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 08:54. Заголовок: Andrey пишет 2) Как ..
Andrey пишет
цитата:
2) Как сделать заново полное считывание базы для этой программы ? можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?
Сие есть тайна для меня, т.к. не понимаю о чем речь. В тсб просмотре только 1 - :nRowCount() строк
Сие есть тайна для меня, т.к. не понимаю о чем речь.
Базу открывать по сети SHARED. Открываем БЕЗ индексов. Первый юзер открыл базу - допустим 10 записей в ней. Другой добавил ещё пару записей и что-то откорректировал. Вот по кнопке Refresh хочу перечитать заново базу и получить все записи для 1-го юзера. У себя в задаче у меня есть такая кнопка, но там у меня условный индекс, рисуется всё автоматом.
Andrey :DrawLine(...), :DrawSelect(...) рисуют строку из буфера записи, так что, если 2-ая прога делает commit, то твоя при перемещении по базе должна показать изменения или по кнопке :Refresh(.T.)\Display(). Пробуй
Andrey
постоянный участник
Пост N: 6033
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 09:39. Заголовок: SergKis пишет: или ..
SergKis пишет:
цитата:
или по кнопке :Refresh(.T.)\Display(). Пробуй
Блин, так просто... Не догадался сразу. Заработало !
Andrey
постоянный участник
Пост N: 6034
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 10:04. Заголовок: Базу открывать по се..
Базу открывать по сети SHARED. Открываем БЕЗ индексов. А как сделать пересчёт в 1-ом столбце, который я создаю сам ?
ADD COLUMN TO TBROWSE oBrw DATA {|| 0 } ; //oBrw:nAt } ; HEADER CRLF + "NN" SIZE 40 ; COLORS {CLR_BLACK, WHITE} ALIGN DT_CENTER ; NAME NN
Так как индексов нет, то перестройку нумерации нежно только при вставки/удалении записи. Добавил в эти функции - пересчёт ItogoNN( oBrw ) Вот сама функция: Скрытый текст
FUNCTION ItogoNN( oBrw ) LOCAL nI, cAlias := oBrw:cAlias, nRec := ( cAlias )->( RecNo() )
Eval( oBrw:bGoTop ) // переход на начало таблицы FOR nI := 1 TO oBrw:nLen Eval( oBrw:GetColumn("NN"):bData, nI ) oBrw:Skip(1) NEXT
Отправлено: 17.09.18 11:47. Заголовок: Andrey пишет: Но не..
Andrey пишет:
цитата:
Но нет вообще пересчёта. Почему ?
А чего ты ожидаешь от этого ? Andrey пишет:
цитата:
DATA {|| 0 }
PS и не надо портить хороший пример
SergKis
постоянный участник
Пост N: 2005
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 11:54. Заголовок: Andrey А что ты счи..
Andrey А что ты считаешь таким "хитрым" способом ?
Andrey
постоянный участник
Пост N: 6035
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 12:00. Заголовок: SergKis пишет: А чт..
SergKis пишет:
цитата:
А что ты считаешь таким "хитрым" способ
Ставил
ADD COLUMN TO TBROWSE oBrw DATA {|| oBrw:nAt } ;
Первый раз показывает правильно. После удаления/вставки или колёсиком покрутить нумерация слетает.... Может и неправильно так делать, тогда подскажите как ? База открывается без индексов ! Можно было бы через массив, там вроде проще, но нужна база.
Haz пишет:
цитата:
PS и не надо портить хороший пример
Я его до рабочей таблицы довожу. Как в жизни юзера требуют.
SergKis
постоянный участник
Пост N: 2006
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 12:12. Заголовок: Andrey Тебе что пиш..
Andrey Тебе что пишешь, что не пишешь - результат один ....
цитата:
Если ON и без индекса, то сам управляй переменной :nLen, т.е. уст. блок :bLogicLen для "правильного" счета записей в просмотре.
плюс свой skipper нужен, может еще что понадобится. А для NN колонки пиши ADD COLUMN TO TBROWSE oBrw DATA {|| (oBrw:cAlias)->( OrdKeyNo() ) } ; но без индекса с SET DELETED ON хз что будет
SergKis
постоянный участник
Пост N: 2007
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 12:14. Заголовок: в работе тсб. не ту ..
в работе тсб. не ту кнопку нажал, сори.
SergKis
постоянный участник
Пост N: 2008
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 12:52. Заголовок: Andrey пишет Я его д..
Andrey пишет
цитата:
Я его до рабочей таблицы довожу. Как в жизни юзера требуют.
Делай команду выборки в др. таблицу ( COPY TO ..., APPEND FROM ... FOR ! deleted ) Поля бери только ключ для связки или recno + поля по которым построить рабочие индексы для тек. просмотра, если надо. Таблица будет "узкая" и быстрая. Связываешь с основной базой и работаешь SET DELETED OFF, отображая удаленные цветом (вдруг передумают удалять). Все модификации переносишь на основную базу. По refresh можешь сделать ZAP и снова APPEND FROM ... или новый COPY TO ... с переоткрытием.
ADD COLUMN TO TBROWSE oBrw DATA {|| (oBrw:cAlias)->( OrdKeyNo() ) } ; но без индекса с SET DELETED ON хз что будет
Ставил и так, только индекса нет и высвечивается RECNO() Из-за этого и подумал, что можно первую колонку сделать "виртуальной" и нумерацию туда самому переписывать при вставке/добавлении записи. Удалённые записи не нужны, юзер просит только рабочие записи.
SergKis пишет:
цитата:
По refresh можешь сделать ZAP и снова APPEND FROM ... или новый COPY TO ... с переоткрытием.
Нужно тогда закрывать базу, открывать её монопольно и т.д. Более сложный вариант получается....
Отправлено: 17.09.18 14:24. Заголовок: Andrey пишет Нужно т..
Andrey пишет
цитата:
Нужно тогда закрывать базу, открывать её монопольно и т.д. Более сложный вариант получается....
Это таблица отобранная, может состоять из одного поля (ключ или RecNo для связи с базой), находится в mem:, открыта сразу монопольно - твой тсб единственный пользователь, многое упрощается. Это общий случай для всех отборов (типа команда select) ведения, отчетов, ....
SergKis
постоянный участник
Пост N: 2010
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 14:30. Заголовок: PS Можешь иметь на н..
PS Можешь иметь на нее тэг с FOR ! deleted(), тогда удаленные будут исчезать при set deleted on, OrdKeyNo(), OrdKeyCount() будут ok
Делай команду выборки в др. таблицу ( COPY TO ..., APPEND FROM ... FOR ! deleted )
Сергей, привет! В сети будет сюрприз. Если коллега удалит или вставит запись , то RDD это отработает при скроле по таблице и запись либо появится, либо исчезнет, а вот нумерация слетит т.к. Refresh() не вызывался и временная таблица не пересчитана
Игорь, привет ! Сюрприза не будет, т.к. работаем (тсб) совсем с др. таблицей с конкретным числом записей. Под командами copy to ..., append from ... понимаю условное обозначение выборки с уст. scope, filter (это скорее do while ...) На время работы их, если это под тсб, блокируем тсб :lEnable := .T., потом :Reset(), :Display() ... Таблица для тсб может иметь поля для индексов, тогда делаем сначала reindex. То что в базе запись удалена, а у нас нет - будет пустая запись на экране новой не будет совсем, но это временно до след. нажатия refresh, допустимое время появления данных на сервере оно субъективно, но существует
проще индекс держать с !Deleterd() и дергать номер ключа. Но легкий путь , не наш метод
SergKis
постоянный участник
Пост N: 2012
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 15:14. Заголовок: PS Для тсб (человека..
PS Для тсб (человека) вполне может не важны те добавления\удаления в данный момент он свое крыжит для важных выборок делаем locktable на время выборки и "чудес" не будет
SergKis
постоянный участник
Пост N: 2013
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 15:16. Заголовок: Haz пишет проще инде..
Haz пишет
цитата:
проще индекс держать с !Deleterd()
Кто бы спорил, но у Андрея одно рабочее место без индекса, другое с условным индексом ... Что бы не ломать ту ситуацию новую можно так решать безболезненно. Да сложности особой нет
SergKis
постоянный участник
Пост N: 2014
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 15:19. Заголовок: PS + такая техника с..
PS + такая техника спокойно перейдет в LetoDB
Andrey
постоянный участник
Пост N: 6038
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 15:40. Заголовок: SergKis пишет: Кто ..
SergKis пишет:
цитата:
Кто бы спорил, но у Андрея одно рабочее место без индекса, другое с условным индексом ... Что бы не ломать ту ситуацию новую можно так решать безболезненно. Да сложности особой нет
Да я уже согласился. Понял, что огород городить не надо. Надо открывать базу в SHARED и делать индекс !Deleterd() Только вот забыл как делать файл с уникальным именем в папке.. Сейчас сделаю свой вариант и покажу Tsbrowse.
SergKis
постоянный участник
Пост N: 2015
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 15:45. Заголовок: Andrey пишет Только ..
Andrey пишет
цитата:
Только вот забыл как делать файл с уникальным именем в папке..
А с именем самого dbf не пойдет. Его должны открывать ВСЕ приложения с модификацией (как SET AUTOPEN ON) иначе "нам удачи не видать"
SergKis
постоянный участник
Пост N: 2016
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 15:48. Заголовок: PS Если планируешь п..
PS Если планируешь повторно исп. удаленные записи, то нужен тэг FOR Deleted()
Andrey
постоянный участник
Пост N: 6039
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 15:51. Заголовок: SergKis пишет: А с ..
SergKis пишет:
цитата:
А с именем самого dbf не пойдет. Его должны открывать ВСЕ приложения с модификацией (как SET AUTOPEN ON) иначе "нам удачи не видать"
Зачем ? Каждый узер открывает базу и делает свой индекс с !Deleterd() Вешаем таймер и каждые полминуты делаем Refresh() базы. Чем не решение ? Избавимся от создания общего индекса. Но можно держать и общий индекс с !Deleterd(). Это уже без разницы.
SergKis
постоянный участник
Пост N: 2017
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 16:05. Заголовок: Andrey пишет Вешаем ..
Andrey пишет
цитата:
Вешаем таймер и каждые полминуты делаем Refresh() базы
Знаем проходили, Чел пялится в свою запись на экране, вдруг раз она убежала то ли вверх то ли вниз - вставились\удалились записи рядом, попытка удержать курсор на ней может не получиться, пока он таращил глаза, наконец нашел, начал любоваться а она опять куда то улетела, причина см. выше и т.д.
цитата:
Избавимся от создания общего индекса
По мне это минус. Если базы копеечные, то да так можно делать, но вопрос нужно ли ?
Знаем проходили, Чел пялится в свою запись на экране, вдруг раз она убежала то ли вверх то ли вниз - вставились\удалились записи рядом, попытка удержать курсор на ней может не получиться, пока он таращил глаза, наконец нашел, начал любоваться а она опять куда то улетела, причина см. выше и т.д.
Понял, так делать тогда не будем. Только для теста....
SergKis пишет:
цитата:
По мне это минус. Если базы копеечные, то да так можно делать, но вопрос нужно ли ?
У меня такой механизм (условная индексация) работает уже лет 15. Условная индексация каждого юзера для всех его нужных полей базы, что хочет то и выбирает и ко мне не пристаёт.
Andrey
постоянный участник
Пост N: 6044
Зарегистрирован: 12.09.06
Отправлено: 17.09.18 18:25. Заголовок: Что-то фигня получае..
Что-то фигня получается с разными индексами... С одним общим лучше ! Вот так выглядит теперь: [img]https://i.imgur.com/gievW7U.png?3[/img]
Вот проект и исходники (fpt) - https://cloud.mail.ru/public/GMwS/mbgXwsCEs Запустить две программы и можно тестировать. Посмотрите пожалуйста исходники, может что-то и упустил.
SergKis
постоянный участник
Пост N: 2018
Зарегистрирован: 17.02.12
Отправлено: 17.09.18 18:56. Заголовок: Andrey Так поправь ..
IF lDbfNo .OR. !FILE(cIndx+'.cdx') // если нет базы или индекса USE ( cDbf ) ALIAS "TEST" EXCLUSIVE NEW
WHILE TEST->( RecCount() ) < 10 TEST->( dbAppend() ) TEST->F1 := Date() + n++ TEST->F2 := Str( n ) TEST->F3 := n TEST->F4 := ( n % 2 ) == 0 END
GO TOP INDEX ON RECNO() TAG NN FOR !Deleted() INDEX ON RECNO() TAG NO FOR Deleted() USE
ENDIF
SET AUTOPEN ON
USE ( cDbf ) ALIAS "TEST" SHARED NEW OrdSetFocus('NN') GO TOP
// ORDLISTADD( cIndx )
AADD( aAlias, ALIAS() ) // запомнить базу для закрытия
RETURN aAlias
Andrey
постоянный участник
Пост N: 6064
Зарегистрирован: 12.09.06
Отправлено: 07.10.18 16:04. Заголовок: Всё таки есть неболь..
Всё таки есть небольшие сбои в Tsbrowse или в примерах Tsb_Shared нужно что-то добавлять. Непонятки возникли: 1) если удалить 2-3 записи в таблице, то нарушается показ в вертикальном скролинге.
2) demo.exe - если таблица без вертикального скролинга, то при добавлении записей вертик.скролинг не появляется (иногда появляется)
3) demo2.exe - если таблица без вертикального скролинга, то при добавлении записей вертик.скролинг появляется но без нижней стрелки, огрызок какой то...
Отправлено: 12.10.18 22:47. Заголовок: Всем доброй ночи ! В..
Всем доброй ночи ! Вот столкнулся с такой проблемой, не знаю как сделать перемещение записи в таблице вверх или вниз. Какой нужно сделать алгоритм показа ? Ввести новое поле в базу или по другому ? Я делал ранее алгоритм пересчёта поля на лету, но там база была очень маленькой. А для больших баз как это реализовать ?
Юзер хочет добавить запись под/перед курсором/маркером бровса, а не в конец базы.
В чем проблема? Держи активный индекс по которому сортируются записи. Хоть вычисляемый, хоть по значению в поле. При добавлении позаботься о том чтобы у новой записи индекс получил нужное значение. Варианты реализации - все что угодно на твой вкус, главное результат. Вопрос вообще ни каким боком к Tsbrowse не относится. Если тупо оценить его то это, "как логически поместить запись в нужную позицию" Это же и к предыстории к вопроса относится. Как решишь, далее нужно всего лишь применить новую редакцию ::gotorec() с указанием нужной строки
Сергей привет. Навеяно исходниками. Году в 90 занимался вставкой записей используя функции семейства fread, fwrite итд. Зная структуру dbf эта задача прммитивная, но тогда.... и базы были короче и валялись они локально. А может и оптимизма в голове было побольше. Сейчас я только пожелаю флаг в руки и вперёд в атаку. А я тут подожду.
SergKis
постоянный участник
Пост N: 2087
Зарегистрирован: 17.02.12
Отправлено: 13.10.18 22:25. Заголовок: Haz пишет А я тут п..
Haz пишет
цитата:
А я тут подожду.
Как говорится "Хозяин-барин", но dbInsert очень хорошо легла на: 1. Разбиение отчета печати по листам, когда нельзя разрывать лист на строках заголовков, итогов и т.д., т.е. разрывать лист можно только на детальной строке а далее как душа ляжет ... Вставляю строку типа chr(12) 2. Выполнен отбор типа select * ...., далее по уточнению различные группирования, заголовки\подзаголовки\итоги\под итоги и т.д. с выходом на печать и п.1 3. Ввод в какой то документ, где пользователь сам определяет перед\после какой строкой[и] делаем запись new 4. Export или подсовывание запроса с базы где нет полей с определенными названиями в какой то уже работающий отчет. Делаем запрос и потом меняем названия полей на нужные или на раб. месте за дробью надо не 7 знаков, а по установке, округляем и меняем в структуре через FieldRename(...) Это основное, что использую.
Haz
администратор
Пост N: 1360
Зарегистрирован: 20.02.11
Отправлено: 13.10.18 23:02. Заголовок: SergKis пишет: Как ..
SergKis пишет:
цитата:
Как говорится "Хозяин-барин", но
Плавали, знаем все тоже делаю в sql запросах Select top 50 * Select next Select summa as [ выручка с НДС ] Группировки так вообще для этого скуль и придумали а вставку в определённую логическую позицию по спец полю определяющему сортировку и вложенность структуры.
Но тут кто как привык. Все подходы правильные когда работают
SergKis
постоянный участник
Пост N: 2088
Зарегистрирован: 17.02.12
Отправлено: 13.10.18 23:32. Заголовок: Haz пишет все тоже д..
Haz пишет
цитата:
все тоже делаю в sql запросах
На ADS у нас только немцы приходили в начале 2000-х, но их выжили скандинавы. Из за его стоимости никто из клиентов не хочет(ел) приобретать лицензию, даже богатый Латв.энерго. От исп. mysqll и firebird мы отказались сами из за администр. затрат эксплуатации на чужих администраторах\рс.
цитата:
Но тут кто как привык
Схему select * или select (...) as (...) ... поддерживаю на DBFCDX(letodb), распределяя "основной" запрос на сервер, с доработкой "до кондиции" на клиенте.
Andrey
постоянный участник
Пост N: 6072
Зарегистрирован: 12.09.06
Отправлено: 14.10.18 18:36. Заголовок: Вот ещё одна непонят..
Вот ещё одна непонятка для меня. Беру пример \SAMPLES\Advanced\Tsb_array_2\demo.prg Меняю:
LOCAL cFontName := "Comic Sans MS" LOCAL nFontSize := 16
Юзер хочет добавить запись под/перед курсором/маркером бровса, а не в конец базы.
Haz пишет:
цитата:
Держи активный индекс по которому сортируются записи. Хоть вычисляемый, хоть по значению в поле. При добавлении позаботься о том чтобы у новой записи индекс получил нужное значение.
далее нужно всего лишь применить новую редакцию ::gotorec() с указанием нужной строки
очень помог. Я еще мало что могу в использовании MiniGui и TsBrowse в частности. А есть задача, в которой желательно реализовать следующее. Во-первых, реализовать отметку нескольких записей по SHIFT/CTRL + клик мышью (как в проводнике, например) и затем перемещение / копирование этих записей после указанной курсором записи, т.е. "привычный" copy/past. Во-вторых, хотелось бы, чтобы перемещенная запись меняла цвет шрифта или фона, например, как в Total Commander. Это только на момент работы с БД. После выхода из TsBrowse сохранять цвет измененных записей не надо.
Далее по bLClick добавлять в этот массив номера записей, проверяя предварительно нажата ли CTRL или SHIFT. С SHIFT придется повозится на предмет получения не одного а списка номеров записей TimTim пишет:
цитата:
затем перемещение / копирование этих записей после указанной курсором записи, т.е. "привычный" copy/past.
можно через контекстное меню с пересчетом ключа индекса для копируемых (перемещаемых) записей TimTim пишет:
цитата:
хотелось бы, чтобы перемещенная запись меняла цвет шрифта или фона,
в условии oBrw:SetColor() проверять есть ли запись в массиве помеченных. См. пример TSB_CALENDAR как там сделана отметка и покраска . Правда там отметка относится к ячейке, но логика одинакова
TimTim
Пост N: 151
Зарегистрирован: 10.07.07
Отправлено: 22.10.18 15:40. Заголовок: Спасибо за ответ. Пр..
Спасибо за ответ. Пример с календарем посмотрю. А чем и как ловить нажатие клавиш CTRL и / или SHIFT?
Haz
администратор
Пост N: 1367
Зарегистрирован: 20.02.11
Отправлено: 22.10.18 16:05. Заголовок: TimTim пишет: А чем..
TimTim пишет:
цитата:
А чем и как ловить нажатие клавиш CTRL и / или SHIFT?
KBDSTAT()
Bit Key ------------------------------------------------------------------------ 1 Right shift currently pressed 2 Left shift currently pressed 3 Ctrl currently pressed (left or right) 4 Alt currently pressed (Alt or Shift-Alt) 5 Scroll-Lock ON/OFF 6 Num-Lock ON/OFF 7 Caps-Lock ON/OFF 8 Insert ON/OFF
IF ISBIT(KBDSTAT(), 3) MsgDebug("CTRL pressed") END
SergKis
постоянный участник
Пост N: 2094
Зарегистрирован: 17.02.12
Отправлено: 22.10.18 18:32. Заголовок: Haz Что то new :Got..
Haz Что то new :GotoRec(...) как то не так срабатывает. Пример https://my-files.ru/4e57lz Работа кнопок Up, Down и перепоказ после них 1. New вариант :GotoRec положил в функцию myGotoRec 2. Old вариант oBrw:GotoRec(...) 3. галочки переключают на функцию и доп параметр nRowPos На родном (old) варианте отрабатывает ок, по показ с 1-ой строки На new варианте ломается показ, нажмем Home показ восстановится Или я что то потерял ?
SergKis
постоянный участник
Пост N: 2095
Зарегистрирован: 17.02.12
Отправлено: 22.10.18 18:59. Заголовок: PS чуть перепутал, н..
PS чуть перепутал, но это не влияет на результат
If lPos MyGotoRec(oBrw, nRec, nRow) Else MyGotoRec(oBrw, nRec) EndIf
Haz
администратор
Пост N: 1368
Зарегистрирован: 20.02.11
Отправлено: 22.10.18 20:15. Заголовок: SergKis пишет: new ..
SergKis пишет:
цитата:
new варианте ломается показ,
Завтра посмотрю
Haz
администратор
Пост N: 1369
Зарегистрирован: 20.02.11
Отправлено: 23.10.18 10:43. Заголовок: SergKis пишет: Что ..
SergKis пишет:
цитата:
Что то new :GotoRec(...) как то не так срабатывает.
Сергей, вроде со скипами там косяк был
FUNC myGotoRec( oBrw, nRec, nRowPos ) LOCAL cAlias LOCAL nSkip := 0 LOCAL lMore := .T. LOCAL lSkip := .F. LOCAL lRet := .F. LOCAL lReCount := .F.
DO WHILE lMore (cAlias)->( dbSkip(-1) ) nSkip ++ lMore := !(cAlias)->(BOF()) .and. nSkip < (nRowPos) // lSkip := !(cAlias)->(BOF()) ENDDO
// :Refresh(lReCount, lReCount)
//If lSkip :Skip( nSkip -1 ) //EndIf
:Refresh(lReCount, lReCount)
:nRowPos := nSkip :nAt := :nLogicPos()
:Refresh(lReCount, lReCount)
:ResetVscroll()
If :bChange != Nil Eval( :bChange, Self, 0 ) EndIf
:lHitTop := :lHitBottom := .F.
DO EVENTS
EndIf end with
RETURN lRet
твой пример погонял - все норм
SergKis
постоянный участник
Пост N: 2096
Зарегистрирован: 17.02.12
Отправлено: 23.10.18 13:52. Заголовок: Haz пишет твой приме..
Haz пишет
цитата:
твой пример погонял - все норм
Игорь добавь до 21 строки в таблице (в районе 7 к примеру) и жмем End С записью Line 15 проделываем Up, Down во всех режимах С new вариантом перескок отображения на Line 13, что не совсем правильно
добавь до 21 строки в таблице (в районе 7 к примеру) и жмем End
Да, все увидел. Пару дней возьму на правку и тестирование.
Andrey
постоянный участник
Пост N: 6079
Зарегистрирован: 12.09.06
Отправлено: 25.10.18 19:22. Заголовок: Всем привет. Сделал ..
Всем привет. Сделал у себя выгрузку базы через SetArrayTo() и обломался. Оказывается таблица больше 41 колонок НЕ ДЕЛАЕТСЯ. А у меня в базе 120 колонок, есть и ещё чуть больше.
Этот параметр наверное как то задан по умолчанию ? Увеличить можно сейчас ? Раньше компы были слабее, а сейчас на порядок быстрее.
SergKis
постоянный участник
Пост N: 2103
Зарегистрирован: 17.02.12
Отправлено: 25.10.18 19:57. Заголовок: Andrey пишет Оказыва..
Andrey пишет
цитата:
Оказывается таблица больше 41 колонок НЕ ДЕЛАЕТСЯ.
Странное утверждение. Tsb_array_2\demo.prg меняем слегка
STATIC FUNCTION CreateDatos()
LOCAL a, i, k := 1000, aDatos, aHead, aSize, aFoot, aPict, aAlign, aName
aDatos := Array( k ) FOR i := 1 TO k aDatos[ i ] := { " ", ; // 1 i, ; // 2 ntoc( i ) + "_123", ; // 3 Date() + i, ; // 4 PadR( "Test line - " + ntoc( i ), 20 ), ; // 5 Round( ( 10000 -i ) * i / 3, 2 ), ; // 6 100.00 * i, ; // 7 0.12, ; // 8 Round( 100.00 * i * 0.12, 2 ), ; // 9 Round( 1234567.00 / i, 3 ), ; // 10 PadR( "Line " + StrZero( i, 5 ), 20 ), ; // 11 Date(), ; // 12 Time(), ; // 13 i % 2 == 0 } // 14 a := AClone(aDatos[ i ]) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) AEval(a, {|xv| AAdd(aDatos[ i ], xv) }) NEXT ...
Да, тоже не понял как клеятся слова выгрузка и setarrayto. Куда выгрузка, где эти колонки? У меня Tsbrowse был с 1000 колонок
Andrey
постоянный участник
Пост N: 6080
Зарегистрирован: 12.09.06
Отправлено: 25.10.18 21:06. Заголовок: Haz пишет: У меня T..
Haz пишет:
цитата:
У меня Tsbrowse был с 1000 колонок
У меня почему то 41 колонка и всё, больше не идёт.
SergKis пишет:
цитата:
126 колонок есть
У меня почему то режет в 3-х местах только на 41 колонку. Буду смотреть у себя, раз нет ограничений.
Andrey
постоянный участник
Пост N: 6084
Зарегистрирован: 12.09.06
Отправлено: 26.10.18 16:42. Заголовок: Понял почему это про..
Понял почему это происходит. Так как у меня выгружается иногда и по 40-50 тыс.записей, я сделал для того чтобы юзер не смотрел и не видел пустой экран, создание формы и показ таблицы из одной записи на 41 колонку. Потом я в ON INIT передаю новый массив. А далее делаю:
oBrw8:DeleteRow( .T. ) // Delete All oBrw8:aArray:={} // очистить массив
aArray := aDim // переопределяем на новый входящий массив
For nI := 1 TO Len(aArray) if ! empty(aArray[ nI ]) ADD ITEM aArray[ nI ] TO &cBrw OF &cForm EndIf Next
Из-за этого у меня и режется до 41 колонки.
Andrey
постоянный участник
Пост N: 6085
Зарегистрирован: 12.09.06
Отправлено: 26.10.18 17:48. Заголовок: Непонятка возникает ..
Непонятка возникает при обновлении массива. Показываю прелодер, а он при создании таблицы не показывает лепестки - белый экран и всё. Делаю так:
// создаём окно ожидания с потоком WaitThreadCreate( 'Расчёт по отчёту ...' ) // как в SAMPLES\BASIC\WAIT_WINDOW_2\demo2.prg
oBrw8:DeleteRow( .T. ) // Delete All oBrw8:aArray:={} // очистить массив
aArray := aDim // переопределяем на новый входящий массив
For nI := 1 TO Len(aArray) if ! empty(aArray[ nI ]) ADD ITEM aArray[ nI ] TO &cBrw OF &cForm // вариант 1 EndIf IF nI % 500 DO EVENTS // чтобы показывать прелодер из WaitThreadCreate() ENDIF Next
Если поместить DO EVENTS то таблица на экране вся показывается и мелькает, потом подвисает ещё иногда. Если убрать DO EVENTS то таблицы на экране нет (что хорошо), но прелодер не работает, белый экран на нём, без лепестков и время сбоку в секундах стоит, отображает 00:00:00.
Зачем? Зачем в ts добавлять по одному элементу? Формируй массив данных любуюсь на свой прелодер. А потом добавляй целиком. Хоть через SetArray(To) или прямым присвоением в oBrw:aArray с последующей синхронизации бровса ( тоже все уже разжевано на форуме) . Даже был пример как не массив а dbf подменить на лету.
Andrey
постоянный участник
Пост N: 6086
Зарегистрирован: 12.09.06
Отправлено: 27.10.18 15:56. Заголовок: Haz пишет: А потом ..
Haz пишет:
цитата:
А потом добавляй целиком.
Переделал это добавление. Действительно быстрее намного получилось. Только прелодер все равно белый, без лепестков. На 1-2 секунды появляется всего, потом уже Tsbrowse показывается.
Отправлено: 27.10.18 17:11. Заголовок: Haz пишет: Ты же са..
Haz пишет:
цитата:
Ты же сам в прошлом посте писал как это лечится
Он забыл типа
Andrey
постоянный участник
Пост N: 6120
Зарегистрирован: 12.09.06
Отправлено: 09.11.18 18:45. Заголовок: Всем привет ! Вопрос..
Всем привет ! Вопрос не могу решить, помогите пожалуйста. Таблица небольшая, на экран помещается, даже остаётся много пустого места. Добавляю туда ещё запись и не могу - показать на экране всю таблицу целикоми чтобы маркер был на добавленной записи. Причём есть индекс по полю, из-за него последняя запись в таблице не становиться последней, а чуток ранее. Делаю так:
oBrw:Reset() oBrw:Refresh(.T.) ItogoNN(oBrw) oBrw:SetOrder(2, , .F. ) // сортировка по столбцу 2 .... // мои вычисления позиции nRow в таблице oBrw:GoPos(nRow,5) // уст. МАРКЕР на ХХ строку и ХХ колонку oBrw:GotoRec( nRow, nRow-1 ) // ??? уст. МАРКЕР на ХХ строку и показать таблицу с 1-ой позиции строк oBrw:SetFocus() DO EVENTS
Пробовал по разному, сначала было oBrw:GotoRec( nRow, nRow ), всё равно таблица 1 позицию выдает с 9 строки таблицы. Потом сделал так oBrw:GotoRec( nRow, nRow -1 ) - без разницы. Методом научного тыка сегодня сделал. Нужно так оказывается:
oBrw:Reset() oBrw:Refresh(.T.) ItogoNN(oBrw) oBrw:SetOrder(2, , .F. ) // сортировка по столбцу 2 .... // мои вычисления позиции nRow в таблице Eval( oBrw:bGoTop ) // переход на начало таблицы oBrw:GoPos(nRow,5) // уст. МАРКЕР на ХХ строку и ХХ колонку oBrw:GotoRec( nRow, nRow-1 ) // ??? уст. МАРКЕР на ХХ строку и показать таблицу с 1-ой позиции строк oBrw:SetFocus() DO EVENTS
Спасибо вам за этот отличный метод !!!
SergKis
постоянный участник
Пост N: 2130
Зарегистрирован: 17.02.12
Отправлено: 10.11.18 16:44. Заголовок: Andrey пишет у меня ..
Andrey пишет
цитата:
у меня таблица через SetArrayTo()
Это означает таблица в массиве тсб, в таком случае :GotoRec(...) полностью игнорирует свои внутренности, т.е. НЕ РАБОТАЕТ, т.к. значение :lIsDbf = .F.
Пришёл Сергей и сдал военную тайну от том что goto на recno это только для dbf
Надо было терпеть до последнего
Andrey
постоянный участник
Пост N: 6123
Зарегистрирован: 12.09.06
Отправлено: 10.11.18 23:22. Заголовок: Haz пишет: Пришёл С..
Haz пишет:
цитата:
Пришёл Сергей и сдал военную тайну от том что goto на recno это только для dbf
Ну хоть что то стало понятней !
SergKis
постоянный участник
Пост N: 2131
Зарегистрирован: 17.02.12
Отправлено: 11.11.18 00:09. Заголовок: Haz пишет Надо было ..
Haz пишет
цитата:
Надо было терпеть до последнего
Игорь, тянуть нельзя было, Андрей до сих пор верит в Деда Мороза, что загружает SetArrayTo(), а не TsBrowse. Что дальше было бы ?
Теперь можно быть спокойным, Андрей пишет
цитата:
Ну хоть что то стало понятней !
Andrey
постоянный участник
Пост N: 6137
Зарегистрирован: 12.09.06
Отправлено: 02.12.18 18:43. Заголовок: Всем привет ! Замети..
Всем привет ! Заметил такую странность у себя в проектах использующие Tsbrowse/ Для Суперхидера цвет текста не работает ! Вот хотя бы для примера Tsb_Export, там цвет указан желтый, а всегда показывает черный.
Может не в той теме пишу, но продублирую. Попробовал XLSXML - отлично! Но заказчик захотел поле Number 16 знаков для номера банк.карты и вывод успешно загнулся. Я доковырял до модуля xlsxml_s.prg строка 123: ::writeData( "Number", row, column, AllTrim( Str( xData, 18, 6 ) ), style ) Получается, если разрядность больше - идут звезды при выводе. Не знаю, кто поддерживает этот модуль, - поправьте, плз.
Андрей - Tsb_Export - отличный пример! В Tsb2xml.prg -> FUNCTION XmlSetDefault: вместо oCol:XML_FootFont идет 2 раза присваивание oCol:XML_HdrFont -поправьте, плз.
Haz
администратор
Пост N: 1430
Зарегистрирован: 20.02.11
Отправлено: 16.01.19 16:36. Заголовок: krutoff пишет: о за..
krutoff пишет:
цитата:
о заказчик захотел поле Number 16 знаков для номера банк.карты и вывод успешно загнулся.
выводи как строку например вместо этого oObj:writeNumber( nRow, 13, 1234567890123456789, "numberRight" )
выводи так oObj:writeString( nRow, 13, ntoc(1234567890123456789), "numberRight" )
Andrey
постоянный участник
Пост N: 6179
Зарегистрирован: 12.09.06
Отправлено: 18.02.19 14:42. Заголовок: Всем привет ! Как б..
Всем привет !
Как боротся с отгрызанными стрелками ? Если делаю oBrw:Hide() или просто сохраняю/перечитываю цвета у бровса, то выходит так:
Только после того как мышкой встаю на линию скролинга, то тогда появляются стрелки. Юзер будет просто в шоке....
Как с этим бороться ?
SergKis
постоянный участник
Пост N: 2245
Зарегистрирован: 17.02.12
Отправлено: 18.02.19 14:52. Заголовок: Andrey пишет Как с э..
Andrey Посмотри исходник :Enabled(), думаю, увидишь Можешь найти тему "Новая версия ...", посвященную :Enabled()
Andrey
постоянный участник
Пост N: 6262
Зарегистрирован: 12.09.06
Отправлено: 18.04.19 16:57. Заголовок: Хотелось бы простого..
Хотелось бы простого написания, как то так - oBrw:Enabled( .F. , {BLACK,SILVER} ) А так придётся писать отдельную внешнюю функцию. Не совсем удобно... И в METHOD Enabled() нет сохранения
oBrw:nClrLine := ??? // цвет линий между ячейками таблицы
Для этого я добавил в класс DATA nClr_Gray AS NUMERIC INIT CLR_GRAY DATA nClr_HGray AS NUMERIC INIT CLR_HGRAY
А как это использовать - не понимаю.
У себя сделал тест:
oBrw:Enabled( .F. ) // блокировка таблицы с закраской nClrLine := TsbColorRepl(oBrw, BLACK, SILVER) MsgDebug(...) oBrw:nClrLine := nClrLine // восстановить цвет линий между ячейками таблицы oBrw:Enabled( .T. ) // разблокировка таблицы с закраской .... /////////////////////////////////////////////////////////////////// // заменить текущий цвет TBROWSE FUNCTION TsbColorRepl(oBrw, aBackColor, aFontColor) LOCAL nJ, nBackColor, nFontColor, nSaveColor
nFontColor := ToRGB( aFontColor ) nBackColor := ToRGB( aBackColor ) // ------ изменить цвета Tsbrowse ------------ FOR nJ := 1 to LEN(oBrw:aColumns) // меняем цвет по всем колонкам oBrw:SetColor( { 1}, { { || nFontColor } } ) // 1 , текста в ячейках таблицы oBrw:SetColor( { 2}, { { || nBackColor } } ) // 2 , фона в ячейках таблицы oBrw:Setcolor( { 3}, { nFontColor } ) // 3 , текста шапки таблицы oBrw:SetColor( { 4}, { { || nBackColor } } ) // 4 , фона шапка таблицы oBrw:SetColor( { 9}, { nFontColor } ) // 9 , текста подвала таблицы oBrw:SetColor( {10}, { { || nBackColor } } ) // 10, фона подвала таблицы //oBrw:SetColor( {15}, { { || CLR_WHITE } } ) // 15, линий между ячейками таблицы NEXT nSaveColor := oBrw:nClrLine // сохранить цвет линий между ячейками таблицы oBrw:nClrLine := nFontColor // новый цвет линий между ячейками таблицы // цвет фона под таблицей oBrw:hBrush := CreateSolidBrush( aBackColor[1], aBackColor[2], aBackColor[3] )
RETURN nSaveColor
Так заработала, только вверху шапки и внизу подвала за границей таблицы НЕ КРАСЯТСЯ ячейки.
SergKis
постоянный участник
Пост N: 2402
Зарегистрирован: 17.02.12
Отправлено: 18.04.19 20:27. Заголовок: Andrey пишет А как э..
Andrey пишет
цитата:
А как это использовать - не понимаю.
Внимательно, медленно просмотри метод :Enabled() Найди переменные, сравни со своим текстом ...
Andrey
постоянный участник
Пост N: 6267
Зарегистрирован: 12.09.06
Отправлено: 21.04.19 15:12. Заголовок: Всем привет ! Всех п..
Всем привет ! Всех поздравляю с праздниками ! Вопрос возник. Делаю у себя в проге на главной таблице:
oBrw:Enabled( .F. ) // блокировка таблицы с закраской
Таблица становиться серой и на первом же поле вывода прога сваливается:
Error BASE/1003 Переменная не существует: MARK // это первое поле в таблице
Called from (b)LISTFIELDTABLE(847) in module: Tbrw_table.prg Called from TSBROWSE:BDATAEVAL(1584) in module: h_tbrowse.prg Called from TSBROWSE:DRAWSELECT(3797) in module: h_tbrowse.prg Called from TSBROWSE:PAINT(9779) in module: h_tbrowse.prg Called from TCONTROL:HANDLEEVENT(878) in module: TControl.prg Called from TSBROWSE:HANDLEEVENT(8328) in module: h_tbrowse.prg Called from EVENTS(95) in module: h_events.prg Called from DOEVENTS(0) Called from CREATEBROWSEPRINTF5(441) in module: form_f5print.prg Called from FORM_F5PRINT(221) in module: form_f5print.prg Called from FORMPRINTF5(105) in module: form_f5print.prg Called from (b)BUTTON_UPMENUTABLE(2152) in module: Tbrw_table.prg
Вот код:
Дата_2 = '{|| (Alias())->MARK }' // это текстовый ини-файл
Отправлено: 21.04.19 16:04. Заголовок: Andrey пишет Что я н..
Andrey пишет
цитата:
Что я не так делаю ?
Для таких действий в объект колонки внесена переменная\свойство cAlias, т.е. oCol:bData := MacroBlock('MARK') oCol:cAlias := 'MY1' если алиас совпадает с алиасом тсб, то oCol:cAlias := oBrw:cAlias или обычный вариант oCol:bData := FieldWBlock('MARK', Select(Alias()))
Отправлено: 25.04.19 10:30. Заголовок: CheckBox по ENTER
Вопрос поднял Сергей, я немного перефразирую и спрошу тут
С какой целью в METHOD TSBrowse:Edit() в CheckBox игнорируется VK_RETURN ? Кроме как защита от дурака , когда пользователь тыкает бездумно по кнопкам и не смотрит что происходит у меня другого объяснения нет. Ведь до кнопки VK_SPACE нужно типа "осмысленно" дотянуться.
Только мне кажется что если бездумно , то все равно куда тянуться, до 1, 0, Y, N, S, ENTER, SPACE но только ENTER в этом случае игнорируется. В итоге пользователь до изнеможения долбит ENTER , забывая про SPACE и устав кликает мышью. Может восстановим VK_RETURN в правах ? для совместимости можно с флагом типа ::lCheckBoxIgnoreReturn по умолчанию TRUE , а можно и без тогда
If nKey != VK_RETURN .OR. # ::lCheckBoxIgnoreReturn
Отправлено: 27.04.19 21:04. Заголовок: Haz пишет: тогда в..
Haz пишет:
цитата:
тогда в своей программе при определении бровса достаточно указать oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c:cAlias ) }
Поставил у себя такую замечательную эту штуку в тестовый пример ! Отличное решение, юзера будут просто в восторге. Я ещё сделал поиск по номеру записи - вообще все претензии что программа сама удалила и исправила - пропадут ! Правда не по всем полям происходит запись. Нужно разбираться.
Правда не по всем полям происходит запись. Нужно разбираться.
Рад что пригодилось. Запись не идет по тем полям где используется bPrevEdit с последующим отказом от редвктирования., но с изменением значения. Тут нужно самому позаботиться, т. к. метод Edit не вызывается. В целом использую подобный функционал несколько лет. Мотивирует пользователя лучше чем пинок, особенно когда все видят героя.
Haz
администратор
Пост N: 1495
Зарегистрирован: 20.02.11
Отправлено: 27.04.19 21:42. Заголовок: Haz пишет: В целом ..
Haz пишет:
цитата:
В целом использую подобный функционал несколько лет.
Добавлю, что из объекта tsBrosе который передается блоку третьим параметром, легко достать номер колонки и соответственно имя Поля, которое изменили. Никак не доходят руки до контрольного примера запятая будет посвободнее обязательно что-нибудь простое напишу
Andrey
постоянный участник
Пост N: 6275
Зарегистрирован: 12.09.06
Отправлено: 27.04.19 22:20. Заголовок: Да мне Сергей посове..
Да мне Сергей посоветовал так сделать:
// запись в лог-файл всех изменений полей БД oBrw1:bEditLog := { |xo,xn,ob| WriteEditLog( xo, xn, ob ) }
///////////////////////////////////////////////////////////////////// // запись в лог-файл всех изменений полей БД FUNCTION WriteEditLog( xOld, xNew, oBrw ) LOCAL cFileLog := ChangeFileExt( Application.ExeName, ".log" ) LOCAL nCol, cHead, cStr, CRZ := "; "
nCol := oBrw:nCell - 1 // номер колонки в таблице cHead := oBrw:aColumns[ nCol ]:cHeading // имя шапки колонки IF LEN(ALLTRIM(cHead)) == 0 cHead := HB_NtoS(nCol) ENDIF
Возможно используешь :Selector по этому нумерация едет. Попробуй выдернуть имя поля через oCol:cName
Продолжу тут. Я лог веду в dbf, с указанием имени поля и тайм штампа времени изменения. Это позволяет вне завистмости в каком бровсе поменяли значение, всегда правильно показывать хронологию. Показ реализован прямо в бровсе по правой кнопке. Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней.
SergKis
постоянный участник
Пост N: 2475
Зарегистрирован: 17.02.12
Отправлено: 28.04.19 11:34. Заголовок: Haz пишет Имя колонк..
Haz пишет
цитата:
Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней
Посмотрел на примере, oBrw:nCell и nCol в METHOD PostEdit, разные. Добавил в вызов nCol
Все даты в формате GMT
3 час. Хитов сегодня: 29
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет