Форум: "Начинающим";
Текущий архив: 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.005 c