Необходимо вывести неизвестное количество таблиц (StdTables.Table), каждая в отдельное окно. Пользуюсь способом описанным в примере к подсистеме CtlsxTestTables.CrateMultiTable следующим образом:
PROCEDURE NextTable (OUT link: ARRAY OF CHAR; VAR n: INTEGER);
VAR tab: POINTER TO ARRAY OF CT.Table;
i: INTEGER;
str: Dialog.String;
BEGIN
IF tables = NIL THEN NEW(tab, 1); n:=0;
ELSE n:=LEN(tables); NEW(tab, n+1);
FOR i:=0 TO n-1 DO tab[i]:=tables[i] END
END;
tables:=tab;
Strings.IntToString(n, str);
link:='ArmshnData.tables[' + str + ']'
END NextTable;
PROCEDURE (this: PacketList) CreateTable(), NEW;
VAR link: Dialog.String;
el: Data;
i: INTEGER;
p: Controls.Prop;
v: Views.View;
BEGIN
NextTable(link, this.index);
tables[this.index].SetSize(this.rows, this.packet.data_count);
el:=this.packet.data; i:=0;
WHILE (i < this.packet.data_count) & (el # NIL) DO
tables[this.index].SetLabel(i, el.name);
INC(i);
el:=el.next
END;
NEW(p); p.link:=link$; p.label:=''; p.guard:=''; p.notifier:='';
p.level:=0; p.opt[Controls.sorted]:=FALSE;
Views.Deposit(CT.dir.NewControl(p));
Views.Fetch(v);
StdDialog.Open(v, this.id, NIL, '', NIL, FALSE, TRUE, FALSE, FALSE, FALSE);
END CreateTable;
(*äåéñòâèÿ ïðè íàæàòèè êíîïêè Open äèàëîãîâîãî îêíà main*)
PROCEDURE OpenTable*();
VAR str: Dialog.String;
el: PacketList;
BEGIN
dialog.list.GetItem(dialog.list.index, str); (*âûäåëåííàÿ ñòðîêà â ñïèñêå òèïîâ ïàêåòîâ*)
el:=packet;
WHILE el # NIL DO
IF el.id$ = str$ THEN el.CreateTable(); RETURN END;
el:=el.next
END
END OpenTable;
При нажатии кнопки для создания вызывается процедура OpenTable, которая должна открыть таблицу в новом окне, соответствующую выделенной строке в списке dialog.list. Данные в таблице периодически должны обновляться при обновлении информации об отображаемой ими модели. Но обновляется всегда только последняя открытая таблица, хотя (как было проверено) сообщение Dialog.Update(table[this.index]) передаю всем открытым в данный момент таблицам.
|