Автор | Сообщение |
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:....
| |
|
Ответов - 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. Если у всех, то надо бы Эксель на передний план ВСЕГДА переключать. Или ключ ввести для перевода. У кого какие будут соображения ?
| |
|
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) позволит этого избежать.
| |
|
Haz
|
| |
Пост N: 1231
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.04.18 23:18. Заголовок: Andrey пишет: сдела..
Andrey пишет: цитата: | сделать задержку, чтобы бегунок показывался на экране нормально |
| Тормозить программу специально? Ради красоты бегунка Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100 То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую.
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5847
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.18 07:24. Заголовок: Haz пишет: Правильн..
Haz пишет: цитата: | Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100 То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую. |
| А как надо правильно ? Подправь пожалуйста исходник, а то в методе :Excel2() нормально рисуется бегунок, а в методе :ExcelOle() - огрызок какой-то.
| |
|
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 Как исправить, чтобы заработало ?
| |
|
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
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5851
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.18 21:14. Заголовок: Haz пишет: Ты уж оп..
Haz пишет: цитата: | Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle() Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents() |
| Да точно, перепутал я. Понял насчёт Sysrefresh() или DoEvents(). Но остальной код я тоже не понимаю, зачем так сделано: nCount -= 15 и т.д. - для меня загадка... Напиши пожалуйста как правильно сделать, а Григорий уже исправит исходники ! И как насчёт подвала таблицы, почему нет в экселе её ?
| |
|
Haz
|
| |
Пост N: 1233
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.04.18 11:21. Заголовок: Andrey пишет: И ещ..
Andrey пишет: цитата: | И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы ! |
| В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml Ищи где намудрил с исходниками
| |
|
Andrey
|
| постоянный участник
|
Пост N: 5852
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.04.18 12:06. Заголовок: Haz пишет: В версии..
Haz пишет: цитата: | В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml |
| Я понял в чём дело. Если увеличить таблицу то 1000 элементов, то подвал в таблице пропадает ! Я пробовал на версии 18.03 - тоже нет подвала. Сделал в версии 18.04 кол-во строк 240, подвал есть. На 250 строках подвала уже нет и вот такая таблица получается: Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ? Смотреть последний проект - Tsb_Export8d.7z
| |
|
Haz
|
| |
Пост N: 1234
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.04.18 12:22. Заголовок: Andrey пишет: Что-т..
Andrey пишет: цитата: | Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ? |
| А ерундит счетчик строк в алгоритме, на твоей картинке ясно виден разрыв ( пустая строка ) и после нее еще 5 строк. Если в примере общее число строк уменьшить на 5 , то разрыв исчезнет и подвал появится. Скорее всего из-за разрыва подвал затирается. Так что ищи причину разрыва, подвал - это следствие
| |
|
Haz
|
| |
Пост N: 1235
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.04.18 12:32. Заголовок: Добавлю чуть. В теку..
Добавлю чуть. В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к
| |
|
|
Andrey
|
| постоянный участник
|
Пост N: 5853
Зарегистрирован: 12.09.06
|
|
Отправлено: 28.04.18 13:35. Заголовок: Haz пишет: В текуще..
Haz пишет: цитата: | В текущей реализации ::ExcelOle() морально устарел , а убивец текущей реализации метода - Паша После появления поддержки вариантного массива этот ::ExcelOle() стал рудиментом, т.к. с __oleVariantNew() работать приятнее и понятнее , чем клеить ячейки в строку с ограничением в 20к |
| А можно сделать замену этой текущей реализации для всех ? Я этого сам не осилю.
| |
|
Haz
|
| |
Пост N: 1236
Зарегистрирован: 20.02.11
|
|
Отправлено: 28.04.18 14:10. Заголовок: Andrey пишет: Я это..
Andrey пишет: Ну надо же когда то начинать
| |
|
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 ) и еще интереснее , если в первый раз ввести значение ручками , а во второй вызвать кнопку - тоже завис.
| |
|
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к тоже работает быстро, но можно и делать это прямой записью.
| |
|
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 ) работает не виснет. Игорь, наверно, примерчик нужен
| |
|
Haz
|
| |
Пост N: 1238
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.05.18 17:01. Заголовок: SergKis пишет: рабо..
SergKis пишет: цитата: | работает не виснет. Игорь, наверно, примерчик нужен |
| Сергей, спасибо. Пока обошелся решив по другому. Сейчас не до примерчиков, позже сделаю обязательно ( может дома подготовлю и то не уверен ) ! Тащу два объемных проекта, даже тараканов в них давить некогда. Нужно сдать ! После сдачи видимо будет период оптимизации кода и украшательства. Вот там примерчики начнутся.
| |
|
Haz
|
| |
Пост N: 1239
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.05.18 10:42. Заголовок: Сергей работает не ..
Сергей Вобщем это я тупанул. Работает конечно при чистом запуске. Я пользуюсь для сборки проектов фришным редактором от Xailer ( xEdit ) Этот редактор , при запуске проекта на исполнение , пытается управлять приложением ( пытается использовать отладку, показать значения переменных, ресурсов и пр.) Возможно и можно его прикрутить как отладчик, но я не пользуюсь. Так вот, при запуске из под редактора , кнопка эта вешает задачу, при запуске нормальном - все ок. Знал же, раньше натыкался и все выяснил. Но время прошло и за неиспользованием этого функционала все забыл ((. Пол дня потратил на старые грабли
| |
|
gfilatov2002
|
| moderator
|
Пост N: 1276
Зарегистрирован: 11.02.10
|
|
Отправлено: 11.05.18 13:05. Заголовок: Pasha пишет: для на..
Pasha пишет: цитата: | для начала можно убрать некоторые рудименты |
| Благодарю за помощь! Выполнил предложенные правки цитата: | Используя класс win_oleAuto |
| для следующей сборки
| |
|
SergKis
|
| постоянный участник
|
Пост N: 1809
Зарегистрирован: 17.02.12
|
|
Отправлено: 11.05.18 18:34. Заголовок: Haz пишет Есть колон..
Haz пишет цитата: | Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet |
| У себя исп. вариант без кнопки, но с назначением клавиш, может будет интересно. Изменения: CLASS TSColumn ... DATA aKeyEvent INIT {} DATA bKeyEvent ... METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) ... ENDCLASS ... METHOD SetKeyEvent( nKey, bKey, lCtrl, lShift, lAlt ) CLASS TSColumn 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
| |
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|
|