Автор | Сообщение |
|
| |
Пост N: 1511
Зарегистрирован: 20.02.11
|
|
Отправлено: 06.02.20 17:17. Заголовок: Курсы ЦБ РФ на дату
потребовалось часто и быстро дергать курсы валют с ЦБ РФ , за пару часов написал функцию. Может кому сгодиться на оригинальность не претендую , но работает . Возвращает массив значений на дату . FUNC GetCBR( dDate) LOCAL oHttp, cHtml, oNode, oDoc, oVal, oIterator, oCurrent LOCAL aArray := {} LOCAL cNumCode, cCharCode ,cNominal, cName, cValue LOCAL aCur := {} LOCAL cDate := StrZero(Day( dDate ),2,0) + "/" + StrZero(month( dDate ),2,0) + "/" + StrZero(year( dDate ),4,0) oHttp := TIpClientHttp():new( "http://www.cbr.ru/scripts/XML_daily.asp?date_req=" + cDate ) IF ! oHttp:open() MsgBox( "Connection error:", oHttp:lastErrorMessage() ) RETURN {} ENDIF cHtml := oHttp:readAll() oHttp:close() oDoc := TXMLDocument():New( cHtml, 8 ) // см. hbxml.ch IF oDoc:nError != 0 MsgBox( "xml file parsing error " + hb_ntos( oDoc:nError ) ) RETURN {} ENDIF oVal := oDoc:findfirst( "Valute" ) IF oVal == NIL MsgBox( "no Valute found" ) RETURN {} ENDIF DO WHILE .T. oIterator := TXMLIterator():New( oVal ) DO WHILE .T. oCurrent := oIterator:Next() IF oCurrent == NIL EXIT ELSE switch oCurrent:cName case "CharCode" cCharCode := oCurrent:cData exit case "NumCode" cNumCode := oCurrent:cData exit case "Nominal" cNominal := oCurrent:cData exit case "Name" cName := oCurrent:cData exit case "Value" cValue := CharRepl(",", oCurrent:cData, ".") exit end switch ENDIF ENDDO AAdd(aCur, {cCharCode, cNumCode, Val(cNominal), cName, Val(cValue)} ) oVal := oDoc:findnext() IF oVal == NIL EXIT ENDIF ENDDO RETURN aCur
| |
|
Ответов - 46
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 3039
Зарегистрирован: 17.02.12
|
|
Отправлено: 09.02.20 17:12. Заголовок: PS Потерял ф-ю *--..
PS Потерял ф-ю Скрытый текст
*----------------------------------------------------------------------------* FUNC TxtWidth( cText, cFontName, nFontSize, cChr ) // get the width of the text *----------------------------------------------------------------------------* LOCAL hFont, nWidth LOCAL lFont := ! HB_ISNUMERIC(cFontName) DEFAULT cChr := 'A' IF VALTYPE( cText ) == 'N' cText := REPLICATE( cChr, cText ) ENDIF DEFAULT cText := REPLICATE( cChr, 2 ), ; cFontName := _HMG_DefaultFontName, ; nFontSize := _HMG_DefaultFontSize If lFont; hFont := InitFont( cFontName, nFontSize ) Else ; hFont := cFontName EndIf nWidth := GetTextWidth( 0, cText + cChr, hFont ) If lFont; DeleteObject( hFont ) EndIf RETURN nWidth Увидел ошибки tsbrowse.ch #xcommand @ <row>,<col> TBROWSE <name> ; ... [ <load: LOADFIELEDS> ] ; ... h_tsbrowse.prg FUNCTION _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight, ; ... DEFINE COLUMN oCol DATA 'hb_ntos(iif( IndexOrd() > 0, ORDKEYNO(), RecNo() ))' ; HEADER '#' ; FOOTER ' ' ; ALIGN 1, 1, 1 ; WIDTH TxtWidth(6) ; PICTURE '9999999' ; MOVE 0 ; DBLCURSOR ; NAME ORDKEYNO ...
|
| |
|
|
| постоянный участник
|
Пост N: 6582
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.02.20 09:56. Заголовок: SergKis пишет: Изме..
SergKis пишет: цитата: | Изменения ch файла показаны на версию Минигуи 2.07. prg файл взял от hmg 20.01 и наложил из своей версии |
| А почему эти изменения нельзя добавить в основную версию МиниГуи ? Это же всем тоже будет удобно.
| |
|
|
| постоянный участник
|
Пост N: 3043
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.02.20 11:49. Заголовок: Andrey пишет А почем..
Andrey пишет цитата: | А почему эти изменения нельзя добавить в основную версию МиниГуи ? |
| Повторю, у меня нет и не будет bcc 5.8, потому последние hmg только скачиваю. Могу сделать, отладить в версию hmg 19.09 вместе с примером
| |
|
|
| постоянный участник
|
Пост N: 3045
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.02.20 12:57. Заголовок: SergKis пишет Могу с..
SergKis пишет цитата: | Могу сделать, отладить в версию hmg 19.09 вместе с примером |
| Тут для hmg 19.09, если интересно https://TransFiles.ru/ff1ig
| |
|
|
| постоянный участник
|
Пост N: 3046
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.02.20 14:01. Заголовок: PS В CBru.prg надо п..
PS В CBru.prg надо поправить (в моей версии объект дает :ClientHeight уже без :StatusBar:Height) nW := oWnd:ClientWidth - nX * 2 nH := oWnd:ClientHeight - nY - oWnd:StatusBar:Height ...
| |
|
|
| постоянный участник
|
Пост N: 6584
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.02.20 15:59. Заголовок: SergKis пишет: Повт..
SergKis пишет: цитата: | Повторю, у меня нет и не будет bcc 5.8, потому последние hmg только скачиваю. Могу сделать, отладить в версию hmg 19.09 вместе с примером |
| Так я беру и правлю пути под BCC 5.5.1, и всех делов то... Под bcc 5.8 у меня тоже не всё компилирует, сборщик ресурсов глючит. SergKis пишет: цитата: | Тут для hmg 19.09, если интересно |
| Конечно интересно. Странно, под 20.01 (Update 3) не работает... Собрал и вылет с ошибкой: Error BASE/1066 Argument error: conditional Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from TSBROWSE:MOUSEMOVE(9574) in module: h_tbrowse.prg Called from TCONTROL:HANDLEEVENT(913) in module: TControl.prg Called from TSBROWSE:HANDLEEVENT(8687) in module: h_tbrowse.prg Called from EVENTS(95) in module: h_events.prg Called from DOMESSAGELOOP(0) Called from _ACTIVATEWINDOW(1494) in module: h_windows.prg Called from DOMETHOD(5379) in module: h_controlmisc.prg Called from MAIN(127) in module: CBru.prg А понял в чём ошибка. Добавил в проект h_tbrowse.prg и всё заработало... А в стандартный МиниГуи добавить нельзя эти изменения из h_tbrowse.prg ? Григорий, посмотри пожалуйста разницу в h_tbrowse.prg !
| |
|
|
| moderator
|
Пост N: 1652
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.02.20 17:48. Заголовок: Andrey пишет: в ста..
Andrey пишет: цитата: | в стандартный МиниГуи добавить нельзя эти изменения из h_tbrowse.prg ? |
| Добавил эти изменения, за исключением обработки символов ";" и "\" в заголовках и персональных установок для Tbrowse, которые есть в коде. Собрал этот пример - работает (и выглядит) идентично оригиналу.
| |
|
|
| постоянный участник
|
Пост N: 3047
Зарегистрирован: 17.02.12
|
|
Отправлено: 10.02.20 18:53. Заголовок: gfilatov2002 пишет Д..
gfilatov2002 пишет Поправить надо Function _DefineTBrowse ( ControlName, ParentFormName, nCol, nRow, nWidth, nHeight,; ... oBrw:InsColumn( nColNumber, oCol ) oBrw:nCell := nColNumber + 1 oBrw:nFreeze := nColNumber oBrw:lLockFreeze := .T. IF HB_ISNUMERIC(nW) .and. nW > 0 oBrw:GetColumn(nColNumber):nWidth := nW ENDIF ...
| |
|
|
| moderator
|
Пост N: 1653
Зарегистрирован: 11.02.10
|
|
Отправлено: 10.02.20 22:09. Заголовок: SergKis пишет: Попр..
SergKis пишет: Поправил. Благодарю за помощь
| |
|
|
| постоянный участник
|
Пост N: 6585
Зарегистрирован: 12.09.06
|
|
Отправлено: 10.02.20 22:52. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | Собрал этот пример - работает (и выглядит) идентично оригиналу. |
| Классно ! Ждем с нетерпением новую версию !
| |
|
|
| постоянный участник
|
Пост N: 3153
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.20 20:08. Заголовок: Haz пишет Добавь к ..
Haz пишет цитата: | Добавь к :GetColumn("Name"):cPicture := "@R " + Replicate("X", 50) именно @R c пробелом(иногда и по два и более делаю) , будет отступ от вертикальной линии ЗЫ я такими шаблонами вложенность строк в структурах показываю ... для показа шаблон со сдвигом, в :prevedit меняю на обычный, в :editexit восстанавливаю сдвиг. Сам сдвиг храниться в спец поле indent, количество пробелов в шаблоне равно indent*2 |
| Попробовал использовать Picture "@R " + Replicate("X", 50) с заменой, как то не зашло, т.к. picture почти нигде не задаю (на default упор) Вернулся к реализации с пробелами, но залез в CLASS TsBrowse, ввел переменную, поправил методы Скрытый текст
DATA nCellMarginLR // space margin left or right cell ... METHOD DrawHeaders( lFooters ) CLASS TSBrowse ... Local nCellMarginLR, aTmp, cTmp, nK, nN ... IF nAlign != 1 .and. ::nCellMarginLR != NIL nCellMarginLR := If( Valtype( ::nCellMarginLR ) == "B", Eval( ::nCellMarginLR, nJ, Self, oColumn, nAlign, 1 ), ::nCellMarginLR ) IF HB_ISNUMERIC( nCellMarginLR ) .and. nCellMarginLR > 0 IF lMultiLine aTmp := hb_ATokens(uData, CRLF) cHeading := '' nN := Len(aTmp) FOR nK := 1 TO nN cTmp := aTmp[ nK ] IF nAlign == 0 ; cTmp := space( nCellMarginLR ) + cTmp ELSEIF nAlign == 2 ; cTmp += space( nCellMarginLR ) ENDIF cHeading += cTmp + iif( nK == nN, "", CRLF ) NEXT ELSE IF nAlign == 0 ; cHeading := space( nCellMarginLR ) + cHeading ELSEIF nAlign == 2 ; cHeading += space( nCellMarginLR ) ENDIF ENDIF ENDIF ENDIF TSDrawCell( hWnd, ; // 1 hDC, ; // 2 0, ; // 3 nStartCol, ; // 4 aColSizes[ nJ ] + nDeltaLen, ; // 5 cHeading, ; // 6 ... If ::lFooting .and. ::lDrawFooters ... IF nAlign != 1 .and. HB_ISCHAR(cFooting) .and. ::nCellMarginLR != NIL nCellMarginLR := If( Valtype( ::nCellMarginLR ) == "B", Eval( ::nCellMarginLR, nJ, Self, oColumn, nAlign, 2 ), ::nCellMarginLR ) IF HB_ISNUMERIC( nCellMarginLR ) .and. nCellMarginLR > 0 IF lMultiLine aTmp := hb_ATokens(uData, CRLF) cFooting := '' nN := Len(aTmp) FOR nK := 1 TO nN cTmp := aTmp[ nK ] IF nAlign == 0 ; cTmp := space( nCellMarginLR ) + cTmp ELSEIF nAlign == 2 ; cTmp += space( nCellMarginLR ) ENDIF cFooting += cTmp + iif( nK == nN, "", CRLF ) NEXT ELSE IF nAlign == 0 ; cFooting := space( nCellMarginLR ) + cFooting ELSEIF nAlign == 2 ; cFooting += space( nCellMarginLR ) ENDIF ENDIF ENDIF ENDIF TSDrawCell( hWnd, ; // 1 hDC, ; // 2 ::nRowCount(), ; // 3 nStartCol, ; // 4 aColSizes[nJ] + nDeltaLen, ; // 5 cFooting, ; // 6 ... METHOD DrawLine( xRow ) CLASS TSBrowse ... Local nCellMarginLR, aTmp, cTmp, nK, nN ... IF nAlign != 1 .and. ::nCellMarginLR != NIL nCellMarginLR := If( Valtype( ::nCellMarginLR ) == "B", Eval( ::nCellMarginLR, nJ, Self, oColumn, nAlign, 0 ), ::nCellMarginLR ) IF HB_ISNUMERIC( nCellMarginLR ) .and. nCellMarginLR > 0 IF lMultiLine aTmp := hb_ATokens(uData, CRLF) uData := '' nN := Len(aTmp) FOR nK := 1 TO nN cTmp := aTmp[ nK ] IF nAlign == 0 ; cTmp := space( nCellMarginLR ) + cTmp ELSEIF nAlign == 2 ; cTmp += space( nCellMarginLR ) ENDIF uData += cTmp + iif( nK == nN, "", CRLF ) NEXT ELSE IF nAlign == 0 ; uData := space( nCellMarginLR ) + uData ELSEIF nAlign == 2 ; uData += space( nCellMarginLR ) ENDIF ENDIF ENDIF ENDIF TSDrawCell( hWnd, ; // 1 hDC, ; // 2 xRow, ; // 3 nStartCol , ; // 4 aColSizes[ nJ ] + nDeltaLen, ; // 5 uData, ; // 6 ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... Local nCellMarginLR, aTmp, cTmp, nK, nN ... IF nAlign != 1 .and. ::nCellMarginLR != NIL nCellMarginLR := If( Valtype( ::nCellMarginLR ) == "B", Eval( ::nCellMarginLR, nJ, Self, oColumn, nAlign, 0 ), ::nCellMarginLR ) IF HB_ISNUMERIC( nCellMarginLR ) .and. nCellMarginLR > 0 IF lMulti aTmp := hb_ATokens(uData, CRLF) uData := '' nN := Len(aTmp) FOR nK := 1 TO nN cTmp := aTmp[ nK ] IF nAlign == 0 ; cTmp := space( nCellMarginLR ) + cTmp ELSEIF nAlign == 2 ; cTmp += space( nCellMarginLR ) ENDIF uData += cTmp + iif( nK == nN, "", CRLF ) NEXT ELSE IF nAlign == 0 ; uData := space( nCellMarginLR ) + uData ELSEIF nAlign == 2 ; uData += space( nCellMarginLR ) ENDIF ENDIF ENDIF ENDIF TSDrawCell( hWnd, ; // 1 hDC, ; // 2 nRowPos, ; // 3 nStartCol, ; // 4 aColSizes[ nJ ] + nDeltaLen, ; // 5 uData, ; // 6 ...
| Если :nCellMarginLR задан блоком кода, то передаются параметры в него - номер колонки - объект тсб oBrw - объект колонки - и тип вызова 0 - линия тсб ( :DrawLine(), :DrawSelect() ) 1 - Header ( :DrawHeader() ) 2 - Footer ( :DrawFooter() ) Eval( ::nCellMarginLR, nJ, Self, oColumn, nAlign, 0 ) Если возвращает число пробелов > 0, то делается margin Left or Right Попробовал в простом примере, без блока - работает и по мне, удобно в использовании.
| |
|
|
|
| постоянный участник
|
Пост N: 3154
Зарегистрирован: 17.02.12
|
|
Отправлено: 02.05.20 20:15. Заголовок: PS В предпросмотре р..
PS В предпросмотре ровненько показывает, как и в редакторе, а включение в тему и текст прыгает тудой-сюдой.
| |
|
|
| |
Пост N: 1544
Зарегистрирован: 20.02.11
|
|
Отправлено: 02.05.20 23:26. Заголовок: SergKis пишет: зале..
SergKis пишет: цитата: | залез в CLASS TsBrowse, ввел переменную, поправил методы |
| Сергей. Давно тоже хотел зашить в методы колонки. Правда реализация через блоки показалась слишком сложной. Пошёл по пути пикчи на основании значения спец поля. Если и вводить переменную то в клас колонки, при этом учитывая что тип может быть не только символьный. А тут кроме пикчи в голову ничего не приходит Ps. Кстати не нравится что значения числовых полей прилипают вплотную к правой линии.... И тут тоже пикчей дополняют пробелы
| |
|
|
| постоянный участник
|
Пост N: 3155
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.20 07:11. Заголовок: Haz пишет Кстати не ..
Haz пишет цитата: | Кстати не нравится что значения числовых полей прилипают вплотную к правой линии.... |
| Игорь, мне тоже не нравится такое прилипание еще и символьных (другие тоже) полей вплотную к левой линии. Сделанная переменная на класс это, в первую очередь, исправить прижимание к границе\линии, задав 1 или 2 получается приличный вид всех колонок с DT_LEFT, DT_RIGHT. Особенно это заметно при задании цвета отрицательным значением, т.е. обводка ячеек линией. Пока такой пример Tsb_array_2\demo3.prg и пробовал. цитата: | Если и вводить переменную то в клас колонки, при этом учитывая что тип может быть не только символьный |
| Тоже была такая мысль, но решил ограничится, пока, переменной класса, передавая в блок параметры oColumn, nAlign и тип вызова ( 0 для строки, 1 header, 2 footer ). Т.е. для колонки с опред. именем и nAlign можно вернуть числовое нужное смещение, для всех других, к примеру 1 для отступа от линии.
| |
|
|
| постоянный участник
|
Пост N: 3156
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.20 10:32. Заголовок: PS Сделал эти измене..
PS Сделал эти изменения только в своей версии. Надо такое в hmg или усиливать по колонкам, а может, вообще, лишнее ?
| |
|
|
| |
Пост N: 1545
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.05.20 12:15. Заголовок: SergKis пишет: Надо..
SergKis пишет: цитата: | Надо такое в hmg или усиливать по колонкам, а может, вообще, лишнее ? |
| По колонками может пригодиться. С мультилайном мысль интересная, её шаблоном не сделать. И может слева и права иметь возможность дополнять не только пробелами, можно использовать псевдографику для рисования псевдо дерева к примеру. То есть блок выдает не число, а строку. Я не занимался этим вопросом серьёзно, для решения локальной задачи играл с шаблонами т. к. они независимы от типа данных. Была даже мысль добавить переменные cLPicture и cRPicture, для добавления стандартного слева справа перед применением. Потом компания купила Битрикс и пришлось с головой уйти в синхронизацию данных с этой витриной посредством rest запросов и написанием своего вэб сервера. Поэтому бросил. Может тут все выскажут свое мнение? Мне все же как-то с шаблонами справа и слева через блоки больше нравится, универсальное, но и твоё предложение тоже полезно
| |
|
|
| постоянный участник
|
Пост N: 3157
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.20 12:39. Заголовок: Haz пишет И может сл..
Haz пишет цитата: | И может слева и права иметь возможность дополнять не только пробелами, можно использовать псевдографику для рисования псевдо дерева к примеру. |
| Добавить проверку возврата на строку и добавлять ее, это реально и просто. Делать переменные в класс колонки, пока не знаю, может в будущем. Тогда переменная из tsbrowse класса определяет глобальную установку отступа колонок DT_LEFT, DT_RIGHT, если задано в классе колонки, то подменять общее значение на значение полученное из колонки. Но, думается, решить это можно для колонки и от переменной из tsbrowse класса
| |
|
|
| |
Пост N: 1546
Зарегистрирован: 20.02.11
|
|
Отправлено: 03.05.20 17:07. Заголовок: SergKis пишет: Но, ..
SergKis пишет: цитата: | Но, думается, решить это можно для колонки и от переменной из tsbrowse класса |
| Да, согласен. Можно так для строкового значения сделать. В процессе использования придёт понимание чего не хватает
| |
|
|
| постоянный участник
|
Пост N: 3162
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.20 18:56. Заголовок: Haz Вот что получил..
Haz Вот что получилось hmg 20.04. Изменения тсб Скрытый текст
CLASS TSBrowse FROM TControl ... DATA nCellMarginLR // space margin left or right cell ... If HB_ISNUMERIC( oColumn:nHLineStyle ) nLineStyle := oColumn:nHLineStyle EndIf IF nAlign != DT_CENTER .and. ::nCellMarginLR != NIL cHeading := ::CellMarginLeftRight( nJ, cHeading, oColumn, nAlign, lMultiLine, 0 ) ENDIF TSDrawCell( hWnd, ; // 1 ... If ::lFooting .and. ::lDrawFooters ... If HB_ISNUMERIC( oColumn:nFLineStyle ) nLineStyle := oColumn:nFLineStyle EndIf IF nAlign != DT_CENTER .and. ::nCellMarginLR != NIL cFooting := ::CellMarginLeftRight( nJ, cFooting, oColumn, nAlign, lMultiLine, 0 ) ENDIF TSDrawCell( hWnd, ; // 1 ... METHOD DrawLine( xRow ) CLASS TSBrowse ... Else l3DText := nClr3dL := nClr3dS := Nil EndIf IF nAlign != DT_CENTER .and. ::nCellMarginLR != NIL uData := ::CellMarginLeftRight( nJ, uData, oColumn, nAlign, lMultiLine, 0 ) ENDIF TSDrawCell( hWnd, ; // 1 ... METHOD DrawSelect( xRow, lDrawCell ) CLASS TSBrowse ... If lDrawCell IF nAlign != DT_CENTER .and. ::nCellMarginLR != NIL uData := ::CellMarginLeftRight( nJ, uData, oColumn, nAlign, lMulti, 0 ) ENDIF lDraw := TSDrawCell( hWnd, ; // 1 ... METHOD CellMarginLeftRight( nJ, cData, oColumn, nAlign, lMultiLine, nOut ) CLASS TSBrowse Local nCellMarginLR, aTmp, cTmp, nK, nN, cBuf Local uTmp := ::nCellMarginLR nCellMarginLR := If( Valtype( uTmp ) == "B", Eval( uTmp, nJ, Self, oColumn, nAlign, nOut ), uTmp ) IF HB_ISNUMERIC ( nCellMarginLR ) ; cBuf := space( nCellMarginLR ) ELSEIF HB_ISCHAR( nCellMarginLR ) ; cBuf := nCellMarginLR ENDIF IF HB_ISCHAR( cBuf ) .and. Len( cBuf ) > 0 DEFAULT cData := "" IF lMultiLine aTmp := hb_ATokens( cData, CRLF ) cData := '' nN := Len( aTmp ) FOR nK := 1 TO nN cTmp := aTmp[ nK ] IF nAlign == DT_LEFT ; cTmp := cBuf + cTmp ELSEIF nAlign == DT_RIGHT ; cTmp += cBuf ENDIF cData += cTmp + iif( nK == nN, "", CRLF ) NEXT ELSE IF nAlign == DT_LEFT ; cData := cBuf + cData ELSEIF nAlign == DT_RIGHT ; cData += cBuf ENDIF ENDIF ENDIF RETURN cData
| Пример demo5.prg и h_tbrowse.prg тут https://TransFiles.ru/zkhi1
| |
|
|
| постоянный участник
|
Пост N: 3163
Зарегистрирован: 17.02.12
|
|
Отправлено: 03.05.20 19:00. Заголовок: PS Запуск demo5.exe..
PS Запуск demo5.exe без параметров - работа с массивом demo5.exe * работа с dbf demo5.exe * 7 работа с dbf только 7 полей
| |
|
Ответов - 46
, стр:
1
2
3
All
[только новые]
|
|
|