Форум » GUI » TsBrowse в Минигуи (продолжение) » Ответить

TsBrowse в Минигуи (продолжение)

Vlad04: TsBrows определяется в виде строки ПАРМЕТРОВ объекта и их значений К примеру [quote] 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 [/quote] Здесь я собрал параметры из разных tBrows Можно или нет и какие парметры заменить выражением ( и каким) ? oBrw2:.... oBrw2:....

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

Andrey: Чтобы не было путаницы, описываю кратко задачу которую делаю. 1) На форму вывожу таблицу из ОДНОЙ строки 26 колонок. Просто для краткости. 2) Далее эту таблицу удаляю и меняю на нужную - пусть будет 50 записей и 8 колонок. Вылет происходит при присваивании нового массива в таблицу. Пробовал двумя методами:[pre2] ADD ITEM aArray[ nI ] TO &cBrw OF &cForm и aRows := Array(1, 8) aRows[1][1] := aArray[nI,1] ..... oBrw1:AddItem( aRows[1] )[/pre2] Полазив по h_tbrowse.prg понял что там не правильно определяется размер колонок. Остаётся старая длина колонок - 26. Исходник h_tbrowse.prg строка 10558:[pre2] 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 ...........[/pre2] Вопрос - как у себя в программе обнулить массив - aHead который в h_tbrowse.prg ? Почему не срабатывает удаление колонок для массива заголовков таблицы, т.е. не работает этот код: [pre2] nCol := oBrw1:nColCount() // сколько колонок в текущем массиве nColMax := LEN(aDim[1]) // сколько колонок в новом массиве For nI := nColMax + 1 To nCol oBrw1:DelColumn( nI ) Next[/pre2] Может я не так удаляю ?

Петр: Просто для краткости - лезьте снова в h_tbrowse.prg и попытайтесь понять, как же работает метод DelColumn .. hb_ADel( ::aColumns, nPos, .T. ) // это в виде бонуса ..

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


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

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

Haz: Andrey пишет: Но увы, я не смогу, знаний у меня пока ещё не хватает... Не пойму какие знания нужны для 1 строки кода [pre2] MEIHOD DelColumn() ... ... oCol := ::aColumns[ nPos ] ARRDEL_( ::aColumns, nPos ) ARRDEL_( ::aColSizes, nPos ) ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве ... ... [/pre2] можно попутно резануть и массивы ::aFormatPic ::aJustify но на расчет nColumns в методе StArray/SetArrayTo они не влияют.

Haz: SergKis пишет: У нас уже была дискуссия по oBrw:DelColumn() nn времени назад. Результатом было отказ от него, т.к. проще сделать release и пересоздать тсб как нужно, чем корячится с отладкой тсб Сергей , я видимо пропустил эту дискуссию или был в коматозе от работы. Но даже в случае отказа от ::DelColumn - не велика потеря, хотя для полноты класса он нужен. Всегда можно написать свою функцию при необходимости. Я использую иногда у себя DelColumn тк это быстрее чем собирать сложный бровс. А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет )) Release и пересоздание использую только когда на этом месте нужно показать другой бровс Вообще интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns )

SergKis: Haz пишет интересно , почему в методе SetArray ( который являлся изначальным шаблоном для твоего SetArrayTo ) количество столбцов определяется через Len( ::aHeading ), а не как Len( ::aColumns ) ответ на кусочке из примера[pre2] 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 [/pre2] т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом.

SergKis: Haz пишет ::DelColumn - не велика потеря, хотя для полноты класса он нужен. Но лезть в класс, лично у меня, нет сил, если кто то ...

Andrey: Haz пишет: Не пойму какие знания нужны для 1 строки кода А кто ж знал что нужно добавить только 1 строчку ? Я думал, что кучу всего тащить придётся ! Haz пишет: можно попутно резануть и массивы ::aFormatPic ::aJustify но на расчет nColumns в методе StArray/SetArrayTo они не влияют. Нужно ОБЯЗАТЕЛЬНО ! Т.е. если не переопределить, то при присвоении новых данных будет вылет по ошибке.

Петр: Для Andrey Не вникая в реализацию DelColumn, могу сказать, что он не заточен на удаление столбцов в цикле [pre2]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 [/pre2] ps. по крайней мере это относится к циклу for, который вы собрались использовать

Andrey: Haz пишет: MEIHOD DelColumn() ... ... oCol := ::aColumns[ nPos ] ARRDEL_( ::aColumns, nPos ) ARRDEL_( ::aColSizes, nPos ) ARRDEL_( ::aHeaders, nPos ) // можно и с проверкой что такой элемент есть в этом массиве ... Не могу найти это кусок кода. Брал последний МиниГуи 17.12, в исходнике h_tbrowse.prg: [pre2]* ============================================================================ * 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. )[/pre2] То или не то ?

Haz: Andrey пишет: То или не То, у меня видимо старее версия.

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

SergKis: Игорь пишет и тут 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: Григорий - можно сделать правку в исходнике ? последний МиниГуи 17.12, в исходнике h_tbrowse.prg: [pre2]* ============================================================================ * 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. ) // новая строка[/pre2] С этой правкой мой проект заработал ! Т.е. удаление столбцов и присваивание новых массивов и показ новой таблицы проходит отлично ! Единственно что не проверил это добавление новых столбцов. Но это уже чуть позже.

gfilatov2002: Andrey пишет: можно сделать правку в исходнике ? Да, конечно. По итогу обсуждения добавил такие строки [pre2] 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 [/pre2]

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

ММК: Haz пишет: А вот HideColumn не люблю, на бровсе с большим количеством полей визуально как резиновый "растягай" себя ведет )) — Соломон Моисеевич, вы любите жизнь? — Люблю! — А почему? — А куда деваться? SergKis пишет: т.е. достаточно сменить шапку и остальное не трогать, где то смысл есть в этом. Правый клик по шапке и в меню. Убрал птичку -нет столбца. Поставил птичку - есть столбец ...

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



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