On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
Vlad04
постоянный участник


Пост N: 420
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 19.12.13 18:16. Заголовок: TsBrowse в Минигуи (продолжение)


TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений
К примеру

 цитата:

DEFINE TBROWSE oBrw2 ;
AT 60,450 ;
ALIAS cAlias ;
OF Form1 ;
WIDTH 330 ;
HEIGHT 340 ;
FONT "Verdana" ;
SIZE 9 ;
ON DBLCLICK CopyRec();
ON GOTFOCUS fModelo_Hab(2) ;
AUTOFILTER ;
CELLED EDIT;
VALUE nRec;
GRID


Здесь я собрал параметры из разных tBrows
Можно или нет и какие парметры заменить
выражением ( и каким) ?
oBrw2:....
oBrw2:....

























<a href=http://www.bestmarket.com.ua >ноутбуки</a>























<a href=http://www.bestmarket.com.ua >ноутбуки</a>
Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]


SergKis



Пост N: 1707
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.01.18 14:28. Заголовок: Haz пишет метод рабо..


Haz пишет
 цитата:
метод работает. Я о том что просто не пользуюсь им.


Я тоже не пользуюсь, но с тем что работает, не соглашусь.
Если фонты по блоку кода - валится, нет footer вывода ...
т.е. для того чтобы заработал, надо делать спец. отображение тсб.
с изменениями, простенький вывод есть без адо, длл и др. спец.оборудования.

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 758
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 26.01.18 11:36. Заголовок: Tsb_seek ИЗ пример..


Tsb_seek ИЗ примеров c:\MiniGUI\SAMPLES\Advanced\Tsb_seek\

Сегодня обратил на такую странность в отображении. Если стрелкой прокручивать бровс вниз,
то экран заполняется одинаковыми данными, не обновляется.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5703
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.01.18 13:48. Заголовок: Vlad04 пишет: то эк..


Vlad04 пишет:

 цитата:
то экран заполняется одинаковыми данными


Наверное залипла последняя запись в таблице. Такое бывает часто.
Нужно добавить разрыв в конец таблицы.
Был бы подвал в конце таблицы, можно было бы воспользоваться функцией
oBrw:SetNoHoles() // убрать дырку внизу таблицы


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 760
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 26.01.18 14:27. Заголовок: Помогло , без подвал..


Помогло , без подвала

Спасибо: 0 
Профиль
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 )}


CorrectionFirstLast - где то здесь описывается


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5705
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.01.18 15:38. Заголовок: Vlad04 пишет: Corre..


Vlad04 пишет:

 цитата:
CorrectionFirstLast


Выкинь эту функцию и забудь про неё !
Её дорабатывать нужно, я тоже её использовал, в каких то случаях помогает, в других вообще мешает.
Наz советовал её не пользоваться.
Делай высоту таблицы на 1-2 пикселя больше чем высота всех отображаемых ячеек.
Это SergKis так рекомендует. У меня залипание пропало в таких случаях.

Спасибо: 0 
Профиль
SergKis



Пост N: 1713
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.01.18 15:42. Заголовок: Vlad04 пишет Но не в..


Vlad04 пишет
 цитата:
Но не во всех случаях


если так
 
END WINDOW

br_f:SetNoHoles(3)
br_zaw:SetNoHoles(3)

br_f:enabled(.f.)


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 762
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 26.01.18 17:26. Заголовок: SergKis br_zaw:Set..


SergKis


 цитата:
br_zaw:SetNoHoles(3)


Очень хорошо ! А (3) , что означает ?
И вообще, что этот метод делает ?

Спасибо: 0 
Профиль
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. - рассчитает величину дырки, вернет из метода не меняя размер


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5706
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.01.18 08:12. Заголовок: Делаю таблицу выбора..


Делаю таблицу выбора по базе.
Создаю колонки:
     // создать 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.
Как это сделать ?

Вот картинка:




Спасибо: 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. Т.е. вместо показа чекбокса можешь вывести пустое место.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5707
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.01.18 10:13. Заголовок: Vlad04 пишет: А поп..


Vlad04 пишет:

 цитата:
А попробуй при формировании колонки установить условия показа чекбокса от значения ID. Т.е. вместо показа чекбокса можешь вывести пустое место.


Покажи как:
 ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ;  
DATA FieldWBlock( "VIEW", Select() ) ;


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1166
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.01.18 14:13. Заголовок: Andrey пишет: Табли..


Andrey пишет:

 цитата:
Таблица не простая, для ID=0 делаются заголовки в таблице цветом и запрет на редактирование.
Нужно убрать в таблице показ чекбокса по условию ID=0.
Как это сделать ?


Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать.
Но думаю грязновато работать будет. В смысле работать будет , но с глючком.

Оптимально - в классе дописать возможность ::aCheck назначать блок кода и добавить проверки на hb_isBlock( ::aCheck ).
тогда картинки чекбокса можно будет менять на лету , в том числе и задавать NIL

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5709
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.01.18 15:02. Заголовок: Haz пишет: Не меняя..


Haz пишет:

 цитата:
Не меняя класса TBROWSE можно только пытаться по условию ID=0 подменить ::aCheck в блоках ::bOnDrawLine и ::bOnDraw соответственно , а по условию ID <> 0 восстанавливать.
Но думаю грязновато работать будет. В смысле работать будет , но с глючком.



Вот я с этим и бился... Решил сделать по другому:
 
LOCAL hImgTrue := LoadImage("CheckT28"), hImgFalse := LoadImage("CheckF28")
.....
// создать 3-ю колонку
ADD COLUMN TO oBrw2 HEADER "Печать"+CRLF+"в таблице" ;
DATA FieldWBlock( "VIEW", Select() ) ; // эту строку наверное можно выкинуть ?
SIZE nWidth3 ;
NAME VIEW BITMAP ;
ALIGN DT_CENTER, DT_CENTER ;
EDITABLE MOVE DT_MOVE_DOWN
oBrw2:aColumns[3]:bPrevEdit:= {|| CheckField(), FALSE } // проверка до ввода
oBrw2:aColumns[3]:uBmpCell := {|| IF( (oBrw2:cAlias)->ID == 0, '' , IF( (oBrw2:cAlias)->VIEW , hImgTrue, hImgFalse ) ) }
oBrw2:aColumns[3]:bData := {||Nil}
oBrw2:aColumns[3]:cData := '{||Nil}'
oBrw2:aColumns[3]:nAlign := nMakeLong( DT_CENTER, DT_CENTER )



Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1167
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.01.18 15:19. Заголовок: Andrey пишет: Решил..


Andrey пишет:

 цитата:
Решил сделать по другому:


вполне нормальное решение отказаться от чекбокса и использовать подмену ::bData и ::uBmpCell
и главное оно универсально

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 767
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 30.01.18 16:44. Заголовок: Andrey Покажи как: ..


Andrey

 цитата:
Покажи как:

ADD COLUMN TO Brw_1 DATA {|| iif(Dogovor->Vid <> 0,aVidD[Dogovor->Vid],' Нет ' )} ...

Вариант не для ПРЯМОГО РЕДАКТИРОВАНИЯ.




Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1168
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 30.01.18 20:39. Заголовок: Vlad04 пишет: Вариа..


Vlad04 пишет:

 цитата:
Вариант не для ПРЯМОГО РЕДАКТИРОВАНИЯ.


Это скорее вариант не прямой выборки. Для редактирования ему как до луны.
Но это ни в коем случае не упрёк. Как работает блок выборки_записи, все
знают со времен клиппера, и допилить - не вопрос.
PS. сам часто использую этот прием, ступор иногда возникает при инкрементальном поиске по таким колонкам


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6712
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 30.01.18 22:43. Заголовок: Haz пишет: Для реда..


Haz пишет:

 цитата:
Для редактирования ему как до луны


Да уж


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5710
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 30.01.18 22:57. Заголовок: Andrey пишет: oBrw2..


Andrey пишет:

 цитата:
oBrw2:aColumns[3]:bPrevEdit:= {|| CheckField(), FALSE } // проверка до ввода



Редактировать нужно ТОЛЬКО ТРЕТИЙ столбец. Мышка и Enter в CheckField() прекрасно с этим справляются.
Там ещё параллельно в другую базу пишется...

Скрытый текст



Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 768
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 31.01.18 07:53. Заголовок: Haz Такую конструкци..


Haz
Такую конструкцию использую только для информационных столбцов, прямое редактирование использую
для простых таблиц, типа справочник (1-2 колонки), что сложней - в отдельной форме.

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 769
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 31.01.18 07:58. Заголовок: А есть примеры много..


А есть примеры многострочных бровсов ?
Вариантов может быть несколько:
в одной строке
- Поле 1
- Поле 2
или
- Часть1(Поле 1)
- Часть2(Поле 1)


Спасибо: 0 
Профиль
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
...



Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1169
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 31.01.18 11:12. Заголовок: SergKis пишет: А ес..


SergKis пишет:

 цитата:
А есть примеры многострочных бровсов ?


В примерах есть только вариант с широкими строками , где в ячейке может быть многострочный текст.
Такой вариант удобно использовать в виде календарика с событиями , привычно смотрится и можно каждую ячейку развернуть в окно с подробным описанием.
Все остальные случаи многострочного бровса можно поделить условно на 2 вида :
1) когда заранее готовятся многострочные данные для скармливания бровсу , это может быть подготовка массива, временной базы или результат SQL запроса к таблице.
Получаем многострочность в однострочном бровсе.

2) когда под задачу пишется свой Skipper() и FieldWblock().
Этот путь не простой , но проходимый.

Я использую вариант 1 , нет желания и времени возиться с 2

PS дополню
вариант 1 предпочтителен еще и тем что позволяет фильтровать ( срывать подразделы )



Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 770
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 01.02.18 11:03. Заголовок: Haz В примерах ес..


Haz


 цитата:

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



О каких примерах конкретно идёт речь ?

Спасибо: 0 
Профиль
Haz
moderator


Пост 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

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5718
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.02.18 14:27. Заголовок: Всем привет. Использ..


Всем привет.
Использую многострочный Tsbrowse (из 2х строк). Всё работает отлично.
При экспорте в Эксель высота строк ставиться почему то как одна строка.
И приходиться твблицу в Экселе вручную высоту править... Убийственная работа.
Нельзя там в исходниках исправить высоту ячеек, сделать её зависимой от высоты таблицы ячеек ?

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 775
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 10.02.18 07:15. Заголовок: в Эксель высота стр..



 цитата:
в Эксель высота строк ставиться почему то как одна строка.


А у Эксель для данного столбца нельзя ли установить свойство - ПЕРЕНОСИТЬ ПО СЛОВАМ.
Тогда Эксель будет сам высоту строк править

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5719
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.18 09:08. Заголовок: Vlad04 пишет: А у Э..


Vlad04 пишет:

 цитата:
А у Эксель для данного столбца нельзя ли установить свойство


Я там исходник глянул .... и ничего не понял...

Спасибо: 0 
Профиль
Haz
moderator


Пост 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 и ее содержимое понятно без каких либо тайных знаний.

PS Подарок тем , кому лень искать константы:
http://www.purebasic.fr/english/viewtopic.php?p=267584

PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами.
Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке.
В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml.
Пишу с мобильного и точно не помню.
Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка.
И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1174
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.02.18 16:03. Заголовок: PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами. Формат BIFF считаю устар


И в новое сообщение тоже
PPS Добавлю свое мнение, которое может не совпадать со мнгоми форумчанами.
Формат BIFF считаю устаревшим, и не уверен что его следует развивать библиотеке.
В 2007 микрософт формально его похоронил перейдя на xml. В исходнках harbour есть что то типа xlsxml.
Пишу с мобильного и точно не помню.
Уверен xml более перспективен как экспорт данных, т. к. микрософт теперь его использует в основе движка.
И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)


Спасибо: 0 
Профиль
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)
* ============================================================================

Function BiffRec( nOpCode, uData, nRow, nCol, lBorder, nAlign, nPic, nFont )
....

Блин, да это только для шаманов ....




Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1175
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.02.18 16:57. Заголовок: Andrey пишет: Блин,..


Andrey пишет:

 цитата:
Блин, да это только для шаманов


Шаманом себя не считаю, но проблем не вижу.
В понед гляну с компа.
И прочитай мое последнее сообщение по поводу BIFF



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5721
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.02.18 17:40. Заголовок: Haz пишет: И вот в ..


Haz пишет:

 цитата:
И вот в xml готов поучаствовать. Тестовые примеры выгрузки в Excel из harbour у меня идут отлично и по скорости и по оформлению. Прикрутить класс к Tsbrowse, например как :Excel3() считаю вопросом времени (свободного времени)



Очень хочется иметь этот новый класс в исходниках.
Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации.


Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 776
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 11.02.18 11:43. Заголовок: Haz Тестовые пример..


Haz

 цитата:
Тестовые примеры выгрузки в Excel из harbour у меня идут отлично



Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай.

Спасибо: 0 
Профиль
Vlad04
постоянный участник


Пост N: 777
Зарегистрирован: 13.10.05
ссылка на сообщение  Отправлено: 11.02.18 11:44. Заголовок: из Tsbrows..


из Tsbrows

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1176
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.02.18 12:24. Заголовок: Vlad04 пишет: Это ..


Vlad04 пишет:

 цитата:

Это не OLE и Excel 2007 и выше? Тогда может в начале с примерами ознакомить ? Выгрузка в Tsbrows частный случай.


Это не OLE, до 2007 микрософт отстегивал стороннему разработчику за использование xml позже написал свою компоненту.
Поддержка xml была и до 2007.
Примеры все в исходниках харбура. Знакомся на здоровье, все в свободном доступе. Ссылки на исходники есть в разделе Harbour на этом форуме

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6723
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.02.18 14:34. Заголовок: Andrey пишет: Я так..


Andrey пишет:

 цитата:
Я так же готов поучаствовать в тестировании и настройке этого класса, по мере своей квалификации.


+1
Потестю на древнем Excel 2003

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1177
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.02.18 16:48. Заголовок: Dima пишет: Потестю..


Dima пишет:

 цитата:
Потестю на древнем Excel 2003


Так ты уже потестил)

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6724
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.02.18 18:56. Заголовок: Haz пишет: Так ты у..


Haz пишет:

 цитата:
Так ты уже потестил)


Это было не с Минигуи

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1178
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.02.18 12:01. Заголовок: Andrey пишет: Блин,..


Andrey пишет:

 цитата:
Блин, да это только для шаманов ....


Глянул с компа. Какие шаманы ??? примитив в 4 строки кода

Чтоб ::Excel2 был зависим от высоты строк бровса нужно всего - то
1) перейти по ссылке которую я давал и найти там установку высоты строки по умолчанию увидеть там код команды, ее длину и прочитать про размерность единицы высоты
 
DEFHEIGHT.DEF_ROWHEIGHT_RECORD
DEFHEIGHT\opcode = 37
DEFHEIGHT\length = 2


2) Открыть исходник BiffRec() и после команды 36 ( ну чтоб попорядку ) вставить нашу 37
 
Case nOpCode == 37 // DEF_ROWHEIGHT_RECORD record
Default nCol := nRow
cHead := I2Bin( 37 ) + ; // opCode
I2Bin( 2 ) // body length
cBody := I2BIN( uData )



3) Открыть исходник Excel2() и задать высоту строк по умолчанию по высоте строки бровса ( про размерность по ссылке конечно прочитали - поэтому *20, но мне точнее показалось на 15 )
 
FWrite( nHandle, BiffRec( 66, GetACP() ) )
FWrite( nHandle, BiffRec( 12 ) )
FWrite( nHandle, BiffRec( 13 ) )
FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 20) )


PS Кто тут увидел шаманов

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5723
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.18 14:49. Заголовок: Haz пишет: PS Кто т..


Haz пишет:

 цитата:
PS Кто тут увидел шаманов



Да ты шаман !
Можешь у других спросить... Больше тебя и никто и не написал как делать !

Заодно и подскажи как для шапки таблицы такое же сделать ?
А то тоже получается всегда в одну строчку !


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1179
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.02.18 14:52. Заголовок: Кому была интересна выгрузка в Excel через XML


Пересобрал библиотеку hbxlsxml.lib под BCC ( в родной с русским есть глюк)
и дополнил свой пример Tsb_cursor выгрузкой в Excel по правой кнопке мышь.
Это просто пример, как альтернатива BIFF или OLE
Цветная раскраска и формулы поддерживается от автора библиотеки.

по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре
click here

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1180
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.02.18 14:55. Заголовок: Andrey пишет: Заодн..


Andrey пишет:

 цитата:
Заодно и подскажи как для шапки таблицы такое же сделать ?
А то тоже получается всегда в одну строчку !



можно перед записью строки заголовков задать высоту по заголовку, а потом перед записью данных задать высоту данных

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5724
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.02.18 18:08. Заголовок: Haz пишет: по ссылк..


