2016-05-30 3 views
0

Я открываю ACRTable для создания события формы.EListError - как его предотвратить

Это то, что я на после прокрутки таблицы:

procedure TForm1.ACRTable1AfterScroll(DataSet: TDataSet); 
begin 
if ACRTable1.FieldByName('COMPANY_ID').AsString <> '' then 
begin 
ACRQuery1.SQL.Text:= 'select * from MEMBERS where COMPANY_ID = ' + 
ACRTable1.FieldByName('COMPANY_ID').AsString; 
ACRQuery1.Open; 
end; 
end; 

Однако если ACRQuery1 не имеет каких-либо записей, которые я получаю базу данных EListError. Я пробовал:

procedure TForm1.ACRQuery1BeforeOpen(DataSet: TDataSet); 
begin 
if ACRQuery1.RecordCount =0 then 
    label1.Caption:='No records found' 
    else label1.Caption:=''; 
end; 

Но все-таки ту же ошибку. Что я делаю неправильно? Как я могу предотвратить этот EListError?

ответ

1

Я не уверен, какой тип TDataSet-потомка ваш ACRQuery1 есть, но при угадывании он вычисляет свой RecordCount из TList или аналогичного (например, читая его свойство Count), который фактически не существует, если набор данных не открыт , Итак, первое, что я хотел бы попробовать было бы избежать при попытке чтения его RecordCount, если он не открыт:

procedure TForm1.ACRQuery1AfterOpen(DataSet: TDataSet); 
begin 
// Following is how I would have structured it 
// Make sure you remove your BeforeOpen handler 
    if ACRQuery1.Active then begin 
    if (ACRQuery1.RecordCount = 0) then 
     label1.Caption := 'No records' 
    else 
     label1.Caption := IntToStr(ACRQuery1.RecordCount); 
    end 
    else begin 
    label1.Caption:='No records found'; 
end; 

После того, как код перемещается в случае AfterOpen, проверка на набора данных, Acttive не очень необходимо, поскольку событие не будет вызываться иначе - перемещение проверки на RecordCount в событие AfterOpen должно избегать его чтения, в то время как реализация набора данных не может вернуть значение для него, но я включил тест для него в код , на всякий случай, если вы попытаетесь использовать код в другом месте.

Кстати, если вы все еще получаете EListError, используя приведенный выше код, я бы сказал, что причиной является ошибка в реализации TACRQuery, а не что-то, что вы делаете «неправильно», и вы должны сообщить об этом автору (с).

+0

Я все еще получаю сообщение об ошибке. – user763539

+0

Извините, я допустил ошибку в том, что я впервые разместил. Другое дело, что ваш код должен быть в событии AfterOpen. – MartynA

+0

Все равно получите ошибку :( – user763539

Смежные вопросы