Динамическое кол-во полей в browse

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
Galex
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 29 июн 2006, 14:39
Контактная информация:

Динамическое кол-во полей в browse

Сообщение Galex »

Товарищи, возникла такая ситуация: необходимо чтобы кол-во полей, отображаемых в browse было динамическим... А еще лучше чтобы пользователь мог сам добавлять колонки в browse или tree... Если у кого-нибудь есть опыт решения данной проблемы, подскажите как это лучше реализовать... Не писать же это в Delphi!!! :eek:
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

вот например, добавляет по кнопке Ок еще одну колонку в браузер
interface testcfg;
table struct t1
(
p1 : string,
p2 : double,
p3 : double
);
create view from t1;
browse br1;
show at(,,,20);
table t1;
fields
t1.p1 'name field' : [10],protect;
end;
screen scr1
show at(,21,,);
buttons
cmok;
<<
<.ok.>
>>
end;
handleevent
cminit:
{
t1.p1 := 'запись 1';
t1.p2 := 111;
insert current t1;
t1.p1 := 'запись 2';
t1.p2 := 222;
insert current t1;
}
cmok:
{
cfsSetCurrentContainer('testcfg');
var p2self : longint;
cfsCreateObject('Column','BR1','newpole',false,p2self);
cfsSetProp('newpole', 'Title', 'new pole');
cfsSetProp('newpole', 'FieldName','t1.p2');
rescanpanel(#t1);
}
end;
end.
Хочу зачетить ,что в t1 обязательно должна быть запись, для пустой таблицы конфигуратор почему-то не создает объекты :sad:
Все использованные ф-ции описаны в документации по галактике.
Galex
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 29 июн 2006, 14:39
Контактная информация:

Сообщение Galex »

san, большой спасибо за подробный код... Но меня достаточно было только подтолкнуть... :cool: Но у меня опять проблема, нашел я мануал по API конфигуратору, нашел список нужных констант... Все вроде, нормально - поля добавляются, но при попытке изменить размер screen'а или при выполнении RescanPanel Галактика вылетает с ошибкой 213 (rtl: выход за границы коллекции)...
Galex
Постоянный обитатель
Сообщения: 175
Зарегистрирован: 29 июн 2006, 14:39
Контактная информация:

Сообщение Galex »

Чуть не забыл, Галактика 8.0 без патчей... Возможно в них проблема?...
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

Galex писал(а):Чуть не забыл, Галактика 8.0 без патчей... Возможно в них проблема?...
Врятли патчи, эта ф-ность работает и на старых версиях.Надо смотреть что конкретно делается и после чего возникает ошибка.Возможно параметры не того типа передаются или что то еще. В моем примере rescanpanel работает.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

поле в browse добавляется, а вот в Tree - НЕТ!!! Как быть?
Если в привеленном примере заменить browse br1 на Tree br1 - "играем на балалайке". Можно ли в дереве динамически скрывать/показывать поля???
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

вот это не знаю, таких исследований я не проводил.
Alexander
Местный житель
Сообщения: 248
Зарегистрирован: 28 ноя 2006, 13:29

Сообщение Alexander »

делается просто:
SetFieldState(#Field, sfVisible);
ClearFieldState(#Field, sfVisible);
san
Местный житель
Сообщения: 412
Зарегистрирован: 28 апр 2005, 11:34
Откуда: Галактика Млечный Путь

Сообщение san »

Alexander
в начале речь шла о добавлении новых колонок
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Динамическое кол-во полей в browse

Сообщение Алексей »

Докомпилировал личную карточку учета СФО. Захожу в неё и получаю ошибку про интерпретацию поля attrval1_vstring.
Хотя первое поле появляется вполне благополучно.
ЧТО делаю не так? Что нужно указать вместо attrval1_vstring в строке создания cfsCreateObject('Column','BRPERSSFO','attrval1_vstring',false, pField2); ?

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

#component "F_SFO"
Alter Interface GetPersCard;
Create view as select attrval1.vstring from attrnam attrnam1, attrval attrval1
where((
    4008              == attrnam1.wtable
and 'продление носки' == attrnam1.name
and 4008              == attrval1.wtable
and attrnam1.nrec     == attrval1.cattrnam
and shperssfo.nrec    == attrval1.crec
));
var pField1, pField2 : longint;

Procedure loadColumns;
{
  cfsCreateObject('Column','BRPERSSFO','shperssfo_enddate',false, pField1);
  cfsSetProp('shperssfo_enddate', 'Title', 'Дата окончания носки');
  cfsSetProp('shperssfo_enddate', 'FieldName','SHPERSSFO.ENDDATE');
  cfsSetProp('shperssfo_enddate', 'PickButton','False');
  cfsSetProp('shperssfo_enddate', 'Protect','True');

  cfsCreateObject('Column','BRPERSSFO','attrval1_vstring',false, pField2);
  cfsSetProp('attrval1_vstring', 'Title', 'Акт продления');
  cfsSetProp('attrval1_vstring', 'FieldName','attrval1.vstring');
  cfsSetProp('attrval1_vstring', 'PickButton','True');
  cfsSetProp('attrval1_vstring', 'Protect','True');

  Rescanpanel(#shperssfo);
}
Window EDITPERSCARD
HandleEvent
cmPick:
{
 if (inherited :: handleevent(cmPick)<>heOK) then abort;
 if curfield=#attrval.vstring then message('1');
}
end;
end;
HandleEvent
 cmInit:
 {
 if (inherited :: handleevent(cmInit)<>heOK) then abort;
 LoadColumns;
 }
end;
End.
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Динамическое кол-во полей в browse

Сообщение Алексей »

при создании объекта
cfsCreateObject('Column','BRPERSSFO','attrval1_vstring',false, pField2);
получаю ошибку cfErrCantCreateObject; (-12)
Алексей
Местный житель
Сообщения: 2896
Зарегистрирован: 24 июн 2005, 12:12
Откуда: Иркутская область

Re: Динамическое кол-во полей в browse

Сообщение Алексей »

вопрос снят, объявлять надо было вот так:

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

  cfsCreateObject('Column','BRPERSSFO','Field: ATTRVAL1.VSTRING',false, pField2);
но только почему... странно. почему не могу написать любую строку?
Ответить