Различное число колонок в Browse

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Здравствуй, All. (Так и хочется сказать - Здравствуй, дружок !!!
("Радионяня"))

Хочется иметь возможность создавать Browse c произвольным числом колонок.
Т.е. я точно знаю, что первая колонка у меня будет и знаю - какая именно (STRING(30)). А вот сколько колонок будет дальше - узнаю (ю) после некоторого анализа некоторой БД.
Один раз анализ дает значение - 21, другой раз -35, третий - 49 и т.д.
Как динамически создавать колонки в Browse?. И поможет ли мне в этом оператор FORMAT ?

А может кто-нибудь уже решал данную проблему или подобную ?

Буду благодарен за примерчик.

Евгений Григоров.

(Добавление)

поможет, если версия Clarion 55 и выше то там ещё проще через PROPLIST:Format,номер колонки

Andrew Myalin
andrew@arsis.ru
http://mavcla.arsis.ru (MAV Direct ODBC)
ICQ: 10659412
Yahoo group: clarion@yahoogroups.com

Если есть мксимальное кол-во колонок, т.е. оно гранично, то создаеться писок со всеми колонками, при формировании списка заполняються только необходимые а наличие и описание самих коолонок - list{prop:format}... и буде счастье :)
А может кто-нибудь уже решал данную проблему или подобную ?
у меня в списке, не 49, но порядка 20 колонок, и название и размеры их, и само наличие, мне на этапе открытите не известно, поэтому все выполняеьтся в самом списке.
Буду благодарен за примерчик.
примерчик чего?, т.е. в какой части? заполнения или рисования ?

--
Best regards,
Курко Максим mailto:ClaList@enigmasoft.com.ua
ICQ: <164766643>

Разве что PROP:FORMAT.
Или набор пропертей типа PROPLIST:FieldNo, PROPLIST:Locator и т.д.

Подозреваю, что это должно выглядеть примерно так:

Код: Выделить всё

loop i#=2 to col_num ! первая колонка уже есть
    ?list{proplist:fieldno, i#} = i# ! i# = номер поля в очереди from
    ?list{proplist:header, i#} = 'Заголовок ' & i#
    ?list{proplist:width, i#} = 50
    ?list{proplist:picture , i#} = '@s30' ! например
    ?list{proplist:locator , i#} = 0
    ?list{proplist:rightborder , i#} = true
    ?list{proplist:resize , i#} = true
    ?list{proplist:scroll , i#} = true
end
?list{proplist:lastonline , col_num} = true
А может кто-нибудь уже решал данную проблему или подобную ?
Однозначно. Щас закидают примерами... :)

Сергей.

Это означает, что число полей в очереди тоже должно быть произвольным.
Наверное, сейчас Олег Руденко скажет - "Используй мой класс dQue" - and don't worry - be happy.

Что-то больно сложно. Нет ли чего попроще.?

Евгений Григоров

(Добавление)

Но какое-то ограничение сверху есть, наверное... Все равно сильно много полей Кларион не вытянет. В полях разместить локальные строковые переменные, которым присваивать (например, по Evaluate) нужные значения. Ненужные поля спрячем, например, присвоив нулевую ширину через Proplist:Width

Col CString(200),Dim(100)

И заранее создать ListBox колонок, например, на 100, в которые распихать локальные переменные Col[N]. А при форматировании строки озаботиться присвоением значений этим переменным.

Кстати, если речь идёт не о Browse, а просто о списке,
см. Prop:VlbProc

---------------------------------------
C уважением,
Юрий Философов,
Главный программист
Корпорация "Диполь", Саратов
E-mail yufil@tacis-dipol.ru (служ)
yufil@mail.ru (дом)
ICQ#75924439

ну не факт, можно иметь одно большое поле STRING в очереди, значение каждой колонки раделять "!" символом.
Что-то больно сложно. Нет ли чего попроще.?
Можно формировать PROP:Format общий целиком самому.

Это крайне не удобно, поскольку нет красивого скрола по пролям.
нельзя сделать часть полей фиксируемых и т.д.

--
Best regards,
Курко Максим

это почему, ты просто не понял, колонки могут иметь любые атрибуты, разделитель нужен только для разбиения на колонки, чтобы значения попадали в нужные колонки, при этом сам символ "!" отображаться не будет

"1!Hello!!End"

1 - в первую колонку
Hello1 - во вторую
End - в третью

где неудобства?

Andrew Myalin
Написал: ClaList(2)
Гость

Сообщение Гость »

интересно, тогда расскажи, плз, как это можно указав разделитьтель свой нарезать в списке на колонки строку...просто я такого метода
не знаю..

--
Best regards,
Курко Максим

ну попробуй следующее, войди в Window Formater
создай ?List сделай три колонки, в свойствах в From вставь следующее (не Queue):

'Field1!Field2!Field2'

далее дай команду Preview и увидишь

Andrew Myalin

секундочку... у меня есть такое решение, но применяеться нон в дроп-даунском листе и при таком указании, я протос получаю несколько фиксированных значений листа. и все. но колонка будет нарисована так, как я ее описал в FORMAT. может дело в версии Клариона.
у меня 4.0
далее дай команду Preview и увидишь
:) попробовадл, и ничегошеньки не увидел..

попробовал в аську сказать.. но от тебя молчек... :)
--
Best regards,
Курко Максим
далее дай команду Preview и увидишь
Ну если не три колонки? Был же вопрос начет переменного числа колонок?
В приницпе если нужен именно браузер - делать по максимуму число колонок и показывать только те что нужно. Если просто список показывать и не нужно его при этом наполнять полями-рефералами - тут механизм вирт.листбоксов самое удобное.

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757

ну а какая разница то, PROP:Format (количество колонок) формируем сами, и наполнение единственного поля в Queue тоже, так что количество колонок тут не при чём

Andrew Myalin
Написал: ClaList(2)
Гость

Сообщение Гость »

Наверное, сейчас Олег Руденко скажет - "Используй мой класс dQue" - and don't worry - be happy.
Ага, прям так и скажу! Только немного в сторону - просто глянь один из примеров, которые входят в дистрибутив - T_dQue.clw
Там как раз производится создание динамического списка легальными средствами Клариона.
Это - что касается формирования самого списка.

Что-же касается очереди, из которой этот список будет "тянуть" данные, то есть несколько вариантов:

1 вариант Андрея Мялина:
Заполнить строку значениями колонок через "!" и подсунуть ее списку. Что-то типа:

LOC:Data = Clip(Left(Format(FILE:Price,@n11`2))) &'!'& !
Clip(FILE:Name) &'!'& FILE:Code
?List{PROP:From} = LOC:Data

Причем, что интересно, таким образом можно вывести в список как одну строчку, так и много.

2 вариант Вадима Синявского:
Использование свойств списка PROP:VLBProc/PROP:VLBVal.
Более подробно - см. хелп.

3 вариант с очередью постоянной структуры:
Обьявляешь очередь с кучей однотипных полей - лучше всего с полями типа STRING. При заполнении очереди поля заполняются данными поочередно. Таким образом, будут заполнены поля, которые будут отображаться в созданном списке.
В этом случае, для доступа к полям очереди ОЧЕНЬ удобно использовать WHAT/WHO/WHERE.
Хотя, можно описать и полную очередь с полями реальных типов.
При заполнении очереди - заполнять только нужные поля.
А в созданном списке каждую колонку "натравить" именно на нужное поле из очереди.

4 обобщенный вариант N3:
Рисуешь полную структуру списка по-максимуму.
Соответственно - обьявляешь и очередь по-максимуму.
А при определении реальной структуры списка просто "гасишь" ненужные колонки: ?List{PROPLIST:Width,Col#} = 0.

5 ну и, естественно, использовать библиотеки типа DynaQue.
Что-то больно сложно. Нет ли чего попроще.?
Имхо, 1,3,4 варианты - самые простые.
Особенно 3,4 - работают как с "ручным" списком, так и с бровзом, созданным стандартными шаблонами.
Пятый вариант немного сложнее, но позволяет формировать нужную структуру списка одним методом.
Самый сложный - второй вариант. И практически не работоспособен, когда неизвестно общее число записей в очереди - как, например, в случае с постраничным бровзом из стандартных шаблонов.

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com

Библиотека DynaLib
http://dynalib.narod.ru
Самый сложный - второй вариант. И практически не работоспособен, когда неизвестно общее число записей в очереди - как, например, в случае с постраничным бровзом из стандартных шаблонов.
Не люблю я с тобой спорить, но тут явно ты неправ ;)
Дело в том, что при любом раскладе после заполнения _линейной_ очереди содержимым для показа (будь то постраничный, будь то полностью загружаемый список) - а именно линейный список (а не матрица) необходим для виртуальных листбоксов - ты будешь знать кол-во элементов всего и кол-во столбцов - а это все что нужно для определения поведения виртулаьного списка. Более того - в вирт. методе ты используй расчитываемые при заполнении переменные - и после заполнения линейного списка все работает автоматом!
Главный плюс - легкость заполнения и настроки этого механизма для абсолютно произвольного набора данных.
Главный минус - невозможность использовать рефералы :(

Кстати - первый вариант (со строкой) - штука простая только для небольших наборов с прогнозируемым "размером".
Представь - у тебя есть сиквельная выборка - произвольная! - и тебе нужно ее показать. Потрбуется танцевать с перераспределеним памяти под строку в динамике, копированием уже подготовленной подстроки в новую... время будет откушиваться очень знатно. И все как-то зыбко-неочевидно...

А мой вариант работает как часы (на практике, а не в абстракте).

И еще одно - при сформированной строке для показа в ListBox-е крайне сложно будет с ней в дальнейшем работать. Например если потребуется отсортировать список по какой-то колонке или сделать локатор по колонке. Виртуальный лист-бокс тоже не очень подарок в этом смысле - но все же намного проще (хотя после того, как все это проделано ничего сложного там не наблюдается). Ведь имея известные строку-столбец адресовать ячейку в линейном списке не составит труда - в вот со строкой попыхтеть прийдется как программеру так и процессору (алгоритм будет очень тяжелый - перебор строки сплошняком) ;)

Так что как ни крути - в реальной жизни (не учебном примере естственно) для показа произвольного списка все же виртуальне листбоксы самые удобные (конечо же возможно использование dyna-библиотеки и еще более упростит жизнь - но мы оттталкиваемся от "штатных" средств).

--
Best regards,
Vadym mailto:vadim@softcreator.com
ICQ: 82308757
Не люблю я с тобой спорить, но тут явно ты неправ ;)
Согласен!

Просто писал, вспоминая давние опыты с VLB, когда ради интереса хотел написать что-то типа "черного ящика" для просмотра Queue с возможностью использования доп.
фильтров и прочих наворотов серьезных бровзов.
Т.е., если есть очередь и есть еще и фильтр, то без построения промежуточной очереди с уже отобранными записями ничего не выходило. Из-за недостатка времени тогда забросил тот проект. А сейчас вот вспомнил - и написал первые впечатления.
Если-же имеется уже готовая очередь для показа, то полностью согласен - довольно легко ее юзать через VLB.

=============================
С уважением, Олег А. Руденко.

Написал: ClaList(2)
Ответить