Страница 1 из 1

Формирование колонок ListBox

Добавлено: 28 Июль 2006, 10:44
Evgen
Версия: C6.3 9.053, ABC
Всем привет!
У меня такая проблема, имеется очередь, в ней присутствуют постоянные 2 поля, а количество оставшихся полей не известно, и определяется в ходи работы программы.
Вопрос: Необходимо в теле программы написать такой код, который формирует оставшиеся поля, и выводит их в ListBox'е.
Пробывал описать одно поле (FNew) через массив но не получилось...

TD QUEUE
FName1 STRING(20)
FName2 STRING(20)
FNew LONG,DIM(10)
END

Еще пробывал различные варианты, описанные в других темах, но или я не понял как они работают или просто не выходит.
Например:

col_num# = 10
loop i#=1 to col_num# ! первая колонка уже есть
?List1{proplist:fieldno, i#} = i# ! i# = номер поля в очереди from
?List1{proplist:header, i#} = 'Заголовок ' & i#
?List1{proplist:width, i#} = 50
?List1{proplist:picture , i#} = '@s30' ! например
?List1{proplist:locator , i#} = 0
?List1{proplist:rightborder , i#} = true
?List1{proplist:resize , i#} = true
?List1{proplist:scroll , i#} = true
end
?List1{proplist:lastonline , col_num#} = true

Если я правильно понял, то необходимо сначала здесь описать поля, но через массив не получается, может еще как...
Хотелось бы реализовать это стандартными средствами Clarion.
Заранее блогадарен за любую помощь.

Добавлено: 28 Июль 2006, 10:59
ru_alex
Стандартными средствами в RunTime сложно формировать очередь. Есть библиотека О. Руденко DynaLib, которая позволяет это делать(может и еще есть, я не знаю), но это за деньги.
Скорее всего тебе можно обойтись стандартными средствами.
Создаешь очередь

TD QUEUE
FName1 STRING(20)
FName2 STRING(20)
FNew1 LONG
FNew2 LONG
FNew3 LONG
FNew4 LONG
FNew5 LONG
FNew6 LONG
...
END

А в ?list{prop:format) нужно подставить сформированную строку, как ее формировать, читай доку по prop:format. Именно сформировать строку, например для данной очереди, если мы хотим отобразить FNew2 и FNew5 то что-то типа

'100L(2)|~FName1~@s20@#1#100L(2)|~FName2~@s20@#2#30R(2)|~FNew2~@n14@#4#30R(2)|~FNew5~@n14@#7#'

А массивы из очереди я не знаю как в LIST выводить, наверное как-нибудь через OVER поля.

Добавлено: 28 Июль 2006, 11:58
Evgen
TD QUEUE
FName1 STRING(20)
FName2 STRING(20)
FNew1 LONG
FNew2 LONG
FNew3 LONG
FNew4 LONG
FNew5 LONG
FNew6 LONG
...
END

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

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

Добавлено: 28 Июль 2006, 12:10
ru_alex
Evgen писал(а):Так, пробывал, отлично получается, но дело в том, что очень муторно создавать так... можно сказать проделывал эту операцую несколько раз, не очень вдохновляет, много времени на это эходит.
Не понял, а в чем проблема? Очередь разве не один раз создавать нужно? Тем более, что описать ее можно в Embed ручками, когда много полей, так проще.
У меня до использования DynaLib такая схема работала, очередь порядка 200 полей. Заполнять ее удобно, используя оператор WHAT.

Добавлено: 28 Июль 2006, 12:14
Ravenous
Можешь посмотреть в документации про VLB(VLBProc,VLBval).

Добавлено: 28 Июль 2006, 12:29
Evgen
Не понял, а в чем проблема? Очередь разве не один раз создавать нужно? Тем более, что описать ее можно в Embed ручками, когда много полей, так проще.[/quote]

Можно привести примерчик описания очереди в Embed с использованием WHAT, в Help'е почитал, вроде понятно но не очень...

Добавлено: 28 Июль 2006, 12:46
ru_alex
Можно привести примерчик описания очереди в Embed с использованием WHAT, в Help'е почитал, вроде понятно но не очень...
Геморойно объявлять большую очередь в интерфейсе данных APP. В Embed же можно не только исполняемые операторы писать.
В процедуре это Local Data, заходишь туда и:

TD QUEUE
FName1 STRING(20)
FName2 STRING(20)
FNew1 LONG
FNew2 LONG
FNew3 LONG
FNew4 LONG
FNew5 LONG
FNew6 LONG
...
END


А по WHAT:

MyAny ANY
code
loop i#=1 to 10
MyAny &= what(TD,5) ! FNew3
MyAny = i#
add(TD)
end