Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] 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 [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

Ответов - 300, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 All

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

Andrey: Предложение по METHOD Excel2() - сделать задержку, чтобы бегунок показывался на экране нормально, это в конце метода: [pre2] 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 .....[/pre2] И ещё предложение: [pre2] 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 ] ), ;[/pre2] Поясню почему. Если в примере нужно убрать показ суперхидера, то можно назначит ему высоту 1 пиксел. И исходники пересматривать не придётся. Но если у нас суперхидер есть в 1 пиксел, то ! Empty( ::aSuperHead ) выдаст что суперхидер есть и сделает экспорт его на лист Экселя. А If (::lDrawSuperHd) позволит этого избежать.

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


Andrey: Haz пишет: Правильнее нормально задавать параметры отображения. К примеру если рисуем процентовку, которая, напоминаю равна 100 То незачем прорисовывать каждую запись из 1000. Дастаточно каждую десятую. А как надо правильно ? Подправь пожалуйста исходник, а то в методе :Excel2() нормально рисуется бегунок, а в методе :ExcelOle() - огрызок какой-то.

Andrey: И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы ! Там же есть вроде в тексте: [pre2] 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 [/pre2] Как исправить, чтобы заработало ?

Haz: Andrey пишет: Предложение по METHOD Excel2() - сделать задержку, Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle() Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents() В конце метода nCount == nTotal ?? при выводе этого [pre2] ::ExcelOle() If hProgress != Nil SendMessage( hProgress, PBM_SETPOS, nCount, 0 ) EndIf [/pre2] если посмотреть в Excel2() то в конце там не nCount . Может тут проблема ? [pre2] ::Excel2() If hProgress != Nil SendMessage( hProgress, PBM_SETPOS, nTotal, 0 ) EndIf [/pre2] Следующий фокус я не понял [pre2] 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 [/pre2] и затем два раза [pre2] If hProgress != Nil nCount -= 15 SendMessage( hProgress, PBM_SETPOS, nCount, 0 ) EndIf [/pre2]

Andrey: Haz пишет: Ты уж определись про какой метод ты пишешь ? А то говоришь про Excel2() а код кидаешь из ExcelOle() Вместо INKEYGUI() скорее подойдет Sysrefresh() или DoEvents() Да точно, перепутал я. Понял насчёт Sysrefresh() или DoEvents(). Но остальной код я тоже не понимаю, зачем так сделано: nCount -= 15 и т.д. - для меня загадка... Напиши пожалуйста как правильно сделать, а Григорий уже исправит исходники ! И как насчёт подвала таблицы, почему нет в экселе её ?

Haz: Andrey пишет: И ещё одна странность в методе :ExcelOle() - не рисуется подвал таблицы ! В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml Ищи где намудрил с исходниками

Andrey: Haz пишет: В версии 2018/03/28: HMG Extended Edition version 18.03. все рисуется из твоего же примера Tsb_Brw2xml Я понял в чём дело. Если увеличить таблицу то 1000 элементов, то подвал в таблице пропадает ! Я пробовал на версии 18.03 - тоже нет подвала. Сделал в версии 18.04 кол-во строк 240, подвал есть. На 250 строках подвала уже нет и вот такая таблица получается: Что-то ерундит алгоритм выгрузки в эксель. Как и где подправить ? Смотреть последний проект - Tsb_Export8d.7z

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

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

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

Haz: Andrey пишет: Я этого сам не осилю. Ну надо же когда то начинать

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

Pasha: 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: Haz пишет Следующий код при выборе кнопки записывает слово "Test" в поле, но только в первый раз, во второй раз бровс зависает Добавил в пример Tsb_addrecord_2 [pre2] 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 ) [/pre2] работает не виснет. Игорь, наверно, примерчик нужен

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

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

gfilatov2002: Pasha пишет: для начала можно убрать некоторые рудименты Благодарю за помощь! Выполнил предложенные правки Используя класс win_oleAuto для следующей сборки

SergKis: Haz пишет Есть колонка NAME с текстовым полем , хочу и редактировать его и выбирать из справочника . Идеально подходит ::SetBtnGet У себя исп. вариант без кнопки, но с назначением клавиш, может будет интересно. Изменения: [pre2] 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 [/pre2]



полная версия страницы