Форум » GUI » Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение) » Ответить

Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)

gfilatov: Начало темы находится здесь, а теперь АНОНС * АНОНС * АНОНС * АНОНС * АНОНС Готовится к опубликованию новая сборка №48, которая выйдет в конце недели. Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне Кратко, что нового: - исправление обнаруженных ошибок и неточностей кода; - новый класс HEADERIMAGE для Grid и Browse; - свойство Address в Hyperlink может теперь открывать папку или файл на диске; - добавлен NOTABSTOP класс для Browse; - поддержка пользовательских компонентов (заимствована из оффициального релиза); - расширения и исправления в библиотеках TsBrowse и PropGrid; - обновлены сборки Харбор и HMGS-IDE; - новые и обновленные старые примеры (как обычно ).

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

SergKis: Haz Haz пишет Кстати да Та же схема и для Clipboard oRec := GetRec() System.Clipboard := hb_valtoexp(oRec:GetAll(.F.)) aRec := &( System.Clipboard ) // перед возможна проверка на формат { } oRec := oKeyData() AEval(aRec, {|a| oRec:Set(a[1], a[2]) })

SergKis: Haz пишет В сети вместо этого использую dbskip(0) Это уже нюансы, в letodb skip(0) не работает, надо dbGoto(RecNo()) или leto_commit() или dbcommit()

SergKis: SergKis пишет Та же схема и для Clipboard Можно использовать ф-ии AtoC и CtoA System.Clipboard := AtoC(oRec:GetAll(.F.)) aRec := CtoA(System.Clipboard)


Haz: SergKis пишет: System.Clipboard Возможно лучше и не клипбоард, а внутреннюю переменную. Тк вставка возможна в эту или такую же таблицу, но не в Word Excel paint и пр. И это даст возможность держать в клипбоард какую-то другую нужную информацию

SergKis: Haz пишет Возможно лучше и не клипбоард, а внутреннюю переменную. Я, думал, у тебя между разными своими приложениями передача. Главное в начало строки идентификатор лепить (к примеру id. таблицы) для проверки правильности переносимости, т.е. запись таблицы T123 можно перенести в T123,T105, ... что бы не сломать данные пересекающихся структур

Haz: SergKis пишет: между разными своими приложениями передача. Нет. Все в рамках одной системы, но как правило одна строка таблицы имеет несколько подчинённых таблиц. Можно использовать bAddAfter чтоб сохранить структуру подчиненности. Тут я рассуждал в общем что метод Clone может пригодиться. Ты его компактно нарисовал на основе AppendRow. Копирование в буфер и вставка из него, тоже... К примеру. Есть данные прогноза чего либо на текущий период, потом делается копия для следующего периода и актуализируется. Таким образом в системе живут временные среза по периодами, которые описывают что хотели, как все менялось и тд. Это я все о планах продаж. Иногда нужно руками перенести данные из прошлого в актуальный период. Во тут копи-пасте и годится. Системный клипбоард можно использовать. Но мне кажется внутренний буфер надёжнее, а может это параноя

SergKis: Haz пишет Иногда нужно руками перенести данные из прошлого в актуальный период Такое проделывал, давая отметить все или выборочно (строки тсб) в переменной (по кнопке\space,dblclick,...) Схема по памяти[pre2] oMetka := oKeyData() ... :UserKeys ( VK_SPACE, {|ob| (ob:cAlias)->( oMetka:Set( RecNo(), RecGet() ) ) }) :bLDblClick := {|p1,p2,p3,ob| ob:PostMsg( WM_KEYDOWN, VK_SPACE, 0 ) } oCol := :GetColumn('METKA') oCol:lCheckBox := .T. oCol:cAlias := :cAlias oCol:bData := {|| RecNo() } oCol:bDecode := {|nr| ! Empty(oMetka:Get(nr)) } [/pre2] Таким образом в oMetka накопятся на ключ recno объект записи. Для вставки в др. место (alias) делаем (alias)->( AEval(oMetka:GetAll(.T.)/*только объекты записи*/, {|or| dbAppend(), PutRec(or) } ) ) Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал.

Haz: SergKis пишет: Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал. Пока никто не пробовал Я раньше это через sql делал т. к. это было проще. Сейчас простые перебросы можно на новом методе опробовать. Сложные все же на sql оставлю, там скорость в разы выше за счёт 100% выполнения на серваке

SergKis: PS память подвела[pre2] :UserKeys ( VK_SPACE, {|ob,nr,lr| nr := (ob:cAlias)->( RecNo() ), lr := Empty(oMetka:Get(nr)), ; iif( lr,(ob:cAlias)->( oMetka:Set( nr, RecGet() ) ), oMetka:Del(nr) ) } [/pre2]

SergKis: Haz пишет Сложные все же на sql оставлю Здесь тоже можно убыстрить, в oMetka:Set( RecNo(), RecNo() ), а потом или через BM Filter выборку делать или передать массив записей на сервер и там сделать выборку из одной и вставку в др. таблицу. С :AppendRow() будет с прорисовкой, для небольших объемов скорость не так критична

Haz: SergKis пишет: Здесь тоже можно убыстрить Да, можно. В лето очень не хватает sql движка. Получился бы уникальный продукт. Все что ниже НЕ РЕКЛАМА Много из того что приходится делать для оптимизации уже есть в sql. Именно поэтому я уже давно перескочил на ads. Особенно удобно делать выборку для отчёта, таблицы можно клеить между собой вдоль и поперёк. В качестве примера который давно приводил Диме: Есть таблица с платежами -дата -контрагент (ID) -сумма выплаты -сумма поступлений -статья бюджета(ID) Так вот, за произвольный период от и до по дате это разворачивается в график движения денег с произвольный шагом от дня до квартала или полугодия итд ( это колонки) с подстановкой значения из справочников вместо ID и с группировкой по контрику или статье за миллисекунды. Остаётся только плюнуть этим в Excel. Что касается простых выборов данных, то делаю их на клиенте и тут чем больше возможностей tsb тем проще и понятнее делать. AppendRow уже использую, но пока как пользовательский метод. Появится в сборке - переключусь на него. В пятницу написал аналог метода GotoRec() только с сохранением RowPos на которой стояли. Помню пользователи жаловались что оригинальный прыгает на начало таблицы. Так что tsb становится все функциональнеё и стабильнее.

SergKis: Haz пишет Именно поэтому я уже давно перескочил на ads. Осмелюсь спросить, лицензионный. Лучше не говори, можешь только подмигнуть. :) В пятницу написал аналог метода GotoRec() только с сохранением RowPos на которой стояли Перепрыг на 1ую тоже происходит, но иногда. понять причину не удалось, но сама нужная запись держится. Если твой new аналог фурычит, делись пожалуйста. "Моя твоя осень, осень плагодарна будет"