Haz пишет:

 цитата:
по ссылке готовый пример, исходник примера и библиотека. исходники самой библы в искать харбуре



Пример понятен.
Наверное всё таки тестовый пример нужно отдельно для этого делать, с разными типами полей.
Или прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3

Желательно ещё бы сразу в примере задать многострочный Tsbrowse для экспорта.
Суперхидер и подвал так же необходим в экспорте.
А цвета наверное нужно как то задавать отдельным параметром в ЭКСПОРТ, тира 0-черно/белый, 1-цвет передать с Tsbrowse, 2-задать свои отдельные цвета. Это как предложение по цвету.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1181
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 12.02.18 19:38. Заголовок: Andrey пишет: прик..


Andrey пишет:

 цитата:
прикрутить этот новый экспорт в пример MiniGUI\SAMPLES\Advanced\Tsb_array_3


Я продемонстрировал сам механизм использования xmlxls.
По которому можно примерно оценить скорость выгрузки 1000 строк и
простейшее оформление. Конечно в этом механизме есть и форматы ячеек и формулы и использование цвета, объединения, задавать шрифты и пр. Конечно не все, но многое в нем есть.
Сам по себе экспорт бровса в оригинальном виде в Excel, это как полуфабрикат.
Выгрузка документа должна быть законченной, включая оформление. Под офомлением я понимаю вид документа, а не слответствие листа в Excel внешнему виду бровса.
Оформление должно включать все реквизиты документа, а не только табличку.
Сейчас лучшее оформление можно получить через OLE, но скорость оставляет желать лучшего. Понятно что можно выкинуть в олю массив, а потом наряжать лист, так и это не быстро.
Наводить красоту можно и через тот же BIFF, но нет библиотеки, а в кодах по спецификации BIFF можно потеряться.
В этом плане xmlxls это компромис с хорошей скоростью и возможностью рисовать почти как хочешь.
Я на нем сделал несколько отчётов и могу сказать, что это именно альтернатива OLE для рисования на листе Excel.

Теперь что касается выгрузки именно бровса в Excel.
Встраивать сам класс в исходники TSBROWS скорее всго не рационально т. к. бровс потребует библиотеку xmlxls для сборки.
А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо.
Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.




Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6727
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.02.18 23:00. Заголовок: Haz пишет: Встраива..


Haz пишет:

 цитата:
Встраивать сам класс в исходники TSBROWS скорее всго не рационально т. к. бровс потребует библиотеку xmlxls для сборки.


+1

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5725
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.02.18 14:39. Заголовок: Haz пишет: Но делат..


Haz пишет:

 цитата:
Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.



Хорошо, я тогда сделаю пример таблицы для этого. А там далее уже поможешь...

Возвращаюсь к вопросу:
Haz пишет:

 цитата:
можно перед записью строки заголовков задать высоту по заголовку, а потом перед записью данных задать высоту данных


Можно для Григория (чтобы он добавил в библиотеку) дать код для этого ?

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1182
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.02.18 21:52. Заголовок: Andrey пишет: Хорош..


Andrey пишет:

 цитата:
Хорошо, я тогда сделаю пример таблицы для этого. А там далее уже поможешь...

договорились

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1183
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.02.18 21:57. Заголовок: Haz пишет: Можно дл..


Haz пишет:

 цитата:
Можно для Григория (чтобы он добавил в библиотеку) дать код для этого ?


Да можно конечно. Тем более, что это и так понятно по коду Excel2 куда что вставлять. Вопрос, а надо ли из простого экспорта, городить копию бровса?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5726
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.02.18 11:00. Заголовок: Haz пишет: Вопрос, ..


Haz пишет:

 цитата:
Вопрос, а надо ли из простого экспорта, городить копию бровса?


Нет не надо, надо только 2 позиции:
1) Просто если шапка таблицы (а это часто бывает) состоит из нескольких строк, то при экспорте надо учитывать высоту шапки.
2) Если данные таблицы 2-3 строки, то при экспорте тоже учитываем высоту данных таблицы.

У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту.

Спасибо: 0 
Профиль
Haz
moderator


Пост 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 ! Empty( cTitle )
cTitle := StrTran( cTitle, CRLF, Chr( 10 ) )
nAlign := If( Chr( 10 ) $ cTitle, 5, 1 )
FWrite( nHandle, BiffRec( 4, cTitle, 0, 0,, nAlign ) )
nLine := 3
EndIf

Добавляем это
FWrite( nHandle, BiffRec( 37 , ::nHeightHead * 15) )



А После этого ...
If bPrintRow != Nil .and. ! Eval( bPrintRow, nRow )
::Skip( 1 )
Loop
EndIf

Добавляем это
If nRow == 2
FWrite( nHandle, BiffRec( 37 , ::nHeightCell * 15) )
END


Andrey пишет:

 цитата:
У меня несколько таблиц есть с такими параметрами, да я думаю и другие порадуются более корректному экспорту.


может кто и порадуется , а по мне это просто способ схалявить на выгрузке таблицы. НУ чтоб юзер отстал , или для себя бумажку распечатать надо.
такую выгрузку до ума еще доводить и доводить ( к примеру форматы ячеек ставить "процентный" или "финансовый" или как принято в фин отчетности - все отрицательные числа в скобках )
Проще уж сразу выгружать нормально


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1185
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.02.18 11:53. Заголовок: Использование ::aCheck


для справки;

Обнаружил неприятную особенность :aCheck , при задании в качестве картинки хендла картинки из внешней переменной ( в моём случаи PUBLIC ) , повторный вызов TS картинку уже не показывал .
Беглый просмотр кода исходников показал что при дестрое TS , так же дестроятся и эти хендлы. Т.е. закрытие бровса убивало PUBLIC переменные с хендлами картинок.

Из ситуации вышел без изменения исходников , храня хендлы в самом бровсе через
 
__objAddData (oBrw, 'hPic1' )
oBrw:hPic1:= LoadImage("PICTURE1")

и

oBrw:GetColumn( 'COL1'):aCheck := {oBrw:hPic1, nil }



Спасибо: 0 
Профиль
SergKis



Пост N: 1742
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.02.18 20:49. Заголовок: Haz пишет oBrw:GetCo..


Haz пишет
 цитата:
oBrw:GetColumn( 'COL1'):aCheck := {oBrw:hPic1, nil }


Почему сразу не делать oBrw:GetColumn( 'COL1'):aCheck := {LoadImage('PICTURE1'), nil } ?


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1186
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.02.18 21:18. Заголовок: SergKis пишет: Поче..


SergKis пишет:

 цитата:
Почему сразу не делать


Логично, но не рискнул. При uBmpCell при этом идёт утечка памяти.
В aCheck возможно утечка не проявится... тестировать не стал
Хотя uBmpCell я вызвал в блоке...

Спасибо: 0 
Профиль
SergKis



Пост N: 1743
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.02.18 21:35. Заголовок: Haz пишет При uBmpC..


Haz пишет
 цитата:
При uBmpCell при этом идёт утечка памяти.


Как я понимаю, uBmpCell это полностью собственное управление, сам поставил, сам снял\освободил.
Остальные свойства доводились "до кондиции"Скрытый текст

Рекомендовал бы, вместо uBmpCell, использовать :aBitMaps с цифровым значением (Tsb_aBitMaps)
 
oBrw:GetColumn("FLD1"):aCheck := { LoadImage(".\RES\Print32.png"), NIL }
oBrw:GetColumn("FLD2"):aCheck := { LoadImage(".\RES\Save32.png" ), NIL }
oBrw:GetColumn("FLD3"):aCheck := { LoadImage(".\RES\Mail32.png" ), NIL }
oBrw:GetColumn("FLD4"):aCheck := { LoadImage(".\RES\check1.bmp" ), ;
LoadImage(".\RES\check0.bmp") }

oBrw:GetColumn("FLD6"):lBitMap := .T.
oBrw:GetColumn("FLD6"):aBitMaps := { LoadImage(".\RES\edit_delete.bmp" ), ;
LoadImage(".\RES\edit_cancel.bmp" ) }
...
oBrw:GetColumn("FLD7"):lBitMap := .T.
oBrw:aBitMaps := { LoadImage(".\RES\flag_bel.bmp"), ;
LoadImage(".\RES\flag_en.bmp" ), ;
LoadImage(".\RES\flag_kaz.bmp"), ;
LoadImage(".\RES\flag_ru.bmp" ), ;
LoadImage(".\RES\flag_ua.bmp" ) }


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1187
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.02.18 21:49. Заголовок: SergKis пишет: Реко..


SergKis пишет:

 цитата:
Рекомендовал бы, вместо uBmpCell, использовать :aBitMaps


Да, согласен спасибо за подсказку.
В uBmpCell утечка была именно из-за блока. При каждом DrawLine() инмциализировался новый хендл.


Спасибо: 0 
Профиль
SergKis



Пост N: 1744
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.02.18 23:32. Заголовок: SergKis пишет Осталь..


SergKis пишет
 цитата:
Остальные свойства доводились "до кондиции"


Упс. Потерялось однако. В моей версии еще такие строки есть в методе Destroy():
 
...
If Len( ::aColumns ) > 0
For i := 1 To Len( ::aColumns )
If Valtype( ::aColumns[ i ]:aCheck ) == "A"
AEval( ::aColumns[ i ]:aCheck, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } )
EndIf
If Valtype( ::aColumns[ i ]:aBitMaps ) == "A"
AEval( ::aColumns[ i ]:aBitMaps, {|hBmp| If( Empty( hBmp ), , DeleteObject( hBmp ) ) } )
EndIf
Next
EndIf


If Valtype(::aBitMaps) == "A"
AEval(::aBitMaps, {|hBmp| If( empty(hBmp), , DeleteObject(hBmp) ) })
EndIf

...

т.е. в тек. версии утечка есть при oBrw:aBitMaps := {LoadImage(...), ...}
на колонках утечки нет.


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1188
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.02.18 08:37. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. в тек. версии утечка есть при oBrw:aBitMaps := {LoadImage(...), ...}
на колонках утечки нет


Возможно и а текущей не будет утечки если aBitMaps задавать массивом.
Внутренние переменные бровса убьются сборщиком мусора после дестроя самого бровса.
А во время работы бровса новые объекты не создаются.
В моем же случае было uBmpCell := {¦¦ if( lFllag, Loadimage(), nil)}
тоесть при навигации бровса постоянно создаётся новый хендл картинки, не уничтожая старый.
GdiPlus при навигации показал утечки. Обнаружил проблему Дима, у него пользователь от скуки гонял курсор вверх вниз и брос падал.
С дестроем в твой версии все понятно. Непривычно само поведение - кормишь бровсу переменную, а он ее убивает.
Этот момент нужно учитывать. У меня маленькая статусная картинка используется в нескольких модулях и в каждом бровсе, я ее определил в паблик переменной при старте программы сслаюсь на нее везде. т. е. LoadImage() делал один раз. Поскольку aCheck практически не использовал то проблем не видел. Будем считать это особеннстью бровса.


Спасибо: 0 
Профиль
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 аналогично.
Надо ли ?


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1189
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.02.18 12:08. Заголовок: SergKis пишет: aChe..


SergKis пишет:

 цитата:
aChecк, aMitMaps как особенность тсб, просто надо учитывать


я про это же . Пока сам не наткнешься- не поймешь )


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1238
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 16.02.18 13:31. Заголовок: SergKis пишет: В мо..


SergKis пишет:

 цитата:
В моей версии еще такие строки в методе Destroy():


Благодарю за исправление
Добавил его в текущий код.

Кстати, уже готов RC 3 для новой сборки.
Кратко, что нового см. ниже
Скрытый текст


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5731
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 20.02.18 12:38. Заголовок: Haz пишет: А вот от..


Haz пишет:

 цитата:
А вот отдельный пример экспорта бровса сделать конечно можно. Подвалы, суперхидеры, шрифты и цвета, это все решаемо.
Но делать из какого либо примера винегрет, тоже не вариант. Так что только отдельный и небольшой, чтоб было понятно что где.


Сделал отдельный пример. Отправил на почту. Ждем что выйдет из под руки мастера !

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1190
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.02.18 20:51. Заголовок: Andrey пишет: Ждем ..


Andrey пишет:

 цитата:
Ждем что выйдет


За пару дней, что нибудь да выйдет.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1243
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.02.18 21:30. Заголовок: Andrey пишет: Отпра..


Andrey пишет:

 цитата:
Отправил на почту


На какую
Ничего не пришло...

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1191
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 20.02.18 22:34. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
На какую
Ничего не пришло...


Григорий, мне пришло
Андрей хочет выгрузку в Excel из бровса в формате XML увидеть.
Я так вывожу отчёты из программ. Качество оформления как OLE, скорость выгрузки как BIFF


Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1244
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 20.02.18 23:17. Заголовок: Haz пишет: мне приш..


Haz пишет:

 цитата:
мне пришло


Понял, буду ждать от Вас выгрузку в Excel из бровса в формате XML

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1192
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.02.18 15:53. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделал отдельный пример. Отправил на почту. Ждем что выйде


Андрей, скинул на почту.

Для справки :
Под выгрузку немного допиливал библиотеку hbxlsxml, в оригинальной косяки с русским языком и многострочными ячейками в Excel.
Библиотека не секрет , могу выложить все исходники.

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

И наконец выгрузка бровса - частный случай. Я рисую морду отчету и гружу из DBF

ЗЫ В примере не стал трогать Excel3() , которую подправил Сергей, а написал Brw2Xml и вставил ее вызов.




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5733
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.02.18 17:39. Заголовок: Haz пишет: Библиоте..


Haz пишет:

 цитата:
Андрей, скинул на почту.


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. Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи !

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1193
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.02.18 19:57. Заголовок: Andrey пишет: Загол..


Andrey пишет:

 цитата:
Заголовок таблицы - косяк: размер фонта не тот.


Я его и не делал, все для этого есть. Как задать шрифт видно из примера по хидеру и футеру. Опрелить стиль для заголовка дело 3 минут.
То же и суперхидер, сделать можно, но зачем?
Задачу воспроизводства бровса в Excel один в один, решить то можно, только кому она нужна?
Более востребованы быстрые выгрузки в Excel, тем более оформленные как отчёты.


Andrey пишет:

 цитата:
Формат вывода 6-ой колонки не соответствует Tsbrowse


Форматы все задаются в функции XMLSetDefault(), специально задал только 2.
Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение. Andrey пишет:

 цитата:
Далее нет цветового оформления.
Т.е. нужно бы сделать цвета таблицы полностью как в Tsbrowse. Возможно ли такое сделать ?


Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру.
Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета.

PS Andrey пишет:

 цитата:
Судя по правкам в исходнике, у тебя ещё старая версия МиниГуи !


Там правка только карго касается, не гонюсь сразу обновряться, т. к. некоторые библиотеки харбура приходится обновлять (в поставке они старые)
Да и сюрпризы в отлаженном коде после обновлений иногда бывают. Обновляюсь когда есть время на ловлю блох в своих проектах после обновлений.

Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример?
PS сегодня, внесу мелкие правки

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5734
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.02.18 13:10. Заголовок: Haz пишет: Ну и гла..


Haz пишет:

 цитата:
Ну и главное, мы тут переписываемся, а народ не знает о чем. Кто выложит пример?



Григорию отправлю пример, как сделаем.

Haz пишет:

 цитата:
Возможно, при условии что цвет задан явно, а не блоком кода. В примере это показано по хидеру и футеру.
Кстати твоя выгрузка через Excel2() вообще ничем в этом раскладе, ни шрифтов ни цвета.


Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел.
Чтобы потом можно было делать на базе этого свою раскраску отчёта.
А выгрузка через Excel2() ограничена, из-за чего я и ухватился за твой пример.

Haz пишет:

 цитата:
Форматы все задаются в функции XMLSetDefault(), специально задал только 2.
Не хочу писать транслятор с форматов PICTURE в форматы Excel. Это отдельное и бесполезное развлечение.


Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле.
Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку.


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1194
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 13:17. Заголовок: Andrey пишет: Согла..


Andrey пишет:

 цитата:
Согласен с этим, но в качестве примера как сделать ТОЛЬКО для одного формата я и ввел в пример такое поле.
Чтобы потом, каждый кто будет использовать это, смог сделать свою обработку.



Лови
https://drive.google.com/open?id=1J_3jTxCSvdPg_xzhhLgSqi7yro6l_NyL


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1195
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 13:19. Заголовок: Andrey пишет: Тогда..


Andrey пишет:

 цитата:
Тогда, если можно дай пример закраски шапки таблицы (любым цветом) и отрицательных чисел.
Чтобы потом можно было делать на базе этого свою раскраску отчёта.


в примере шапка и так красится, что касается отрицательных чисел , то это задается теми же форматами 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\ "

Brw2Xml(oBrw, "TEST.XML", .T.,, aTitle)
XmlReSetDefault( oBrw )




Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1196
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 13:32. Заголовок: Haz пишет: А выгруз..


Haz пишет:

 цитата:
А выгрузка через Excel2() ограничена


На самом деле если бы была нормальная спецификация пл BIFF2(4) , то выгрузка Excel2() довольно легко дополняется. Видел только англоязычную где то, да и с примерами по BIFF очень скудно.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5735
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.02.18 13:53. Заголовок: Haz пишет: в пример..


Haz пишет:

 цитата:
в примере шапка и так красится,


У меня нет. Excel 2003





Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6737
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.02.18 13:58. Заголовок: Andrey пишет: Excel..


Andrey пишет:

 цитата:
Excel 2003


Я думал один такой на форуме

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1197
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 13:59. Заголовок: Andrey пишет: У мен..


Andrey пишет:

 цитата:
У меня нет. Excel 2003



Да , у 2003 ограничения по палитре.
Попробуй в коде подставить
 
вместо этого oStyle:bgColor( '#' + NToC(oBrw:nClrSpcHdBack, 16) )
вот это oStyle:bgColor( '#' + NToC(CLR_GREEN, 16) )



Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1198
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 14:01. Заголовок: Dima пишет: Я думал..


Dima пишет:

 цитата:
Я думал один такой на форуме



Надо же чтоб кто то на старье потестил )))


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6738
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.02.18 14:01. Заголовок: Haz пишет: На самом..


Haz пишет:

 цитата:
На самом деле если бы была нормальная спецификация пл BIFF2(4)


Не она ?
https://www.openoffice.org/sc/excelfileformat.pdf

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1199
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 14:07. Заголовок: Dima пишет: Не она ..


Dima пишет:

 цитата:
Не она ?


Это видел, кто возьмется перевести на "великий и могучий" ?



Спасибо: 0 
Профиль
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() ?




Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1200
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 14:35. Заголовок: Andrey пишет: Можно..


Andrey пишет:

 цитата:
Можно как нибудь убрать/починить этот формат для METHOD Excel2() ?


или полностью переделывать , то есть все предустановки выносить из Excel2() и назначать до экспорта ( у меня для этого служит XMLSetDefault() и переопределения перед экспортом) или навсегда вшивать этот ( никому не нужный формат ) в исходник Excel2(). Сам формат можно подсмотреть у меня в выгрузке.


Спасибо: 0 
Профиль
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\ "

Brw2Xml(oBrw, "TEST.XML", .T.,, aTitle) // экспорт в Excel
XmlReSetDefault( oBrw )

А лучше наверное в исходнике дать этот формат и небольшое описание, типа для назначения своих форматов.

Можно название твоей функции поменять на Excel3Xml() ?

И ещё вопрос:
      For nCol := 1 To Len( oBrw:aColumns ) 
uData := Eval( oBrw:aColumns[ nCol ]:bData )
cType := ValType( uData )

можно добавить сюда сразу:
 
nBackColor := oBrw:aColumns[ nCol ]:nClrBack
oStyle:bgColor( '#' + NToC(nBackColor, 16) ) // Excel > 2003

Или так не пойдёт, потому что цвета Tsbrowsa состоят из блок-кода ?


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1201
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 17:51. Заголовок: Andrey пишет: сдела..


Andrey пишет:

 цитата:
сделать определение этого формата до вызова Excel2(), как ты сделал у себя:


Это потребует переделки метода, лучше выносить наружу, т.к форматов в Excel гораздо больше чем в харбур и могут они быть любые

Andrey пишет:

 цитата:
Можно название твоей функции поменять на Excel3Xml()


Называй как хочешь )

Спасибо: 0 
Профиль
SergKis



Пост N: 1767
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.02.18 18:18. Заголовок: Andrey пишет Или так..


Andrey пишет
 цитата:
Или так не пойдёт, потому что цвета Tsbrowsa состоят из блок-кода ?


Сделай обработку блока кода
 
nBackColor := oBrw:aColumns[ nCol ]:nClrBack
If Valtype( nBackColor ) == "B"
Eval( nBackColor, oBrw:nAt, nCol, oBrw )
EndIf

oStyle:bgColor( '#' + NToC(nBackColor, 16) ) // Excel > 2003


Спасибо: 0 
Профиль
SergKis



Пост N: 1768
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.02.18 18:22. Заголовок: PS сори, пропустил п..


PS
сори, пропустил пока набирал (маленький экран)
nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw )


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5738
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.02.18 19:11. Заголовок: SergKis пишет: Сдел..


SergKis пишет:

 цитата:
Сделай обработку блока кода



Сделал. Цвета не появляются ! Хотя коды цвета правильные, совпадают с CLR_HGRAY
Вот код:
 
For nCol := 1 To Len( oBrw:aColumns )
uData := Eval( oBrw:aColumns[ nCol ]:bData )
cType := ValType( uData )

nBackColor := oBrw:aColumns[ nCol ]:nClrBack
If Valtype( nBackColor ) == "B"
nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw )
EndIf
//? nLine, nCol, nBackColor, "== 12632256", CLR_HGRAY
oStyle:bgColor( '#' + NToC(nBackColor, 16) )

switch cType

Наверное ещё что-то нужно сделать, чтобы применить цвет к этой ячейке ?


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1202
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 20:10. Заголовок: Andrey пишет: Навер..


Andrey пишет:

 цитата:
Наверное ещё что-то нужно сделать, чтобы применить цвет к этой ячейке ?


Стиль нужно определить заранее. С блоками скорее в два прохода придётся. Сначала анализируем весь бровс на возможные форматы по цвету, шрифту и пр. На основе анализа формируем все эти форматы, а потом, при выводе бровса в зависимости от результата блока выбираем нужный формат.
Excel читает XML построчно. К момену вывода ячейки формат должен быть определен
Из примера куска кода не ясно где он расположен в тексте
Ps почитал выше, тут не сработает. Тут идёт вывод и форматы уже определены ранее.
Андрей, ты зациклен на воспроизводстве внешнего вида бровса. Либо заранее опрелить цвет которам ты будешь рисовать. Либо взять цвет из каждой ячейки при первомпроходе, сформитовать форматы запомнив координаты. А при выводе брать по координатам.
Я же сторонник того, что копия бровса в Excel никому не нужна. Достаточно вывести данные в читаемом и оформленном виде, для маньков путь анализа бровса.
Другим способом можно назвать условное ворматирование Excel, но там тоже все не само появится, и нужно как минимум знать как написать условный формат.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5739
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.02.18 21:01. Заголовок: Haz пишет: Из приме..


Haz пишет:

 цитата:
Из примера куска кода не ясно где он расположен в тексте


Вот код:
   While  nLine <= nLen 
oSheet:cellHeight( nRow, 1, oBrw:nHeightCell / 1.3 )

For nCol := 1 To Len( oBrw:aColumns )
uData := Eval( oBrw:aColumns[ nCol ]:bData )
cType := ValType( uData )

nBackColor := oBrw:aColumns[ nCol ]:nClrBack
If Valtype( nBackColor ) == "B"
nBackColor := Eval( nBackColor, oBrw:nAt, nCol, oBrw )
EndIf
//? nLine, nCol, nBackColor, "== 12632256"
oStyle:bgColor( '#' + NToC(nBackColor, 16) )

switch cType

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 и не могу с ходу. Для этого нужно разбираться.
А что за пример в котором не показано как можно сделать !
И не маньяк я, а хочу иметь в качестве примера - как нужно правильно делать, а не методом тыка работает/не работает.
Т.е. отдельно написать: // секция для цветового оформления таблицы.
Шапку, суперхидер и подвал как заполнять цветом уже понятно, осталось только саму таблицу покрасить.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1203
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.02.18 21:14. Заголовок: Andrey пишет: Вот я..


Andrey пишет:

 цитата:
Вот я решил сделать цвета в xml и не могу с ходу. Для этого нужно разбираться.


Определить стиль перед выводом заранее. При выводе указать каким стилем. Ты же пытаешься во время вывода ячеек бровса сунуть цвет непонятно какому стилю. Это как раскраски, хочу фигурку закрасить желтым, беру жёлтый фломастер каторый уже заранее преготовлен. Я же не просто так говорил про варианты :
1 выбирать заранее определенные стили - условные цвета вывода
2 попытаться при прогоне по бровсу сформировать все комбинации цвет, шрифт, рамка, выравнивание. Опрелить их как стили с привязкой к координатам ячейки и при выводе бровса брать эти стили
3 тоже что и 2 но использовать условное форматирование.
Мне не сложно еще раз повторить, что Excel читает XML сверху вниз и слева направо. То есть сначала раскладываем фломастеры и их уже не меняем. Потом рисуем тем что разложили. Реализация динамической раскраски начинается с вопроса, а какие фломастеры потребуются.

Ну уж если совсем по простому
То обрати внимание что цвет шапки и подвала задаётся в соответствуюших местах кода под коментарием ОПРЕДЕЛЯЕМ СТИЛИ ШАПКИ и ОПРЕДЕЛЯЕМ СТИЛИ ПОДВАЛА.
Там же есть и комментарий ОПРЕДЕЛЯЕМ СТИЛИ КОЛОНОК, вот туда свой цвет и пихай. И учти каждый стиль одного цвета, нужен другой цвет - определяй новый стиль.


Спасибо: 0 
Профиль
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() рамок в ячейках таблицы.
В шапке и подвале таблицы рамки есть, а на ячейках нет !
Можно это как то подправить ?

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1204
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 02.03.18 10:58. Заголовок: Andrey пишет: Единс..


Andrey пишет:

 цитата:
Единственно что не хватает в экспорте для Excel2() рамок в ячейках таблицы.
В шапке и подвале таблицы рамки есть, а на ячейках нет !
Можно это как то подправить ?



А самому хотя бы посмотреть что мешает ?
Function BiffRec( nOpCode, uData, nRow, nCol, lBorder, nAlign, nPic, nFont )


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5774
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.03.18 22:36. Заголовок: Прикрутил к этому же..


Прикрутил к этому же проекту ещё один экспорт, через ОЛЮ !
1) Для одной строки всё прекрасно работает, для многострочных строк нет !
2) Как задать титул перед шапкой определённым фонтом (также, как для нового oBrw:Excel2() ) ?
Как бы исправить исходники ?
Проект вот тут - https://cloud.mail.ru/public/JNeH/xGmMBvmVD

Почему не работает в методе oBrw:ExcelOle( cXlsFile, ....) следующее назначение ?
   lSave := .T. 
cPath := GetStartUpFolder() + "\" // путь записи файла
cMaska := "A14_ДолгСальдо" // шаблон файла
cXlsFile := cPath + cMaska + "_" + DTOC( DATE() ) + "_"
cXlsFile += SUBSTR( CharRepl( ":", TIME(), "-" ), 1, 5 ) + ".xls"

Обрезает до A14_ДОЛГСАЛЬДО_12.03.2018_23-18


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5777
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.03.18 14:10. Заголовок: Andrey пишет: Почем..


Andrey пишет:

 цитата:
Почему не работает в методе oBrw:ExcelOle( cXlsFile, ....) следующее назначение ?

lSave := .T.
cPath := GetStartUpFolder() + "\" // путь записи файла
cMaska := "A14_ДолгСальдо" // шаблон файла
cXlsFile := cPath + cMaska + "_" + DTOC( DATE() ) + "_"
cXlsFile += SUBSTR( CharRepl( ":", TIME(), "-" ), 1, 5 ) + ".xls"

Обрезает до A14_ДОЛГСАЛЬДО_12.03.2018_23-18



Убрал в модуле h_tbrowse.prg строку 4809:
   If ! Empty( cXlsFile ) 
//cXlsFile := AllTrim( StrTran( Upper( cXlsFile ), ".XLS" ) ) поставил //
EndIf

Перестало обрезать ! И убрался только верхний регистр ! То что нужно !
Григорий, убери пожалуйста в исходниках эту строку. Или замени её как нужно, для следующих версий МиниГуи !
Заранее спасибо !


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5782
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.03.18 19:36. Заголовок: oBrw:ExcelOle( cX..


   oBrw:ExcelOle( cXlsFile, lActivate, hProgress, cTitle, hFont, lSave, bExtern, aColSel, bPrintRow ) 
cXlsFile // имя файла
lActivate := .T. // открыть Excel
hProgress := nil // хенд для ProgressBar
lSave := .T. // сохранить файл
bExtern := nil // ?
aColSel := nil // ?
bPrintRow := nil // ?

Подскажите пожалуйста, что за параметры (за что отвечают) ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5783
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.03.18 10:36. Заголовок: SergKis пишет: Пред..


SergKis пишет:

 цитата:
Предлагаю новый метод для 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
...


Спасибо: 0 
Профиль
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у кинул

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5784
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.18 18:04. Заголовок: SergKis пишет: Може..


SergKis пишет:

 цитата:
Можешь пробовать libу кинул



Классно ! Работает !
Но, если использовать
 oBrw:HideColumns( {10} ,.t.)   // скрыть колонки 

То последняя колонка становится слишком широкой !
Т.е. наверное не учитываются скрытые колонки ?
А так очень понравился этот метод !

Спасибо: 0 
Профиль
SergKis



Пост N: 1794
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.03.18 18:55. Заголовок: Andrey пишет То посл..


Andrey пишет
 цитата:
То последняя колонка становится слишком широкой !


Есть такая бяка. Надо правки делать
 
METHOD AdjColumns( aColumns, nDelta ) CLASS TSBrowse
...
LOCAL nVisible := 0, aVisible := {}
...
AEval( ::aColumns, {|oc| nVisible += iif( oc:lVisible, oc:nWidth, 0 ) })
AEval( aCol , {|nc| iif( obr:aColumns[ nc ]:lVisible, AAdd(aVisible, nc), Nil ) })

k := Len(aVisible)

...
For i := 1 To k
c := aVisible[ i ]

...

вроде работает, погоняй еще, либу кинул

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5785
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.18 19:31. Заголовок: SergKis пишет: врод..


SergKis пишет:

 цитата:
вроде работает, погоняй еще, либу кинул


Погонял... Не работает...
Свой пример кинул.

Спасибо: 0 
Профиль
SergKis



Пост N: 1795
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 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() // растяжка колонок до размера тсб по ширине

END WITH // oBrw объект снят
сработало как надо.



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5786
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.03.18 20:15. Заголовок: SergKis пишет: Убра..


SergKis пишет:

 цитата:
Убрал в самый низ


Поторопился я ... Как всегда.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5788
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.03.18 15:35. Заголовок: Сделал пример ! Tsb ..


Сделал пример !
Tsb кладу на уже готовую форму в другом модуле.
Всё показывает нормально, кроме вертикального скролинга. Должен быть, а не показывает при старте.
Если стрелками(мышкой) подёргать, то линия скролинга появляется... обгрызанная, без стрелки вверху и внизу.
Можно ли как то перерисовать весь вертикальный скролинг ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5827
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.04.18 11:36. Заголовок: Новая версия МиниГуи..


Новая версия МиниГуи - 18.04
Метод oBrw:ExcelOle().
При экспорте в таблице столбец с номерами домов (примерно такой порядок: 1, 2, 5, 9/2 и т.д.) неправильно экспортирует.
Превращает этот столбец в 1,2,5, 09 февраля.
Григорий, я сделаю тестовый пример с этим и вышлю на почту.

Спасибо: 0 
Профиль
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 }
и передаём в
oBrw:SetArrayTo(aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName)

То показ 6 колонки будет так - "123300"

Если сделать
 
oBrw:SetArrayTo(aArray, aFontHF, aHead, aSize, aFoot, aPict, aAlign, aName)
oBrw:aColumns[6]:cPicture := '@R 99:99:99'

То показ в 6 колонке будет уже "12:33:00"

Опять глюк нашёл в Tsb ?


Спасибо: 0 
Профиль
SergKis



Пост N: 1806
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 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].



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5833
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.04.18 20:07. Заголовок: Предложение по METHO..


Предложение по METHOD Excel2() - сделать как у METHOD ExcelOle() в самом конце метода:
   If lActivate 
ShellExecute( 0, "Open", If( lSave, cFile, cWork ),,, 3 )
EndIf

::Display()

If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, 0, 0 )
EndIf

Return Nil


В METHOD ExcelOle() предлагаю сделать в самом начале:
   Default lSave    := ! lActivate .and. ! Empty( cXlsFile ), ; 
cXlsFile := "", ;
hFntTitle := hFont

CursorWait()

// 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-файла.


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1228
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 21.04.18 23:28. Заголовок: Andrey пишет: пред..


Andrey пишет:

 цитата:
предлагаю сделать


Поддержу Андрея.
По первому предложению лишним не будет. В принципе хорошийстиль за собой все проводить в исходное состояние.
По второму думаю все сложнее, проблема может быть не только в количестве точек. Как вариант - может сообщать о недопустимости такого имени файла, а со временем критерии могут быть расширены.



Спасибо: 0 
Профиль
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. Второе предложение это перегруз

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5835
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.04.18 17:15. Заголовок: SergKis пишет: проц..


SergKis пишет:

 цитата:
процедура 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

CursorArrow()

If lActivate
oSheet:Range( "A1" ):Select()
oExcel:Visible := .T. // показ Экселя
EndIf

Из-за этого я и предлагаю для ЭТОГО варианта разместить предупреждения, чтобы потом кто-то не налетел на !
Я Григория замучил - что режется имя файла, месяца 2 не мог понять почему.
А решение оказывается совсем ПРОСТОЕ !


Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 1404
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 22.04.18 20:14. Заголовок: Андрей, нужно абстра..


Андрей, нужно абстрагироваться от конкретного случая. Все обработки вариантов нужно делать "до того, как". Методу нужно предоставить данные в том виде, в котором они будут на 100% обработаны предсказуемым образом без всяких MsgStop(...)

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6817
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 22.04.18 21:24. Заголовок: PSP +1..


PSP
+1

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1229
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.04.18 20:38. Заголовок: PSP пишет: Все обра..


PSP пишет:

 цитата:
Все обработки вариантов нужно делать "до того, как"


+500
Под конкретный случай, нужно конкретно и решать

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5836
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.04.18 15:10. Заголовок: Andrey пишет: Новая..


Понял ваше мнение !

Andrey пишет:

 цитата:
Новая версия МиниГуи - 18.04
Метод oBrw:ExcelOle().
При экспорте в таблице столбец с номерами домов (примерно такой порядок: 1, 2, 5, 9/2 и т.д.) неправильно экспортирует.
Превращает этот столбец в 1,2,5, 09 февраля.



А как это исправить ?
В методе :Excel2(...) выгрузка идёт правильно.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5837
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.04.18 18:32. Заголовок: Пробовал задавать яв..


Пробовал задавать явно формат столбца, всё равно не помогает.
 
// только для 6 и 10 колонки
oBrw:aColumns[6]:cPicture := '@R 99:99:99' // без этого нет показа в колонке ":"
oBrw:aColumns[10]:cPicture := 'xxxxxxxxx'


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6818
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 24.04.18 18:44. Заголовок: Andrey глянь..


Andrey
глянь

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5838
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.04.18 21:28. Заголовок: Спасибо Дима ! Не по..


Спасибо Дима !
Не получается...
добавить перед числом апостроф (‘). Например: ’11-53 или ‘1/47. Апостроф не отображается после нажатия клавиши ВВОД;
Поставил в колонке 10 апостроф (‘) - выгружате через Оле-Эксель так же ‘3/2 или ‘9/3
Конечно как самый примитив пойдёт, только юзера будут очень недовольны таким номером дома...
Можно сделать первым символом знак "_" или "~" ставить.
Но потом бы из документа этот знак желательно убрать...
Тогда нужно ставить обработку удаления, после вставки из буфера...

А лучше надо бы в конвертацию формата для текстового поля явно в исходниках указать, типа:
oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка

Пытался разобраться сaм, ничего не понял...
Там идёт накопление в буфер, а потом идёт вставка из буфера.
Как до этого указать формат столбца не знаю.


Спасибо: 0 
Профиль
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

If ValType( uData ) == "C" .and. At( CRLF, uData ) > 0
uData := StrTran( uData, CRLF, "&&" )

If AScan( aRepl, nCol ) == 0
AAdd( aRepl, nCol )
EndIf
EndIf

В METHOD ExcelOle() предлагаю сделать эту правку !


Pasha пишет:

 цитата:
Как вариант: перед заполнением таблицы по строкам можно установить NumberFormat для тех столбцов, для которых это надо, т.е:



Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6819
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.04.18 08:39. Заголовок: Andrey пишет: SET( ..


Andrey пишет:

 цитата:
SET( "NumberFormat", '@' )


Может не сработать в ряде случаев когда много цифр в ячейке и Excel по своему покажет

Спасибо: 0 
Профиль
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
Остальные столбцы НЕ ТРОГАЮ.

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6820
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 25.04.18 13:43. Заголовок: Andrey пишет: В как..


Andrey пишет:

 цитата:
В каких случаях ?


Да был случай лет 5 назад , вываливал в Excel коды морозильных камер (штук 500 примерно)
В этих кодах были цифры , пробелы , точки и тире. Все коды разные. Из 500 штук , штуки
3 всегда показывало криво , и шаблон подобрать не удалось (руками тоже пробовали) .

PS
Это был файл формата CSV

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5843
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.04.18 07:37. Заголовок: Возвращаюсь опять к ..


Возвращаюсь опять к методу ExcelOle().
При вызов экселя, он запускается, а потом уходит на второй план, т.е. под задачу.
У всех так происходит ?
Или это только у меня так, из-за Far.
Если у всех, то надо бы Эксель на передний план ВСЕГДА переключать. Или ключ ввести для перевода.
У кого какие будут соображения ?

Спасибо: 0 
Профиль
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

If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, nCount, 0 )
EndIf
INKEYGUI(100)

If ::lSelector
::InsColumn( ::aClipBoard[ 2 ], ::aClipBoard[ 1 ] )
::lNoPaint := .F.
EndIf

If ! Empty( cXlsFile ) .and. lSave
.....


И ещё предложение:
         EndIf 

//If ! Empty( ::aSuperHead ) // заменить как ниже
If (::lDrawSuperHd)

For nCol := 1 To Len( ::aSuperHead )
nVar := If( ::lSelector, 1, 0 )
uData := If( ValType( ::aSuperhead[ nCol, 3 ] ) == "B", Eval( ::aSuperhead[ nCol, 3 ] ), ;


Поясню почему. Если в примере нужно убрать показ суперхидера, то можно назначит ему высоту 1 пиксел.
И исходники пересматривать не придётся.
Но если у нас суперхидер есть в 1 пиксел, то ! Empty( ::aSuperHead ) выдаст что суперхидер есть и сделает экспорт его на лист Экселя.
А If (::lDrawSuperHd) позволит этого избежать.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1231
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.04.18 23:18. Заголовок: Andrey пишет: сдела..


Andrey пишет:

 цитата:
сделать задержку, чтобы бегунок показывался на экране нормально


Тормозить программу специально? Ради красоты бегунка
Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100
То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую.


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5847
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.04.18 07:24. Заголовок: Haz пишет: Правильн..


Haz пишет:

 цитата:
Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100
То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую.



А как надо правильно ?
Подправь пожалуйста исходник, а то в методе :Excel2() нормально рисуется бегунок, а в методе :ExcelOle() - огрызок какой-то.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5848
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.04.18 07:26. Заголовок: И ещё одна странност..


И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы !
Там же есть вроде в тексте:
    If AScan( ::aColumns, { |o| o:cFooting != Nil  } ) > 0  

For nCol := 1 To Len( ::aColumns )

If ( aColSel != Nil .and. AScan( aColSel, nCol ) == 0 ) .or. ::aColumns[ nCol ]:cFooting == Nil
Loop
EndIf

uData := If( ValType( ::aColumns[ nCol ]:cFooting ) == "B", Eval( ::aColumns[ nCol ]:cFooting ), ;
::aColumns[ nCol ]:cFooting )
uData := cValTochar( uData )
uData := StrTran( uData, CRLF, Chr( 10 ) )
oSheet:Cells( nLine, nCol ):Value := uData
Next
EndIf

Как исправить, чтобы заработало ?

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1232
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.04.18 16:44. Заголовок: Andrey пишет: Предл..


Andrey пишет:

 цитата:
Предложение по METHOD Excel2() - сделать задержку,


Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle()
Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents()
В конце метода nCount == nTotal ?? при выводе этого
 
::ExcelOle()
If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, nCount, 0 )
EndIf


если посмотреть в Excel2() то в конце там не nCount . Может тут проблема ?
 
::Excel2()
If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, nTotal, 0 )
EndIf



Следующий фокус я не понял
 
If hProgress != Nil
nTotal := ( ::nLen + 1 ) * Len( ::aColumns ) + 30
SetProgressBarRange ( hProgress , 1 , nTotal )
SendMessage( hProgress, PBM_SETPOS, 0, 0 )
nEvery := Max( 1, Int( nTotal * .02 ) ) // refresh hProgress every 2 %
EndIf

и затем два раза
 
If hProgress != Nil
nCount -= 15
SendMessage( hProgress, PBM_SETPOS, nCount, 0 )
EndIf






Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5851
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.04.18 21:14. Заголовок: Haz пишет: Ты уж оп..


Haz пишет:

 цитата:
Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle()
Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents()


Да точно, перепутал я.
Понял насчёт Sysrefresh() или DoEvents().
Но остальной код я тоже не понимаю, зачем так сделано:
nCount -= 15 и т.д. - для меня загадка...
Напиши пожалуйста как правильно сделать, а Григорий уже исправит исходники !

И как насчёт подвала таблицы, почему нет в экселе её ?

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1233
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.04.18 11:21. Заголовок: Andrey пишет: И ещ..


Andrey пишет:

 цитата:

И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы !


В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml
Ищи где намудрил с исходниками

Спасибо: 0 
Профиль
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

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1234
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.04.18 12:22. Заголовок: Andrey пишет: Что-т..


Andrey пишет:

 цитата:
Что-то ерундит алгоритм выгрузки в эксель.
Как и где подправить ?



А ерундит счетчик строк в алгоритме, на твоей картинке ясно виден разрыв ( пустая строка ) и после нее еще 5 строк. Если в примере общее число строк уменьшить на 5 , то разрыв исчезнет и подвал появится.
Скорее всего из-за разрыва подвал затирается.
Так что ищи причину разрыва, подвал - это следствие

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1235
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.04.18 12:32. Заголовок: Добавлю чуть. В теку..


Добавлю чуть.
В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша
После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5853
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.04.18 13:35. Заголовок: Haz пишет: В текуще..


Haz пишет:

 цитата:
В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша
После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к



А можно сделать замену этой текущей реализации для всех ?
Я этого сам не осилю.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1236
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.04.18 14:10. Заголовок: Andrey пишет: Я это..


Andrey пишет:

 цитата:
Я этого сам не осилю.


Ну надо же когда то начинать

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1237
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.05.18 15:32. Заголовок: oBrw:SetBtnGet зависает


Никак не могу понять почему зависает следующий код
Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet
Следующий код при выборе кнопки записывает слово "Test" в поле, но только в первый раз, во второй раз бровс зависает
oBrw:SetBtnGet( "NAME", "", { | oEdit, xVar | xVar := "Test",; 
oEdit:VarPut( xVar ), oEdit:Refresh() }, 16 )


Мож есть у кого мысли куда копать ?

PS Даже с таким кодом на второй раз завис
oBrw:SetBtnGet( "NAME", "", { | | NIL } , 16 )


и еще интереснее , если в первый раз ввести значение ручками , а во второй вызвать кнопку - тоже завис.






Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3725
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.05.18 16:01. Заголовок: Haz пишет: В текуще..


Haz пишет:

 цитата:
В текущей реализации ::ExcelOle() морально устарел



для начала можно убрать некоторые рудименты:

строки

oBook := oExcel:Get( "ActiveWorkBook")
oSheet := oExcel:Get( "ActiveSheet" )

заменить на

oBook := oExcel:ActiveWorkBook
oSheet := oExcel:ActiveSheet

аналогично вызов (в 2-х местах)

oSheet:Range( cRange ):Set( "HorizontalAlignment", xlHAlignCenterAcrossSelection )

заменить на

oSheet:Range( cRange ):HorizontalAlignment := xlHAlignCenterAcrossSelection

после этого можно перейти на использование класса win_oleAuto из библиотеки hbwin, заменив строку

oExcel := CreateObject( "Excel.Application" )

на

win_oleCreateObject( "Excel.Application" )

Используя класс win_oleAuto, можно вместо передачи через буфер обмена передавать в Excel всю таблице одним вызовом __oleVariantNew()
В принципе передача через буфер обмена фрагментами по 20к тоже работает быстро, но можно и делать это прямой записью.

Спасибо: 0 
Профиль
SergKis



Пост N: 1808
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.05.18 16:50. Заголовок: Haz пишет Следующий ..


Haz пишет
 цитата:
Следующий код при выборе кнопки записывает слово "Test" в поле, но только в первый раз, во второй раз бровс зависает


Добавил в пример Tsb_addrecord_2
 
ADD COLUMN TO oBrw DATA FieldWBlock( "ITG", Select( "base" ) ) ;
HEADER "Total" FOOTER hb_ntos(nItg) ;
ALIGN DT_RIGHT, DT_CENTER, DT_RIGHT ;
SIZE 90

oBrw:SetBtnGet( 3, "", { |oe,cv| cv := "Test",;
oe:VarPut(cv), oe:Refresh() }, 16 )


работает не виснет.
Игорь, наверно, примерчик нужен

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1238
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 07.05.18 17:01. Заголовок: SergKis пишет: рабо..


SergKis пишет:

 цитата:
работает не виснет.
Игорь, наверно, примерчик нужен



Сергей, спасибо.
Пока обошелся решив по другому. Сейчас не до примерчиков, позже сделаю обязательно ( может дома подготовлю и то не уверен ) !
Тащу два объемных проекта, даже тараканов в них давить некогда. Нужно сдать ! После сдачи видимо будет период оптимизации кода и украшательства.
Вот там примерчики начнутся.


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1239
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.05.18 10:42. Заголовок: Сергей работает не ..


Сергей

 цитата:
работает не виснет.


Вобщем это я тупанул. Работает конечно при чистом запуске.
Я пользуюсь для сборки проектов фришным редактором от Xailer ( xEdit )
Этот редактор , при запуске проекта на исполнение , пытается управлять приложением ( пытается использовать отладку, показать значения переменных, ресурсов и пр.)
Возможно и можно его прикрутить как отладчик, но я не пользуюсь.
Так вот, при запуске из под редактора , кнопка эта вешает задачу, при запуске нормальном - все ок. Знал же, раньше натыкался и все выяснил. Но время прошло и за неиспользованием этого функционала все забыл ((. Пол дня потратил на старые грабли




Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1276
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 11.05.18 13:05. Заголовок: Pasha пишет: для на..


Pasha пишет:

 цитата:
для начала можно убрать некоторые рудименты


Благодарю за помощь!

Выполнил предложенные правки

 цитата:
Используя класс win_oleAuto


для следующей сборки


Спасибо: 0 
Профиль
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

AAdd( ::aKeyEvent, { nKey, bKey, lCtrl, lShift, lAlt } )

RETURN Self

...
CLASS TGetBox FROM TControl
...
METHOD New( nRow, nCol, bSetGet, oWnd, nWidth, nHeight, cPict, bValid,;
...
::oGet :=
_DefineGetBox ( cControl, ParentFormName, nCol, nRow, nWidth, nHeight, uValue, ; // BK
...
METHOD Edit( uVar, nCell, nKey, nKeyFlags, cPicture, bValid, nClrFore, ;
...
Local nK, aKey, oGet

...
oCol:oEdit := TGetBox():New( nRow+::aEditCellAdjust[1], nCol+::aEditCellAdjust[2], ;
bSETGET( uValue ), Self, nWidth+2+::aEditCellAdjust[3], nHeight+2+::aEditCellAdjust[4], ;
cPicture,, nClrFore, nClrBack, hFont, ::cChildControl, cWnd, ;
cMsg,,,,, bChange, .T.,, lSpinner .and. cType $ "ND", bUp, bDown, ;
bMin, bMax, oCol:lNoMinus )

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

// oBrw:SetBtnGet( 3, "", { |oe,cv| cv := "Test",;
// oe:VarPut(cv), oe:Refresh() }, 16 )

oBrw:aColumns[3]:SetKeyEvent(VK_F5, {|og,ky| MyKeyEvent(og, ky) })
oBrw:aColumns[3]:SetKeyEvent(VK_F6, {|og,ky| MyKeyEvent(og, ky) })
oBrw:aColumns[3]:SetKeyEvent(VK_F7, {|og,ky| MyKeyEvent(og, ky) })

AEval( oBrw:aColumns, {|oCol,nCol| oCol:lFixLite := .T., ;
...
*----------------------------------------------
STATIC FUNCTION MyKeyEvent( oGet, nKey )
*----------------------------------------------
LOCAL cVK := '', cTx := 'Test '
If nKey == VK_F5
cVK := 'VK_F5'
ElseIf nKey == VK_F6
cVK := 'VK_F6'
ElseIf nKey == VK_F7
cVK := 'VK_F7'
EndIf
oGet:VarPut(cTx+cVK)
oGet:Refresh()
// MsgBox( cVK + ' : ' + cValToChar( oGet:VarGet() ), 'Info' )

RETURN NIL



Спасибо: 0 
Профиль
SergKis



Пост N: 1810
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.05.18 19:19. Заголовок: PS DATA bKeyEvent н..


PS
DATA bKeyEvent
надо убрать, остался от опытов

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1240
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.05.18 22:17. Заголовок: SergKis пишет: У се..


SergKis пишет:

 цитата:
У себя исп. вариант без кнопки


Сергей. Спасибо. В понедельник поткстирую


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1241
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.05.18 22:58. Заголовок: Сергей : может буде..


Сергей :

 цитата:
может будет интересно.


У меня есть очень draft, ну совсем бета альтернативного комбо в ячейке.
Руки не доходят довести до ума, но испьзую так как есть. В понедельник скину в форум пример.
Глянешь, интересны идеи. Суть в том, что вместо комбика попытался использовать бровс по базе.
В последних проектах использую успешно, хоть и бета. А вот времени на осмысление нет.
И чтоб совсем точки над ё, я не прошу сделать за меня. Я предлагаю идею и готов выслушать мнение.


Спасибо: 0 
Профиль
SergKis



Пост N: 1811
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.05.18 00:04. Заголовок: Haz пишет Суть в том..


Haz пишет
 цитата:
Суть в том, что вместо комбика попытался использовать бровс по базе.


С этого начинал, с combo (и с поиском по букве). В итоге отказался, со временем маленький список -> в большой, + колонки ...
Практически везде перехожу на тсб (с hb 2.0 browse, на 3.2 переделываю на тсб)

 цитата:
А вот времени на осмысление нет.


Со временем туго, согласен, справочники делаю по такой схеме (с поправками на задачу конечно), как идея (код из задачи, как есть) Скрытый текст


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1244
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.05.18 18:09. Заголовок: Сергей Haz пишет: У..


Сергей
Haz пишет:

 цитата:
У меня есть очень draft, ну совсем бета альтернативного комбо в ячейке.



Выдернул из проекта , переписал под CDX вроде работает . Логика похожа на твой пример - те же массивы заголовков, полей и пр.
Подчеркиваю это совсем бета , по мере допиливаю понемногу. Но что это понятно из примера
Скрытый текст


Спасибо: 0 
Профиль
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 )

END


Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6825
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.05.18 21:46. Заголовок: SergKis пишет: Игор..


SergKis пишет:

 цитата:
Игорь
Поправь [ i ], начиная с этого текста и т.д.


Поправил

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1245
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.05.18 21:50. Заголовок: Dima пишет: Поправи..


Dima пишет:

 цитата:
Поправил


и я

Спасибо: 0 
Профиль
SergKis



Пост N: 1813
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 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, как у меня в примере

Спасибо: 0 
Профиль
SergKis



Пост N: 1814
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.05.18 22:12. Заголовок: Haz, Dima Как то пр..


Haz, Dima
Как то правка не прошла
 
::oBrw:aColumns[ i ]:cHeading := ::aHeaders[ i ] // тут надо, может и ниже тоже
END
END


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1247
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 14.05.18 23:08. Заголовок: SergKis пишет: Мысл..


SergKis пишет:

 цитата:
Мысли по твоему варианту


Про назначение клавиш - спасибо. Прикину как прикрутить.
В остальном пример сильно кастрирван. Там есть список полей, которые нужно показать в бровсе и поле которое нужно вернуть из справочника. ID и NAME это частный случай. Поиск по справочнику делаю по содержимому getbox через вызов bSearch. В примере не смог его показать т. к. это FTS поиск от ADS, то есть по вхождению в любых полях. Как в CDX сделать не знаю. У меня для поиска клиента, к примеру, можно в Getbox ввести ИНН или КПП или форму собственноси или почтрвый индекс или чего ещё. или через пробел все это сразу сразу. В FTS задается что искать, любое или все. И бровс фильтрует записи по условию поиска. Все уже привыкли не думая набирать или часть наименования или адреса или телефона. А вот до назначения клавиш я не допер. Повешу на них доп инструмент.
У меня главный косяк в том что на модальной форме этот бровс ругается что из модала можно только модал. А если бровс сам сделать модальным, то на нем не отыграть потерю фокуса так как модал не его потерять).
Твой пример посмотрел, все понятно. Спасибо буду использовать

Спасибо: 0 
Профиль
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 отображения списка относительно родителя и задания кол-ва строк в списке


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1249
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.05.18 16:14. Заголовок: SergKis пишет: Можн..


SergKis пишет:

 цитата:
Можно делать два типа окна для child и modal


1 Буду тип задавать по типу родителя. Так решается проблема что из чего вызывать. Вот как быть с потерей фокуса у модала ?? не дает он его терять, а у меня на это событие справочник закрывается с отказом от выбора.

2 - 4 Согласен . это уже детали реализации.

Спасибо: 0 
Профиль
SergKis



Пост N: 1817
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.05.18 17:07. Заголовок: Haz пишет Вот как б..


Haz пишет
 цитата:
Вот как быть с потерей фокуса у модала ?? не дает он его терять, а у меня на это событие справочник закрывается с отказом от выбора.


По мне, выбор по Enter, DblClick, Button Ok (выбор сделан, список убираем), а все остальное отказ.
Выход базовый по кнопке крестику (своя, работа с NOCAPTION .T.) или Esc (отказ, список убираем).
Потеря фокуса - для child режима - частный случай отказа

Спасибо: 0 
Профиль
SergKis



Пост N: 1818
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.05.18 18:11. Заголовок: PS Игорь, вспомнилос..


PS
Игорь, вспомнилось, ты вроде занимался морганием модальных окон при потере фокуса, можно туда
приблуду вставить типа, по handle окна получить объект (если есть) и получить свойство
bBlock := oW:GetProp('LostFocus') и если блок задан, выполнить
Do_WindowEventProcedure ( bBlock, oW:Index, oW )
В объект окна списка ставить блок (ThisWindow.Object):SetProp('LostFocus', {|ow| ow:Release() }

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1251
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 16.05.18 19:51. Заголовок: SergKis пишет: Игор..


SergKis пишет:

 цитата:
Игорь, вспомнилось, ты вроде занимался морганием модальных окон при потере фокуса, можно туда
приблуду вставить


Примерно так и думаю. Пока ещё не смотрел. Хочу сделать не трогая исходников. Не получится., придется править.

Спасибо: 0 
Профиль
SergKis



Пост N: 1820
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.05.18 21:12. Заголовок: Haz пишет Не получит..


Haz пишет
 цитата:
Не получится., придется править.


Тогда в TWndData можно добавить
DATA bLostFocusModal
и устанавливать и работать с ним

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5871
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.05.18 13:49. Заголовок: Andrey пишет: Сдела..


Andrey пишет:

 цитата:
Сделал в версии 18.04 кол-во строк 240, подвал есть.
На 250 строках подвала уже нет и вот такая таблица получается:
.....
Что-то ерундит алгоритм выгрузки в эксель.
Как и где подправить ?



Предложение по правке этой ошибки (h_tbrowse.prg):
         nColHead := 0 

For nCol := 1 To Len( ::aColumns )

If aColSel != Nil .and. AScan( aColSel, nCol ) == 0
Loop
EndIf

uData := If( ValType( ::aColumns[ nCol ]:cHeading ) == "B", Eval( ::aColumns[ nCol ]:cHeading ), ;
::aColumns[ nCol ]:cHeading )

If ValType( uData ) != "C"
Loop
EndIf

uData := StrTran( uData, CRLF, Chr( 10 ) )
nColHead ++
oSheet:Cells( nLine, nColHead ):Value := uData

If hProgress != Nil

If nCount % nEvery == 0
SendMessage( hProgress, PBM_SETPOS, nCount, 0 )
EndIf

nCount ++
EndIf
Next

nStart := ++ nLine // поставить вместо этого nStart := nLine + 1

EndIf


И ещё при печати подвала:
   If AScan( ::aColumns, { |o| o:cFooting != Nil  } ) > 0 

For nCol := 1 To Len( ::aColumns )

If ( aColSel != Nil .and. AScan( aColSel, nCol ) == 0 ) .or. ::aColumns[ nCol ]:cFooting == Nil
Loop
EndIf

uData := If( ValType( ::aColumns[ nCol ]:cFooting ) == "B", Eval( ::aColumns[ nCol ]:cFooting ), ;
::aColumns[ nCol ]:cFooting )
uData := cValTochar( uData )
uData := StrTran( uData, CRLF, Chr( 10 ) )
oSheet:Cells( nLine + 1, nCol ):Value := uData // вот так сделать
Next
EndIf


Григорий, файл h_tbrowse.prg который присылал мне, я исправил и выслал на почту.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1279
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.05.18 15:36. Заголовок: Andrey пишет: Предл..


Andrey пишет:

 цитата:
Предложение по правке этой ошибки


Благодарю за это исправление
Проблема с выводом подвала решена

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5873
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.05.18 17:25. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Проблема с выводом подвала решена


ДА !

И проблема показа текстовых столбцов вида 3/2, 1/5 и т.д. ТОЖЕ решена в отправленном модуле !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5874
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.05.18 18:56. Заголовок: Вспомнил про ещё оди..


Вспомнил про ещё один баг в METHOD ExcelOle() !

После создания xls файла, сам Эксель уходин на второй план, т.е. под окно этого экспорта.
Юзера ЗЛЯТСЯ ОЧЕНЬ на это !!!
Для исправления этого нужно сделать так:
   CursorArrow() 

::Reset()

If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, 0, 0 )
EndIf

If lActivate
oExcel:Visible := .T.
hWnd := oExcel:hWnd
ShowWindow( hWnd, 6 ) // MINIMIZE windows
INKEYGUI(100)
ShowWindow( hWnd, 3 ) // MAXIMIZE windows
BringWindowToTop( hWnd )
Else
oExcel:Application:Quit()
EndIf

//::Reset()

//If hProgress != Nil
// SendMessage( hProgress, PBM_SETPOS, 0, 0 )
//EndIf

Return Nil

Такой код оставляет ЭКСЕЛЬ на переднем плане.

Спасибо: 0 
Профиль
Alex_Cher





Пост N: 55
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 18.05.18 08:32. Заголовок: Andrey пишет: Вспом..


Andrey пишет:

 цитата:
Вспомнил про ещё один баг в METHOD ExcelOle()



А в

oExcel := TOleAuto():New( "Excel.Application" )

можно получить такой же же эффект, что бы при создание Excel вылетал на передний план ?


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5876
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.05.18 09:42. Заголовок: Alex_Cher пишет: мо..


Alex_Cher пишет:

 цитата:
можно получить такой же же эффект, что бы при создание Excel вылетал на передний план ?


Да. Делай последние строчки так же как METHOD ExcelOle() и получишь такой же результат.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5877
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 19.05.18 18:13. Заголовок: Может такой код нужн..


Может такой код нужно ставить, чтобы Эксель оставался на экране:
   If lActivate 
oExcel:Visible := .T.
If VAL( oExcel:Version ) <= 13 // Excel 2003
ShowWindow( oExcel:hWnd, 6 ) // MINIMIZE windows
ShowWindow( oExcel:hWnd, 3 ) // MAXIMIZE windows
Endif
Try
BringWindowToTop( oExcel:hWnd ) // a window on the foreground
End Try
Else
oExcel:Application:Quit()
EndIf


Спасибо: 0 
Профиль
Alex_Cher





Пост N: 56
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 21.05.18 08:01. Заголовок: Andrey пишет: Делай..


Andrey пишет:

 цитата:
Делай последние строчки так же как METHOD ExcelOle()



Андрей, неверное я что-то не догоняю, с сырцах не нашел метод TOleAuto():
и куда добавлять ...?


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5882
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.05.18 13:11. Заголовок: Alex_Cher пишет: не..


Alex_Cher пишет:

 цитата:
неверное я что-то не догоняю, с сырцах не нашел метод TOleAuto():
и куда добавлять ...?


Этот код добавляй в свою программу.
Я писал про METHOD ExcelOle() который находиться MiniGUI\SOURCE\TsBrowse\h_tbrowse.prg
Но этот метод Григорий исправит и будет достен в следующей версии.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5883
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.05.18 19:44. Заголовок: Нашёл ещё один баг в..


Нашёл ещё один баг в METHOD ExcelOle():

При многострочном построении Tsbrowsa при экспорте - получается так:


Хотя таблица выглядеть должна примерно так:


Как и где исправить код для этого метода ?

Спасибо: 0 
Профиль
Alex_Cher





Пост N: 57
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 25.05.18 07:56. Заголовок: Andrey пишет: Этот ..


Andrey пишет:

 цитата:
Этот код добавляй в свою программу.



Андрей с Excel все получилось ... , почему с Word не получается -

oWord:Visible := .T.
hWnd := oWord:hWnd
ShowWindow( hWnd, 6 ) // MINIMIZE windows
INKEYGUI(100)
ShowWindow( hWnd, 3 ) // MAXIMIZE windows
BringWindowToTop( hWnd )


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5884
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.05.18 15:43. Заголовок: Alex_Cher пишет: по..


Alex_Cher пишет:

 цитата:
почему с 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

RETURN NIL

Смотри пример DBF_to_DOC_03.7z на https://abonent4.ru/minigui/

Спасибо: 0 
Профиль
Alex_Cher





Пост N: 58
Зарегистрирован: 18.06.15
ссылка на сообщение  Отправлено: 28.05.18 10:14. Заголовок: Andrey пишет: Там ф..


Andrey пишет:

 цитата:
Там фигня с Вордом. Я делаю так:



Все получилось, Андрей, большое тебе спасибо ....!

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5925
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.06.18 19:32. Заголовок: Модуль h_tbrowse.prg..


Модуль h_tbrowse.prg, METHOD ExcelOle(...)
Нафига там где то посередке стоит:
   If ::lIsDbf 
( ::cAlias )->( DbGoTo( nRecNo ) )
::GoPos( nOldRow, nOldCol )
EndIf
::nAt := nAt


Всё равно при выходе стоит - ::Reset()




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5926
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.18 12:52. Заголовок: Если в методе ExcelO..


Если в методе ExcelOle(...) стоит функция доп.обработки
 
If bExtern != Nil
Eval( bExtern, oSheet, Self )
EndIf

В ней также можно перемещаться по tsbrowse, то наверное вот этот кусок:
   If ::lIsDbf  
( ::cAlias )->( DbGoTo( nRecNo ) )
::GoPos( nOldRow, nOldCol )
EndIf
::nAt := nAt

- нужно ставить уже после этой If bExtern != Nil ?
Или я не прав ?



Спасибо: 0 
Профиль
SergKis



Пост N: 1899
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.06.18 12:58. Заголовок: Andrey пишет нужно с..


Andrey пишет
 цитата:
нужно ставить уже после этой If bExtern != Nil ?


Я бы сказал "нужно ставить уже и после этой If bExtern != Nil ? "

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5927
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 22.06.18 14:36. Заголовок: Понял ! Спасибо ! :..


Понял ! Спасибо !
Буду у себя так делать.
Осталось Григорию у себя в библиотеке поменять...

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5928
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.06.18 17:55. Заголовок: Всем привет ! Можно ..


Всем привет !
Можно ли как то на лету изменить таблицу с параметром SELECT .T. или вообще без него ?
Т.е. строиться таблица с SELECT .T., а потом его нужно удалить/восстановить.

Спасибо: 0 
Профиль
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. - что неправильно !!!

И разместить как я предлагал доп.функцию уже в самом конце:
   oSheet:Range( "A1" ):Select() 

If hProgress != Nil
SendMessage( hProgress, PBM_SETPOS, nTotal, 0 )
EndIf

If bExtern != Nil
Eval( bExtern, oSheet, Self )
EndIf

If ::lIsDbf
( ::cAlias )->( DbGoTo( nRecNo ) )
::GoPos( nOldRow, nOldCol )
EndIf

::nAt := nAt


If ! Empty( cXlsFile ) .and. lSave


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5960
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.07.18 16:50. Заголовок: Всем привет ! Вот к..


Всем привет !

Вот кусок кода для Tsbrowse:
   LOCAL nRecNo := ( oBrw:cAlias )->( RecNo() ), nAt := oBrw:nAt 
LOCAL nOldRow := oBrw:nLogicPos(), nOldCol := oBrw:nCell
........
For nRow := 1 TO oBrw:nLen
.....
oBrw:Skip(1)
Next
.....
oBrw:Reset() // вариант 1

If oBrw:lIsDbf
( oBrw:cAlias )->( DbGoTo( nRecNo ) )
oBrw:GoPos(nOldRow, nOldCol)
EndIf
oBrw:nAt := nAt

oBrw:Reset() // вариант 2
....

Куда ставить oBrw:Reset() ? По варианту 1 или по варианту 2 ?


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1273
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.07.18 17:36. Заголовок: Andrey пишет: Куда ..


Andrey пишет:

 цитата:
Куда ставить oBrw:Reset()



Посмотреть что делает ::Reset() потом на свой кусок кода и понимание придет само
 
METHOD Reset(lBottom)
...
If lBottom
::GoBottom()
ElseIf ::lInitGoTop
::GoTop()
EndIf
::Refresh( .T., .T. )

If ::bChange != Nil
Eval( ::bChange, Self, 0 )
EndIf

Return Self



Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5961
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.07.18 18:09. Заголовок: А зачем тогда нужно ..


А зачем тогда нужно делать:
LOCAL  nAt := oBrw:nAt  
...
oBrw:nAt := nAt


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1274
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.07.18 20:22. Заголовок: Andrey пишет: зачем..


Andrey пишет:

 цитата:
зачем тогда нужно делать:
LOCAL nAt := oBrw:nAt


При бровсе по массиву gopos не выполнится, а перед этим был skip()

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5964
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.07.18 15:28. Заголовок: Всем привет ! Обнару..


Всем привет !
Обнаружил в методе ExcelOle() баг. Удаляет часть данных из Второй колонке в конце таблицы.
Версия МиниГуи последняя. Пробовал в нескольких задачах.
Вот так это выглядит, 0-к съедает в последней ячейке 2-ой колонки:


Если стоит 001, то удаляет два нолика.
Как бы исправить это ?
В Tsb4xlsOle.prg экспорт отрабатывает на отлично.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5965
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.18 16:14. Заголовок: Ещё обнаружил в мето..


Ещё обнаружил в методе ExcelOle() баг.
Если буквы при экспорте в эксель больше Z, т.е. колонок больше 26 - то ломается экспорт.
Попробую сделать свою функцию для названия колонок и заменить везде CHR(64 +....

Спасибо: 0 
Профиль
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)))

и до кучи еще одну функцию (для адреса диапазона ячеек):

Function ExcelAdr2(nRow1, nCol1, nRow2, nCol2)
Return ExcelAdr(nRow1, nCol1) + ':' + ExcelAdr(nRow2, nCol2)

Под них скорее надо method ExcelOle заточить, вместо
 
aCol := { 26, 52, 78, 104, 130, 156 }, ;
aLet := { "", "A", "B", "C", "D", "E" }, ;
...
cLet := aLet[ AScan( aCol, {|e| Len( If( aColSel != Nil, aColSel, ::aColumns ) ) <= e } ) ]

If ! Empty( cLet )
nCol := AScan( aLet, cLet ) - 1
cLet += Chr( 64 + Len( If( aColSel != Nil, aColSel, ::aColumns ) ) - aCol[ Max( 1, nCol ) ] )
Else
cLet := Chr( 64 + Len( If( aColSel != Nil, aColSel, ::aColumns ) ) )
EndIf
...


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5966
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.07.18 16:59. Заголовок: SergKis пишет: Паша..


SergKis пишет:

 цитата:
Паша тебе дал хорошие функции, зачем велосипед гонять



Да забыл про них. А где давал уже и не помню !

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6872
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.07.18 17:20. Заголовок: Andrey пишет: А гд..


Andrey пишет:

 цитата:
А где давал уже и не помню


тут )) http://clipper.borda.ru/?1-1-0-00000531-000-0-0-1531592334

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5967
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.07.18 13:45. Заголовок: Григорий, я исправил..


Григорий, я исправил h_tbrowse.prg
У меня заработал экспорт с большим количеством колонок.
Исправленный h_tbrowse.prg - оправил к тебе на почту.

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1328
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 17.07.18 14:53. Заголовок: Andrey пишет: зараб..


Andrey пишет:

 цитата:
заработал экспорт с большим количеством колонок


Проверил на базе с 28 полями - экспорт работает нормально.
Благодарю за помощь

Andrey пишет:

 цитата:
Исправленный h_tbrowse.prg


Обрати внимание, что у тебя старая версия этого файла

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5968
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.07.18 17:44. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
Обрати внимание, что у тебя старая версия этого файла


Да, я брал из предыдущей версии.
Буду ждать новую версию МиниГуи.

Спасибо: 0 
Профиль
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

Не совсем понятно зачем это нужно.
Можно пояснить ?

Спасибо: 0 
Профиль
SergKis



Пост N: 1985
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.08.18 15:30. Заголовок: Andrey пишет Можно п..


Andrey пишет
 цитата:
Можно пояснить ?


см. http://clipper.borda.ru/?1-1-0-00000532-000-80-0-1535705309 пост 1960 и далее
Можно применить для др. действий, к примеру своя шифровка\расшифровка символьных полей

Спасибо: 0 
Профиль
SergKis



Пост N: 1986
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.08.18 15:32. Заголовок: PS Обрати внимание н..


PS
Обрати внимание на пример поста 1962

Спасибо: 0 
Профиль
SergKis



Пост N: 1987
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 31.08.18 15:46. Заголовок: PS Описание примера ..


PS
Описание примера - пост 1940, тема та же

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6020
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 31.08.18 23:56. Заголовок: SergKis пишет: Можн..


SergKis пишет:
Можно применить для др. действий, к примеру своя шифровка\расшифровка символьных полей
Давно об этом мечтал. Пример будет на эту тему ?

Спасибо: 0 
Профиль
SergKis



Пост N: 1988
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.09.18 01:03. Заголовок: Andrey пишет Пример..


Andrey пишет
 цитата:
Пример будет на эту тему ?


 
1.
:lEdit := .T.
:bData := FieldWBlock('NAME', select(cAlias))
:bDecode := {|cv| sx_Decrypt(cv, 'MyPassword') }
:bEncode := {|cv| sx_Encrypt(cv, 'MyPassword') }

2.
oKey := oKeyData()
oKey:Set(1, 'Name 1')
oKey:Set(2, 'Name 2')
oKey:Set(3, 'Name 3')
...
oKey:Set(9, 'Name 9')

:lEdit := .F.
:bData := FieldWBlock('NUMKEY', select(cAlias))
:bDecode := {|nk| oKey:Get(nk, '????????') }


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6030
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 00:32. Заголовок: Всем привет ! Пытаюс..


Всем привет !
Пытаюсь понять метод oBrw:DeleteRow() для DBF.
Что-то не работает...
Модифицировал пример Tsb_linedrag для вставки/удаления записей.
Вставка работает, удаление нет. Что не так делаю ?

Проект вот - https://cloud.mail.ru/public/4kmS/Ad1Xf9Sy2

И ещё пара вопросов:
1) Не отрабатывает вставка вертикального скролинга - oBrw:ResetVScroll(). Почему ?
2) Как сделать заново полное считывание базы для этой программы ?
можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?

Спасибо: 0 
Профиль
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

DEFINE WINDOW Form_0 ;
...
STATIC FUNCTION RecnoInsert(oBrw)
...
// IF INDEXORD() == 0
oBrw:GoToRec( nRecno )
// ENDIF
// oBrw:Refresh( .T. ) // перечитать записи таблицы
? "Insert=", nRecno
ENDIF

oBrw:SetFocus()
...
STATIC FUNCTION RecnoDelete(oBrw)
LOCAL nRow := oBrw:nRowPos
...
lDelete := oBrw:DeleteRow()
? "Delete=",nRecno, lDelete
If nRow == oBrw:nRowCount()
oBrw:PostMsg( WM_KEYDOWN, VK_END, 0 )
EndIf

oBrw:SetFocus()
...


Спасибо: 0 
Профиль
SergKis



Пост N: 2000
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 08:27. Заголовок: PS и SET DELETED ON..


PS
и
SET DELETED ON
поставить конечно

Спасибо: 0 
Профиль
SergKis



Пост N: 2001
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 08:31. Заголовок: PPS оговорюсь сразу,..


PPS
оговорюсь сразу, что
 
If nRow == oBrw:nRowCount()
oBrw:PostMsg( WM_KEYDOWN, VK_END, 0 )
EndIf

не решает всех проблем, это только пример варианта, т.к. есть еще значение :nLen его тоже учитывать надо.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6031
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 08:39. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для этого определись с режимом работы SET DELETED ON\OFF


Спасибо большое за разъяснения !

А как быть с :
2) Как сделать заново полное считывание базы для этой программы ?
можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?

Спасибо: 0 
Профиль
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()
...


Спасибо: 0 
Профиль
SergKis



Пост N: 2003
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 08:54. Заголовок: Andrey пишет 2) Как ..


Andrey пишет
 цитата:
2) Как сделать заново полное считывание базы для этой программы ?
можно обойтись без удаления объекта, а просто заново считать базу в готовый объект ?


Сие есть тайна для меня, т.к. не понимаю о чем речь.
В тсб просмотре только 1 - :nRowCount() строк

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6032
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 09:21. Заголовок: SergKis пишет: Сие ..


SergKis пишет:

 цитата:
Сие есть тайна для меня, т.к. не понимаю о чем речь.


Базу открывать по сети SHARED. Открываем БЕЗ индексов.
Первый юзер открыл базу - допустим 10 записей в ней.
Другой добавил ещё пару записей и что-то откорректировал.
Вот по кнопке Refresh хочу перечитать заново базу и получить все записи для 1-го юзера.
У себя в задаче у меня есть такая кнопка, но там у меня условный индекс, рисуется всё автоматом.

Спасибо: 0 
Профиль
SergKis



Пост N: 2004
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 09:31. Заголовок: Andrey :DrawLine(....


Andrey
:DrawLine(...), :DrawSelect(...) рисуют строку из буфера записи, так что, если 2-ая прога делает commit, то твоя при перемещении по базе должна показать изменения или по кнопке :Refresh(.T.)\Display(). Пробуй

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6033
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 09:39. Заголовок: SergKis пишет: или ..


SergKis пишет:

 цитата:
или по кнопке :Refresh(.T.)\Display(). Пробуй


Блин, так просто... Не догадался сразу.
Заработало !

Спасибо: 0 
Профиль
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 )
Вот сама функция:
Скрытый текст

Но нет вообще пересчёта. Почему ?
Проект положил на fpt и - https://cloud.mail.ru/public/KRRJ/2WvDwnz2a

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1305
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.09.18 11:47. Заголовок: Andrey пишет: Но не..


Andrey пишет:

 цитата:
Но нет вообще пересчёта. Почему ?



А чего ты ожидаешь от этого ?
Andrey пишет:

 цитата:
DATA {|| 0 }



PS и не надо портить хороший пример

Спасибо: 0 
Профиль
SergKis



Пост N: 2005
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 11:54. Заголовок: Andrey А что ты счи..


Andrey
А что ты считаешь таким "хитрым" способом ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6035
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 12:00. Заголовок: SergKis пишет: А чт..


SergKis пишет:

 цитата:
А что ты считаешь таким "хитрым" способ


Ставил
ADD COLUMN TO TBROWSE oBrw DATA {|| oBrw:nAt } ;

Первый раз показывает правильно. После удаления/вставки или колёсиком покрутить нумерация слетает....
Может и неправильно так делать, тогда подскажите как ?
База открывается без индексов !
Можно было бы через массив, там вроде проще, но нужна база.

Haz пишет:

 цитата:
PS и не надо портить хороший пример


Я его до рабочей таблицы довожу. Как в жизни юзера требуют.

Спасибо: 0 
Профиль
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 хз что будет

Спасибо: 0 
Профиль
SergKis



Пост N: 2007
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 12:14. Заголовок: в работе тсб. не ту ..


в работе тсб.
не ту кнопку нажал, сори.

Спасибо: 0 
Профиль
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 ... с переоткрытием.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6036
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 13:35. Заголовок: SergKis пишет: ADD ..


SergKis пишет:

 цитата:
ADD COLUMN TO TBROWSE oBrw DATA {|| (oBrw:cAlias)->( OrdKeyNo() ) } ;
но без индекса с SET DELETED ON хз что будет


Ставил и так, только индекса нет и высвечивается RECNO()
Из-за этого и подумал, что можно первую колонку сделать "виртуальной" и нумерацию туда самому переписывать
при вставке/добавлении записи.
Удалённые записи не нужны, юзер просит только рабочие записи.

SergKis пишет:

 цитата:
По refresh можешь сделать ZAP и снова APPEND FROM ... или новый COPY TO ... с переоткрытием.


Нужно тогда закрывать базу, открывать её монопольно и т.д.
Более сложный вариант получается....

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1306
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.09.18 13:38. Заголовок: Andrey пишет: Может..


Andrey пишет:

 цитата:
Может и неправильно так делать, тогда подскажите как


Правильно по индексу. Для таблицы которая целиком на экране , сойдет и ADD COLUMN TO TBROWSE oBrw DATA {|| oBrw:nPaintRow }

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1307
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.09.18 14:10. Заголовок: в др. таблицу ( COP..


в SHARED и по сети оптимально только индекс. Неоптимально - написать что то типа
 
ADD COLUMN TO TBROWSE oBrw DATA {|| GetNum( oBrw ) }


где GetNum()


 
Func GetNum( oBrw )
local cAlias := oBrw:cAlias
local nRec := (cAlias)->(RecNo())
LOcal n := 0


(cAlias)->(dbEval({|| ++n }, {|| !Deleted() .and. RecNo() <= nRec } ))
(cAlias)->( dbGoTo(nRec))

Return n


НО это костыль по сравнению с индексом

Спасибо: 0 
Профиль
SergKis



Пост N: 2009
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 14:24. Заголовок: Andrey пишет Нужно т..


Andrey пишет
 цитата:
Нужно тогда закрывать базу, открывать её монопольно и т.д.
Более сложный вариант получается....


Это таблица отобранная, может состоять из одного поля (ключ или RecNo для связи с базой), находится в mem:,
открыта сразу монопольно - твой тсб единственный пользователь, многое упрощается.
Это общий случай для всех отборов (типа команда select) ведения, отчетов, ....

Спасибо: 0 
Профиль
SergKis



Пост N: 2010
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 14:30. Заголовок: PS Можешь иметь на н..


PS
Можешь иметь на нее тэг с FOR ! deleted(), тогда удаленные будут исчезать при set deleted on, OrdKeyNo(), OrdKeyCount() будут ok

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1309
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.09.18 14:45. Заголовок: SergKis пишет: Дела..


SergKis пишет:

 цитата:
Делай команду выборки в др. таблицу ( COPY TO ..., APPEND FROM ... FOR ! deleted )


Сергей, привет!
В сети будет сюрприз.
Если коллега удалит или вставит запись , то RDD это отработает при скроле по таблице и запись либо появится, либо исчезнет, а вот нумерация слетит т.к. Refresh() не вызывался и временная таблица не пересчитана

Спасибо: 0 
Профиль
SergKis



Пост N: 2011
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:04. Заголовок: Игорь, привет ! Сюрп..


Игорь, привет !
Сюрприза не будет, т.к. работаем (тсб) совсем с др. таблицей с конкретным числом записей.
Под командами copy to ..., append from ... понимаю условное обозначение выборки с уст. scope, filter (это скорее do while ...)
На время работы их, если это под тсб, блокируем тсб :lEnable := .T., потом :Reset(), :Display() ...
Таблица для тсб может иметь поля для индексов, тогда делаем сначала reindex.
То что в базе запись удалена, а у нас нет - будет пустая запись на экране
новой не будет совсем, но это временно до след. нажатия refresh, допустимое время появления данных на сервере оно субъективно, но существует

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1310
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 17.09.18 15:10. Заголовок: SergKis пишет: Сюрп..


SergKis пишет:

 цитата:
Сюрприза не будет


проще индекс держать с !Deleterd() и дергать номер ключа. Но легкий путь , не наш метод

Спасибо: 0 
Профиль
SergKis



Пост N: 2012
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:14. Заголовок: PS Для тсб (человека..


PS
Для тсб (человека) вполне может не важны те добавления\удаления в данный момент он свое крыжит
для важных выборок делаем locktable на время выборки и "чудес" не будет

Спасибо: 0 
Профиль
SergKis



Пост N: 2013
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:16. Заголовок: Haz пишет проще инде..


Haz пишет
 цитата:
проще индекс держать с !Deleterd()


Кто бы спорил, но у Андрея одно рабочее место без индекса, другое с условным индексом ...
Что бы не ломать ту ситуацию новую можно так решать безболезненно. Да сложности особой нет

Спасибо: 0 
Профиль
SergKis



Пост N: 2014
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:19. Заголовок: PS + такая техника с..


PS
+ такая техника спокойно перейдет в LetoDB

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6038
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 15:40. Заголовок: SergKis пишет: Кто ..


SergKis пишет:

 цитата:
Кто бы спорил, но у Андрея одно рабочее место без индекса, другое с условным индексом ...
Что бы не ломать ту ситуацию новую можно так решать безболезненно. Да сложности особой нет



Да я уже согласился.
Понял, что огород городить не надо.
Надо открывать базу в SHARED и делать индекс !Deleterd()
Только вот забыл как делать файл с уникальным именем в папке..
Сейчас сделаю свой вариант и покажу Tsbrowse.

Спасибо: 0 
Профиль
SergKis



Пост N: 2015
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:45. Заголовок: Andrey пишет Только ..


Andrey пишет
 цитата:
Только вот забыл как делать файл с уникальным именем в папке..


А с именем самого dbf не пойдет. Его должны открывать ВСЕ приложения с модификацией (как SET AUTOPEN ON) иначе "нам удачи не видать"

Спасибо: 0 
Профиль
SergKis



Пост N: 2016
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 15:48. Заголовок: PS Если планируешь п..


PS
Если планируешь повторно исп. удаленные записи, то нужен тэг FOR Deleted()

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6039
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 15:51. Заголовок: SergKis пишет: А с ..


SergKis пишет:

 цитата:
А с именем самого dbf не пойдет. Его должны открывать ВСЕ приложения с модификацией (как SET AUTOPEN ON) иначе "нам удачи не видать"


Зачем ? Каждый узер открывает базу и делает свой индекс с !Deleterd()
Вешаем таймер и каждые полминуты делаем Refresh() базы.
Чем не решение ?
Избавимся от создания общего индекса.
Но можно держать и общий индекс с !Deleterd().
Это уже без разницы.

Спасибо: 0 
Профиль
SergKis



Пост N: 2017
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 16:05. Заголовок: Andrey пишет Вешаем ..


Andrey пишет
 цитата:
Вешаем таймер и каждые полминуты делаем Refresh() базы


Знаем проходили, Чел пялится в свою запись на экране, вдруг раз она убежала то ли вверх то ли вниз - вставились\удалились записи рядом, попытка удержать курсор на ней может не получиться, пока он таращил глаза, наконец нашел, начал любоваться а она опять куда то улетела, причина см. выше и т.д.

 цитата:
Избавимся от создания общего индекса


По мне это минус. Если базы копеечные, то да так можно делать, но вопрос нужно ли ?

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6041
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 17.09.18 16:23. Заголовок: SergKis пишет: Знае..


SergKis пишет:

 цитата:
Знаем проходили, Чел пялится в свою запись на экране, вдруг раз она убежала то ли вверх то ли вниз - вставились\удалились записи рядом, попытка удержать курсор на ней может не получиться, пока он таращил глаза, наконец нашел, начал любоваться а она опять куда то улетела, причина см. выше и т.д.


Понял, так делать тогда не будем. Только для теста....

SergKis пишет:

 цитата:
По мне это минус. Если базы копеечные, то да так можно делать, но вопрос нужно ли ?


У меня такой механизм (условная индексация) работает уже лет 15.
Условная индексация каждого юзера для всех его нужных полей базы, что хочет то и выбирает и ко мне не пристаёт.

Спасибо: 0 
Профиль
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
Запустить две программы и можно тестировать.
Посмотрите пожалуйста исходники, может что-то и упустил.

Спасибо: 0 
Профиль
SergKis



Пост N: 2018
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 17.09.18 18:56. Заголовок: Andrey Так поправь ..


Andrey
Так поправьСкрытый текст


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6064
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.10.18 16:04. Заголовок: Всё таки есть неболь..


Всё таки есть небольшие сбои в Tsbrowse или в примерах Tsb_Shared нужно что-то добавлять.
Непонятки возникли:
1) если удалить 2-3 записи в таблице, то нарушается показ в вертикальном скролинге.


2) demo.exe - если таблица без вертикального скролинга, то при добавлении записей вертик.скролинг не появляется (иногда появляется)


3) demo2.exe - если таблица без вертикального скролинга, то при добавлении записей вертик.скролинг появляется но без нижней стрелки, огрызок какой то...

Последний проект Tsb_Basic(1.8).7z здесь - https://cloud.mail.ru/public/8WrP/cpCzTtqKp

Спасибо: 0 
Профиль
SergKis



Пост N: 2084
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.10.18 18:43. Заголовок: Andrey Просто добав..


Andrey
Просто добавь воды строки
 
STATIC FUNCTION RecnoInsert(oBrw)
...
oBrw:ResetVScroll( .T. )
oBrw:oHScroll:SetRange( 0, 0 )

ENDIF

RETURN Nil
...
STATIC FUNCTION RecnoDelete(oBrw)
...
with object oBrw
If :nLen > :nRowCount() .and. :nRowPos < :nRowCount()
(:cAlias)->( dbSkip(-:nRowCount()) )
:nRowPos := :nRowCount()
:Refresh(.T.)
EndIf
end with


oBrw:ResetVScroll( .T. )
oBrw:oHScroll:SetRange( 0, 0 )

RETURN Nil
...

выделенное синим, можешь не ставить.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6065
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 07.10.18 20:48. Заголовок: SergKis пишет: Прос..


SergKis пишет:

 цитата:
Просто добавь воды строки



Спасибо ! Помогло !

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6071
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 12.10.18 22:47. Заголовок: Всем доброй ночи ! В..


Всем доброй ночи !
Вот столкнулся с такой проблемой, не знаю как сделать перемещение записи в таблице вверх или вниз.
Какой нужно сделать алгоритм показа ?
Ввести новое поле в базу или по другому ?
Я делал ранее алгоритм пересчёта поля на лету, но там база была очень маленькой.
А для больших баз как это реализовать ?

Вот заготовку примера сделал - https://cloud.mail.ru/public/FDWs/KgajUDnAw

И ещё одна важная особенность !
Юзер хочет добавить запись под/перед курсором/маркером бровса, а не в конец базы.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1358
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.10.18 16:48. Заголовок: Andrey пишет: Юзер ..


Andrey пишет:

 цитата:
Юзер хочет добавить запись под/перед курсором/маркером бровса, а не в конец базы.


В чем проблема? Держи активный индекс по которому сортируются записи. Хоть вычисляемый, хоть по значению в поле. При добавлении позаботься о том чтобы у новой записи индекс получил нужное значение.
Варианты реализации - все что угодно на твой вкус, главное результат.
Вопрос вообще ни каким боком к Tsbrowse не относится. Если тупо оценить его то это, "как логически поместить запись в нужную позицию"
Это же и к предыстории к вопроса относится. Как решишь, далее нужно всего лишь применить новую редакцию ::gotorec() с указанием нужной строки

Спасибо: 0 
Профиль
SergKis



Пост N: 2086
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.10.18 19:41. Заголовок: Andrey Использую бе..


Andrey
Использую без индексов C функции (вроде от Pasha они), пробни, может подойдет Скрытый текст


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1359
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.10.18 20:24. Заголовок: SergKis пишет: Испо..


SergKis пишет:

 цитата:
Использую без индексов


Сергей привет.
Навеяно исходниками. Году в 90 занимался вставкой записей используя функции семейства fread, fwrite итд. Зная структуру dbf эта задача прммитивная, но тогда.... и базы были короче и валялись они локально. А может и оптимизма в голове было побольше. Сейчас я только пожелаю флаг в руки и вперёд в атаку. А я тут подожду.

Спасибо: 0 
Профиль
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(...)
Это основное, что использую.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1360
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 13.10.18 23:02. Заголовок: SergKis пишет: Как ..


SergKis пишет:

 цитата:
Как говорится "Хозяин-барин", но


Плавали, знаем
все тоже делаю в sql запросах
Select top 50 *
Select next
Select summa as [ выручка с НДС ]
Группировки так вообще для этого скуль и придумали
а вставку в определённую логическую позицию по спец полю определяющему сортировку и вложенность структуры.

Но тут кто как привык. Все подходы правильные когда работают

Спасибо: 0 
Профиль
SergKis



Пост N: 2088
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 13.10.18 23:32. Заголовок: Haz пишет все тоже д..


Haz пишет
 цитата:
все тоже делаю в sql запросах


На ADS у нас только немцы приходили в начале 2000-х, но их выжили скандинавы.
Из за его стоимости никто из клиентов не хочет(ел) приобретать лицензию, даже богатый Латв.энерго.
От исп. mysqll и firebird мы отказались сами из за администр. затрат эксплуатации на чужих администраторах\рс.

 цитата:
Но тут кто как привык


Схему select * или select (...) as (...) ... поддерживаю на DBFCDX(letodb), распределяя "основной" запрос на сервер, с доработкой "до кондиции" на клиенте.

Спасибо: 0 
Профиль
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

DEFINE TBROWSE oBrw ;
....
FONT cFontName SIZE nFontSize ;
GRID

Фонт меняется в таблице, визуально видно.

Запрашиваю размер фонта так:
 
hFont := oBrw:hFont // считать хендл фонта ячеек таблицы
//hFont := oBrw:aColumns[2]:hFont // 1-cells font
If hFont != Nil
aFontGet := GetFontParam(hFont)
nFSize2 := aFontGet[2] // узнать истинный размер фонта в ячейке
ENDIF
? "nFontSize=", nFontSize, "|nFSize2=", nFSize2, hb_ValToExp(aFontGet)
Получаю:
[pre2] nFontSize=16 |nFSize2=9 {"Segoe UI", 9, .F., .F., .F., .F., 0}

Почему так получается ?
Или я неправильно делаю ?
Тогда подскажите пожалуйста как нужно определить размер фонта в ячейках.

Спасибо: 0 
Профиль
SergKis



Пост N: 2089
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.10.18 19:13. Заголовок: Andrey пишет Почему ..


Andrey пишет
 цитата:
Почему так получается ?
Или я неправильно делаю ?


Может игнорируешь исходники, для понимания ситуации ?

Спасибо: 0 
Профиль
TimTim



Пост N: 150
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 22.10.18 11:58. Заголовок: Andrey пишет: Юзер ..


Andrey пишет:

 цитата:
Юзер хочет добавить запись под/перед курсором/маркером бровса, а не в конец базы.


Haz пишет:

 цитата:
Держи активный индекс по которому сортируются записи. Хоть вычисляемый, хоть по значению в поле. При добавлении позаботься о том чтобы у новой записи индекс получил нужное значение.


Привожу пример грубой реализации - https://cloud.mail.ru/public/2CQk/xrGVyF58D
В примере также реализовал "движение" записи вверх-вниз. Действительно совет Haz:

 цитата:
далее нужно всего лишь применить новую редакцию ::gotorec() с указанием нужной строки


очень помог.
Я еще мало что могу в использовании MiniGui и TsBrowse в частности. А есть задача, в которой желательно
реализовать следующее.
Во-первых, реализовать отметку нескольких записей по SHIFT/CTRL + клик мышью (как в проводнике, например) и затем
перемещение / копирование этих записей после указанной курсором записи, т.е. "привычный" copy/past.
Во-вторых, хотелось бы, чтобы перемещенная запись меняла цвет шрифта или фона, например,
как в Total Commander. Это только на момент работы с БД. После выхода из TsBrowse сохранять цвет измененных записей не надо.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1366
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.10.18 15:25. Заголовок: TimTim пишет: Во-пе..


TimTim пишет:

 цитата:
Во-первых, реализовать отметку нескольких записей по SHIFT/CTRL + клик мышью (как в проводнике, например)


Реализовать отметку можно добавив в бровс объект массив с номерами отмеченных записей.
Сделать это можно так
 
__objAddData( oBrw, 'aRecordds' )
oBrw:aRecords := {}

Далее по bLClick добавлять в этот массив номера записей, проверяя предварительно нажата ли CTRL или SHIFT.
С SHIFT придется повозится на предмет получения не одного а списка номеров записей
TimTim пишет:

 цитата:
затем
перемещение / копирование этих записей после указанной курсором записи, т.е. "привычный" copy/past.


можно через контекстное меню с пересчетом ключа индекса для копируемых (перемещаемых) записей
TimTim пишет:

 цитата:
хотелось бы, чтобы перемещенная запись меняла цвет шрифта или фона,


в условии oBrw:SetColor() проверять есть ли запись в массиве помеченных.
См. пример TSB_CALENDAR как там сделана отметка и покраска . Правда там отметка относится к ячейке, но логика одинакова

Спасибо: 0 
Профиль
TimTim



Пост N: 151
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 22.10.18 15:40. Заголовок: Спасибо за ответ. Пр..


Спасибо за ответ. Пример с календарем посмотрю.
А чем и как ловить нажатие клавиш CTRL и / или SHIFT?

Спасибо: 0 
Профиль
Haz
moderator


Пост 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

Спасибо: 1 
Профиль
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 показ восстановится
Или я что то потерял ?

Спасибо: 0 
Профиль
SergKis



Пост N: 2095
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.10.18 18:59. Заголовок: PS чуть перепутал, н..


PS
чуть перепутал, но это не влияет на результат
 
If lPos
MyGotoRec(oBrw, nRec, nRow)
Else
MyGotoRec(oBrw, nRec)
EndIf


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1368
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.10.18 20:15. Заголовок: SergKis пишет: new ..


SergKis пишет:

 цитата:
new варианте ломается показ,


Завтра посмотрю

Спасибо: 0 
Профиль
Haz
moderator


Пост 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.

with object oBrw
If :lIsDbf

lRet := .T.
cAlias := :cAlias
:nLastPos := (cAlias)->( RecNo() )
hb_default( @nRowPos, :nRowPos )
(cAlias)->( dbGoto(nRec) )

DO WHILE (cAlias)->( !EOF() ) .and. nSkip < ( :nRowCount() - nRowPos )
(cAlias)->( dbSkip(1) )
nSkip ++
ENDDO

If (cAlias)->( EOF() )
lReCount := .T.
nRowPos := :nRowCount() - nSkip + 1
EndIf

(cAlias)->( dbGoto(nRec) )
nSkip := 0
:nRowPos := 1

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



твой пример погонял - все норм

Спасибо: 0 
Профиль
SergKis



Пост N: 2096
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.10.18 13:52. Заголовок: Haz пишет твой приме..


Haz пишет
 цитата:
твой пример погонял - все норм


Игорь добавь до 21 строки в таблице (в районе 7 к примеру) и жмем End
С записью Line 15 проделываем Up, Down во всех режимах
С new вариантом перескок отображения на Line 13, что не совсем правильно

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1370
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.10.18 20:49. Заголовок: SergKis пишет: доба..


SergKis пишет:

 цитата:
добавь до 21 строки в таблице (в районе 7 к примеру) и жмем End


Да, все увидел. Пару дней возьму на правку и тестирование.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6079
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.10.18 19:22. Заголовок: Всем привет. Сделал ..


Всем привет.
Сделал у себя выгрузку базы через SetArrayTo() и обломался.
Оказывается таблица больше 41 колонок НЕ ДЕЛАЕТСЯ.
А у меня в базе 120 колонок, есть и ещё чуть больше.

Этот параметр наверное как то задан по умолчанию ?
Увеличить можно сейчас ?
Раньше компы были слабее, а сейчас на порядок быстрее.

Спасибо: 0 
Профиль
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
...

126 колонок есть

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1373
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.10.18 20:02. Заголовок: SergKis пишет: Стра..


SergKis пишет:

 цитата:
Странное утверждение


Да, тоже не понял как клеятся слова выгрузка и setarrayto.
Куда выгрузка, где эти колонки?
У меня Tsbrowse был с 1000 колонок

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6080
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 25.10.18 21:06. Заголовок: Haz пишет: У меня T..


Haz пишет:

 цитата:
У меня Tsbrowse был с 1000 колонок


У меня почему то 41 колонка и всё, больше не идёт.

SergKis пишет:

 цитата:
126 колонок есть


У меня почему то режет в 3-х местах только на 41 колонку.
Буду смотреть у себя, раз нет ограничений.

Спасибо: 0 
Профиль
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 колонки.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6085
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.10.18 17:48. Заголовок: Непонятка возникает ..


Непонятка возникает при обновлении массива.
Показываю прелодер, а он при создании таблицы не показывает лепестки - белый экран и всё.
Делаю так:
   // создаём окно ожидания с потоком 
WaitThreadCreate( 'Расчёт по отчёту ...' ) // как в SAMPLES\BASIC\WAIT_WINDOW_2\demo2.prg

SetProperty(oBrw8:cParentWnd, oBrw8:cControlName, "Enabled", .F.)

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.

Как можно заставить прелодер отображаться ?

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1378
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 26.10.18 19:54. Заголовок: Andrey пишет: табли..


Andrey пишет:

 цитата:
таблица на экране вся показывается и мелькает,


Зачем? Зачем в ts добавлять по одному элементу?
Формируй массив данных любуюсь на свой прелодер. А потом добавляй целиком. Хоть через SetArray(To) или прямым присвоением в oBrw:aArray с последующей синхронизации бровса ( тоже все уже разжевано на форуме) . Даже был пример как не массив а dbf подменить на лету.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6086
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.10.18 15:56. Заголовок: Haz пишет: А потом ..


Haz пишет:

 цитата:
А потом добавляй целиком.


Переделал это добавление. Действительно быстрее намного получилось.
Только прелодер все равно белый, без лепестков.
На 1-2 секунды появляется всего, потом уже Tsbrowse показывается.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1379
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.10.18 16:54. Заголовок: Andrey пишет: Тольк..


Andrey пишет:

 цитата:
Только прелодер все равно белый, без лепестков


Ты же сам в прошлом посте писал как это лечится

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6961
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 27.10.18 17:11. Заголовок: Haz пишет: Ты же са..


Haz пишет:

 цитата:
Ты же сам в прошлом посте писал как это лечится


Он забыл типа

Спасибо: 0 
Профиль
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


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1398
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.18 18:57. Заголовок: Andrey пишет: oBrw:..


Andrey пишет:

 цитата:
oBrw:GotoRec( nRow, nRow-1 )



GotoRec первым параметром принимает номер записи а не номер строки

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6121
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.18 19:16. Заголовок: Haz пишет: GotoRec ..


Haz пишет:

 цитата:
GotoRec первым параметром принимает номер записи а не номер строки


В данном случае у меня в таблице номер записи равен номеру строки, т.е. у меня таблица через SetArrayTo()

Спасибо: 0 
Профиль
SergKis



Пост N: 2129
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.18 19:51. Заголовок: Andrey пишет В данно..


Andrey пишет
 цитата:
В данном случае у меня в таблице номер записи равен номеру строки, т.е. у меня таблица через SetArrayTo()


METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse 
LOCAL cAlias
LOCAL nSkip
LOCAL n
LOCAL nRecSave
LOCAL lRet := .F.
LOCAL lReCount := .F.

IF ::lIsDbf

...


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1399
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.18 22:18. Заголовок: Andrey пишет: после..


Andrey пишет:

 цитата:
последняя запись в таблице не становиться последней, а чуток ранее.


Andrey пишет:

 цитата:
oBrw:GotoRec( nRow, nRow-1 )



Не вдаваясь что такое setarrayto
Если номер записи равен номеру строки и надо попасть на последнюю
Объяснни. что значит nRow - 1

Спасибо: 0 
Профиль
Dima
администратор




Пост N: 6971
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 10.11.18 00:06. Заголовок: Haz пишет: Объяснни..


Haz пишет:

 цитата:
Объяснни. что значит nRow - 1


Да он не помнит уже...склероз ))

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6122
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.11.18 14:27. Заголовок: Haz пишет: Объяснни..


Haz пишет:

 цитата:
Объяснни. что значит nRow - 1


Пробовал по разному, сначала было 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


Спасибо вам за этот отличный метод !!!

Спасибо: 0 
Профиль
SergKis



Пост N: 2130
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.18 16:44. Заголовок: Andrey пишет у меня ..


Andrey пишет
 цитата:
у меня таблица через SetArrayTo()


Это означает таблица в массиве тсб, в таком случае :GotoRec(...) полностью игнорирует свои внутренности, т.е. НЕ РАБОТАЕТ, т.к. значение :lIsDbf = .F.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1400
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.18 18:20. Заголовок: SergKis пишет: т.е..


SergKis пишет:

 цитата:
т.е. НЕ РАБОТАЕТ, т.к. значение :lIsDbf = .F.


Пришёл Сергей и сдал военную тайну от том что goto на recno это только для dbf

Надо было терпеть до последнего

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6123
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.11.18 23:22. Заголовок: Haz пишет: Пришёл С..


Haz пишет:

 цитата:
Пришёл Сергей и сдал военную тайну от том что goto на recno это только для dbf


Ну хоть что то стало понятней !

Спасибо: 0 
Профиль
SergKis



Пост N: 2131
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.18 00:09. Заголовок: Haz пишет Надо было ..


Haz пишет
 цитата:
Надо было терпеть до последнего


Игорь, тянуть нельзя было, Андрей до сих пор верит в Деда Мороза, что загружает SetArrayTo(), а не TsBrowse.
Что дальше было бы ?

Теперь можно быть спокойным, Андрей пишет
 цитата:
Ну хоть что то стало понятней !




Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6137
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 02.12.18 18:43. Заголовок: Всем привет ! Замети..


Всем привет !
Заметил такую странность у себя в проектах использующие Tsbrowse/
Для Суперхидера цвет текста не работает !
Вот хотя бы для примера Tsb_Export, там цвет указан желтый, а всегда показывает черный.
     :SetColor( {17}, { { || CLR_YELLOW                        } } ) // 17, текста спецхидер

Пробовал и так, как и для шапки и подвала таблицы:
     :SetColor( {17}, { CLR_YELLOW                               } ) // 17, текста спецхидер

Почему ? Какой правильный синтаксис ?

Спасибо: 0 
Профиль
gfilatov2002
moderator




Пост N: 1399
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 02.12.18 19:07. Заголовок: Andrey пишет: Для С..


Andrey пишет:

 цитата:
Для Суперхидера цвет текста не работает


Эта ошибка будет исправлена в следующей сборке



Спасибо: 0 
Профиль
krutoff



Пост N: 190
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 16.01.19 16:12. Заголовок: Поправьте xlsxml_s.prg


Может не в той теме пишу, но продублирую. Попробовал 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 -поправьте, плз.

Спасибо: 0 
Профиль
Haz
moderator


Пост 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" )

Спасибо: 1 
Профиль
Andrey
постоянный участник




Пост N: 6179
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.02.19 14:42. Заголовок: Всем привет ! Как б..


Всем привет !

Как боротся с отгрызанными стрелками ?
Если делаю oBrw:Hide() или просто сохраняю/перечитываю цвета у бровса, то выходит так:


Только после того как мышкой встаю на линию скролинга, то тогда появляются стрелки.
Юзер будет просто в шоке....

Как с этим бороться ?

Спасибо: 0 
Профиль
SergKis



Пост N: 2245
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.02.19 14:52. Заголовок: Andrey пишет Как с э..


Andrey пишет
 цитата:
Как с этим бороться ?


Попробуй добавить последними командами
 
obrw:ResetVScroll( .T. )
obrw:oVScroll:SetRange( 0, 0 )
obrw:oHScroll:SetRange( 0, 0 )

obrw:Refresh()

If ! obrw:lNoHScroll .and. obrw:oHScroll != Nil
obrw:oHScroll:SetPos( obrw:nCell )
EndIf

obrw:ResetVScroll( .T. )
obrw:oHScroll:SetRange( 0, 0 )


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6260
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.04.19 12:40. Заголовок: Всем привет ! Вот на..


Всем привет !
Вот нашёл небольшой глюк:


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6261
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.04.19 15:44. Заголовок: SergKis пишет: oBrw..


SergKis пишет:

 цитата:
oBrw:Enabled( lEnable ) - с закраской тсб


А как свою закраску установить ?
Хочется черный фон и серые буквы.
Можно сделать как то так - oBrw:Enabled( .F. , {BLACK,SILVER} ) ?

Спасибо: 0 
Профиль
SergKis



Пост N: 2393
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 16:02. Заголовок: Andrey Посмотри исх..


Andrey
Посмотри исходник :Enabled(), думаю, увидишь
Можешь найти тему "Новая версия ...", посвященную :Enabled()

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6262
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.04.19 16:57. Заголовок: Хотелось бы простого..


Хотелось бы простого написания, как то так - oBrw:Enabled( .F. , {BLACK,SILVER} )
А так придётся писать отдельную внешнюю функцию.
Не совсем удобно...
И в METHOD Enabled() нет сохранения
oBrw:nClrLine := ???  // цвет линий между ячейками таблицы


Спасибо: 0 
Профиль
SergKis



Пост N: 2394
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 18:10. Заголовок: Andrey Ты, точно, п..


Andrey
Ты, точно, посмотрел исходник и пост в теме ?
Григорий делал переменные объекта, для уст. цветов закраски.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6263
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 18.04.19 20:04. Заголовок: SergKis пишет: Ты, ..


SergKis пишет:

 цитата:
Ты, точно, посмотрел исходник и пост в теме ?



Да вроде да !
По теме нашёл
gfilatov2002 пишет:

 цитата:
Для этого я добавил в класс
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


Так заработала, только вверху шапки и внизу подвала за границей таблицы НЕ КРАСЯТСЯ ячейки.

Спасибо: 0 
Профиль
SergKis



Пост N: 2402
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 18.04.19 20:27. Заголовок: Andrey пишет А как э..


Andrey пишет
 цитата:
А как это использовать - не понимаю.


Внимательно, медленно просмотри метод :Enabled()
Найди переменные, сравни со своим текстом ...

Спасибо: 0 
Профиль
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 }' // это текстовый ини-файл

For nI := 1 To Len(aTable)
cHeadName := aTable[nI,1 ] // 1 Шапка_
cDateBlock := aTable[nI,2 ] // 2 Дата_
......
// ------ преобразовать на знаки ------
cHeadName := STRTRAN(cHeadName,";", CRLF )
cDateBlock := STRTRAN(cDateBlock,'CRLF', '"' + CRLF + '"' )
xVal := Eval( &( cDateBlock ) )
aAligh := &(cAlighColum) // выравнивание: cells, header, footer

ADD COLUMN TO TBROWSE oBrw // добавить новую колонку в TBROWSE

oBrw:aColumns[nI]:cHeading := cHeadName // заголовок колонки
oBrw:aColumns[nI]:bData := &( cDateBlock ) // поля в колонке 847 строка
oBrw:aColumns[nI]:nAlign := aAligh[1] // выравнивание: cells

Что я не так делаю ?

Спасибо: 0 
Профиль
SergKis



Пост N: 2438
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 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()))

Спасибо: 0 
Профиль
SergKis



Пост N: 2439
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 21.04.19 16:44. Заголовок: PS Расшифровка cData..


PS
Расшифровка
cDataBlock := '{|| MARK }'

bVal := &( cDataBlock )
xVal := Eval( bVal )
? cDataBlock, xVal, bVal

oCol:bData := bVal
If ! '->' $ cDataBlock
oCol:cAlias := oBrw:cAlias
EndIf

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6268
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 21.04.19 17:11. Заголовок: SergKis - СПАСИБО ! ..


SergKis - СПАСИБО !

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1487
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 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

If Upper( Chr( nKey ) ) $ "YCST1"
::lChanged := uVar == .F.
uVar := .T.
ElseIf Upper( Chr( nKey ) ) $ "FN0"
::lChanged := uVar == .T.
uVar := .F.
ElseIf nKey == VK_SPACE
uVar := ! uValue
::lChanged := .T.
Else
Return 0
EndIf

::lHasChanged := If( ::lChanged, .T., ::lHasChanged )
::oWnd:nLastKey := VK_RETURN
::PostEdit( uVar, nCell )
::lPostEdit := .F.
Return 0
Else
::lPostEdit := .T.
::lChanged := .F.
::oWnd:nLastKey := nKey
::PostEdit( uValue, nCell )
::lPostEdit := .F.
Return 0
EndIf


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6274
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.04.19 21:04. Заголовок: Haz пишет: тогда в..


Haz пишет:

 цитата:

тогда в своей программе при определении бровса достаточно указать
oBrw:bEditLog := { |a,b,c| WriteEditLog( a, b, c:cAlias ) }



Поставил у себя такую замечательную эту штуку в тестовый пример !
Отличное решение, юзера будут просто в восторге.
Я ещё сделал поиск по номеру записи - вообще все претензии что программа сама удалила и исправила - пропадут !
Правда не по всем полям происходит запись. Нужно разбираться.

Спасибо БОЛЬШОЕ Haz !

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1494
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.04.19 21:24. Заголовок: Andrey пишет: Правд..


Andrey пишет:

 цитата:
Правда не по всем полям происходит запись. Нужно разбираться.


Рад что пригодилось.
Запись не идет по тем полям где используется bPrevEdit с последующим отказом от редвктирования., но с изменением значения. Тут нужно самому позаботиться, т. к. метод Edit не вызывается.
В целом использую подобный функционал несколько лет. Мотивирует пользователя лучше чем пинок, особенно когда все видят героя.

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1495
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.04.19 21:42. Заголовок: Haz пишет: В целом ..


Haz пишет:

 цитата:
В целом использую подобный функционал несколько лет.


Добавлю, что из объекта tsBrosе который передается блоку третьим параметром, легко достать номер колонки и соответственно имя Поля, которое изменили.
Никак не доходят руки до контрольного примера запятая будет посвободнее обязательно что-нибудь простое напишу

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 6275
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 27.04.19 22:20. Заголовок: Да мне Сергей посове..


Да мне Сергей посоветовал так сделать:
  // запись в лог-файл всех изменений полей БД 
oBrw1:bEditLog := { |xo,xn,ob| WriteEditLog( xo, xn, ob ) }

Вот мой код записи Скрытый текст

Только мне пришлось делать nCol := oBrw:nCell - 1

Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1496
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 27.04.19 22:42. Заголовок: Andrey пишет: Тольк..


Andrey пишет:

 цитата:
Только мне пришлось делать nCol := oBrw:nCell - 1


Возможно используешь :Selector по этому нумерация едет. Попробуй выдернуть имя поля через oCol:cName

Продолжу тут.
Я лог веду в dbf, с указанием имени поля и тайм штампа времени изменения. Это позволяет вне завистмости в каком бровсе поменяли значение, всегда правильно показывать хронологию.
Показ реализован прямо в бровсе по правой кнопке.
Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней.

Спасибо: 0 
Профиль
SergKis



Пост N: 2475
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.19 11:34. Заголовок: Haz пишет Имя колонк..


Haz пишет
 цитата:
Имя колонки в логе меня не особо интересует, т. к. показываю лог именно в ней


Посмотрел на примере, oBrw:nCell и nCol в METHOD PostEdit, разные. Добавил в вызов nCol
 
METHOD PostEdit( uTemp, nCol, bValid ) CLASS TSBrowse
...
xNewEditValue := ::bDataEval( ::aColumns[ nCol ], , nCol ) //Igor Nazarov

If hb_isBlock( ::bEditLog ) .and. ::aColumns[ nCol ]:xOldEditValue != xNewEditValue
Eval( ::bEditLog, ::aColumns[ nCol ]:xOldEditValue, xNewEditValue, Self, nCol )
EndIf

Return Nil
В задаче
oBrw1:bEditLog := { |xo,xn,ob,nc| WriteEditLog( xo, xn, ob, nc ) }
...
FUNCTION WriteEditLog( xOld, xNew, oBrw, nCell )
LOCAL cFileLog := ChangeFileExt( Application.ExeName, ".log" )
LOCAL nCol, cHead, cStr, CRZ := "; ", oCol, cAls, cName, oC

WITH OBJECT oBrw
DEFAULT nCell := :nCell
oC := :aColumns [ nCell ]
oCol := :GetColumn( nCell ) // - iif( :lSelector, 1, 0 ) )
cName := oCol:cName
nCol := :nColumn( cName )
cAls := iif( Empty(oCol:cAlias), :cAlias, oCol:cAlias )
cHead := oCol:cHeading
END WITH

? cAls , oBrw:lSelector, oBrw:nCell
? nCell, oC:cName, oC:cHeading
? nCol , cName , cHead
...
получил в _MsgLog.txt
MAIN .F. 8
7 FTEXT Text
7 FTEXT Text
правилась колонка 7 FTEXT

Думаю надо добавить в вызов номер колонки редактирования в вызов :bEditLog для начала

Спасибо: 0 
Профиль
SergKis



Пост N: 2476
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.19 11:54. Заголовок: Причина другого знач..


Причина другого значения :nCell понятна, уже выполнены команды
 
If nLastKey == VK_UP .and. ::lPostEditGo
::GoUp()
ElseIf nLastkey == VK_RIGHT .and. ::lPostEditGo
::GoRight()
ElseIf nLastkey == VK_LEFT .and. ::lPostEditGo
::GoLeft()
ElseIf nLastkey == VK_DOWN .and. ::lPostEditGo
::GoDown()
::Refresh( .F. )
ElseIf ::aColumns[ nCol ]:nEditMove >= 1 .and. ::aColumns[ nCol ]:nEditMove <= 5 // excel-like behaviour post-edit movement
Eval( aMoveCell[ ::aColumns[ nCol ]:nEditMove ] )
ElseIf ::aColumns[ nCol ]:nEditMove == 0
::DrawSelect()
EndIf

т.е. подготовлена работа со след. колонкой

Спасибо: 0 
Профиль
SergKis



Пост N: 2477
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 28.04.19 12:13. Заголовок: Можно сделать так ..


Можно сделать так
 
If hb_isBlock( ::bEditLog ) .and. ::aColumns[ nCol ]:xOldEditValue != xNewEditValue
uTemp := ::nCell
::nCell := nCol

Eval( ::bEditLog, ::aColumns[ nCol ]:xOldEditValue, xNewEditValue, Self )
::nCell := uTemp
EndIf


Спасибо: 0 
Профиль
Haz
moderator


Пост N: 1497
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 28.04.19 13:05. Заголовок: SergKis пишет: т.е...


SergKis пишет:

 цитата:
т.е. подготовлена работа со след. колонкой


Может обработку bEditLog поднять перед этой подготовкой?
Посмотрю с работы, с телефона не реально.

Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 467
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет