Автор | Сообщение |
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:....
|
|
|
Ответов - 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 Может я не так удаляю ?
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1571
Зарегистрирован: 09.10.06
|
|
Отправлено: 24.12.17 01:32. Заголовок: Просто для краткости..
Просто для краткости - лезьте снова в h_tbrowse.prg и попытайтесь понять, как же работает метод DelColumn .. hb_ADel( ::aColumns, nPos, .T. ) // это в виде бонуса ..
|
|
|
Haz
|
| |
Пост N: 1147
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.12.17 10:38. Заголовок: Петр пишет: лезьте..
Петр пишет: цитата: | лезьте снова в h_tbrowse.prg |
| Это правильный посыл. Петр пишет: Петр, это надо расписать подробнее для Андрея . Когда допиливалось заполнение бровса из массивов параметров, метод ::DelColumn(), прошли мимо. Думаю просто до него не дошли в тестах. Андрей в исходнике правильно нашёл 2 ключевых места. 1) количество колонок приоритено определяется по длинне массива заголовков 2) ::DelColumn не меняет массивы заголовков, шаблонов, и выравнивания. Но поскольку все это определено в данных объекта бровса, то легко доступно из прикладной программы. Вопрос Андрея понимаю так "как удалить элемент из массива?" И вот тут короче чем твой бонус уже не скажешь. PS. Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками.
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 5659
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.12.17 11:21. Заголовок: Haz пишет: Но по бо..
Haz пишет: цитата: | Но по большому счету это нужно добавить в :DelColumn() тремя аналогичными строками. |
| Да, это было бы отлично ! Но увы, я не смогу, знаний у меня пока ещё не хватает... Если не сложно, сделайте пожалуйста это. Всё равно потом другой кто-то наткнётся на эти
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 1679
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.12.17 11:43. Заголовок: У нас уже была диску..
У нас уже была дискуссия по oBrw:DelColumn() nn времени назад. Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб. Кинул пример Андрею, пусть поделится, если хочет, там его небольшая база использована
|
|
|
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 они не влияют.
|
|
|
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 )
|
|
|
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 т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.
|
|
|
SergKis
|
| постоянный участник
|
Пост N: 1681
Зарегистрирован: 17.02.12
|
|
Отправлено: 24.12.17 13:28. Заголовок: Haz пишет ::DelColum..
Haz пишет цитата: | ::DelColumn - не велика потеря, хотя для полноты класса он нужен. |
| Но лезть в класс, лично у меня, нет сил, если кто то ...
|
|
|
Andrey
|
| постоянный участник
|
Пост N: 5660
Зарегистрирован: 12.09.06
|
|
Отправлено: 24.12.17 14:48. Заголовок: Haz пишет: Не пойму..
Haz пишет: цитата: | Не пойму какие знания нужны для 1 строки кода |
| А кто ж знал что нужно добавить только 1 строчку ? Я думал, что кучу всего тащить придётся ! Haz пишет: цитата: | можно попутно резануть и массивы ::aFormatPic ::aJustify но на расчет nColumns в методе StArray/SetArrayTo они не влияют. |
| Нужно ОБЯЗАТЕЛЬНО ! Т.е. если не переопределить, то при присвоении новых данных будет вылет по ошибке.
|
|
|
Петр
|
| постоянный участник
|
Пост 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, который вы собрались использовать
|
|
|
|
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. ) То или не то ?
|
|
|
Haz
|
| |
Пост N: 1150
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.12.17 17:17. Заголовок: Andrey пишет: То ил..
Andrey пишет: То, у меня видимо старее версия.
|
|
|
Haz
|
| |
Пост N: 1151
Зарегистрирован: 20.02.11
|
|
Отправлено: 24.12.17 17:39. Заголовок: Сергей пишет : Но ле..
Сергей пишет : цитата: | Но лезть в класс, лично у меня, нет сил, |
| Аналогично, только если мелкими шагами. Поскольку этот класс в последние годы активно меняется Вижу только вариант постепенного доведения до условно оптимального. Что касается SetArray или SetArrayto, испозую редко. Но именно SetArrayTo логично востребован. У меня есть свой типа ComboBox на основе бровса. Для разных полей нужен разный выбор, и тут SetArrayTo отлично вписался.
|
|
|
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) ) }) и т.д., т.е. отчеты\отборы, прием\обмен табл.данными
|
|
|
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. ) // новая строка С этой правкой мой проект заработал ! Т.е. удаление столбцов и присваивание новых массивов и показ новой таблицы проходит отлично ! Единственно что не проверил это добавление новых столбцов. Но это уже чуть позже.
|
|
|
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 |
|
|
|
|
Петр
|
| постоянный участник
|
Пост N: 1573
Зарегистрирован: 09.10.06
|
|
Отправлено: 25.12.17 00:05. Заголовок: gfilatov2002 пишет: ..
gfilatov2002 пишет: цитата: | По итогу обсуждения добавил такие строки |
| Григорий, проверки здесь излишние. hb_ADel и так их выполняет, не сваливаясь при этом в обработчик ошибок.
|
|
|
ММК
|
| постоянный участник
|
Пост N: 308
Зарегистрирован: 29.05.10
|
|
Отправлено: 25.12.17 17:39. Заголовок: Haz пишет: А вот H..
Haz пишет: цитата: | А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет )) |
| — Соломон Моисеевич, вы любите жизнь? — Люблю! — А почему? — А куда деваться? SergKis пишет: цитата: | т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом. |
| Правый клик по шапке и в меню. Убрал птичку -нет столбца. Поставил птичку - есть столбец ...
|
|
|
Haz
|
| |
Пост N: 1152
Зарегистрирован: 20.02.11
|
|
Отправлено: 25.12.17 20:27. Заголовок: ММК пишет: Убрал пт..
ММК пишет: цитата: | Убрал птичку -нет столбца. Поставил птичку - есть столбец ... |
| Да спрятать или показать колонку не сложно. я высказал свое отношение к спрятанным колонкам. Мне проще её удалить, чем тянуть в бровсе лишнее. Да и от удаления колонки поле в базе никуда не денется. В качестве абсурда можно сделать пример бровса из 200 колонок и скрыть от 5 и далее все остальное , потом сдвинуться вправо дальше 5. Такой пример скорее не логичен, но демонстрирует хорошо. Кстати то что делает Андрей ( перестраивает бровс по колонкам удаляя лишние и добавляя нужные) Я тоже использую. К примеру классический бюджет подразделения по статьям, левая часть названия, статьи, коды. Правая часть движение денег по периодам. При этом периоды произвольные, если за год по дням то их 365, если по месяцам 12, если по неделям то 52(53). Тупо строю SQL запрос на нужное число периодов, удаляю правую часть бровса и подсунув ему новую рабочую область добавляю колонки. Бюджет из поквартального с 4 колонками превращается в недельный с 52 за 2 секунды. В подням на тригода вперёд за 5 сек, а это 1000 полей. Ясно что практически такая детализация не нужна, но эффект впечатляет. Так это я к тому, если бы я прятал колонки, то сколько мне их нужно было заранее держать в бровсе
|
|
|
Ответов - 300
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
All
[только новые]
|
|