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


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


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

 цитата:

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


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



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


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




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


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

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




Пост N: 5846
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 26.04.18 17:53. Заголовок: Предложение по METHO..


Предложение по METHOD Excel2() - сделать задержку, чтобы бегунок показывался на экране нормально, это в конце метода:
 
If ! Empty( aRepl )
For nCol := 1 To Len( aRepl )
oSheet:Columns( Chr( 64 + aRepl[ nCol ] ) ):WrapText := .T.
Next
EndIf

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

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

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


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

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

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


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

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




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


Andrey пишет:

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


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


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




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


Haz пишет:

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



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

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




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


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

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

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

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

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

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




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


Andrey пишет:

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


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


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



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

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






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




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


Haz пишет:

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


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

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

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




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


Andrey пишет:

 цитата:

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


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

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




Пост N: 5852
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 28.04.18 12:06. Заголовок: Haz пишет: В версии..


Haz пишет:

 цитата:
В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml



Я понял в чём дело. Если увеличить таблицу то 1000 элементов, то подвал в таблице пропадает !
Я пробовал на версии 18.03 - тоже нет подвала.

Сделал в версии 18.04 кол-во строк 240, подвал есть.
На 250 строках подвала уже нет и вот такая таблица получается:



Что-то ерундит алгоритм выгрузки в эксель.
Как и где подправить ?
Смотреть последний проект - Tsb_Export8d.7z

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




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


Andrey пишет:

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



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

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




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


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

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




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


Haz пишет:

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



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

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




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


Andrey пишет:

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


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

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




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


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


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

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


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






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




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


Haz пишет:

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



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

строки

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

заменить на

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

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

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

заменить на

oSheet:Range( cRange ):HorizontalAlignment := xlHAlignCenterAcrossSelection

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

oExcel := CreateObject( "Excel.Application" )

на

win_oleCreateObject( "Excel.Application" )

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

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




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


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


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

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


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

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




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


SergKis пишет:

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



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


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




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


Сергей

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


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




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




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


Pasha пишет:

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


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

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

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


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


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




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


Haz пишет
 цитата:
Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet


У себя исп. вариант без кнопки, но с назначением клавиш, может будет интересно. Изменения:
 
CLASS TSColumn
...
DATA aKeyEvent INIT {}
DATA bKeyEvent

...
METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt )

...
ENDCLASS
...
METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) CLASS TSColumn

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

RETURN Self

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

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

IF ! empty(oCol:aKeyEvent)
oGet := oCol:oEdit:oGet
For nK := 1 TO Len(oCol:aKeyEvent)
aKey := oCol:aKeyEvent[ nK ]
If HB_ISNUMERIC( aKey[1] )
oGet:SetKeyEvent( aKey[1], aKey[2], aKey[3], aKey[4], aKey[5] )
EndIf
Next
ENDIF

EndIf
...
Пример Tsb_addrecord_2\demo.prg
...
ADD COLUMN TO oBrw DATA FieldWBlock( "ITG", Select( "base" ) ) ;
HEADER "Total" FOOTER hb_ntos(nItg) ;
ALIGN DT_RIGHT, DT_CENTER, DT_RIGHT ;
SIZE 90

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

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

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

RETURN NIL



Спасибо: 0 
Профиль
Ответов - 300 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 672
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет