Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Вниз

Runtime error 216 и процедура DBGridEhSelectionChanged   Найти похожие ветки 

 
Ant_   (2011-11-03 19:24) [0]

Проблема такая: При закрытии программы получаю Runtime error 216. Думаю, связано с процедурой DBGridEhSelectionChanged (см.в конце кода). Если значения для Footers задаю в другой процедуре (напр. Button1Click) - то ошибки нет. Вообще результатом должно быть суммирование в Footer выбранных строк отдельно от суммирования всей таблицы.

uses Unit1, Unit2, Unit3, Unit4, Unit6, Unit7;

{$R *.dfm}

procedure TForm5.FormCreate(Sender: TObject);  
DateTimePicker1.Date:=Now;
DateTimePicker2.Date:=Now;
GroupBox1.Height:=175;
DBGridEh1.Columns[3].Visible:=False;
end;

procedure TForm5.FormShow(Sender: TObject);  
DateTimePicker1.Date:=Now;
DateTimePicker2.Date:=Now;
Edit1.Clear;
Edit2.Clear;
Edit4.Text:="00:00";
Edit5.Text:="23:59";
Query1.Active:=False;
Query1.SQL.Clear;

 if (Form7.Edit1.Text="anton")        
 or (Form7.Edit1.Text="sysdba") then
 begin
  Label2.Visible:=True;
  Edit2.Visible:=True;
  GroupBox1.Height:=201;
  DBGridEh1.Columns[3].Visible:=True;
 end;
end;

procedure TForm5.BitBtn1Click(Sender: TObject);  
begin

   Query1.SQL.Clear;   //чистим запрос
{Запрос}
   Query1.SQL.Add("SELECT DISTINCT V_OPERATIONS.DATA_OPERATION, BILL.REGNUM, T_MATERIALS.M_POSITION, ROUND( ( ARCHIVE.AHEIGHT *

ARCHIVE.AWIDTH / 1000000), 2 ) SQUARE, V_OPERATIONS.USER_NAME, V_OPERATIONS.DESCRIPTION");
   Query1.SQL.Add("FROM V_OPERATIONS");
   Query1.SQL.Add("INNER JOIN T_MATERIALS ON (V_OPERATIONS.ID_CONSTRUCTION = T_MATERIALS.ID_CONSTRUCTION) AND

(V_OPERATIONS.MATERIAL_BARCODE = T_MATERIALS.MATERIAL_BARCODE) AND (V_OPERATIONS.DESCRIPTION = T_MATERIALS.DESCRIPTION)");
   Query1.SQL.Add("INNER JOIN T_CONSTRUCTIONS ON (T_MATERIALS.ID_CONSTRUCTION = T_CONSTRUCTIONS.ID)");
   Query1.SQL.Add("INNER JOIN T_ITEMS ON (T_CONSTRUCTIONS.ID_ITEM = T_ITEMS.ID)");
   Query1.SQL.Add("INNER JOIN ARCHIVE ON (T_ITEMS.ID_ARCHIVE = ARCHIVE.AID)");
   Query1.SQL.Add("INNER JOIN BILL ON (ARCHIVE.AFILIAL = BILL.FILIAL) AND (ARCHIVE.ACODE = BILL.CODE)");
   Query1.SQL.Add("where V_OPERATIONS.OPERATION_TYPE_ID = 16");
   Query1.SQL.Add("and V_OPERATIONS.DATA_OPERATION > :ParamFirstDate and V_OPERATIONS.DATA_OPERATION < :ParamLastDate");
   Query1.SQL.Add("order by V_OPERATIONS.DATA_OPERATION");
{Запрос}
  Query1.Params[0].Value:=DateToStr(DateTimePicker1.Date)+" "+Edit4.Text;  
  Query1.Params[1].Value:=DateToStr(DateTimePicker2.Date)+" "+Edit5.Text;  
  Query1.Active:=True;                      
  Edit1.Text:=FloatToStr(Query1.RecordCount);    
  Edit2.Text:=FloatToStr(DBGridEh1.Columns[3].Footer.SumValue);

end;

procedure TForm5.DBGridEh1TitleClick(Column: TColumnEh);  
Var f:string;
begin
 f:= Column.FieldName;//без этой переменной у меня работать не хочет

 with Query1 do
 begin
    Close;
    SQL.Clear;   //чистим запрос
 {Запрос}
    Query1.SQL.Add("SELECT DISTINCT V_OPERATIONS.DATA_OPERATION, BILL.REGNUM, T_MATERIALS.M_POSITION, ROUND( ( ARCHIVE.AHEIGHT *

ARCHIVE.AWIDTH / 1000000), 2 ) SQUARE, V_OPERATIONS.USER_NAME, V_OPERATIONS.DESCRIPTION");
    Query1.SQL.Add("FROM V_OPERATIONS");
    Query1.SQL.Add("INNER JOIN T_MATERIALS ON (V_OPERATIONS.ID_CONSTRUCTION = T_MATERIALS.ID_CONSTRUCTION) AND

(V_OPERATIONS.MATERIAL_BARCODE = T_MATERIALS.MATERIAL_BARCODE) AND (V_OPERATIONS.DESCRIPTION = T_MATERIALS.DESCRIPTION)");
    Query1.SQL.Add("INNER JOIN T_CONSTRUCTIONS ON (T_MATERIALS.ID_CONSTRUCTION = T_CONSTRUCTIONS.ID)");
    Query1.SQL.Add("INNER JOIN T_ITEMS ON (T_CONSTRUCTIONS.ID_ITEM = T_ITEMS.ID)");
    Query1.SQL.Add("INNER JOIN ARCHIVE ON (T_ITEMS.ID_ARCHIVE = ARCHIVE.AID)");
    Query1.SQL.Add("INNER JOIN BILL ON (ARCHIVE.AFILIAL = BILL.FILIAL) AND (ARCHIVE.ACODE = BILL.CODE)");
    Query1.SQL.Add("where V_OPERATIONS.OPERATION_TYPE_ID = 16");
    Query1.SQL.Add("and V_OPERATIONS.DATA_OPERATION > :ParamFirstDate and V_OPERATIONS.DATA_OPERATION < :ParamLastDate");
 {Запрос}
    Query1.Params[0].Value:=DateToStr(DateTimePicker1.Date)+" "+Edit4.Text;  
    Query1.Params[1].Value:=DateToStr(DateTimePicker2.Date)+" "+Edit5.Text;  

    SQL.Add("ORDER BY "+f);
    Open;
   Edit1.Text:=FloatToStr(Query1.RecordCount);  
   Edit2.Text:=FloatToStr(DBGridEh1.Columns[3].Footer.SumValue);
 end;
end;

procedure TForm5.N2Click(Sender: TObject);  
begin
 Form1.Hide;
 Form3.Hide;
 Form4.Hide;
 Form5.Hide;
 Form6.Hide;

 Form2.Query1.SQL.Clear;
 Form2.Edit3.Clear;
 Form2.Show;
end;

procedure TForm5.N3Click(Sender: TObject);    
begin
 Form1.Hide;
 Form2.Hide;
 Form4.Hide;
 Form5.Hide;
 Form6.Hide;

 Form3.Query1.SQL.Clear;
 Form3.ComboBox1.ItemIndex:=-1;
 Form3.Edit3.Clear;
 Form3.Show;
end;

procedure TForm5.N5Click(Sender: TObject);
begin
 Form1.Hide;
 Form2.Hide;
 Form3.Hide;
 Form5.Hide;
 Form6.Hide;

 Form4.Query1.SQL.Clear;
 Form4.ComboBox1.ItemIndex:=-1;
 Form4.Edit1.Clear;
 Form4.ComboBox2.Visible:=False;
 Form4.Combobox2.ItemIndex:=-1;
 Form4.Label2.Visible:=False;
 Form4.DBGridEh2.Visible:=False;
 Form4.DBGridEh1.Visible:=True;
 Form4.Show;

end;

procedure TForm5.N8Click(Sender: TObject);  
begin
 Form1.Hide;
 Form2.Hide;
 Form3.Hide;
 Form4.Hide;
 Form5.Hide;
Form6.Show;
end;

procedure TForm5.N6Click(Sender: TObject);  
begin
Form7.Close;
end;

procedure TForm5.FormClose(Sender: TObject; var Action: TCloseAction);  
begin
// IsConsole:=True;      

Form7.Close;
end;

procedure TForm5.DBGridEh1SelectionChanged(Sender: TObject);
begin
Edit3.Text:=IntToStr(DBGridEh1.SelectedRows.Count);
DBGridEh1.Columns[1].Footers[0].ValueType:=fvtStaticText;
DBGridEh1.Columns[1].Footers[0].Value:=IntToStr(DBGridEh1.SelectedRows.Count);

end;

procedure TForm5.Button1Click(Sender: TObject);
begin
//   Edit3.Text:=IntToStr(DBGridEh1.SelectedRows.Count);
// DBGridEh1.Columns[1].Footers[0].ValueType:=fvtStaticText;
// DBGridEh1.Columns[1].Footers[0].Value:=IntToStr(DBGridEh1.SelectedRows.Count);
end;

end.



 
Юрий Зотов ©   (2011-11-04 14:19) [1]

> Ant_   (03.11.11 19:24)

DLL в программе используется?


 
Ant_   (2011-11-04 18:30) [2]

Точно не знаю, что такое DLL. Наверное не используется, я не уверен. Как узнать?


 
Amoeba_   (2011-11-04 18:55) [3]


> Ant_   (04.11.11 18:30) [2]
>
> Точно не знаю, что такое DLL. Наверное не используется, я не уверен. Как узнать?

Приплыли ...


 
Amoeba_   (2011-11-04 18:58) [4]


>  Ant_   (04.11.11 18:30) [2]
>
> Точно не знаю, что такое DLL.

Читай здесь: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1201
и будешь тогда знать что это такое и с чем и как это едят.


 
Германн ©   (2011-11-05 00:20) [5]

http://www.eurekalog.com/downloads_delphi.php
Триальная версия полнофункциональная. Работает 30 дней.
Она может помочь найти место ошибки.

Попутно спрошу ещё. Таймеры в программе используются?


 
_Юрий   (2011-11-06 09:51) [6]

Надо подключать FastMem в качестве менеджера памяти, включать там режим логгирования ошибок, запускать, и смотреть, где бьется память. А она похоже где то таки бьется.


 
Ant_   (2011-11-07 12:05) [7]


> Юрий Зотов ©   (04.11.11 14:19) [1]
>
> > Ant_   (03.11.11 19:24)
>
> DLL в программе используется?

Нет, не используется.
> Германн ©   (05.11.11 00:20) [5]

Таймеры - используются (если я правильно понимаю,  то это DateTimePicker).


 
Омлет ©   (2011-11-07 12:12) [8]

Таймеры - это TTimer.


 
Ant_   (2011-11-07 12:36) [9]


> Омлет ©   (07.11.11 12:12) [8]
>
> Таймеры - это TTimer.

TTimer - не используется.


 
int64 ©   (2011-11-07 12:53) [10]

Не знаю, как сейчас, но 4 года назад DBGridEh в рантайм цеплял свои ивенты на DataSet (или на DataSource, не помню). Но делал он это криво. Возникали ситуации с вызовом методов "мёртвых" объектов. Свои обработчики можно было использовать только через костыли.

По теме.
Бывает полезным, трудные ошибки отлавливать откусывая функционал. Шаг за шагом, пока она не пропадет. Вплоть до последней стабильной версии. В твоем случае до 0.


 
Ant_   (2011-11-07 13:46) [11]


> int64 ©   (07.11.11 12:53) [10]

Простите, я не знаю, как практически "откусывать функционал". Что нужно делать, поясните?


 
int64 ©   (2011-11-07 17:59) [12]

Это значит закомментировать код и убирать из проекта юниты и объекты, гипотетически влияющие на ошибку. Делать это поэтапно. Если ошибка пропала, то она в убранном функционале. Осталась – в оставленном.
В твоем случае, полагаю, должен остаться только DBGridEh1SelectionChanged со статическим рекордсетом (без странных манипуляций с сортировкой).
Если ошибка останется, то проблема в DBGridEh. Он не позволяет при SelectionChanged выполнять нужный тебе код.


 
Ant_   (2011-11-07 18:13) [13]


> int64 ©   (07.11.11 17:59) [12]

Ок, займусь. Отчет дам позже.


 
Ant_   (2011-11-08 18:59) [14]

Создал новый проэкт, где поместил лиш DBGridEh, DataSource, Table i Database. Для упрощения подключаю не запрос, а таблицу. Также всего 1 футер, который показывает сумму выделенных строк. При закрытии программы - получаю ошибку Access violation. Что делаю неправильно?


 
int64 ©   (2011-11-09 17:57) [15]

Как и предполагалось, глючит компонент.
Тут 2 варианта: исправить компонент, написать костыли.
Если по Button1Click проблем не возникает, то можно попробывать вытащить код из DBGridEh1SelectionChanged через PostMessage.
Не поможет - делать отложенный вызов кода через 0.5 сек (через Ттаймер, например)


 
int64 ©   (2011-11-09 18:03) [16]

Еще есть вариант, что работа с компонетом и его свойствами должна вестись через BeginUpdate/EndUpdate (или чем-то похожим)


 
Ant_   (2011-11-09 19:58) [17]

Решил проблему тем, что заменил процедуру DBGridEhSelectionChanged на DBGridEh1CellClick: результат удовлетворяет, ошибки нет. С двумя футерами буду разбиратся завтра.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
15-1319989105
Кто б сомневался
2011-10-30 18:38
2012.02.19
Кажись уже есть компилятор Delphi x64?


2-1320826326
I_D
2011-11-09 12:12
2012.02.19
Перевод проекта с Delphi 7 в Delphi XE. Проблема с ShortString


13-1127735614
MeF Dei Corvi
2005-09-26 15:53
2012.02.19
Получение информации о системе


15-1320279321
KilkennyCat
2011-11-03 03:15
2012.02.19
налоговый кодекс


15-1320052005
И. Павел
2011-10-31 12:06
2012.02.19
Использование одной связки таблиц несколько раз в одном запросе.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский