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


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



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 181 , стр: 1 2 3 4 5 6 7 8 9 10 All [только новые]


постоянный участник




Пост N: 3933
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.11.21 01:29. Заголовок: Andrey пишет Есть та..


Andrey пишет
 цитата:
Есть такой метод ?


Берешь запускаешь hbedit.exe h_tbrowse.prg, делаешь Alt+L, в полученном списке набираешь что хочешь найти, к примеру, "draw" и смотришь содержимое найденных ф-й. Начни смотреть DrawHeaders() и другие.
Потратишь несколько минут

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




Пост N: 7115
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.21 16:42. Заголовок: Пробовал в шапке/под..


Пробовал в шапке/подвале разные картинки: bmp, png - очень некрасиво получаются:


Если шапку/подвал делать белым или серым, без градиента, то более менее нормально.
В нумераторе bmp красиво выглядит.

Вопрос: можно ли как то сделать, чтобы картинки не делались цветом фона (убрать цвет фона), т.е. ключ какой то прикрутить, типа:
oBrw:lImgBackcolor := .T. / .F.  

Или это можно уже сейчас делать, а я и не знаю ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1797
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.21 17:07. Заголовок: Andrey пишет: Или э..


Andrey пишет:

 цитата:
Или это можно уже сейчас делать, а я и не знаю ?


Можно , в си модуле поиграть с маской вывода.

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




Пост N: 7116
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.21 17:38. Заголовок: Haz пишет: Можно , ..


Haz пишет:

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


Хоть напиши где этот модуль...
А как протащить свой переключатель ?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1798
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.21 19:15. Заголовок: Andrey пишет: Хоть ..


Andrey пишет:

 цитата:
Хоть напиши где этот модуль...

единственный с мидуль в исходниках tsb, функция вроде tsdrawcell . в ней штук 5 вызовов вставки картинки , используется константа SCRAND .
Можно поставить SCRCOPY и прозрачность фона и картинки уйдет .
Вставь этот модуль на си целиком в свой проект через #pragma и меняй как хочешь.
Ps.что означают эти константы в справке микрософт есть.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1799
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 09.11.21 19:21. Заголовок: Andrey пишет: А как..


Andrey пишет:

 цитата:
А как протащить свой переключатель ?

править си и prg исходники. Сейчас не могу , перегруз

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




Пост N: 7117
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.21 22:22. Заголовок: Haz пишет: Вставь э..


Haz пишет:

 цитата:
Вставь этот модуль на си целиком в свой проект через #pragma и меняй как хочешь.


Для себя поставить один раз, да можно.
Но хотелось бы нормального решения.
 
C:\borland\BCC55\Include\wingdi.h

/* Ternary raster operations */
#define SRCCOPY (DWORD)0x00CC0020 /* dest = source */
#define SRCPAINT (DWORD)0x00EE0086 /* dest = source OR dest */
#define SRCAND (DWORD)0x008800C6 /* dest = source AND dest */
#define SRCINVERT (DWORD)0x00660046 /* dest = source XOR dest */
#define SRCERASE (DWORD)0x00440328 /* dest = source AND (NOT dest ) */
#define NOTSRCCOPY (DWORD)0x00330008 /* dest = (NOT source) */
#define NOTSRCERASE (DWORD)0x001100A6 /* dest = (NOT src) AND (NOT dest) */
#define MERGECOPY (DWORD)0x00C000CA /* dest = (source AND pattern) */


C:\MiniGUI\SOURCE\TsBrowse\c_TBrowse.c

HB_FUNC( TSDRAWCELL )
{
HWND hWnd = ( HWND ) HB_PARNL( 1 );
HDC hDC = ( HDC ) HB_PARNL( 2 );
int nRow = hb_parni( 3 );
int nColumn = hb_parni( 4 );
int nWidth = hb_parni( 5 );
....

DrawBitmap( hDC, hBitMap, nTop, nLeft, 0, 0, bSelec ? 0 : SRCAND );



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




Пост N: 7118
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.21 22:35. Заголовок: Поставил целиком исп..


Поставил целиком исправленный c_TBrowse.c в проект
Вот что получилось:


Спасибо БОЛЬШОЕ Haz

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




Пост N: 3935
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.11.21 22:57. Заголовок: Andrey пишет Постави..


Andrey пишет
 цитата:
Поставил целиком исправленный c_TBrowse.c в проект


Если не изменяет память, давно, в какой то версии, уже была замена с SRCCOPY на SRCAND

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




Пост N: 7119
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 09.11.21 23:13. Заголовок: А вот про это я тоже..


А вот про это я тоже забыл.
Некрасиво выглядит картинка в ячейках:


Тогда нужно два переключателя, для шапки/подвала/суперхидера/номератора и для ячеек.
oBrw:lImgNoCellTransparency := .T. / .F.  
oBrw:lImgCellTransparency := .T. / .F.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1800
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 08:44. Заголовок: SergKis пишет: Если..


SergKis пишет:

 цитата:
Если не изменяет память, давно, в какой то версии,


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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1801
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 08:56. Заголовок: Andrey пишет: Тогда..


Andrey пишет:

 цитата:
Тогда нужно два переключателя, для шапки/подвала/суперхидера/номератора и для ячеек.
oBrw:lImgNoCellTransparency := .T. / .F.
oBrw:lImgCellTransparency := .T. / .F.


Не нужны переключатели, нужно явное задание маски примерно так oCol:nCellBitmapMask := SCRAND и пр.

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




Пост N: 3936
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.21 13:38. Заголовок: Haz пишет нужно явно..


Haz пишет
 цитата:
нужно явное задание маски примерно так oCol:nCellBitmapMask := ...


В HB_FUNC( TSDRAWCELL ) свободен 27 параметр или добавить 33-й
 
//HBRUSH wBrush = ( HBRUSH ) HB_PARNL( 27 );
BOOL b3DInv = ( HB_ISNIL( 28 ) ? FALSE : ! hb_parl( 28 ) );
BOOL b3D = ( HB_ISNIL( 28 ) ? FALSE : TRUE );
COLORREF nClr3DL = hb_parnl( 29 );
COLORREF nClr3DS = hb_parnl( 30 );
long lCursor = hb_parnl( 31 );
BOOL bSelec = ( HB_ISNIL( 32 ) ? FALSE : hb_parl( 32 ) );

а для колонок надо маску для каждого элемента определять
oCol:nCellBmpMask
oCol:nHeadBmpMask
oCol:nFootBmpMask
oCol:nSpcHdBmpMask
AAdd( ::aSuperHead, { nFromCol, nToCol, uHead, nClrText, nClrBack, l3dLook, hFont, uBitMap, lAdjust, nLineStyle, ;
nClrLine, nHAlign, nVAlign, lTransp, nSupHdBmpMask } ) //Super Header
Вместо Bmp слово Image использовать в имени (Bmp короче)
PS
Есть еще void DrawMasked( HDC hDC, HBITMAP hbm, int wRow, int wCol ) с масками, с ней как ?
PS2
Значение маски может задаваться блоком кода ?

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




Пост N: 7120
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.11.21 15:41. Заголовок: SergKis пишет: а дл..


SergKis пишет:

 цитата:
а для колонок надо маску для каждого элемента определять


Отличная идея !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1802
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 20:47. Заголовок: SergKis пишет: В HB..


SergKis пишет:

 цитата:
В HB_FUNC( TSDRAWCELL ) свободен 27 параметр или добавить 33-й

думаю лучше добавить 33. Новая сущность , новый параметр

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1803
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 20:49. Заголовок: SergKis пишет: а д..


SergKis пишет:

 цитата:

а для колонок надо маску для каждого элемента определять
oCol:nCellBmpMask
oCol:nHeadBmpMask
oCol:nFootBmpMask
oCol:nSpcHdBmpMask


Вот поэтому мне проще было си модуль прицепить

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




Пост N: 3938
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.21 21:30. Заголовок: Вот поэтому мне прощ..



 цитата:
Вот поэтому мне проще было си модуль прицепить


Понимаю, но вроде и описанные элементы, 33-ий параметр и немного добавить в методах :Draw...() для опр. 33-го параметра. В целом немного. Скажи что в С модуле менял, я туда не лазил

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1804
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 21:43. Заголовок: SergKis пишет: Скаж..


SergKis пишет:

 цитата:
Скажи что в С модуле менял, я туда не лазил


 
else
{
if( bAdjBmp )
{
DrawBitmap( hDC, hBitMap, rct.top, rct.left - 2, rct.right - rct.left + 3, rct.bottom - rct.top - 1, bSelec ? 0 : SRCAND );
hBitMap = 0;

if( ! bOpaque )
MaskRegion( hDC, &rct, GetPixel( hDC, nLeft, nTop ), GetBkColor( hDC ) );
}
else if( bOpaque )
DrawBitmap( hDC, hBitMap, nTop, nLeft, 0, 0, bSelec ? 0 : SRCAND ); // вот это отвечает за вывод uBmpCell в ячейке
else
DrawMasked( hDC, hBitMap, nTop, nLeft );
}
}



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




Пост N: 3939
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.11.21 21:49. Заголовок: Игорь А это место (и..


Игорь
А это место (из текста выше) как ?
 
DrawBitmap( hDC, hBitMap, rct.top, rct.left - 2, rct.right - rct.left + 3, rct.bottom - rct.top - 1, bSelec ? 0 : SRCAND );


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1805
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.11.21 22:05. Заголовок: SergKis пишет: А эт..


SergKis пишет:

 цитата:
А это место (из текста выше) как ?


да просто ставил нужную маску вместо SRCAND и собирал проект.


Если менять системно, то надо вводить 33 параметр в эту функцию
int nMask = hb_parni( 33 );
и примерно
DrawBitmap( hDC, hBitMap, rct.top, rct.left - 2, rct.right - rct.left + 3, rct.bottom - rct.top - 1, bSelec ? 0 : nMask );

В си тоже не особо силен, и по этой причине не стал делать тоже

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




Пост N: 3940
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.21 10:20. Заголовок: Haz пишет Если менят..


Haz пишет
 цитата:
Если менять системно, то надо вводить 33 параметр в эту функцию


Сделал без блока кода. Кинул Андрею тестировать. Назвал переменные
 
DATA nBmpMaskCell INIT 0x008800C6 // SRCAND
DATA nBmpMaskHead INIT 0x008800C6 // SRCAND
DATA nBmpMaskFoot INIT 0x008800C6 // SRCAND
DATA nBmpMaskSpcHd INIT 0x008800C6 // SRCAND

Установка такая работает
STATIC FUNCTION myBrwEnum( oBrw, nOneCol )
LOCAL oCol, nI := 0, nCnt := 0
DEFAULT nOneCol := 1

FOR EACH oCol IN oBrw:aColumns
nI++
oCol:cSpcHeading := NIL
oCol:cSpcHeading := IIF( nI == nOneCol, "#" , "+" )
IF nI > nOneCol
IF oCol:lVisible
oCol:cSpcHeading := hb_ntos( ++nCnt )
oCol:nBmpMaskHead := 0x00CC0020 // SRCCOPY
oCol:nBmpMaskSpcHd := 0x00CC0020 // SRCCOPY
ENDIF
ENDIF
NEXT

Для Super Header добавился 15 элемент, т.е.
oBrw:aSuperHead[ nI, 15 ] := 0x00CC0020 // SRCCOPY


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1806
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 11.11.21 10:34. Заголовок: SergKis пишет: Сдел..


SergKis пишет:

 цитата:
Сделал без блока кода. Кинул Андрею тестировать. Назвал переменные


вроде должно все пройти нормально . Пробовал в СИ правку что выше давал. тоже работает

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




Пост N: 7124
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 13.11.21 22:17. Заголовок: Сергей сделал задани..


Сергей сделал задание константы для маски показа картинки.
Я прикрутил менюшку для проверки этих масок.
Есть несколько интересных масок.
Выглядит вот так:


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 207
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 29.11.21 17:47. Заголовок: Не меняется Height заголовка


Понадобилось длинный заголовок колонки разделить на строки и показать меньшим шрифтом.
Но высота заголовка получилась как для стандартного фонта oBrw. И в итоге половина высоты заголовка - пустая.
Если поменять Height потом в OnInit - сдвигаются все строки.
Нашел ошибку в h_tbrowse.prg: функция STATIC FUNCTION SetHeights( oBrw )
Строка 15787: hFont := iif( hFont == NIL, 0, oBrw:hFont ) -> высоту заголовка по любому расчитывает по стандартному фонту.
Самому менять каждый раз - не выход, прошу поменять, хотя бы на такое: hFont := iif( hFont == NIL, 0, hFont )

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1951
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 29.11.21 20:31. Заголовок: krutoff пишет: hFon..


krutoff пишет:

 цитата:
hFont := iif( hFont == NIL, 0, hFont )


Поправил, конечно (в трех местах - заголовок, подвал и ячейка).
Благодарю за помощь

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




Пост N: 7152
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.12.21 19:31. Заголовок: Смотрю код в термина..


Смотрю код в терминалке
hb_cdpSelect( "RU1251" ) 
use STREET new
Browse()
use


А можно так же сделать для ТСБ ?
Определить параметры по умолчанию и открывать для просмотра базу.
А то чтобы просто показать базу, кода приходиться просто немеренно писать.
Колонку SELECTOR и ORDKEYNO и ENUMERATOR включать сразу

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1818
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 01.12.21 23:33. Заголовок: Andrey пишет: use S..


Andrey пишет:

 цитата:
use STREET new
Browse()
use



Все тоже самое
 
Use street new
Sbrowse()
Use

Andrey пишет:

 цитата:
Колонку SELECTOR и ORDKEYNO и ENUMERATOR включать сразу


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

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




Пост N: 3952
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 01.12.21 23:50. Заголовок: Andrey пишет Колонку..


Andrey пишет
 цитата:
Колонку SELECTOR и ORDKEYNO и ENUMERATOR включать сразу


Ты же сам всегда хочешь их иметь
 
DEFINE TBROWSE &cTabl OBJ oBrw CELL ;
AT nYBrw, nXBrw ALIAS cAls WIDTH nWBrw HEIGHT nHBrw ;
FONT aTsbFont ; // все фонты для таблицы
BRUSH aBrush ; // цвет фона под таблицей
COLORS aColors ; // все цвета таблицы
BACKCOLOR aBackColor ; // фон таблицы - совпадает с фоном окна
HEADERS aHeader ; // список шапки колонок таблицы
JUSTIFY aAlign ; // список отбивки колонок таблицы
COLUMNS aField ; // список наименований колонок таблицы
NAMES aNames ; // список полей базы колонок таблицы
EDITCOLS aEdit ; // массив данных для редактирования колонок .T.\.F.\Nil>\.T\.F.\NIL
FOOTERS aFooter ; // список подвала колонок таблицы
SIZES aFSize ; // ширина колонок таблицы
LOADFIELDS ; // автоматическое создание столбцов по полям активной базы данных
GOTFOCUSSELECT ;
EMPTYVALUE ;
FIXED ; // активирует функцию двойного курсора на закрепленных столбцах
COLNUMBER aNumer ; // виртуальная колонка с нумерацией
ENUMERATOR ; // нумерация колонок
LOCK ; // автоматическая блокировка записи при вводе в базу данных
SELECTOR xSelector ; // первая колонка - селектор записей
ON INIT {|ob| myBrwInit( ob ) } // настройки таблицы - смотреть ниже

Поставь в nil все задаваемые параметры в DEFINE ... кроме ON INIT ... и начиная с FONT ...
Должен сработать :LoadFields(), возможно надо задать цвет для правильной работы, что то такое
 
aColors := {}
AAdd(aColors, { CLR_FOCUSB, { |a,b,c| If( c:nCell == b, n_RGB1, n_RGB3 ) } } )
AAdd(aColors, { CLR_SELEF , GetSysColor( COLOR_WINDOWTEXT ) } )
AAdd(aColors, { CLR_SELEB , { |a,b,c| If( c:nCell == b, n_RGB2, n_RGB3 ) } } )

PS.
Точно не помню, вроде были правки, но может путаю со своей версией (все NIL у меня работают), а в hmg нет, не стыковка по aHeader := NIL и aField := NIL, т.к. они идут внутри aHeader := {NIL} и aField := {NIL} - это ломало тсб. Надо заполнить их массивами от имен полей. Начни с NIL все, если свалится заполни aHeader := {...} и aField := {...} от полей

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 208
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 04.12.21 13:36. Заголовок: Ситуация возникает очень редко, но...


Я сформировал динамически TSBrowse и шапка из-за большого к-ва строк заняла почти все место.
В итоге - показывается только одна строка из нескольких.
Когда я на первой строке нажимаю клавишу Up а потом Down -> то TSBrowse рисует эту первую
строку в заголовке таблицы.
Нашел место, где можно поправить. Прошу изменить в h_tbrowse.prg
строку 7464 ::nRowPos := nLines на -> ::nRowPos := nLines + IIF(nLines==1,1,0)

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 1960
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 05.12.21 14:45. Заголовок: krutoff пишет: можн..


krutoff пишет:

 цитата:
можно поправить. Прошу изменить в h_tbrowse.prg


Ok

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




Пост N: 3979
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.12.21 14:46. Заголовок: Haz Игорь, ты вроде,..


Haz
Игорь, ты вроде, разбирался с VScrollBar, HScrollBar тсб, как их активировать в примере Tsb_2tsb ?
На 1-м тсб место под них есть, а отображения нет, перемещение ячейки в фокусе мало что дает. Я не смотрел V\H Bar, т.к. в моей версии (тсб 7.0) два тсб на окне не фурычат. Может подскажешь что ?

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




Пост N: 3981
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.12.21 16:49. Заголовок: Игорь Все норм, поня..


Игорь
Все норм, понял, "где собака порылась". Надо DO EVENTS поставить, дать возможность отрисовать все
 
...
oBrw1 := _TBrowse( NIL, "CUST1", "Brw_1", nY, nX, nW, nH )

AEval( oBrw1:aColumns, {| oCol | oCol:lFixLite := .T., ;
oCol:lEdit := .T., ;
oCol:lOnGotFocusSelect := .T., ;
oCol:lEmptyValToChar := .T. } )
DO EVENTS


nY += nH + 1
nH -= 1

oBrw2 := _TBrowse( NIL, "CUST2", "Brw_2", nY, nX, nW, nH )

AEval( oBrw2:aColumns, {| oCol | oCol:lFixLite := .T., ;
oCol:lEdit := .T., ;
oCol:lOnGotFocusSelect := .T., ;
oCol:lEmptyValToChar := .T. } )
DO EVENTS

oBrw1:SetFocus()
//oBrw1:Refresh()
DO EVENTS

...


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 213
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 10.12.21 14:13. Заголовок: TSBrowse


Столкнулся со странной ситуацией, когда TSBrowse вылелает по ошибке в строке 9627 Error BASE/1132 Переполнение массива:
Ошибочное количество аргументов Args: [1] = A { ... } length: 6 [2] = N 0
Ошибка плавающая и возникает не всегда.
Прошу немного изменить код в этой строке, он практически ничего не меняет, но ошибка пропадает:
old: ELSEIF nMsg == WM_DESTROY .AND. ! Empty( ::aColumns ) .AND. ::aColumns[ ::nCell ]:oEdit != NIL
New: ELSEIF nMsg == WM_DESTROY .AND. ! Empty( ::aColumns ) .AND. ::nCell > 0 .AND. ::aColumns[ ::nCell ]:oEdit != NIL

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




Пост N: 3988
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.12.21 14:25. Заголовок: krutoff пишет .AND. ..


krutoff пишет
 цитата:
.AND. ::nCell > 0


А как вы получаете :nCell := 0 ? У вас ! Empty( ::aColumns ), т.е. колонки заданы ...
У меня не было таких случаев. Даже :nColumn(<имя отсутствует>) дает 1
По мне, правка, мало что дает, в др. местах конструкция, типа, :aColumns[ :nCell ] много где применяется.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 214
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 10.12.21 17:28. Заголовок: SergKis пишет: А ка..


SergKis пишет:

 цитата:
А как вы получаете :nCell := 0


Сергей, сам не понимаю. CHILD форму создаю динамически, на ней 2 броуза ( два алиаса ) и куча контролов get, editbox и т.д.
Причем обработка броузов делает одна и та же функция, но все переменные (алиасы, названия броузов и т.д. ) внутри броуза навесил на oKeyData().
Если в моей форме создается динамически один броуз - все отрабатывает нормально, а если 2 - вылетает.
Сделал кучу отладки - и вышел на эту строку. ::nCell в отладке показывает ненулевое значение, oEdit = NiL
Причем, если строку разделяю, откусываю подстроку .AND. ::aColumns[ ::nCell ]:oEdit != NIL
и прописываю ниже, как отдельное условие IF ::aColumns[ ::nCell ]:oEdit != NIL - все тоже проходит Ок...
Кроме этого места нигде не вылетает, может DESTROY цепляет?, но опять же вылет идет уже на 1-м броузе, а не на 2-м.

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




Пост N: 3989
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.12.21 17:50. Заголовок: krutoff пишет один ..


krutoff пишет
 цитата:
один броуз - все отрабатывает нормально, а если 2 - вылетает.


Попробуйте добавить DO EVENS или DoEvents() в блоки кода, возможно, что то не успевает отработать, прорисовать, т.е. :nCell == 0 не должно быть. Посмотрите завершение Edit, т.к. идет WM_DESTROY при ::aColumns[ ::nCell ]:oEdit != NIL, созданном объекте для edit, т.е. работа в :Edit и его завершение. Может oBrw:IsEdit применить надо ? Например, если открыт TGetBox и даем oBrw:SetFocus(), он закрывается, но :nCell в :Edit и завершающих :Edit..., меняется только для перестановки от oCol:nEditMove - может там что то происходит.
Правку, предложенную, сделать не трудно, но :nCell := 0 не должно быть, источник надо бы найти
Вместо CHILD MODAL можете попробовать ?

Спасибо: 1 
ПрофильЦитата Ответить
администратор




Пост N: 1819
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 10.12.21 19:27. Заголовок: krutoff пишет: сам ..


krutoff пишет:

 цитата:
сам не понимаю


Кажется мне, что это накладки локальной переменной в каком то из блоков кода.
Оба бровса в одной функции создаются скорее всего и на переменных экономите ( к примеру oBrw используется в обоих бровсах и в блоках кода )

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 215
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 10.12.21 20:26. Заголовок: SergKis пишет: Вмес..


SergKis пишет:

 цитата:
Вместо CHILD MODAL можете попробовать ?


Спасибо, MODAL отрабатывает, я это уже проверил, но если модал, то внутренние окна у меня сделаны CHILD ( для seek ) - и тогда не откроются, и надо тоже только модальные, а не ice.
DoEvents() и oBrw:IsEdit буду тестировать, спасибо за подсказку, я на основе oBrw строю форму для редактирования и поэтому oBrw:IsEdit думаю, всегда .F.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 216
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 10.12.21 20:30. Заголовок: Haz пишет: Кажется ..


Haz пишет:

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


Спасибо!, мог конечно, и не заметить, но доп.переменные только в классе TBrowse (добавлял __objAddData() ) и oKeyData(). Проверял, проверю еще раз, спасибо.
А oBrw -> имени у меня нет, вообще имя oBE - и то, только в параметрах функций. И везде перепроверил на соответствие oBE:cParentWnd и oBE:cControlName. показали два разных Brows'a.

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




Пост N: 3990
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.12.21 21:06. Заголовок: krutoff MODAL отраба..


krutoff
 цитата:
MODAL отрабатывает, я это уже проверил, но если модал, то внутренние окна у меня сделаны CHILD ( для seek ) - и не открываются, а тогда надо тоже только модальные, а не ice


Желательно, перейти на MODAL (мной замечено, что они понадежнее\стабильнее CHILD) + по child можно "неожиданно" перереключаться не туда и завершать окна с вопросом .... Надо добавлять установку родителя перед и восстанавливать после, переменная _hmg_InplaceParentHandle (первое окно modal после MAIN, STANDARD, этого делать не надо).

 цитата:
я на основе oBrw строю форму для редактирования


Это как в примере Tsb_DemoMdi - карточка-запись в тсб ( ф-я MdiChildCard() ) ?

 цитата:
поэтому oBrw:IsEdit думаю, всегда .F.


Если в oCol:oEdit не NIL, то внешние попытки что то делать, требуют проверки oBrw:IsEdi, например
 
ON KEY TAB ACTION {|cf| cf := ThisWindow.FocusedControl, ;
iif( cf == "Brw_1", This.Brw_2.SetFocus, This.Brw_1.SetFocus ) }
ON KEY SHIFT+TAB ACTION {|cf| cf := ThisWindow.FocusedControl, ;
iif( cf == "Brw_1", This.Brw_2.SetFocus, This.Brw_1.SetFocus ) }
ON KEY ESCAPE ACTION ( iif( oBrw1:IsEdit, oBrw1:SetFocus(), ;
iif( oBrw2:IsEdit, oBrw2:SetFocus(), ;
ThisWindow.Release ) ) )

TAB и SHIFT+TAB при включенной ячейки на :Edit() отработают нормально, а ESCAPE надо проверять и при вкл. :Edit() сначала закрывать, что бы не потерять данные, введенные в др. контролы

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 7166
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 10.12.21 22:37. Заголовок: Опять старая проблем..


Опять старая проблема вылезла, несколько лет назад такое было и не решили как исправить.
Глюк показа в левом нижнем углу колонки SELECTOR - при условии что цвет фона ПОДВАЛА последней колонки отличается от основного цвета. Вот так на картинке:


Т.е. цвет фона последней колонки ОРАНЖЕВЫЙ и он перескакивает на SELECTOR - кружок (2).
Вот код как это происходит:
   // цвета изменить 
nClrNoDbf := GetSysColor( COLOR_BTNFACE )
oCol := oBrw:GetColumn("ORDKEYNO")
oCol:nClrBack := nClrNoDbf

// цвет фона шапки таблицы + подвала списка колонок - (1)
FOR nI := oBrw:nColumn("ORDKEYNO") TO Len( oBrw:aColumns )
oCol := oBrw:aColumns[ nI ]
cCol := oCol:cName
cTyp := oCol:cFieldTyp
IF cTyp $ "+=^" // Type: [+] [=] [^]
oCol:nClrHeadBack := CLR_ORANGE
oCol:nClrFootBack := CLR_ORANGE
ENDIF
NEXT

// Левый верхний уголок - (3) исправление фона
oBrw:nClrSelectorHdBack := nClrNoDbf

Как исправить уголок (2) ?
Может можно сделать в коде ТСБ примерно такую переменную ?
   // Левый нижний уголок  
oBrw:nClrSelectorHdFoot := nClrNoDbf


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




Пост N: 3993
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 10.12.21 22:57. Заголовок: Andrey пишет Как исп..


Andrey пишет
 цитата:
Как исправить уголок (2) ?
Может можно сделать в коде ТСБ примерно такую переменную ?


Можно использовать ту же переменную, что и для Header, т.е. сделать такую правку
 
METHOD DrawHeaders( lFooters, lDrawCell ) CLASS TSBrowse
...
IF ::lFooting .AND. ::lDrawFooters
...
If !( nJ == 1 .AND. ::lSelector ) // JP
nClrBack := iif( oColumn:nClrFootBack != NIL, oColumn:nClrFootBack, nClrFootBack )
ELSEIF ::nClrSelectorHdBack != NIL
nClrBack := ::nClrSelectorHdBack

ELSE
nClrBack := ATail( ::aColumns ):nClrFootBack
ENDIF
nClrBack := ::GetValProp( nClrBack, nClrBack, nJ )


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 217
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 11.12.21 13:18. Заголовок: SergKis пишет: Жела..


SergKis пишет:

 цитата:
Желательно, перейти на MODA


Сергей, спасибо за такой детальный совет, буду копать у себя.
PS: Помогло DO EVENTS. Нет, не помогло.

SergKis пишет:

 цитата:
А как вы получаете :nCell := 0 ?


Нашел ошибку! Да, у меня перед Activate формы с броузом, стоял блок
восстанова параметров из INI-файла - там был ноль и тупо присвоило ::nCell := 0
У себя я, конечно, исправил, но, может для присвоения ::nCel сделать метод класса с проверкой?

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




Пост N: 7171
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.21 22:41. Заголовок: Пытаюсь положить окн..


Пытаюсь положить окно в размер ТСБ, не получается... Окно больше и со сдвигом идёт ...
Делаю так:
 
cForm := oBrw:cParentWnd
nRow := GetProperty(cForm, "Row") + GetTitleHeight() + oBrw:nTop
nCol := GetProperty(cForm, "Col") + GetBorderWidth() + oBrw:nLeft
nH := oBrw:nBottom - oBrw:nTop
nW := oBrw:nRight - oBrw:nLeft

DEFINE WINDOW Forma_Zero AT nRow, nCol CLIENTAREA nW, nH MODAL NOCAPTION ;
BACKCOLOR aBColor ON LOSTFOCUS oWnd:Release()

oWnd := ThisWindow.Object


Подскажите пожалуйста, где промахнулся...

Спасибо: 0 
ПрофильЦитата Ответить
администратор




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


Andrey пишет:

 цитата:
где промахнулся..


В алгоритме, берешь oBrw:hWnd и по его координатам (getwindowrect() ) рисуешь свое

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




Пост N: 7174
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 15.12.21 16:55. Заголовок: Haz пишет: берешь o..


Haz пишет:

 цитата:
берешь oBrw:hWnd и по его координатам (getwindowrect() ) рисуешь свое


Спасибо БОЛЬШОЕ !

Вот пример. Когда окно по ценру, то окно wZero по таблице закрывается пиксель в пиксель !!!
А если окно сдвинуть, то наступает фигня...
Может команда нужна типа SET DIALOGBOX CENTER OF PARENT ?
Как исправить ?
Вот исходник - Скрытый текст


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




Пост N: 4008
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 15.12.21 21:15. Заголовок: Andrey пишет Как исп..


Andrey пишет
 цитата:
Как исправить ?


Вспомнил, что с Игорем сделали недавно метод :GetCellSize(), применил
Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 1825
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 15.12.21 21:23. Заголовок: SergKis пишет: прим..


SergKis пишет:

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

необычное решение

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




Пост N: 7176
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 16.12.21 13:27. Заголовок: Супер ! :sm208:..


Супер !

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




Пост N: 4009
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 16.12.21 14:41. Заголовок: Andrey Обработаем l..


Andrey
Обработаем lHead и передадим параметры Скрытый текст


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




Пост N: 7196
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.12.21 07:15. Заголовок: Непонятка возникла п..


Непонятка возникла по ТСБ.
Ставлю отключение вывода суперхидера/шапки/нумератора/подвала
oBrw:lDrawHeaders  := .F.

Всё скрывается, отлично но:
(1) теряется формат полей "T=@"
(2) размеры ТСБ уменьшаются снизу
Вот картинка:


И ещё один вопрос.
Как мне можно оставить Нумератор и Подвал в ТСБ ?
Или только отдельно Подвал ?
Или только отдельно Нумератор ?

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 220
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 14.01.22 12:34. Заголовок: Копирование TSBrowse


Никто не копировал объект OBRW TSBrowse?
Я сформировал TSBrowse на одной форме со всеми картинками, блоками кода и т.д. и
хотел бы скопировать(клонировать) этот объект на другую форму, это возможно?

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




Пост N: 4033
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 14.01.22 14:40. Заголовок: krutoff пишет Я сфор..


krutoff пишет
 цитата:
Я сформировал TSBrowse на одной форме со всеми картинками, блоками кода и т.д. и
хотел бы скопировать(клонировать) этот объект на другую форму, это возможно?


Чисто технически копировать можно, но колонки это объекты и в скопированном варианте будут ссылки на одни и те же колонки, при lEdit := .T. каждый тсб будет создавать каждый свои :oEdit, хорошо это или плохо, хз.
Делал копирование колонок
 
aColOld := {}
FOR EACH oCol IN oBrw:aColumns
AADD( aColOld, oCol:Clone() )
NEXT

менял колонки в oBrw:aColumns (добавлял переменные в oCol) и потом восстанавливал обратно из aColOld.
Можно создать новый DEFINE TBROWSE ... и методом oBrw:AddColumn( oCol ) перегнать туда массив aColOld, но надо помнить, что в колонках в :bData, через FieldWBlock("FieldName", select(oBrw:cAlias)), заложена область dbf файла.
Можно создать базу колонок и потом исп. ее для создания разных тсб (алиас для тсб задается). Примеры: app_oopcolumns и app_ooptsbbox
Если исп. _TBrowse(...) с oTsb := oHmgData() ... параметрами, то для др. разных тсб можно использовать параметры настройки одного объекта oTsb, возможно, это неплохой вариант.

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4086
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 02.03.22 13:06. Заголовок: Пример из серии Craz..


Пример из серии Crazy https://TransFiles.ru/w6x7n
Возможно будет кому то интересен.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 160
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 26.04.22 15:19. Заголовок: Редактирование даты


Имеется код:
DEFINE TBROWSE Br_sch AT h_tlbar,0 ALIAS 'sch' WIDTH w_br HEIGHT h_br BOLD CELLED
...
ADD COLUMN TO Br_sch HEADER 'Ввод в'+CRLF+'работу' SIZE w_dtv ;
DATA FieldWBlock('dtuse', Select('sch')) ;
ALIGN DT_CENTER, DT_CENTER ;
PREEDIT {|uVar| oldVal := uVar, IF(Status = 1, .T., .F.)} ;
POSTEDIT {|uVar| postMod(uVar,'введен'), Br_sch:DrawSelect()} ;
EDITABLE
...
Пользователи недовольны тем, как приходится набирать дату, процесс получается довольно
протяженный пока выберешь год, потом месяц и наконец дату.
В примере d:\MiniGUI\SAMPLES\Advanced\Tsb_Basic дата вводится простыми цифрами, но как
это сделать в моём случае я так и не сообразил.
Помогите люди добрые.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7649
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 26.04.22 17:05. Заголовок: у меня так примерно ..


у меня так примерно
oBrw3:SetColSize("data_c", 85 )
oBrw3:GetColumn("data_c"):cHeading :="Дата"+CRLF+"создания"
oBrw3:GetColumn("data_c"):cPicture :="@D"
oBrw3:GetColumn( "data_c"):lEdit := kaka("master")
obrw3:GetColumn("data_c"):bPrevEdit := { |a, b, lLock| SetGetAdjustBrw(b,{2,0,-2,-3}) , If( lLock := (b:cAlias)->(RLock()), (b:cAlias)->(dbUnLock()), Msgstop("Запись заблокирована","Внимание")), lLock }
oBrw3:GetColumn("data_c"):nAlign:=DT_CENTER
oBrw3:lPickerMode := .F.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 161
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 27.04.22 05:13. Заголовок: Dima пишет: oBrw3:l..


Dima пишет:

 цитата:
oBrw3:lPickerMode := .F.


Спасибо, помогла данная установка.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 162
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 08.06.22 18:08. Заголовок: Редактирование логического поля


Наткнулся на непонятную ситуацию

DEFINE TBROWSE ...
...
ADD COLUMN TO Br_sch HEADER '' SIZE w_lod ;
DATA FieldWBlock('lm1', Select('sch')) ;
CHECKBOX ;
PREEDIT {|| preMod('lm1')} ;
EDITABLE
...
У меня редактирование логического поля происходит по уcловию
из preMod. Всё работает, когда используется клавиатура, но когда
используется мышь то двойной клик по полю хоть и вызывает выполнение
функции preMod, её возврат не анализируется и поле lm1 всегда
меняет своё значение на противоположное.
Такое впечатление, что двойной клик мышью вызывает сначала
безусловное редактирование логического поля, а потом обработку
из PREEDIT.

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




Пост N: 4134
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 08.06.22 20:47. Заголовок: alex_II пишет PREEDI..


alex_II пишет
 цитата:
PREEDIT {|| preMod('lm1')}


Что возвращает эта конструкция и какие значения имеют oCol:lCheckBoxNoReturn .OR. ::lCheckBoxAllReturn ?
То о чем спрашиваете тут (метод :Edit(...))Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 163
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 09.06.22 05:30. Заголовок: PREEDIT возвращает ...


PREEDIT возвращает .F.
oCol:lCheckBoxNoReturn = .T.
::lCheckBoxAllReturn = .T.

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




Пост N: 4135
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.22 09:05. Заголовок: alex_II тогда попад..


alex_II
тогда попадете в выделенный цветом код, см. Скрытый текст выше, т.к. двойной клик выполняет
 
IF ValType( ::bDataEval( ::aColumns[ nCol ] ) ) == "L" .AND. ;
::aColumns[ nCol ]:lCheckBox // virtual checkbox
::PostMsg( WM_CHAR, VK_SPACE, 0 )


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 164
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 09.06.22 09:30. Заголовок: Пардон, может я что-..


Пардон, может я что-то не догоняю
Как выбраться из этой ситуации?

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




Пост N: 4136
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 09.06.22 10:24. Заголовок: alex_II Если объект..


alex_II
Если объект oBrw Public\Private\Static, то
PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')} ;
POSTEDIT {|| oBrw:lCheckBoxAllReturn := .T. }
Если oBrw Local, то надо исп. внутренние переменные параметры блоков кода :bPrevEdit и :bPostEdit

Спасибо: 1 
ПрофильЦитата Ответить



Пост N: 165
Зарегистрирован: 12.07.06
ссылка на сообщение  Отправлено: 09.06.22 13:01. Заголовок: Редактирование логического поля


SergKis
Большое спасибо за помощь, всё заработало корректно
Только маленькая поправка:
PREEDIT {|| oBrw:lCheckBoxAllReturn := preMod('lm1')}
но это уже детали.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 227
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 12.07.22 15:04. Заголовок: После того, как я в..


После того, как я включил блок кода ::bFilter, метод GotoRec( nRec, nRowPos )
Игоря Назарова стал работать некорректно.
Сам крутил - не получилось. Игорь, если будет возможность - гляньте, плз.

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




Пост N: 4139
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.22 15:55. Заголовок: krutoff пишет я вклю..


krutoff пишет
 цитата:
я включил блок кода ::bFilter


Используйте лучше методы:
:FilterData( cFilter, lBottom, lFocus )
:FilterFTS( cFind, lUpper, lBottom, lFocus, lAll )

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 228
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 12.07.22 17:09. Заголовок: SergKis Сергей, спа..


SergKis
Сергей, спасибо за ответ.
Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи),
а через TSBrowse показывать фильтрованые записи.

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




Пост N: 4140
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.07.22 17:53. Заголовок: krutoff пишет Но в м..


krutoff пишет
 цитата:
Но в моей ситуации я хотел уйти от DbSetFilter, чтобы Seek работало по всей базе без фильтра (тут мне важны все записи),а через TSBrowse показывать фильтрованые записи.


Используя :bFilter вам надо исп. все установки окружения тсб в ручном режиме (:nLen входящих строк в просмотр ...), если глянуть метод DbSkipper( nToSkip ) видно - все делается руками, т.е.
 
ELSEIF nToSkip < 0 .AND. !( ::cAlias )->( Bof() ) // going up

WHILE nSkipped > nToSkip

( ::cAlias )->( dbSkip( -1 ) )

IF ::bFilter != NIL .AND. !( ::cAlias )->( Bof() )
While ! Eval( ::bFilter ) .AND. !( ::cAlias )->( Bof() )
( ::cAlias )->( dbSkip( -1 ) )
ENDDO

IF ( ::cAlias )->( Bof() )
( ::cAlias )->( dbGoto( nRecNo ) )
RETURN nSkipped
ENDIF
ENDIF

IF ( ::cAlias )->( Bof() )
( ::cAlias )->( dbGoTop() )
EXIT
ENDIF

nSkipped--
ENDDO

по мне, :GotoRec(...) не имеет к :bFilter никакого отношения.
Почему бы после Seek не накапливать RecNo() в объекте контейнере (oRec := oHmgData() ; iif( dbSeek(...), oRec:Set(RecNo(), RecNo()), ) ) или в строке (cRec := "," ; cRec += iif(dbSeek(...), hb_ntos(RecNo())+',', "")) (oRec или cRec private\public). потом ставить
:FilterData("oRec:Get(RecNo(), 0) > 0",...)
или на строку
:FilterData("','+hb_ntos(RecNo())+',' $ cRec", ...)
PS
Если из RecNo() или ID записей сделать в mem:file.dbf , то тсб простым способом, с SET RELATION ... на осн. базу можно показывать нужные поля, т.е. ваш просмотр

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 229
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 13.07.22 11:21. Заголовок: SergKis Сергей, спа..


SergKis
Сергей, спасибо за
    подсказку! Поправил метод GotoRec( nRec, nRowPos ) -> включил ::DbSkipper
    Протестировал. Все работает!
    Скрытый текст


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




    Пост N: 4141
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 17.07.22 22:53. Заголовок: krutoff пишет Поправ..


    krutoff пишет
     цитата:
    Поправил метод GotoRec( nRec, nRowPos ) -> включил ::DbSkipper
    Протестировал. Все работает!


    Попробуйте пример Tsb_addrecord cо старым\родным вариантом :Gotorec(...) и вариант с вашими поправками.
    Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет

    Спасибо: 1 
    ПрофильЦитата Ответить
    moderator




    Пост N: 2050
    Зарегистрирован: 11.02.10
    ссылка на сообщение  Отправлено: 21.07.22 12:00. Заголовок: SergKis пишет: Родн..


    SergKis пишет:

     цитата:
    Родной метод работает после кнопки "AddRecord" (курсор, например, на 3-й строке) правильно, ваш вариант - нет


    Я уже поправил код Олега (тестировал на том же примере Tsb_addrecord).
    Хочу включить эти изменения в новую сборку.

    Спасибо: 1 
    ПрофильЦитата Ответить
    постоянный участник




    Пост N: 7288
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 04.02.23 09:15. Заголовок: Заметил у себя две б..


    Заметил у себя две бяки в ТСБ.
    1) Если делаем так в ON INIT окна
        oBrw:Enabled( .F. )  // блокировка таблицы  
    ...удаляем столбцы, ставим свои размеры колонок
    oBrw:Enabled( .T. ) // разблокировка таблицы

    То в ТСБ размер колонок и сами колонки восстанавливаются ДО ПЕРВОНАЧАЛЬНЫХ значений.
    Это так должно быть ?
    Тогда это не есть хорошо, т.к. построение окна с таблицей занимает время и нужна блокировка всего окна от шаловливых ручек юзера.

    2) Использую у себя условную индексацию. Очень удобно.
    Но на больших базах 1 тыс.записей и выше при смене текущего индекса курсор ТСБ впадает в ступорт, вешает ТСБ.
    До сих пор лечу это таким кодом после создания условного индекса:
       // ------------- добавка обязательна ----------  
    nTags := ( oBrw_2:cAlias )->( ordCount() )
    oBrw_2:aTags := {}
    FOR nI := 1 TO nTags
    AAdd( oBrw_2:aTags, { ( ALIAS() )->( ordName( nI ) ), ( ALIAS() )->( ordKey( nI ) ) } )
    NEXT
    oBrw_2:uLastTag := ( ALIAS() )->( ordName( nTags ) ) // без этого индекс слетает

    А можно этот код добавить сразу в ТСБ ?
    Раньше, года 2-3 назад такого не было, ТСБ работал без этого.

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




    Пост N: 4201
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 04.02.23 10:22. Заголовок: Andrey пишет Если де..


    Andrey пишет
     цитата:
    Если делаем так в ON INIT окна ...удаляем столбцы, ставим свои размеры колонок


    На мой взгляд это неправильно, надо формировать список рабочих колонок на уровне
    DEFINE TBROWSE ...
    ...удаляем столбцы, ставим свои размеры колонок
    END TBROWSE
    или делать не обрамляя методом :Enabled, т.к., если смотреть метод :Enabled, то увидишь сохранение\восстановление данных колонок
     
    ...
    IF ::lEnabled
    ::aOldEnabled := { ::hBrush, {}, ::nClrPane, {}, ::nClrLine }
    FOR nI := 1 TO Len( ::aColumns )
    AAdd( ::aOldEnabled[ 2 ], ::aColumns[ nI ]:Clone() )

    ::aColumns[ nI ]:SaveColor()
    NEXT
    ...
    IF ! ::lEnabled
    FOR nI := 1 TO Len( ::aColumns )
    ::aColumns[ nI ]:RestColor()
    SetColor( , ::aColumns[ nI ]:aColors, nI )
    NEXT
    IF ! Empty( ::oPhant )
    ::oPhant:RestColor()
    ENDIF
    IF HB_ISARRAY( ::aOldEnabled ) .AND. ! Empty( ::aOldEnabled[ 1 ] )
    AEval( ::aOldEnabled[ 2 ], {| oc, nc | ::aColumns[ nc ] := oc:Clone() } )

    ...

     цитата:
    Использую у себя условную индексацию


    что это ?

     цитата:
    Очень удобно.


    Все в мире относительно

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




    Пост N: 7289
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 09.02.23 12:15. Заголовок: Вопрос по ТСБ, возмё..


    Вопрос по ТСБ, возмём пример Tsb_composite !
    Для сортировки ПО СТОЛБЦАМ там нужно создавать ОДИН индекс по колонкам.

    1) Почему нужно делать ТОЛЬКО ОДИН файл ?
    При использование нескольких индексных файлов сортировка не работает.

    2) Если мне надо свой индекс сделать, то как тогда сделать чтобы сортировка работала ?
    Типа STR(KCity)+UPPER(STREET)

    Раньше (года 2 назад) сортировка работала по нескольким индексным файлам, теперь нет.
    Что нужно прикрутить в ТСБ чтобы вернулась прежняя сортировка ?

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




    Пост N: 7302
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 21.02.23 03:53. Заголовок: Опять непонятка в ТС..


    Опять непонятка в ТСБ с массивом.
    Таблица построена, делаю сортировку по колонке с датой вот так:
    STATIC FUNCTION myTsbSort(oBrw) 
    LOCAL nCol := oBrw:nColumn("NAME_3")
    LOCAL oCol, lDescend := .F.

    oBrw:lNoChangeOrd := .F. // включить сортировку
    oBrw:nColOrder := 4 // поставить значок сортировки по колонке
    oBrw:SetOrder(nCol, , lDescend)

    RETURN Nil

    И нифига не получаю - т.е. правильной сортировки нет !
    Вот так в таблице:


    Как победить эту сортировку ?

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




    Пост N: 7303
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 21.02.23 18:58. Заголовок: Танцы с бубном показ..


    Танцы с бубном показали, что использование виртуальной колонки в ТСБ с массивом - ПРОТИВОПОКАЗАНО !!!
    Т.е. в ТСБ НЕ НАДО использовать COLNUMBER { 1, 20 } - если нужна сортировка по колонке.
    Не помогают всякие ухищрения типа:
       IF oBrw:nColumn("ARRAYNO") > 0  
    nCol -= 1
    ENDIF
    IF oBrw:lSelector
    nCol -= 1
    ENDIF

    Придётся делать как и в 2015 году - свою собственную виртуальную колонку и отслеживать самому нумерацию этой колонки.

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




    Пост N: 7321
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 13.03.23 09:25. Заголовок: Всем привет ! Что по..


    Всем привет !
    Что посоветуете делать для хранения и показа картинки в ТСБ ?
    Нужно показывать в одной колонке ТСБ картинки из базы.
    Картинки небольшие BMP или PNG размером 48х48 или 64х64.
    Есть 2 варианта:
    загонять все картинки в массив и показывать в ТСБ, или записывать эти картинки в поле базы, а потом уже показывать.
    Количество записей в базе может быть и 100 записей, а может и 10-20 тыс.
    Как показывать картинки из массива - знаю:
          oBrw:aBitMaps := M->ahPubBmp 
    oBrw:GetColumn(2):lBitMap := .T. // колонка с картинками
    oBrw:aColumns[2]:uBmpCell := {|| M->ahPubBmp[oBrw:nAt] }
    oBrw:aColumns[2]:uBmpHead := {|| Nil }
    oBrw:aColumns[2]:bData := {||Nil}
    oBrw:aColumns[2]:cData := '{||Nil}'
    oBrw:aColumns[2]:nAlign := nMakeLong( DT_CENTER, DT_CENTER )
    oBrw:aColumns[2]:nHAlign := nMakeLong( DT_CENTER, DT_CENTER )

    А как делать показ напрямую из мемо-поля не делал или уже забыл....
    Подскажите как это сделать ?

    Спасибо: 0 
    ПрофильЦитата Ответить
    moderator




    Пост N: 2111
    Зарегистрирован: 11.02.10
    ссылка на сообщение  Отправлено: 13.03.23 12:38. Заголовок: Andrey пишет: как д..


    Andrey пишет:

     цитата:
    как делать показ напрямую из мемо-поля


    Можно попробовать использовать BLOB мемо-поля для хранения картинок.
    В Харборе есть такие функции для этой цели:

     цитата:
    BLOBDirectExport( <nPointer>, <cTargetFile> [, <kMode>] )
    BLOBDirectGet( <nPointer> [, <nStart> [, <nCount> ]] )
    BLOBDirectImport( <nOldPointer>, <cSourceFile> )
    BLOBDirectPut( [<nOldPointer>], <xBlob> )
    BLOBGet( <nFieldNo> [, <nStart> [, <nCount>]] )
    BLOBExport( <nFieldNo>, <cTargetFile>, <nMode> )
    BLOBImport( <nFieldNo>, <cSourceFile> )


    В поставке Минигуи есть рабочий пример в папке \SAMPLES\BASIC\BLOBfiles

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




    Пост N: 7322
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 13.03.23 13:08. Заголовок: Есть ещё такой приме..


    Есть ещё такой пример - MiniGUI\SAMPLES\Advanced\Tsb_BitMaps
    Но там не совсем понятно, грузятся картинки из файла.
    А как сделать показ из мемо-поля уже записанную туда картинку ?

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




    Пост N: 7323
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 13.03.23 13:56. Заголовок: gfilatov2002 пишет: ..


    gfilatov2002 пишет:

     цитата:
    Можно попробовать использовать BLOB мемо-поля для хранения картинок


    Спасибо !
    Сделал пример и загрузил в базу картинки (bmp).
    Как показать эти картинки в ТСБ - не знаю ?
    Пример тут - https://cloud.mail.ru/public/FvKA/sFktSMppQ
    и сделан на базе примера MiniGUI\SAMPLES\Advanced\Tsb_BitMaps
    Народ, отзовитесь ... Как это можно реализовать ?

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1903
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 13.03.23 18:22. Заголовок: Andrey пишет: Народ..


    Andrey пишет:

     цитата:
    Народ, отзовитесь ... Как это можно реализовать ?


    FreeImage в помощь.
    Смотри примеры , как минимум Advanced\Freeimage , там как раз загрузка картинки из базы.

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




    Пост N: 7324
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 14.03.23 09:22. Заголовок: Спасибо за ссылку. П..


    Спасибо за ссылку.
    Посмотрел примеры, ну там и наворочено...
    Не знаю как и прикрутить это к ТСБ...

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1904
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 09:50. Заголовок: Andrey пишет: Посмо..


    Andrey пишет:

     цитата:
    Посмотрел примеры, ну там и наворочено...
    Не знаю как и прикрутить это к ТСБ


    Ты притворяешься?
    Один из самых мелких примеров. Получить картинку из базы, грузнуть в память и получив хендл указать в uBmpCell.
    В примере картинку берут из базы sql запросом , с этой строки чуть ниже всего одна строчка кода для получения хендла.
    Удачи.

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




    Пост N: 7325
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 14.03.23 10:22. Заголовок: Haz пишет: Ты притв..


    Haz пишет:

     цитата:
    Ты притворяешься?


    Да нет.
    Не совсем ясен будет механизм показа.

    Haz пишет:

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


    И как это сделать - грузнуть в память ?
    Если в базе будет 10 тыс. записей, то все картинки нужно будет грузить в память ?
    А она выдержит столько ?
    Пример давал выше - там все картинки уже в базе.
    Если не сложно, покажи пожалуйста на примере, как это сделать.
    Думаю, что и другим будет интересно.

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1905
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 10:41. Заголовок: Andrey пишет: Если ..


    Andrey пишет:

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


    Хендл картинки нужен в момент прорисовки строки.Нет надобности весь миллиард держать в памяти. При желании можно динамичную подкачку сделать и загрузку хендлов в хеш по номеру записи на пару страниц бровса вверх и вниз и отслеживать диапазон по событиям бровса.

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1906
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 11:16. Заголовок: Andrey пишет: Не со..


    Andrey пишет:

     цитата:
    Не совсем ясен будет механизм показа.


    LoadImage() в блоке ubmpCell вопросов же не вызовет с механизмом. И тут тоже самое, вместо LoadImage() функция freeimage которая выдаёт хендл по строке.

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1907
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 14:13. Заголовок: Haz пишет: FreeImag..


    Haz пишет:

     цитата:
    FreeImage в помощь.


    Андрей!
    Плохие новости , через FI не получится в ТСБ скормить хендл картинки, ТСБ не понимает хендл возвращаемый FI_LoadImage...()
    Не трать время, ищи другой способ

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




    Пост N: 7326
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 14.03.23 16:54. Заголовок: Haz пишет: Плохие н..


    Haz пишет:

     цитата:
    Плохие новости , через FI не получится в ТСБ скормить хендл картинки, ТСБ не понимает хендл возвращаемый FI_LoadImage...()
    Не трать время, ищи другой способ


    Огромное СПАСИБО за то что проверил это.
    А то я бы ... и нифига бы не понял.

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1908
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 17:26. Заголовок: В FW есть функция за..


    В FW есть функция загрузки битмапа из строки, в MG нет такой. Здесь только LoadImage() из файла или ресурсов. Поэтому решение будет кривым :
    Из блоба писать в файл , а из Файла LoadImage()
    Более того, сам код TsBrowse использует именно такой подход. Функция StockBmp() из ТСБ для графических иконок пользует последовательность кода
     
    nHandle := FCreate( cBmpFile )
    nWrite := FWrite( nHandle, cBmp, Len( cBmp ) )
    FClose( nHandle )
    hBmp := LoadImage( cBmpFile )
    FErase( cBmpFile )


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




    Пост N: 7327
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 14.03.23 22:00. Заголовок: Haz пишет: В FW ест..


    Haz пишет:

     цитата:
    В FW есть функция загрузки битмапа из строки, в MG нет такой.


    А взять такую функцию и добавить в МиниГуи можно ?
    Или кто-то поможет это сделать ?
    Без нарушения авторских прав FW....

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1909
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.03.23 23:13. Заголовок: Andrey пишет: А взя..


    Andrey пишет:

     цитата:
    А взять такую функцию и добавить в МиниГуи можно ?


    Ну если кто возьмётся с код править, то можно добавить.

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




    Пост N: 7328
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 15.03.23 11:14. Заголовок: Буду думать над этим..


    Буду думать над этим вопросом.
    Может кто из наших форумчан поможет ?

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




    Пост N: 7329
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 15.03.23 11:17. Заголовок: Ещё один вопрос по Т..


    Ещё один вопрос по ТСБ.
    При первом показе ТСБ делаю показ ПУСТОЙ таблицы (ну юзер так привык), как а Экселе.
    Мешают/раздражают значки логического поля.

    Как их можно убрать на время ?

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1910
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 15.03.23 11:30. Заголовок: Andrey пишет: Как и..


    Andrey пишет:

     цитата:
    Как их можно убрать на время


    oCol:bDecode := { lxl if( время не прошло, nil, x )}

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




    Пост N: 7330
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 15.03.23 12:42. Заголовок: Спасибо ! :sm36: Н..


    Спасибо !
    Нашёл ещё одно решение.
    При старте делаю так:
        oBrw:aCheck   := { LoadImage("CheckT28"), /*LoadImage("CheckF28")*/ }   // заменяем колонку CHECKBOX на свои картинки

    А потом, после заполнения таблицы делаю так:
       IF oBrw:Cargo:n1Start > 0           // не пустая таблица 
    oBrw:aCheck := { LoadImage("CheckT28"), LoadImage("CheckF28") }
    ENDIF


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




    Пост N: 7333
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 18.03.23 16:37. Заголовок: Что то не получается..


    Что то не получается сделать ширину в экселе при экспорте в ТСБ штатными средствами.
    Вот такой код:
       oBrw:ExcelOle( cXlsFile, lActivate, hProgress, aTitle, hFont, lSave, bExternXls, aColSel, bPrintRow ) 

    For nI := 1 To oBrw:nColCount()
    oCol := oBrw:aColumns[ nI ]
    nW := oCol:nWidth
    oSheet:Columns(nI):ColumnWidth := nW // строка 246
    Next

    Вылет вот такой:
     
    Error BASE/1004 Метод не экспортирован: COLUMNS Args: [1] = U [2] = N 1
    --------------------------------- Stack Trace ---------------------------------
    Called from COLUMNS(0)
    Called from TOEXCEL2(246) in module: Form_7Btn.prg
    Called from (b)MYCONTEXMENUEXPORT(48) in module: Form_7Btn.prg
    Called from _DOCONTROLEVENTPROCEDURE(0)

    Эксель не закрыт, на экране висит. Перезапускать эксель не хочется.
    Что ещё забыл ?

    Там в исходнике METHOD ExcelOle() вот это стоит:
       IF bExtern != NIL 
    Eval( bExtern, oSheet, Self )
    ENDIF

    oRange:Borders():LineStyle := xlContinuous
    oRange:Columns:AutoFit()

    Т.е. если я дам функцию в bExtern, свои размеры колонок, эксель потом сам переформатирует колонки ?

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




    Пост N: 4247
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 18.03.23 16:52. Заголовок: Andrey пишет Эксель ..


    Andrey пишет
     цитата:
    Эксель не закрыт, на экране висит.


    Может и висит, но сообщение говорит, что в переменной oSheet нет объекта или он, метод, написан неверно, т.е. метод Columns не найден.
    Почему сразу не задаешь размеры, при описании колонок Header ?
    В конце формирования Sheet обычно делают AutoFit для выравнивания размеров колонок к размеру текстов в них

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




    Пост N: 7334
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 18.03.23 16:58. Заголовок: SergKis пишет: Поче..


    SergKis пишет:

     цитата:
    Почему сразу не задаешь размеры, при описании колонок Header ?


    Да в штатном oBrw:ExcelOle() это вроде нельзя...
    SergKis пишет:

     цитата:
    Может и висит, но сообщение говорит, что в переменной oSheet нет объекта


    Да там в этом методе все переменные локальные:
    METHOD ExcelOle( cXlsFile, lActivate, hProgress, cTitle, hFont, lSave, bExtern, aColSel, bPrintRow ) CLASS TSBrowse 
    LOCAL oExcel, oBook, oSheet, nRow, nCol, uData, nEvery, oRange, cRange, cCell, cLet, nColHead, ;

    Были бы переданны в PUBLIC - было бы хорошо....
    Но это опять править исходники МиниГуи надо.

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




    Пост N: 4248
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 18.03.23 17:05. Заголовок: Andrey пишет Тебе д..


    Andrey пишет
     цитата:
    Да там в этом методе все переменные локальные:


    Тебе дан ТВОЙ блок кода с параметрами, в нем и НАДО все делать Eval( bExtern, oSheet, Self ), т.е.
    Задай bExtern, а oSheet, oBrw получишь. Твое
     цитата:

    oBrw:ExcelOle( cXlsFile, lActivate, hProgress, aTitle, hFont, lSave, bExternXls, aColSel, bPrintRow )

    For nI := 1 To oBrw:nColCount()
    oCol := oBrw:aColumns[ nI ]
    nW := oCol:nWidth
    oSheet:Columns(nI):ColumnWidth := nW // строка 246
    Next



    конечно нет объекта в oSheet

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




    Пост N: 7335
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 18.03.23 17:12. Заголовок: SergKis пишет: Зада..


    SergKis пишет:

     цитата:
    Задай bExtern, а oSheet, oBrw получишь. Твое


    oRange:Columns:AutoFit() стоит после Eval( bExtern, oSheet, Self )
    Наверное моя ширина колонок замениться ?
    Вот я про это и спрашиваю...

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




    Пост N: 4249
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 18.03.23 17:22. Заголовок: Andrey пишет Наверно..


    Andrey пишет
     цитата:
    Наверное моя ширина колонок замениться ?


    Не знаю, т.к. никогда не использую Excel Ole.
    Возможно, получишь все нормально или вставив в длинный текст заменитель CRLF (сколько надо для ширины) получишь нужное. Или Wrap отключи, то же что то получишь

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1913
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 23.03.23 18:57. Заголовок: Всем привет, терзает..


    Всем привет, терзает меня давно один вопрос . При редактировании поля в ТСБ курсор скачет на первую позицию и обратно. На сам процесс не влияет , но не эстетично.
    Порыл по исходникам и нашел причину :
    в методе UpStable()

    14778: ::GoTop() - вызывает видимый прыжок на начало таблицы с прорисовкой курсора. По коду нет необходимости здесь использовать метод , достаточно будет (::cAlias)->(dbGoTop()) -и быстрее , и без дерганья курсора.
    Вроде когда то не было такого, или просто не обращал внимания

    чуть ниже два вызова ::Skip() - их тоже можно заменить на (::cAlias)->(dbSkip()), но они хоть на экране не мелькают

    Поменял, погонял - полет нормальный

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




    Пост N: 4250
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 23.03.23 19:29. Заголовок: Haz пишет 14778: ::G..


    Haz пишет
     цитата:
    14778: ::GoTop()


    У меня 14772 и последняя версия.

     цитата:
    чуть ниже два вызова ::Skip()


    ты имеешь ввиду строки (для понимания)
     
    ELSE
    ( ::cAlias )->( dbSkip( 1 ) )
    //!!! ::Skip( 1 )
    ENDIF
    ...
    IF lSkip
    ( ::cAlias )->( dbSkip( -::nRowPos ) )
    //!!! ::Skip( -::nRowPos )
    ENDIF


    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1914
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 23.03.23 19:32. Заголовок: SergKis пишет: ты и..


    SergKis пишет:

     цитата:
    ты имеешь ввиду строки (


    Да эти. Только у меня они не заменены на dbSkip

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




    Пост N: 4251
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 23.03.23 19:50. Заголовок: Haz пишет чуть ниже ..


    Haz пишет
     цитата:
    чуть ниже два вызова ::Skip() - их тоже можно заменить на (::cAlias)->(dbSkip()), но они хоть на экране не мелькают



     цитата:
    Только у меня они не заменены на dbSkip


    т.е. не меняем, ты меня не путай, я на таблетках, плохо соображаю
    "Скажи точно, сколько класть"

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1915
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 23.03.23 20:03. Заголовок: SergKis пишет: Скаж..


    SergKis пишет:

     цитата:
    Скажи точно, сколько класть"


    Меняем все. Просто в твоем сообщении уже увидел замену, подумал что у меня не самая последняя версия.
    ::GoTop() точно под замену
    ::Skip() 99% что да. Посмотрел код погонял, у меня все норм на рабочем проекте. Еще на всякий случай завтра с фильтрами проверю и отпишусь. Себе все поменял

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1916
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 23.03.23 20:04. Заголовок: SergKis пишет: я на..


    SergKis пишет:

     цитата:
    я на таблетках,


    Выздоравливай

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1917
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 23.03.23 21:18. Заголовок: Вобщем потестировал ..


    Вобщем потестировал и с фильтрами и со сменой индекса, все работает при всех заменах

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




    Пост N: 4254
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 27.03.23 16:40. Заголовок: Haz пишет Вобщем пот..


    Haz пишет
     цитата:
    Вобщем потестировал и с фильтрами и со сменой индекса, все работает при всех заменах


    Игорь, а как будет при применении :DbSkipper(n), разве не будет конфликта с (:cAlias)->( dbSkip(n) ) ?
    Наверно, :Skip(n) метод надо оставить, в нем нет отображений и он не мешает.

    Замена ( ::cAlias )->( dbGoTop() ) //!!! 23.03.23 ::GoTop()
    тоже не совсем корректна, т.к. :GoTop() выполняет свои алгоритмы, например Eval( ::bGotop } ...
    Ты не пробовал перед "При редактировании поля в ТСБ" сделать ::lPainted := .F., потом вернуть, если надо.
    Все прорисовки идут при ::lPainted := .T.
    Может тогда курсор скакать не будет ?

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1918
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 27.03.23 20:00. Заголовок: SergKis пишет: Заме..


    SergKis пишет:

     цитата:
    Замена ( ::cAlias )->( dbGoTop() ) //!!! 23.03.23 ::GoTop()
    тоже не совсем корректна, т.


    В этом месте не важно, тут простой подсчет строк с начала и все остальные вычисления только тормозят процесс.
    :Skip() можно и оставить, , но при обычном использовании тоже не критично, в коде полно и функций dbSkip() и методов :Skip() Завтра посмотрю на :dbSkipper() уверен не повлияет.

    Есть где нибудь в инете актуальные исходники MG ? А то не всегда комп под рукой и по телефону не посмотреть

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




    Пост N: 4256
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 27.03.23 20:34. Заголовок: Haz пишет Есть где н..


    Haz пишет
     цитата:
    Есть где нибудь в инете актуальные исходники MG ?


    тут "Download" http://hmgextended.com/

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1919
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 27.03.23 21:45. Заголовок: SergKis пишет: тут ..


    SergKis пишет:

     цитата:
    тут "Download"


    Про тут я знаю, мне не скачивать , и просматривать исходник хотелось бы с браузера ( без скачивания и установки) . в последнее время часто езжу на общественном транспорте и есть время полистать в телефоне. Можно конечно и с компа папку MG в телефон кинуть и не забывать обновлять.

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1920
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 27.03.23 22:27. Заголовок: SergKis пишет: Игор..


    SergKis пишет:

     цитата:
    Игорь, а как будет при применении :DbSkipper(n), разве не будет конфликта с (:cAlias)->( dbSkip(n) ) ?
    Наверно, :Skip(n) метод надо оставить, в нем нет отображений и он не мешает.



    Сергей , ты прав для корректной отработки ::bFilter (если он есть ) ::Skip() тогда лучше оставить


     цитата:

    Замена ( ::cAlias )->( dbGoTop() ) //!!! 23.03.23 ::GoTop()
    тоже не совсем корректна, т.к. :GoTop() выполняет свои алгоритмы, например Eval( ::bGotop } ...


    в этом месте Eval( ::bGotop } ... и пр. точно не нужны , тут по коду просто подсчет строк, но есть но ...
    при ( ::cAlias )->( dbGoTop() ) опять таки не учитывается ::bFilter , значит тоже нельзя
    просто замкнутый круг получается.

     цитата:

    Ты не пробовал перед "При редактировании поля в ТСБ" сделать ::lPainted := .F., потом вернуть, если надо.
    Все прорисовки идут при ::lPainted := .T.
    Может тогда курсор скакать не будет ?


    Да , это скорее всего решит проблему , но это нагружает код разработчика для исправления косяка в MG
    может в самом ::Upstable() перед ::GoTop() поставить ::lPainted := .F. , а после ::lPainted := .T.
    Попробовал, решает вопрос с прыганьем и позволяет корректно выполнить функционал ::bFilter

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




    Пост N: 4257
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 27.03.23 22:55. Заголовок: Haz пишет Попробовал..


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


    Осталось решить эти строки нужны ?
     
    METHOD UpStable() CLASS TSBrowse
    ...
    IF ::lPainted
    ::Refresh( iif( ::nLen < nRows, .T., .F. ) )
    ENDIF

    Посмотрел код на :UpStable() и :Refresh() после него. Во многих местах этот метод есть, но небольшой процент вероятности, что где то его не хватает есть. Думаю "поставить ::lPainted := .F. , а после ::lPainted := .T." хорошая мысль, т.к. выкинется, возможно, лишний :Refresh(), будет меньше мелькания

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1921
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 28.03.23 10:10. Заголовок: SergKis пишет: Оста..


    SergKis пишет:

     цитата:
    Осталось решить эти строки нужны ?

    сегодня посмотрю тоже

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1922
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 28.03.23 12:00. Заголовок: SergKis пишет: Оста..


    SergKis пишет:

     цитата:
    Осталось решить эти строки нужны ?


    Просто так не выкинуть.
    В самом методе upstable , можно GoTop() обрамить выключением и включёнием lPainted и это уберёт видимость прыжка.
    Дальше по логике метода вызывается перерисовка если есть несоответствие строк . Это в принципе правильно. Метод проверяет строки сверху и снизу окна бровса. Без перерисовки тут не обойтись. Вызываемые далее в исходнике рефрешы после upstable не всегда учитывают что нужна полная перерисовка.
    Тут скорее путь такой, upstable всегда перерисовывает, а код исходников чистить от лишних рефрешей после upstable.
    Это уберёт и дерганье и повысит скорость

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




    Пост N: 4258
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 28.03.23 13:00. Заголовок: Haz пишет Тут скорее..


    Haz пишет
     цитата:
    Тут скорее путь такой, upstable всегда перерисовывает, а код исходников чистить от лишних рефрешей после upstable.


    Это повторение ситуации, :Upstable() должен давать сообщение, что нужна прорисовка, но сам делать не должен.
    Прорисовка нужна вне :UpStable(), а почистить код и оптимизировать :Refresh() идея хорошая, но трудно выполнимая, слишком много условий и вариантов, которые и тестировать надо. Вынести на какой нибудь счетчик потребности :Refresh() (заменив вызовы текущие) и если он > 0 и new переменная .T. - делать :Refresh() и счетчик в 0. Вынести бы :Refresh() на событие, но слишком разбросан он по текстам
    PS
    Я стараюсь делать так, например, после (Edit) изменений в нескольких строках Row
     
    oCol:bPostEdit := {|xv,ob|
    ...
    IF xv != oc:xOldEditValue
    DO EVENTS ; _wPost(55, ob:cParentWnd, ob)
    ENDIF
    Return Nil
    }

    (This.Object):Event(55, {|ow,ky,ob| DoEvents(), ky := ow, ob:Refresh(), DoEvents() })

    Использую событие всегда по потребности, используя _wPost(55...), _wSend(55...) и для др. окна с тсб тоже (работая на тек. окне). Такая метода с постановкой :lPainted := .T.\.F., думаю будет работать

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1923
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 28.03.23 13:17. Заголовок: SergKis пишет: Это ..


    SergKis пишет:

     цитата:
    Это повторение ситуации, :Upstable() должен давать сообщение,


    Да , согласен , поэтому и написал что просто так не выкинуть. Просто процитирую твои слова, т.к. полностью согласен
    :Upstable() должен выполнять все внутренние установки и выставлять флаг для :Refresh(), сам вызывать :Refresh() не должен
    при этом флаг для рефреш имеет признаки 1) с очисткой , 2) без очистки
    Именно так работает метод :Refresh()
    1. с очисткой - сначала очищается текущее окно , а потом по чистенькому прорисовка. Это вызывает моргание но без него не обойтись если после фильтра строк стало меньше чем было.
    2. без очистки - рисует поверх моргания нет

    Может имеет смысл пересмотреть метод и сделать третий вариант
    3. перерисовка полностью без очистки. Суть в том , что если :nLen < :nRowCount то до :nLen рисуем поверх, а дальше просто рисуем пустые строки ( с сеткой или без ). Это визуально добавит плавности.

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




    Пост N: 4259
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 28.03.23 15:10. Заголовок: Haz пишет Может имее..


    Haz пишет
     цитата:
    Может имеет смысл пересмотреть метод и сделать третий вариант


    Игорь, я за "любой кипишь", если он на пользу. Не уверен, что получится реализовать, т.к. разбросано сильно по текстам и режимам, которые не применял никогда. Тут бы получить вариант простенький, счетчик :Refresh() (знать сколько раз подряд вызывался в том или ином режиме), отключить\включить :Refresh() (кроме, может быть, перемещения, PgUp, PgDn, Up, Dn, ...), что бы самому управлять :Refresh() в др. случаях, с очисткой или нет это уже техника, параметры есть. А "третий вариант" это событие 55 (выше), оно может быть простым или более сложным, но оно работает когда мне надо, а не тсб за меня, что то пытается изобразить. Такое событие не сунешь в тсб, т.к. оно внешнее по отношению к тсб и может работать как с кнопок, мышек, ..., других окон и даже др. процесса. Такие мысли

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1924
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 28.03.23 16:07. Заголовок: SergKis пишет: Не у..


    SergKis пишет:

     цитата:
    Не уверен, что получится реализовать, т.к. разбросано


    Ну как метод сделать можно, черновик попробовал , мелькает меньше ( только на DrawSelect )

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




    Пост N: 4260
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 28.03.23 17:51. Заголовок: Haz пишет Ну как мет..


    Haz пишет
     цитата:
    Ну как метод сделать можно, черновик попробовал , мелькает меньше ( только на DrawSelect )


    На DrawSelect не должна моргать, там же ничего нет, после всех DrawLine одна строка поверх с др. атрибутами цвета ... и все
    "Дойдешь до кондиции" выложи на посмотреть

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1925
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 28.03.23 19:01. Заголовок: SergKis пишет: На D..


    SergKis пишет:

     цитата:
    На DrawSelect не должна моргать


    Должна, сначала рисуются все строки drawline а потом drawselect и эта прорисовка со стандарта на селект видна на плохой сети. Но это решаемо алгоритмом

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1926
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 29.03.23 11:31. Заголовок: SergKis пишет: трет..


    SergKis пишет:

     цитата:
    третий вариант" это событие 55 (выше


    Сделал контрольный, чуть косметики и выложу.
    Это не совсем событие 55, там у тебя Refresh без очистки. Это значит , что при установке фильтра и не полном заполнении окна бровса, строки из фильтра перерисуются, а остальные остаются мусором на экране. В данном случае нужна очистка, но ее видно мельканием, т.к. сначала полностью очищается окно, а потом все рисуем заново
    Чисто теоретически , при неполном заполнении окна бровса с очисткой работает быстрее ( меньше строк рисовать ) а с дорисовкой плавнее и плюс бонусом опционально сетка на незанятой область бровса ( любым цветом ).
    Я сделал пример не с очисткой , а с дорисовкой всего окна бровса

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




    Пост N: 4261
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 29.03.23 12:42. Заголовок: Haz пишет Это значит..


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


    Ты не понял, событие 55 может быть разным, простым, более сложным, Например такое
    :Event(55, {|ow,ky,ob| DoEvents(), ky := ow, ob:Refresh(ob:nLen < ob:nRowCount(), .T.), DoEvents() })
    то, что было ранее это из примера, где фиксированное кол-во строк в тсб, который служит для установки\снятия
    галочек как в RedioGroup и вызывается в :bPostEdit, т.е. давая завершить работе методов :Edit... и прорисовкой тек.
    строки и только потом сработает 55 событие, которое перерисует все строки, для показа состояния галочек др. строк.
    PS
    И если откл. внутреннее исп. :Refresh() (в :UpStable или др. варанты), то 55 событие позволяет мне управлять когда
    перепоказывать окно тсб

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1928
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 29.03.23 12:52. Заголовок: SergKis пишет: Ты н..


    SergKis пишет:

     цитата:
    Ты не понял, событие 55 может быть разным, простым, более сложным,


    Да понял я, вопрос в том что есть два варианта рефреш. Первый не чистит мусор, второй моргает. А так да , согласен на 55 можно понаписать свой h_tbrowse целиком

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




    Пост N: 4262
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 29.03.23 13:05. Заголовок: Haz пишет вопрос в т..


    Haz пишет
     цитата:
    вопрос в том что есть два варианта рефреш. Первый не чистит мусор, второй моргает


    Написанный выше дает только один вариант, на все случаи и :nLen ставит и чистит когда надо, по мне вопроса тут нет.
    То что моргает, так это уровень C, туда не лезем, т.к. DoubleBuffer не будет реализован. Т.е. что есть, то и используем

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




    Пост N: 7350
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 04.04.23 12:00. Заголовок: Всем привет ! У меня..


    Всем привет !
    У меня есть иконки в ресурсах ехе-ника.
    Можно организовать показ этих иконок в ТСБ ?
    bmp как показывать знаю....

    Спасибо: 0 
    ПрофильЦитата Ответить
    moderator




    Пост N: 2121
    Зарегистрирован: 11.02.10
    ссылка на сообщение  Отправлено: 04.04.23 17:03. Заголовок: Andrey пишет: Можно..


    Andrey пишет:

     цитата:
    Можно организовать показ этих иконок в ТСБ ?


    Да, можно

    Выложил рабочий пример по адресу
    click here

    Он сделан на базе примера MiniGUI\SAMPLES\Advanced\Tsb_BitMaps

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




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


    gfilatov2002 пишет:

     цитата:
    Выложил рабочий пример по адресу


    Спасибо БОЛЬШОЕ !
    И в своей библиотеке подправь этот пример. Будет тогда отлично !

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




    Пост N: 7352
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 04.04.23 18:20. Заголовок: А иконку в контекстн..


    А иконку в контекстное меню можно сразу выводить ?
    Без всякой замены на лету ?
    А то приходилось делать в два этапа, вывести пустой ресурс, а потом менять его на иконку.
    Сложно это, давно перестал делать.

    Спасибо: 0 
    ПрофильЦитата Ответить
    moderator




    Пост N: 2122
    Зарегистрирован: 11.02.10
    ссылка на сообщение  Отправлено: 04.04.23 18:47. Заголовок: Andrey пишет: А ико..


    Andrey пишет:

     цитата:
    А иконку в контекстное меню можно сразу выводить ?


    Уже можно...
    Благодарю за запрос

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 166
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 05.04.23 12:16. Заголовок: aColors, есть вопрсы


    Столкнулся с несоответствием в описании структуры массива aColors.
    Использовал superheader и захотел поменять цвета через SetColor, в описании
    это 16 и 17 элементы массива, а на деле оказалось надо указывать 15 и 16 элемент.
    Глянул в TSBROWSE.CH. там тоже 16 и 17, непонятно
    Использую HMG Extended Edition version 22.12 (Update 2).

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




    Пост N: 4266
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 05.04.23 15:58. Заголовок: alex_II пишет захоте..


    alex_II пишет
     цитата:
    захотел поменять цвета через SetColor, в описании это 16 и 17 элементы массива


    Кусочек со старого примера (версии старше указанной), работает на 16 и 17 элементы
     
    STATIC FUNCTION mySupHdTsb( oBrw, aSupHd )
    LOCAL O := oBrw:Cargo // использовать из контейнера свои переменные

    ADD SUPER HEADER TO oBrw FROM 1 TO oBrw:nColCount() TITLE " "+aSupHd[1] HORZ DT_LEFT

    WITH OBJECT oBrw
    // задать цвета суперхидеру
    :SetColor( {16}, { O:nClr16 } ) // 16, фона
    :SetColor( {17}, { O:nClr17 } ) // 17, текста
    END WIDTH

    RETURN NIL


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




    Пост N: 7361
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 13.04.23 15:04. Заголовок: Если я ставлю фильтр..


    Если я ставлю фильтр на базу oBrw:FilterData( cFilter ), то у меня при перемещении по базе
    на линии ВЕРТИКАЛЬНОГО скролинга бегунок неправильно отображается.
    Как починить его ?

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1931
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 14.04.23 08:31. Заголовок: Andrey пишет: Как п..


    Andrey пишет:

     цитата:
    Как починить его ?

    разбираться со значением :bLogicLen после вызова фильтра. Там устанавливается конкретное значение , отличное от изначального в :setdbf()

    Ошибка. bLogicLen. не учтена работа в шаред режиме при которой коллеги могут внести правки в базу , влияющие на фильтр , а так же удаление и добавление новых записей и то что фильтр можно поставить вне бровса. И при значении :bLogicLen == {|| 1000} после последнего вызова метода получим ерунду.
    А так же, не применимо для логики ads в целом , с его AOF фильтрами.

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




    Пост N: 7363
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 15.04.23 07:48. Заголовок: Иконки рисуются крас..


    Иконки рисуются красиво на светлых тонах.


    Но если выводить на тёмном фоне, на иконках появляются "зазубрины":


    Это можно как то исправить ?
    P.S. Пробовал ставить темные иконки - не проходит....
    Хотя в меню такие иконки нормально выглядят...


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




    Пост N: 7489
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 25.07.23 08:27. Заголовок: Собираю коллекцию по..


    Собираю коллекцию показа ресурсов в ТСБ !
    Не могу понять как можно загрузить bmp, png, jpg из внешней dll + с изменением размеров ?
    Т.е. картинки в dll могут быть любых размеров, а мне в ТСБ нужно выводить нужный размер, допустим 90х90.
    С иконками разобрался, их можно загружать в ТСБ любых размеров.

    Работа с ресурсами в ТСБ:
    #include "minigui.ch" 

    #define LOAD_LIBRARY_AS_DATAFILE 0x00000002
    //////////////////////////////////////////////////////////
    ....
    oBrw:GetColumn( "FLD1" ):aCheck := { LoadImage( ".\RES\check1.bmp" ), LoadImage( ".\RES\check0.bmp" ) }
    oBrw:GetColumn( "FLD2" ):aCheck := { GETICONFROMRES( ".\RES\Edit32.ico" ), NIL } // файл иконки 32x32
    oBrw:GetColumn( "FLD3" ):aCheck := { GETICONFROMRES( "iFolder32" ) , NIL } // ресурс иконки в ехе-файле 32x32
    oBrw:GetColumn( "FLD4" ):aCheck := { myLoadIconByName( "iSave128", 48 ), NIL } // 48x48 - ресурс иконки 128x128 в ехе-файле
    oBrw:GetColumn( "FLD5" ):aCheck := { myLoadIconByName( ".\RES\Edit32.ico", 64 ), NIL } // файл иконки 32x32 увеличим 64x64
    oBrw:GetColumn( "FLD6" ):aCheck := { myLoadLibraryEx("Image.Dll", "iExit", 90 ), NIL } // ресурс иконки в dll-файле любые размеры

    oBrw:GetColumn( "FLD7" ):aCheck := { LoadImage( ".\RES\Save32.png" ), NIL }
    oBrw:GetColumn( "FLD8" ):aCheck := { LoadImage( ".\RES\Mail32.jpg" ), NIL }
    oBrw:GetColumn( "FLD9" ):aCheck := { myLoadImageDll( "Image.Dll", "png_Mail", 64 ), NIL }

    oBrw:GetColumn( "FLD6" ):lBitMap := .T.
    oBrw:GetColumn( "FLD6" ):aBitMaps := { LoadImage( ".\RES\edit_delete.bmp" ), ;
    LoadImage( ".\RES\edit_cancel.bmp" ), ....... }
    .....
    FUNCTION myLoadIconByName( cIcon, nWH)
    LOCAL hIcon, hBmp

    hIcon := myLoadIconByName( cIcon, nWH, nWH )
    hBmp := BmpFromIcon( hIcon )
    DestroyIcon(hIcon)

    RETURN hBmp

    FUNCTION myLoadLibraryEx( cIconDll, cIcon, nWH )
    LOCAL hIcon, hLib, hIconFromDll, hBmp := 0

    If !File( cIconDll )
    MsgStop("There is no resource file for the program!" + CRLF + cIconDll )
    Return hBmp
    Endif

    hLib := LoadLibraryEx( cIconDll, 0, LOAD_LIBRARY_AS_DATAFILE )

    if ! Empty( hLib )
    hIconFromDll := LoadIconByName( cIcon, nWH, nWH, hLib )

    if ! Empty( hIconFromDll )
    hIcon := CopyIcon( hIconFromDll )
    hBmp := BmpFromIcon( hIcon )
    DestroyIcon( hIconFromDll )
    DestroyIcon( hIcon )
    endif

    FreeLibrary( hLib )
    endif

    RETURN hBmp

    Замечания по коду приветствуются.
    Если хендл не получился, возвращаю 0, может и неправильно, но зато потом можно убить сразу все хендлы:
          ON RELEASE {|| AEval(ahBmp, {|h| DestroyIcon( h ) }) }

    Как можно сделать функцию - myLoadImageDll( "Image.Dll", "png_Mail", 64 ) ?
    где "png_Mail" - имя ресурса, 64 - нужный размер показа

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




    Пост N: 7570
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 27.09.23 17:18. Заголовок: В новой версии МиниГ..


    В новой версии МиниГуи 23.09 (Update 2) сделать просмотр dbf-файла просто.
    Минимальный код для открытия базы:
       #include "minigui.ch" 
    REQUEST DBFCDX, DBFFPT

    FUNCTION Main()
    LOCAL cDbf := GetStartUpFolder() + '\test_Engl.dbf'

    RddSetDefault("DBFCDX")
    SET FONT TO "DejaVu Sans Mono", 13

    USE (cDbf) NEW EXCLUSIVE
    TsbViewer()

    RETURN NIL
    // добавить при сборке библиотеку TsbViewer.lib

    Внешний вид окна:


    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 7824
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 27.09.23 17:45. Заголовок: Andrey пишет: В нов..


    Andrey пишет:

     цитата:
    В новой версии МиниГуи 23.09 (Update 2) сделать просмотр dbf-файла просто.


    Да мы в курсе , читаем ChangeLog.txt

    PS
    C:\MiniGUI\SAMPLES\Advanced\Tsb_Viewer\demo5.prg

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 7825
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 27.09.23 17:48. Заголовок: Правда есть ньюанс п..


    Правда есть ньюанс при запуске


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




    Пост N: 7571
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 27.09.23 20:55. Заголовок: Dima пишет: Правда ..


    Dima пишет:

     цитата:
    Правда есть ньюанс при запуске


    Странно и непонятно.
    Такое впечатление что берется старая TsbViewer.lib
    Так как в новой TsbViewer.lib MAIN окно включено по умолчанию.
    Пересобрал заново TsbViewer.lib - поправил пути в tsbviewer.hbp, т.к. я делаю свой путь для каждой версии МиниГуи
    -workdir=c:/minigui-23.09.2/lib/hbmk/obj 
    -oc:/minigui-23.09.2/lib/TsbViewer
    -Ic:/minigui-23.09.2/include
    Перепроверил ещё раз у себя, собирается и запускается без ошибок.



    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 7826
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 27.09.23 21:17. Заголовок: Andrey пишет: Стран..


    Andrey пишет:

     цитата:
    Странно и непонятно.


    TsbViewer.lib от 04.07.23
    TsbViewer.prg от 06.01.22

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




    Пост N: 7572
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 27.09.23 21:22. Заголовок: Вот в новой версии у..


    Вот в новой версии у меня так:


    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 7827
    Зарегистрирован: 17.05.05
    ссылка на сообщение  Отправлено: 28.09.23 14:54. Заголовок: Andrey пишет: Такое..


    Andrey пишет:

     цитата:
    Такое впечатление что берется старая TsbViewer.lib


    Да , так и есть , лежала либа в папке C:\MiniGUI\SAMPLES\Advanced\Tsb_Viewer\ , убил её
    и пересобрал , работает

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




    Пост N: 7575
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 28.09.23 15:28. Заголовок: Ну и отлично ! :sm1..


    Ну и отлично !

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 170
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 12.10.23 19:54. Заголовок: Возможно ли?


    Есть ряд одинаковых по структуре файлов.
    Можно как-то в открытом TsBrowse на лету поменять DBF-файл?

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




    Пост N: 4427
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 12.10.23 20:09. Заголовок: alex_II Переоткройт..


    alex_II
    Переоткройте др. dbf с тем же alias, можно и в той же области

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 171
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 13.10.23 04:34. Заголовок: Забыл уточнить, все ..


    Забыл уточнить, все файлы открыты.

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




    Пост N: 4428
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 13.10.23 09:23. Заголовок: alex_II пишет Забыл ..


    alex_II пишет
     цитата:
    Забыл уточнить, все файлы открыты.


    SergKis пишет
     цитата:
    Переоткройте ...


     
    oBrw:UserKeys( VK_F6, {|ob| myNewOpen(ob) } )
    ...
    FUNC myNewOpen(oBrw)
    Local cNewDbf := ...
    dbSelectArea(oBrw:cAlias)
    USE
    USE (cNewDbf) ALIAS (oBrw:cAlias) SHARED
    oBrw:Reset()
    RETURN Nil


    Спасибо: 1 
    ПрофильЦитата Ответить
    постоянный участник




    Пост N: 7604
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 08.11.23 15:16. Заголовок: Построил таблицу. Ка..


    Построил таблицу.
    Как можно поменять фон цвета шапки и подвала у столбца SELECTOR (1) ?


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




    Пост N: 4445
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 08.11.23 16:27. Заголовок: Andrey А посмотреть..


    Andrey
    А посмотреть метод :DrawHeaders слабо и поискать F7 в far "lSelect" ?
    Там несколько строк всего

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




    Пост N: 7605
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 08.11.23 21:26. Заголовок: SergKis пишет: А по..


    SergKis пишет:

     цитата:
    А посмотреть метод :DrawHeaders слабо и поискать F7 в far "lSelect" ?
    Там несколько строк всего


    Посмотрел, ни фига не понял

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




    Пост N: 4446
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 08.11.23 21:41. Заголовок: Andrey пишет Посмотр..


    Andrey пишет
     цитата:
    Посмотрел, ни фига не понял


    Странно выбор данных для переменной nClrBack из переменных oBrw и oColumn
     
    IF !( nJ == 1 .AND. ::lSelector ) // не 1-я колонка
    IF ( nClrBack := iif( ::nColOrder == nI, oColumn:nClrOrdeBack, oColumn:nClrHeadBack ) ) == NIL
    nClrBack := iif( ::nColOrder == nI, nClrOrdeBack, nClrHeadBack )
    ENDIF
    ELSE // 1-я колонка
    nClrBack := iif( ::nClrSelectorHdBack == NIL, ATail( ::aColumns ):nClrHeadBack, ::nClrSelectorHdBack )
    ENDIF
    ниже есть и для Footer
    IF ::lFooting .AND. ::lDrawFooters
    ...
    IF !( nJ == 1 .AND. ::lSelector ) // JP
    nClrBack := iif( oColumn:nClrFootBack != NIL, oColumn:nClrFootBack, nClrFootBack )
    ELSEIF ::nClrSelectorHdBack != NIL
    nClrBack := ::nClrSelectorHdBack
    ELSE
    nClrBack := ATail( ::aColumns ):nClrFootBack
    ENDIF
    ...


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




    Пост N: 7606
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 08.11.23 21:46. Заголовок: ELSEIF cCol == &..


        ELSEIF cCol == "SELECTOR"  
    oCol:nClrHeadBack := oTsb:n12Clr4Back // фона шапки селектора колонка 1
    oCol:nClrFootBack := oTsb:n12Clr10Back // фона подвала селектора колонка 1

    Так не работает.
    Если делаем так, то вылет !
        ELSEIF cCol == "SELECTOR"  
    oCol:nClrSelectorHdBack := oTsb:n12Clr4Back // фона шапки селектора колонка 1
    oCol:nClrFootBack := oTsb:n12Clr10Back // фона подвала селектора колонка 1


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




    Пост N: 4447
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 08.11.23 21:53. Заголовок: Andrey Копипастишь ..


    Andrey
    Копипастишь и придумываешь, ты просто посмотри внимательно код выше, по названиям видно

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




    Пост N: 7607
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 16.11.23 08:57. Заголовок: Вот ещё пример ТСБ в..


    Вот ещё пример ТСБ в папке \MiniGUI-23.10\SAMPLES\Advanced\APP_OOPTEMPLATE
    Окно и таблица строится из ини-файла Demo_timer.cfg
    Смотреть секцию - [ТАБЛИЦЯ_БД_АБОНЕНТИ]


    Правая кнопка мышки на ячейке вызывает меню для работы с буфером:
    Копировать в буфер/Вставить из буфера/Удалить
    в зависимости от языка.

    Предусмотрен вызов меню по клику мышки на суперхидере.
    Повторное открытие базы в другой кодировке на "лету", без закрытия таблицы.

    Спасибо: 0 
    ПрофильЦитата Ответить





    Пост N: 232
    Зарегистрирован: 17.10.05
    ссылка на сообщение  Отправлено: 01.01.24 15:05. Заголовок: Редактирование Memo поля как 'C'


    Всех с Новым Годом!
    Прошу в h_tbrowse.prg сделать изменения в строке 5266
    IF ::lIsArr .AND. oCol:cDataType # ValType( uValue ) // GF 15/07/2009
    cType := ValType( uValue )
    oCol:cDataType := cType
    ENDIF
    В моем случае, если cDataType = 'M', то этот блок переводит cDataType в 'C' и
    дальше не отрабатывает строка 5451
    ELSEIF ( cType == "C" .AND. Chr( 13 ) $ uValue ) .OR. cType == "M" .OR. oCol:lEditBox
    и редактирование переводит на GetBox.
    Я, конечно, вручную поставил oCol:lEditBox := .T., но хотелось бы автоматически.

    Спасибо: 0 
    ПрофильЦитата Ответить
    moderator




    Пост N: 2237
    Зарегистрирован: 11.02.10
    ссылка на сообщение  Отправлено: 01.01.24 16:43. Заголовок: krutoff пишет: в h..


    krutoff пишет:

     цитата:
    в h_tbrowse.prg сделать изменения в строке 5266


    Благодарю за подсказку.
    Поправил эту строку для учета "М" типа данных.

    Мой контрольный пример см. ниже:
    Скрытый текст


    Спасибо: 1 
    ПрофильЦитата Ответить





    Пост N: 233
    Зарегистрирован: 17.10.05
    ссылка на сообщение  Отправлено: 03.01.24 12:37. Заголовок: Динамическая высота строк TSBrowse


    Я так понимаю, что динамическая высота строк TSBrowse не предусмотрена?
    Бывает очень длинная строка и ячейка ее не показывает, обрезает, даже если
    показывать через CRLF.

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




    Пост N: 4488
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 03.01.24 14:20. Заголовок: krutoff пишет Я так ..


    krutoff пишет
     цитата:
    Я так понимаю, что динамическая высота строк TSBrowse не предусмотрена?


    есть немного с memo полями, переменные смотрите в коде
     
    DATA nMemoHE // memo sizes on edit and view mode
    DATA nMemoWE // Height in lines and Width in pixels
    DATA nMemoHV // default: 3 lines height and 200 pixels width
    DATA nMemoWV
    и
    STATIC FUNCTION SetHeights( oBrw )
    ...
    // Now for cells
    ...
    IF Empty( oBrw:nMemoHV )
    IF At( Chr( 13 ), cHeading ) > 0
    oBrw:nMemoHV := Len( hb_ATokens( cHeading, Chr( 13 ) ) )
    ENDIF
    ENDIF
    DEFAULT oBrw:nMemoHV := 2

    Предусмотреть динамическую высоту автоматом, по мне, трудно (тип С), т.к. каждому надо по разному от ширины колонки. Например, я часто использую схему ширина не > 45 символов и на tooltip ячейки вешаю полное содержимое, что бы получить больше колонок в просмотре и не исп. для поля С вставки CRLF для вертикального разбиения показа ячейки, т.к. это съедает строки в просмотре и в др. строках будут пустоты в ячейки, текст короче.
    PS
    Проще выделить место на окне показа или отдельное окно, в котором организовать показ длинных полей, при перемешении по тсб в Label-ах, GetBox-ах ReadOnly или EditBox ReadOnly или тсб с вертикальной раскладеой, как по полям одной записи в SBrowse. Ситуация с отдельным окном может оказаться предпочтительней, т.к. вызывать просмотр можно по кнопке или R\L клику

    Спасибо: 1 
    ПрофильЦитата Ответить
    постоянный участник




    Пост N: 7723
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 09.04.24 19:03. Заголовок: Есть длинная строка ..


    Есть длинная строка адреса.
    В ТСБ естественно будет показываться только то кол-во символов, которые заданы в picture.
    Допустим 30 символов.
    А можно сделать чтобы показывало последние 30 символов из строки в колонке ?

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




    Пост N: 4548
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 09.04.24 19:29. Заголовок: А можно сделать чтоб..



     цитата:
    А можно сделать чтобы показывало последние 30 символов из строки в колонке ?


    oCol:bDecode := {|ca| ca := trim(ca), iif( Len(ca) > 30, "..."+right(ca, 30), ca ) }

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




    Пост N: 7724
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 09.04.24 23:04. Заголовок: Спасибо БОЛЬШОЕ ! :..


    Спасибо БОЛЬШОЕ !

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 175
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 12.04.24 13:52. Заголовок: Не пойму почему


    ТСБ работает с массивом
    ...
    s1 := 0
    aKv - массив [4,11]
    ...
    Br:SetArrayTo(aKv,,aZg,aWi,aFoot,aPict,aAlgn)

    Хочу при старте заполнить подвал второй колонки, в этой колонке цифры и надо подсчитать сумму
    Делаю так:
    Br:aColumns[2]:cFooting := {|| aEval(Br:aArray, {|aVal,nElm| s1 += aVal[2]}), str(s1,10,2)}
    но aEval почему-то проходит по массиву 4 раза, т.е сумма получается в четыре заза больше.

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




    Пост N: 4549
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 12.04.24 14:33. Заголовок: alex_II Тсб - это п..


    alex_II
    Тсб - это просто рисование данных в таблице по настройке, ничего не считает. В данном случае прошло 4-е прохода прорисовки. Надо посчитать и записать в нужные колонки :cFooting := cValToChar(...) или в переменные, поля dbf, ... и в :cFooting := блок кода для получения строки из них (для каждой колонки), тогда по каким то действиям меняете значения данных для этих блоков кода и делаете переотображение тсб всех строк oBrw:Refresh(...), курсора oBrw:DrawSelect(), oBrw:DrawFooters()

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 176
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 12.04.24 17:30. Заголовок: Я извиняюсь, но ниче..


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

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




    Пост N: 4550
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 12.04.24 17:49. Заголовок: alex_II 1. Тсб - эт..


    alex_II
    1. Тсб - это просто рисование данных в таблице по настройке, ничего не считает.
    2. Выносите свой блок кода, подсчета итоговых сумм, из тсб отдельно
    3. Создаете массив для показа в тсб
    4. Запускаете подсчет сумм по колонкам массива, т.е. исполняете свой блок кода, итоги запомнили
    5. DEFINE TBROWSE ... => в колонки переносите итоги oCol:cFooting := <итоги из массива, как строка> END TBROWSE
    6. Тсб нарисуется вместе с итогами (за 4-ре раза, потому в вашей ситуации учетверение сумм, так не надо делать)
    Если делаем правку строк с суммами в строках массива тсб :lEdit := .T., то итоги надо пересчитать, т.е. запускаем блок кода подсчета сумм п.2, получив новые итоги, заносим их результаты в нужные oCol:cFooting и делаем oBrw:DrawFooters() - перерисовать подвал.
    Если, например, у вас есть массив итогов aItig, то можно исп. блок кода в oCol:cFooting := {|| hb_ntos(aItog[3]) } и так во все колонки. Блок кода будет обеспечивать данные дли Footers по выполнению oBrw:DrawFooters()
    PS
    Примеры APP_OOPREPORT смотрите, там есть итоги в массивах, создаваемых по кнопкам

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 177
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 12.04.24 18:53. Заголовок: Спасибо за развёрнут..


    Спасибо за развёрнутый ответ

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




    Пост N: 7725
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 12.04.24 19:50. Заголовок: SergKis пишет: Прим..


    SergKis пишет:

     цитата:
    Примеры APP_OOPREPORT смотрите, там есть итоги в массивах, создаваемых по кнопкам


    Можно ещё глянуть этот пример - SAMPLES\Advanced\Tsb_array_4
    там тоже идёт подсчёт итогов !

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 178
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 18.04.24 20:21. Заголовок: После редактирования линия выше ячейки затирается!


    Пример: ...\MiniGUI\SAMPLES\Advanced\Tsb_array_2\demo5.prg
    Сперва думал, что сам как-то повлиял своими настройками, убил на это день.
    У меня белый фон и вид получается удручающий

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




    Пост N: 7727
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 18.04.24 23:17. Заголовок: alex_II пишет: У ме..


    alex_II пишет:

     цитата:
    У меня белый фон и вид получается удручающий


    Картинку в студию !
    Красивый и продвинутый ТСБ смотри \SAMPLES\Advanced\Tsb_5Win

    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 179
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 19.04.24 05:31. Заголовок: https://i.postimg.cc..



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

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




    Пост N: 7728
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 19.04.24 07:59. Заголовок: Попробуй увеличить в..


    Попробуй увеличить высоту ячеек.
          oBrw:nHeightCell  += 6 


    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1966
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 19.04.24 08:09. Заголовок: alex_II пишет: Там...


    alex_II пишет:

     цитата:
    Там. где была корректировка, сетка нарушается.


    В методе Edit() координаты окна редактирования рассчитываются не пойми как и для каждого контрола отдельно. Погрешность выравнивается подгонкой через массив из 4 значений.
    Выхода из положения два
    1 править edit()
    2 перед редактированием задавать сдвиги в массиве корректировки координат окна редактирования. Высота строки бровса тут не при чем т ее изменение не поможет

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




    Пост N: 7729
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 19.04.24 09:26. Заголовок: Пример - SAMPLES\..


    Пример - SAMPLES\Advanced\Tsb_Basic\demo.prg
       oBrw:nHeightCell += 10         // к высоте ячеек таблицы добавим 
    oBrw:nHeightHead += 5 // к высоте шапки таблицы добавим

    // GetBox встраиваем в ячейку, задаем отступы
    oBrw:aEditCellAdjust[1] += 4 // cell_Y + :aEditCellAdjust[1]
    oBrw:aEditCellAdjust[2] += 2 // cell_X + :aEditCellAdjust[2]
    oBrw:aEditCellAdjust[3] -= 5 // cell_W + :aEditCellAdjust[3]
    oBrw:aEditCellAdjust[4] -= 8 // cell_H + :aEditCellAdjust[4]


    Спасибо: 0 
    ПрофильЦитата Ответить



    Пост N: 180
    Зарегистрирован: 12.07.06
    ссылка на сообщение  Отправлено: 19.04.24 12:45. Заголовок: С высотой ячеек и н..


    С высотой ячеек и не только я игрался целый день, ничего не помогает.
    Править метод Edit() нет ни желания ни возможности, много работы.
    Печалька.

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




    Пост N: 4551
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 19.04.24 13:00. Заголовок: alex_II пишет Там. г..


    alex_II пишет
     цитата:
    Там. где была корректировка, сетка нарушается


    oBrw:DrawSelect(), oBrw:Refresh() перерисовывают строку курсора и все окно, не понимаю проблему совсем
    Не нравится oBrw:aEditCellAdjust, положите на ячейку[и] modal окно в размеры или больше со своим вводом

     цитата:
    Править метод Edit() нет ни желания ни возможности, много работы


    Метод Edit править нет нужды, даже мыслей на это нет, а сделать свой ввод (можно даже красивый) один раз и использовать везде ЭТО и есть работа над проектом (hmg это продукт как есть и использование его вами это ваш риск ...)

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1967
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 19.04.24 15:28. Заголовок: alex_II пишет: Прав..


    alex_II пишет:

     цитата:
    Править метод Edit() нет ни желания ни возможности, много работы.
    Печалька.


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


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




    Пост N: 4553
    Зарегистрирован: 17.02.12
    ссылка на сообщение  Отправлено: 19.04.24 15:48. Заголовок: Haz пишет У себя , ..


    Haz пишет
     цитата:
    У себя , когда лень менять исходники делаю замену


    А мне всегда лень это делать, обхожусь вариантом modal окон как в примере Tsb_addrecord_3 ф-я
    STATIC FUNCTION Add_Rec( oBrw )
    только для всех вариантов ведения (Add, Add+Copy, Del, Edit) и окно может быть как для одной Cell так и нескольких, а GETBOX-ы иметь встроенные кнопки для ACTION и ACTION2

    Спасибо: 0 
    ПрофильЦитата Ответить
    администратор




    Пост N: 1968
    Зарегистрирован: 20.02.11
    ссылка на сообщение  Отправлено: 19.04.24 15:56. Заголовок: SergKis пишет: А мн..


    SergKis пишет:

     цитата:
    А мне всегда лень это делать, обхожусь вариантом modal окон как в примере Tsb_addrecord_3 ф-я
    STATIC FUNCTION Add_Rec( oBrw )
    только для всех вариантов ведения (Add, Add+Copy, Del, Edit) и окно может быть как для одной Cell так и нескольких, а GETBOX-ы иметь встроенные кнопки для ACTION и ACTION2


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

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




    Пост N: 7738
    Зарегистрирован: 12.09.06
    ссылка на сообщение  Отправлено: 23.04.24 00:12. Заголовок: Схема расчёта итогов..


    Схема расчёта итогов на лету, после установки фильтра на базу.
    Может кому будет интересно.
    Т.е. набираем буквы в поиске, и получаем итого в подвале таблицы.
    Спасибо ОГРОМНОЕ Сергею.
    Скрытый текст


    Спасибо: 0 
    ПрофильЦитата Ответить
    Ответов - 181 , стр: 1 2 3 4 5 6 7 8 9 10 All [только новые]
    Ответ:
    1 2 3 4 5 6 7 8 9
    большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

    показывать это сообщение только модераторам
    не делать ссылки активными
    Имя, пароль:      зарегистрироваться    
    Тему читают:
    - участник сейчас на форуме
    - участник вне форума
    Все даты в формате GMT  3 час. Хитов сегодня: 195
    Права: смайлы да, картинки да, шрифты да, голосования нет
    аватары да, автозамена ссылок вкл, премодерация откл, правка нет