Haz: SergKis пишет: можешь только подмигнуть. :) Ну подмигнуть не вопрос Если твой new аналог фурычит, делись пожалуйста. В понедельник скину в виде функции. Пока думаю надо ли оно и методом не оформил

Haz: Haz пишет: В понедельник скину в виде функции. Примерно так [pre2] STATIC FUNCTION GoRec(oBrw, nRec) LOCAL nRecno, nRowPos LOCAL nSkip := 0 LOCAL lMore := .T. LOCAL lSkip :=.F. if oBrw:lIsDbf oBrw:SetFocus() oBrw:nLastPos := (oBrw:cAlias)->(RecNo()) nRowPos := oBrw:nRowPos (oBrw:cAlias)->(dbGoto(nRec)) oBrw:nRowPos := 1 //подсчет числа скипов чтобы остаться на той же строке ( если возможно ) while lMore (oBrw:cAlias)->(dbSkip(-1)) nSkip ++ lMore := !(oBrw:cAlias)->(bof()) .and. nSkip < (nRowPos) lSkip := !(oBrw:cAlias)->(bof()) end oBrw:Refresh(.t., .t.) if lSkip oBrw:Skip(nSkip) end oBrw:nRowPos := nSkip oBrw:nAt := oBrw:nLogicPos() oBrw:ResetVScroll() If oBrw:bChange != Nil Eval( oBrw:bChange, oBrw, 0 ) EndIf oBrw:lHitTop := oBrw:lHitBottom := .F. do events end RETURN Nil [/pre2]

SergKis: Игорь, спасибо. Покручу, заменив :GotoRec()

Haz: SergKis пишет: Покручу, заменив :GotoRec() можно допилить и вторым параметром передавать желаемый RowPos, а по умолчанию пытаемся сохранить текущий. Так можно задавать первый, последний и вообще любой. У меня работает без замечаний. Ещё потестирую и вклею в проект.

SergKis: Haz пишет У меня работает без замечаний. У меня рабочая версия hmg 2.07, tsb по коду местами отличается (исторически) и приходится "привязываться к местности". :GotoRec мой сильно отличается от кода в hmg тек. версии. Так что, покрутить придется. Параметры и new возможности - это хорошо

Haz: SergKis пишет: Параметры и new возможности - это хорошо Тем более когда это не просто, а очень просто [pre2] STATIC FUNCTION GoRec(oBrw, nRec, nRowPos ) LOCAL nRecno, nRowPos LOCAL nSkip := 0 LOCAL lMore := .T. LOCAL lSkip :=.F. if oBrw:lIsDbf oBrw:SetFocus() oBrw:nLastPos := (oBrw:cAlias)->(RecNo()) nRowPos := oBrw:nRowPos hb_default( @nRowPos, oBrw:nRowPos ) (oBrw:cAlias)->(dbGoto(nRec)) oBrw:nRowPos := 1 ... [/pre2]

Haz: SergKis Примерчик как работает GoRec. там два бровса по одной DBF . При движении по MASTER отрабатывает SLAVE при этом строки через GoRec() тута

SergKis: Haz пишет Примерчик как работает GoRec Примерчик работает и в моей версии Заменил у себя метод :GotoRec на предложенный, погонял на реальной задаче - полет нормальный. Получился такой метод [pre2] METHOD GotoRec( nRec, nRowPos ) CLASS TSBrowse LOCAL nRecno, cAlias LOCAL nSkip := 0 LOCAL lMore := .T. LOCAL lSkip := .F. LOCAL lRet := .F. If ::lIsDbf lRet := .T. cAlias := ::cAlias ::SetFocus() ::nLastPos := (cAlias)->( RecNo() ) hb_default( @nRowPos, ::nRowPos ) (cAlias)->( dbGoto(nRec) ) ::nRowPos := 1 DO WHILE lMore (cAlias)->( dbSkip(-1) ) nSkip ++ lMore := !(cAlias)->(BOF()) .and. nSkip < (nRowPos) lSkip := !(cAlias)->(BOF()) ENDDO ::Refresh(.F., .F.) If lSkip ::Skip(nSkip) EndIf ::nRowPos := nSkip ::nAt := ::nLogicPos() ::ResetVScroll() If ::bChange != Nil Eval( ::bChange, Self, 0 ) EndIf ::lHitTop := ::lHitBottom := .F. EndIf RETURN lRet [/pre2]



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