On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
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:....



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


Andrey
постоянный участник




Пост N: 5658
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 23.12.17 22:41. Заголовок: Чтобы не было путани..


Чтобы не было путаницы, описываю кратко задачу которую делаю.
1) На форму вывожу таблицу из ОДНОЙ строки 26 колонок. Просто для краткости.
2) Далее эту таблицу удаляю и меняю на нужную - пусть будет 50 записей и 8 колонок.

Вылет происходит при присваивании нового массива в таблицу.
Пробовал двумя методами:
 
ADD ITEM aArray[ nI ] TO &cBrw OF &cForm
и
aRows := Array(1, 8)
aRows[1][1] := aArray[nI,1]
.....
oBrw1:AddItem( aRows[1] )

Полазив по h_tbrowse.prg понял что там не правильно определяется размер колонок.
Остаётся старая длина колонок - 26.
Исходник h_tbrowse.prg строка 10558:
 
nColumns := If( ! Empty( aHead ), Len( aHead ), If( ! Empty( ::aArray ), Len( ::aArray[ 1 ] ), 0 ) )
::aDefValue := Array( Len( aArray[ 1 ] ) )
? "--------- h_tbrowse.prg nColumns=",nColumns // моя отладка возвращает 26
? "Len( aHead )=", Len( aHead ), "Len( ::aArray[ 1 ] )=", Len( ::aArray[ 1 ] ) // моя отладка возвращает 26 и 8
For nI := 1 To nColumns
...........


Вопрос - как у себя в программе обнулить массив - aHead который в h_tbrowse.prg ?
Почему не срабатывает удаление колонок для массива заголовков таблицы, т.е. не работает этот код:
   nCol  := oBrw1:nColCount()  // сколько колонок в текущем массиве 
nColMax := LEN(aDim[1]) // сколько колонок в новом массиве

For nI := nColMax + 1 To nCol
oBrw1:DelColumn( nI )
Next

Может я не так удаляю ?




Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1571
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.12.17 01:32. Заголовок: Просто для краткости..


Просто для краткости - лезьте снова в h_tbrowse.prg и попытайтесь понять, как же работает метод DelColumn

..
hb_ADel( ::aColumns, nPos, .T. ) // это в виде бонуса
..


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1147
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 10:38. Заголовок: Петр пишет: лезьте..


Петр пишет:

 цитата:
лезьте снова в h_tbrowse.prg


Это правильный посыл.
Петр пишет:

 цитата:
это в виде бонуса


Петр, это надо расписать подробнее для Андрея . Когда допиливалось заполнение бровса из массивов параметров, метод ::DelColumn(), прошли мимо.
Думаю просто до него не дошли в тестах.
Андрей в исходнике правильно нашёл 2 ключевых места.
1) количество колонок приоритено определяется по длинне массива заголовков
2) ::DelColumn не меняет массивы заголовков, шаблонов, и выравнивания.
Но поскольку все это определено в данных объекта бровса, то легко доступно из прикладной программы.
Вопрос Андрея понимаю так "как удалить элемент из массива?"
И вот тут короче чем твой бонус уже не скажешь.

PS. Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками.

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5659
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 11:21. Заголовок: Haz пишет: Но по бо..


Haz пишет:

 цитата:
Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками.


Да, это было бы отлично !
Но увы, я не смогу, знаний у меня пока ещё не хватает...
Если не сложно, сделайте пожалуйста это.
Всё равно потом другой кто-то наткнётся на эти

Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1679
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 11:43. Заголовок: У нас уже была диску..


У нас уже была дискуссия по oBrw:DelColumn() nn времени назад.
Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб.
Кинул пример Андрею, пусть поделится, если хочет, там его небольшая база использована

Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1148
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 11:54. Заголовок: Andrey пишет: Но ув..


Andrey пишет:

 цитата:
Но увы, я не смогу, знаний у меня пока ещё не хватает...


Не пойму какие знания нужны для 1 строки кода
 
MEIHOD DelColumn()
...
...
oCol := ::aColumns[ nPos ]
ARRDEL_( ::aColumns, nPos )
ARRDEL_( ::aColSizes, nPos )
ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве
...
...


можно попутно резануть и массивы
::aFormatPic
::aJustify
но на расчет nColumns в методе StArray/SetArrayTo они не влияют.


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1149
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 12:04. Заголовок: SergKis пишет: У на..


SergKis пишет:

 цитата:
У нас уже была дискуссия по oBrw:DelColumn() nn времени назад.
Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб



Сергей , я видимо пропустил эту дискуссию или был в коматозе от работы. Но даже в случае отказа от ::DelColumn - не велика потеря, хотя для полноты класса он нужен. Всегда можно написать свою функцию при необходимости. Я использую иногда у себя DelColumn тк это быстрее чем собирать сложный бровс. А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет ))
Release и пересоздание использую только когда на этом месте нужно показать другой бровс

Вообще интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns )




Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1680
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 13:16. Заголовок: Haz пишет интересно ..


Haz пишет
 цитата:
интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns )


ответ на кусочке из примера
 
STATIC FUNCTION MyTest()
LOCAL aArray, aHead, aSize, aFoot, aPict, aAlign, aName, aFontHF
LOCAL oBrw := _HMG_aControlIds [ (This.oBrw.Index) ]
LOCAL cForm := oBrw:cParentWnd
LOCAL cBrw := oBrw:cControlName
LOCAL nSet := This.Cargo // это StatusBar.Cargo

If empty(nSet)
aArray := AClone( ThisWindow.Cargo[ 1 ] )
aHead := ASize(AClone( ThisWindow.Cargo[ 2 ] ), 6)

aSize := ASize(AClone( ThisWindow.Cargo[ 3 ] ), 6)
aFoot := ASize(AClone( ThisWindow.Cargo[ 4 ] ), 6)
aPict := ASize(AClone( ThisWindow.Cargo[ 5 ] ), 6)
aAlign := ASize(AClone( ThisWindow.Cargo[ 6 ] ), 6)
aName := ASize(AClone( ThisWindow.Cargo[ 7 ] ), 6)
This.Cargo := 1
Else
aArray := AClone( ThisWindow.Cargo[ 1 ] )
aHead := AClone( ThisWindow.Cargo[ 2 ] )

aSize := AClone( ThisWindow.Cargo[ 3 ] )
aFoot := AClone( ThisWindow.Cargo[ 4 ] )
aPict := AClone( ThisWindow.Cargo[ 5 ] )
aAlign := AClone( ThisWindow.Cargo[ 6 ] )
aName := AClone( ThisWindow.Cargo[ 7 ] )
This.Cargo := 0
EndIf

_ReleaseControl(cBrw, cForm) // delete picture object

oBrw := CreateTsb(cBrw, cForm, aArray, aHead, aSize, aFoot, aPict, aAlign, aName)

RETURN Nil

т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1681
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 13:28. Заголовок: Haz пишет ::DelColum..


Haz пишет
 цитата:
::DelColumn - не велика потеря, хотя для полноты класса он нужен.



Но лезть в класс, лично у меня, нет сил, если кто то ...

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5660
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 14:48. Заголовок: Haz пишет: Не пойму..


Haz пишет:

 цитата:
Не пойму какие знания нужны для 1 строки кода



А кто ж знал что нужно добавить только 1 строчку ?
Я думал, что кучу всего тащить придётся !

Haz пишет:

 цитата:
можно попутно резануть и массивы
::aFormatPic
::aJustify
но на расчет nColumns в методе StArray/SetArrayTo они не влияют.


Нужно ОБЯЗАТЕЛЬНО !
Т.е. если не переопределить, то при присвоении новых данных будет вылет по ошибке.

Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1572
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 24.12.17 14:55. Заголовок: Для Andrey Не вника..


Для Andrey

Не вникая в реализацию DelColumn, могу сказать, что он не заточен на удаление столбцов в цикле

procedure main() 

local aTest := Array( 26 )

local nSize := Len( aTest )
local i := 8

for i := i + 1 to nSize
? i, nSize, Len( hb_ADel( aTest, i, .T. ) )
next


ps. по крайней мере это относится к циклу for, который вы собрались использовать

Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5661
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 16:24. Заголовок: Haz пишет: MEIHOD D..


Haz пишет:

 цитата:
MEIHOD DelColumn()
...
...
oCol := ::aColumns[ nPos ]
ARRDEL_( ::aColumns, nPos )
ARRDEL_( ::aColSizes, nPos )
ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве
...



Не могу найти это кусок кода. Брал последний МиниГуи 17.12, в исходнике h_tbrowse.prg:
* ============================================================================ 
* METHOD TSBrowse:DelColumn() Version 9.0 Nov/30/2009
* ============================================================================
METHOD DelColumn( nPos ) CLASS TSBrowse
..........
Строка 2078:
oCol := ::aColumns[ nPos ]
hb_ADel( ::aColumns, nPos, .T. )
hb_ADel( ::aColSizes, nPos, .T. )


То или не то ?


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1150
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 17:17. Заголовок: Andrey пишет: То ил..


Andrey пишет:

 цитата:
То или не


То, у меня видимо старее версия.


Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1151
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 24.12.17 17:39. Заголовок: Сергей пишет : Но ле..


Сергей пишет :

 цитата:
Но лезть в класс, лично у меня, нет сил,


Аналогично, только если мелкими шагами. Поскольку этот класс в последние годы активно меняется
Вижу только вариант постепенного доведения до условно оптимального.
Что касается SetArray или SetArrayto, испозую редко. Но именно SetArrayTo логично востребован.
У меня есть свой типа ComboBox на основе бровса. Для разных полей нужен разный выбор, и тут SetArrayTo отлично вписался.


Спасибо: 0 
Профиль
SergKis
постоянный участник




Пост N: 1682
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 24.12.17 18:16. Заголовок: Игорь пишет и тут Se..


Игорь пишет
 цитата:
и тут SetArrayTo отлично вписался.


У меня, большинство, чтение csv и txt файлов. Типа ранее сохраненных hb_memowrit(cFile, hb_valtoexp(aArray)) потом читаемых
aArray := &( hb_memoread(cFile) ) или
aTemp := hb_ATokens(hb_memoread(cFile), CRLF)
aArray := {}; AEVal(aTemp, {|cv| iif( empty(cv), Nil, AAdd(aArray, &cv) ) })
и т.д., т.е. отчеты\отборы, прием\обмен табл.данными


Спасибо: 0 
Профиль
Andrey
постоянный участник




Пост N: 5662
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 24.12.17 20:44. Заголовок: Григорий - можно сде..


Григорий - можно сделать правку в исходнике ?
последний МиниГуи 17.12, в исходнике h_tbrowse.prg:
* ============================================================================  
* METHOD TSBrowse:DelColumn() Version 9.0 Nov/30/2009
* ============================================================================
METHOD DelColumn( nPos ) CLASS TSBrowse
..........
Строка 2078:
oCol := ::aColumns[ nPos ]
hb_ADel( ::aColumns, nPos, .T. )
hb_ADel( ::aColSizes, nPos, .T. )
hb_ADel( ::aHeaders, nPos, .T. ) // новая строка
hb_ADel( ::aFormatPic, nPos, .T. ) // новая строка


С этой правкой мой проект заработал !
Т.е. удаление столбцов и присваивание новых массивов и показ новой таблицы проходит отлично !
Единственно что не проверил это добавление новых столбцов. Но это уже чуть позже.

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




Пост N: 1219
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 24.12.17 23:10. Заголовок: Andrey пишет: можн..


Andrey пишет:

 цитата:
можно сделать правку в исходнике ?


Да, конечно.
По итогу обсуждения добавил такие строки

 цитата:
 
If ValType( ::aHeaders ) == "A" .and. Len( ::aHeaders ) >= nPos
hb_ADel( ::aHeaders, nPos, .T. )
EndIf
If ValType( ::aFormatPic ) == "A" .and. Len( ::aFormatPic ) >= nPos
hb_ADel( ::aFormatPic, nPos, .T. )
EndIf



Спасибо: 0 
Профиль
Петр
постоянный участник


Пост N: 1573
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 25.12.17 00:05. Заголовок: gfilatov2002 пишет: ..


gfilatov2002 пишет:

 цитата:
По итогу обсуждения добавил такие строки



Григорий, проверки здесь излишние.
hb_ADel и так их выполняет, не сваливаясь при этом в обработчик ошибок.

Спасибо: 0 
Профиль
ММК
постоянный участник


Пост N: 308
Зарегистрирован: 29.05.10
ссылка на сообщение  Отправлено: 25.12.17 17:39. Заголовок: Haz пишет: А вот H..


Haz пишет:

 цитата:
А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет ))


— Соломон Моисеевич, вы любите жизнь?
— Люблю!
— А почему?
— А куда деваться?
SergKis пишет:

 цитата:
т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.


Правый клик по шапке и в меню. Убрал птичку -нет столбца. Поставил птичку - есть столбец ...






Спасибо: 0 
Профиль
Haz
администратор




Пост N: 1152
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 25.12.17 20:27. Заголовок: ММК пишет: Убрал пт..


ММК пишет:

 цитата:
Убрал птичку -нет столбца. Поставил птичку - есть столбец ...


Да спрятать или показать колонку не сложно. я высказал свое отношение к спрятанным колонкам.
Мне проще её удалить, чем тянуть в бровсе лишнее. Да и от удаления колонки поле в базе никуда не денется.
В качестве абсурда можно сделать пример бровса из 200 колонок и скрыть от 5 и далее все остальное , потом сдвинуться вправо дальше 5. Такой пример скорее не логичен, но демонстрирует хорошо.
Кстати то что делает Андрей ( перестраивает бровс по колонкам удаляя лишние и добавляя нужные)
Я тоже использую. К примеру классический бюджет подразделения по статьям, левая часть названия, статьи, коды. Правая часть движение денег по периодам. При этом периоды произвольные, если за год по дням то их 365, если по месяцам 12, если по неделям то 52(53). Тупо строю SQL запрос на нужное число периодов, удаляю правую часть бровса и подсунув ему новую рабочую область добавляю колонки. Бюджет из поквартального с 4 колонками превращается в недельный с 52 за 2 секунды. В подням на тригода вперёд за 5 сек, а это 1000 полей. Ясно что практически такая детализация не нужна, но эффект впечатляет.
Так это я к тому, если бы я прятал колонки, то сколько мне их нужно было заранее держать в бровсе

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