On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
gfilatov
модератор




Пост N: 699
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 29.01.08 13:59. Заголовок: Новая версия Расширенного релиза библиотеки MiniGUI (часть VI ) (продолжение)


Начало темы находится здесь, а теперь

АНОНС * АНОНС * АНОНС * АНОНС * АНОНС

Готовится к опубликованию новая сборка №48, которая выйдет в конце недели.
Если у Вас есть интересные наработки для включения в новый релиз, то сейчас самое удобное время для их отправки мне

Кратко, что нового:

- исправление обнаруженных ошибок и неточностей кода;
- новый класс HEADERIMAGE для Grid и Browse;
- свойство Address в Hyperlink может теперь открывать папку или файл на диске;
- добавлен NOTABSTOP класс для Browse;
- поддержка пользовательских компонентов (заимствована из оффициального релиза);
- расширения и исправления в библиотеках TsBrowse и PropGrid;
- обновлены сборки Харбор и HMGS-IDE;
- новые и обновленные старые примеры (как обычно ).




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


SergKis



Пост N: 2049
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 12:56. Заголовок: Haz Haz пишет Кстати..


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]) })

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



Пост N: 2050
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 13:00. Заголовок: Haz пишет В сети вме..


Haz пишет
 цитата:
В сети вместо этого использую dbskip(0)


Это уже нюансы, в letodb skip(0) не работает, надо dbGoto(RecNo()) или leto_commit() или dbcommit()

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



Пост N: 2051
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 13:12. Заголовок: SergKis пишет Та же ..


SergKis пишет
 цитата:
Та же схема и для Clipboard


Можно использовать ф-ии AtoC и CtoA
System.Clipboard := AtoC(oRec:GetAll(.F.))
aRec := CtoA(System.Clipboard)

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


Пост N: 1336
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 13:47. Заголовок: SergKis пишет: Syst..


SergKis пишет:

 цитата:
System.Clipboard


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

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



Пост N: 2052
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 14:11. Заголовок: Haz пишет Возможно л..


Haz пишет
 цитата:
Возможно лучше и не клипбоард, а внутреннюю переменную.


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

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


Пост N: 1337
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 16:26. Заголовок: SergKis пишет: межд..


SergKis пишет:

 цитата:
между разными своими приложениями передача.


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

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



Пост N: 2053
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:09. Заголовок: Haz пишет Иногда ну..


Haz пишет
 цитата:
Иногда нужно руками перенести данные из прошлого в актуальный период


Такое проделывал, давая отметить все или выборочно (строки тсб) в переменной (по кнопке\space,dblclick,...)
Схема по памяти
 
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)) }

Таким образом в oMetka накопятся на ключ recno объект записи. Для вставки в др. место (alias) делаем
(alias)->( AEval(oMetka:GetAll(.T.)/*только объекты записи*/, {|or| dbAppend(), PutRec(or) } ) )
Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал.

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


Пост N: 1338
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 22.09.18 21:29. Заголовок: SergKis пишет: Сейч..


SergKis пишет:

 цитата:
Сейчас с :AppendRow() можно ее проделывать в AEval (др. тсб) вместо dbAppend(), PutRec(or), но еще не пробовал.


Пока никто не пробовал
Я раньше это через sql делал т. к. это было проще.
Сейчас простые перебросы можно на новом методе опробовать. Сложные все же на sql оставлю, там скорость в разы выше за счёт 100% выполнения на серваке

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



Пост N: 2054
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:31. Заголовок: PS память подвела :U..


PS
память подвела
 
: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) ) }


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



Пост N: 2055
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 22.09.18 21:40. Заголовок: Haz пишет Сложные вс..


Haz пишет
 цитата:
Сложные все же на sql оставлю


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

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


Пост N: 1339
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.09.18 10:21. Заголовок: SergKis пишет: Здес..


SergKis пишет:

 цитата:
Здесь тоже можно убыстрить


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

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



Пост N: 2056
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 23.09.18 17:10. Заголовок: Haz пишет Именно поэ..


Haz пишет
 цитата:
Именно поэтому я уже давно перескочил на ads.


Осмелюсь спросить, лицензионный. Лучше не говори, можешь только подмигнуть. :)

 цитата:
В пятницу написал аналог метода GotoRec() только с сохранением RowPos на которой стояли


Перепрыг на 1ую тоже происходит, но иногда. понять причину не удалось, но сама нужная запись держится.
Если твой new аналог фурычит, делись пожалуйста. "Моя твоя осень, осень плагодарна будет"

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


Пост N: 1340
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 23.09.18 17:34. Заголовок: SergKis пишет: може..


SergKis пишет:

 цитата:
можешь только подмигнуть. :)


Ну подмигнуть не вопрос

 цитата:
Если твой new аналог фурычит, делись пожалуйста.


В понедельник скину в виде функции. Пока думаю надо ли оно и методом не оформил

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


Пост N: 1341
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.09.18 10:45. Заголовок: Haz пишет: В понеде..


Haz пишет:

 цитата:
В понедельник скину в виде функции.


Примерно так

 
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



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



Пост N: 2057
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.18 18:16. Заголовок: Игорь, спасибо. Покр..


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

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


Пост N: 1342
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.09.18 21:50. Заголовок: SergKis пишет: Покр..


SergKis пишет:

 цитата:
Покручу, заменив :GotoRec()

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

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



Пост N: 2058
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.09.18 22:29. Заголовок: Haz пишет У меня раб..


Haz пишет
 цитата:
У меня работает без замечаний.


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

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


Пост N: 1343
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 10:28. Заголовок: SergKis пишет: Пара..


SergKis пишет:

 цитата:
Параметры и new возможности - это хорошо


Тем более когда это не просто, а очень просто
 
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
...


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


Пост N: 1344
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.09.18 16:03. Заголовок: Примерчик как работает GoRec


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

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



Пост N: 2059
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 25.09.18 19:28. Заголовок: Haz пишет Примерчик ..


Haz пишет
 цитата:
Примерчик как работает GoRec


Примерчик работает и в моей версии
Заменил у себя метод :GotoRec на предложенный, погонял на реальной задаче - полет нормальный.
Получился такой метод
 
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


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