Показать сообщение отдельно
Старый 27.02.2003, 09:51   #20  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Отложим (на время) динамическое формирование таблицы и подумаем о том, как у нас эта самая таблица будет заполняться данными. Как мы решили, данные будут грузиться не сразу все, а по мере необходимости.
Максимально упростим пример. Вот форма, на ней таблица, в ней один столбец, в который должно выводиться itemId из invatTable, которое являетмся dataSource в этой форме.

В executeQuery() мы определяем количество записей в таблице(забудем пока про производительность и оптимальность и попробуем просто понять принцип работы) и добавляем первые 20 записей в таблицу:

PHP код:
public void executeQuery()
{
    
int it;
    ;
    
super();

    
qr this.queryRun();

    
recCount SysQuery::countTotal(qr);
    
Table.rows(recCount);

    
min(20recCount);

    
qr this.queryRun();
    
it qr.get(tableNum(InventTable));
    
itemId it.ItemId;

    
Table.cell(1,1).data(itemId);
    
displayCount 1;


    for (
i=2i<=ti++)
    {
        
qr.next();
        
it qr.get(tableNum(InventTable));
        
itemId it.ItemId;
        
Table.cell(1,i).data(itemId);
        
displayCount++;
    }

Перекрываем textChange() у контрола, который привязан к таблице:

PHP код:
public void textChange()
{
    
super();

    if (
displayCount recCount)
    {
        
qr.next();
        
it qr.get(tableNum(InventTable));
        
itemId it.ItemId;
        
displayCount++;
        
Table.cell(1displayCount).data(itemId);
//        info("добавлена еще одна запись");
        
print itemId;
  
//      pause;
    
}

То есть при вызове этого метода из таблицы считывается следующая запись и добавляется в таблицу, тем самым эмулируя поведение серверных курсоров ADO.
Когда будешь пробовать попробуй сначала так, а затем раскомментировав сторки. Результаты чуть-чуть разные, но выводы примерно такие:

Если мы хотим, чтобы textChange() вызывался со 100% гарантией пользователь должен щелкнуть мышкой на одну из ячеек таблицы и клавишами "стрелка вниз", PageDown перемещаться по таблице. Так вроде все работает. Если же пользователь начинает скролировать таблицу, то часто получается ситуация, когда пользователь начинает видеть пустые незаполненные строки.. в общем сам увидишь.

Кроме того, textChange() будет вызываться даже тогда, когда пользователь начнет перемещаться по таблице вверх - вроде бы не надо, но в таблицу все равно будут добавляться новые записи.

Можно сделать следующее(только что пришло в голову) - выбросить из таблицы скролбар(раз им все равно пользоваться нельзя), а в замен попробовать подсунуть пользователю что нибудь другое(в простейшем случае пару кнопок). Положение курсора в таблице тображать например с помощью progressBar'а. В общем все дело опять уходит в дебри и превращается в неудобную конструкцию.

Буду дальше экспериментировать, но и ты скажи свое мнение, а то может я вообще не в том направлении двигаюсь и фигней занимаюсь ?