Topik |
Отправлено: 06.06.2004, 13:38 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Опишу формы и их назначения:
После нажатия кнопки ОК на форме поиска, появляется окно с таблицей в которой перечислены найденые объекты (это сделано).
Следующий этап, если необходимо изменить информацию об объекте, пользователь кликает на ячейке и появляется форма редактирования, которая содержит текущие данные, юзер их изменяет, кликает ОК и данные в базе обновляются.
Значит проблема возникла такая,
значения в форму редактирования я передаю, написал UPDATE (база MySQL), по всем параметрам апдейт, верный, но вот когда открываю форму редактирования, и нажимаю ОК(смотри UPDATE), то выпадает ошибка типа
//----------------
Project alfa.exe raised exception class EA Access Violation with message 'Access violation at address 0040BE10 in module 'alfa.exe'. Read of address 00002F8'
Process stopped. Use Step or Run to continue.
//----------------
что может быть? |
|
Topik |
Отправлено: 06.06.2004, 14:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Немного дополню:
форма в которой находится Query к которому обращается форма радектирования, я вляется child, а форма редактирования прост Normal и выводится на экран как ShowModal(); |
|
creater |
Отправлено: 06.06.2004, 15:27 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 120
|
для обновления попробуй использовать связку:
if (IBTransaction1->InTransaction) IBTransaction1->Commit();
IBTransaction1->StartTransaction();
IBQuery1->Close();
IBQuery1->SQL->Clear();
IBQuery1->SQL->Add("update .....);
IBQuery1->Open();
IBQuery1->Prepare();
IBQuery1->ExecSQL();
IBTransaction1->Commit();
с указанием соотвествующих связей форма->компонент |
|
Topik |
Отправлено: 06.06.2004, 15:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Что такое
if (IBTransaction1->InTransaction) IBTransaction1->Commit();
? |
|
Topik |
Отправлено: 06.06.2004, 15:48 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
у меня не interBase а BDE |
|
Topik |
Отправлено: 06.06.2004, 16:04 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
ошибка выдается на
Form1->Query1->Close(); |
|
Topik |
Отправлено: 06.06.2004, 18:01 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Хоть бы кто ответил |
|
creater |
Отправлено: 06.06.2004, 19:28 |
|
Станционный диспетчер
Группа: Участник
Сообщений: 120
|
QUOTE (Topik @ 06/06/2004, 17:06) | ошибка выдается на
Form1->Query1->Close(); |
ошибка?
может active у Query не включил? :-)
или связи элементов не установил... |
|
Admin |
Отправлено: 06.06.2004, 21:36 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
По описанию ошибки нельзя сказать в чем именно проблема.
Попробуйте пройтись по шагам, смотрите значения переменных
и что происходит, чтобы понять в какой момент наступает
ошибка или приведите код.
Также,
QUOTE | но вот когда открываю форму редактирования, и нажимаю ОК(смотри UPDATE), то выпадает ошибка типа
|
Форма редактирования открывается, или вываливается ошибка ?
Вряд-ли из-за работы с базой, тут скорее всего что-то другое,
или обращаетесь к уже удаленному объекту (например форме),
или что-то еще этого плана, на все другое сообщение об ошибке
было-бы более ясным.
|
|
Topik |
Отправлено: 07.06.2004, 09:51 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
to Admin
Форма редактирования открывается, но вот когда хочу Update сделать, вот тогда и выпадает в ошибку
Какую часть кода надо показать? |
|
Admin |
Отправлено: 07.06.2004, 10:01 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | но вот когда хочу Update сделать, вот тогда и выпадает в ошибку
Какую часть кода надо показать? |
Для начала эту самую: "когда хочу Update сделать.":
CODE |
void __fastcall TMainForm::Button1Click(TObject *Sender) // Update button
{
...
|
И что касается всех этих форм — они динамически
создаются-уничтожаются, или они Auto-create forms ?
|
|
Topik |
Отправлено: 07.06.2004, 10:09 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Вот форма из редактирования из которой Update и делается
#include
#pragma hdrstop
#include "red_fl.h"
#include "add_house.h"
#include "alfa1.h"
#include "alfa3.h"
#include "fl_sel.h"
#include "house_sel.h"
#include "off_search.h"
#include "off_sel.h"
#include "offb_search.h"
#include "offb_selcpp.h"
#include "search_house.h"
#include "add_offb.h"
#include "add_office.h"
#include "alfa2.h"
#include "red_h.h"
#include "red_off.h"
#include "red_offb.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFl_Red *Fl_Red;
//---------------------------------------------------------------------------
__fastcall TFl_Red::TFl_Red(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFl_Red::Button3Click(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TFl_Red::city_fl_3Change(TObject *Sender)
{
}
//---------------------------------------------------------------------------
void __fastcall TFl_Red::Button2Click(TObject *Sender)
{
//TResult1* Result1 = new TResult1(Application);
Result1->Query1->Open();
Result1->Query1->SQL->Clear();
Result1->Query1->SQL->Add("UPDATE fl_common SET ");
AnsiString insert_dannie;
insert_dannie="city ='" + city_fl_3->Text +"',"
"district = '" + disrtict_fl_3-> Text +"',"
"metro = '" + metro_fl_3->Text +"',"
"street = '" + street_fl_3->Text +"',"
"house = '" + house_fl_3->Text +"',"
"flat = '" + flat_fl_3->Text +"',"
"h_storey = '" + h_storey_fl_3->Text +"',"
"floor = '" + floor_fl_3->Text +"',"
"rooms = '" + room_fl_3->Text +"',"
"balcons = '" + balcons_fl_3->Text +"',"
"garage = '" + garage_fl_3->Text +"',"
"m_cost = '" + m_cost_fl_3->Text +"',"
"cost = '" + cost_fl_3->Text +"',"
"common_area = '" + common_area_fl_3->Text +"',"
"live_area = '" + live_area_fl_3->Text +"',"
"kitchen_area = '" + kitchen_area_fl_3->Text +"',"
"telephone = '" + telephone_fl_3->Text +"',"
"balcon = '" + balcon_fl_3->Text +"',"
"cooker = '" + cooker_fl_3->Text +"',"
"sanitary = '" + sanitary_fl_3->Text +"',"
"parking = '" + parking_fl_3->Text +"',"
"addition = '" + addition_fl_3->Text +"'"
"WHERE nopinf= '" + Result1->Query1->FindField("fl_common.nopinf")->AsString +"'";
Result1->Query1->SQL->Add(insert_dannie);
Result1->Query1->ExecSQL();
Result1->Close();
}
//-----------------
Форма Result1 имеет свойство formStyle=fsMDIChild
A форма редактирования FL_Red fsNormal и выводится как ShowModal
Result1 создается динамически
А Fl_Red автоматически
Отредактировано Topik — 07/06/2004, 11:16 |
|
Admin |
Отправлено: 07.06.2004, 10:25 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Но тогда форма родительская должна быть fsMDIForm ?
Result1 создается динамически — а где момент ее
создания — уничтожения, в коде нет.
То есть при закрытии Child-формы она уничтожается
(при OnClose: Action = caFree;) или нет ?
Отредактировано Admin — 07/06/2004, 11:28
|
|
Topik |
Отправлено: 07.06.2004, 10:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Родительская форма это MainWindow, из которой вызывается форма поиска.
форма Result1 создается из формы поиска вот таким макаром
void __fastcall TFlatsSearch2::Button2Click(TObject *Sender)
{
TResult1* Result1 = new TResult1(Application);
Result1->Query1->Close();
Result1->Query1->SQL->Clear();
Result1->Query1->SQL->Add("select * from fl_common fc,fl_tech ft,fl_juridical fj where fc.nopinf=ft.nopinf and fc.nopinf=fj.nopinf");
Result1->Query1->SQL->Add(" AND fc.type_sale='" + arenda_prodaga->Caption + "'");
Форма поиска fsNormal ShowModal;
При закрытии Форма Result1 уничтожается OnClose: Action = caFree;
А потом, при щелчке на ячейке OnCellClick
Fl_Red=ShowModal();
и передача значений ячеек в нее. из Query1 который находится на Result1
Отредактировано Topik — 07/06/2004, 11:35 |
|
Admin |
Отправлено: 07.06.2004, 11:25 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | При закрытии Форма Result1 уничтожается OnClose: Action = caFree;
А потом, при щелчке на ячейке OnCellClick
Fl_Red=ShowModal();
и передача значений ячеек в нее. из Query1 который находится на Result1
|
То есть сначала форма при закрытии уничтожается,
(и Query1 и др компоненты на ней уже не существуют)
а потом из нее Вы пытаетесь передать значения ячеек ?
Не получается-ли что Вы пытаетесь работать с уже
уничтоженной формой ?
|
|
Topik |
Отправлено: 07.06.2004, 11:27 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Help кто-нить
|
|
Topik |
Отправлено: 07.06.2004, 11:38 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
я не правильно выразился, работаю я при открытой форме
имелся ввиду ответ на вопрос Admin
QUOTE |
То есть при закрытии Child-формы она уничтожается
(при OnClose: Action = caFree;) или нет ?
|
Отредактировано Topik — 07/06/2004, 12:40 |
|
Topik |
Отправлено: 07.06.2004, 12:42 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Admin ну помоги пожалуйста, я вторые сутки мучаюсь |
|
olegenty |
Отправлено: 07.06.2004, 15:09 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
вот тебе простая рекомендация, выполнив которую ты можешь за 5 мин решить свою проблему: воспользуйся отладчиком. и увидишь, какого именно объекта уже не существует при обращении.
|
|
Topik |
Отправлено: 07.06.2004, 15:34 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
А как воспользоваться дебагером |
|
** pasha |
Отправлено: 07.06.2004, 16:16 |
|
Не зарегистрирован
|
Да Админ тут и не причем.
Я так понял что возможно где-то неправильно организовано MDI-приложение, отсюда и ошибки.
Надеюсь что
QUOTE |
А потом, при щелчке на ячейке OnCellClick
Fl_Red=ShowModal();
|
это всего лишь описка, а в коде стоит правильно Fl_Red->ShowModal();
Я понял так -
1 Есть FormStyle=fsMDIForm — это форма MainWindow
2 из нее открывется методом ShowModal() форма Fl_Red,
то есть где-то в коде есть
Fl_Red->ShowModal();
эта форма fsNormal и не динамически созданная.
3 из TFl_Red как-то выводит (судя по коду) некую форму
поиска FlatsSearch2, какая она и как создается — Вы не написали
4 И наконец это форма поиска FlatSearch2 (опять-же, судя по
приведенному коду) создает форму Result1
CODE |
void __fastcall TFlatsSearch2::Button2Click(TObject *Sender)
{
TResult1* Result1 = new TResult1(Application);
...
}
|
Форма Result1 имеет свойство formStyle=fsMDIChild
находится в списке динамически создаваемых,
уничтожается при ее закрытии — и создается формой FlatsSearch2
Уффф. Так что-ли все это работает ?
|
|
Topik |
Отправлено: 07.06.2004, 16:26 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
ну почти
MainWindow, на самом деле MDIForm, из нее вызывается форма FlatsSearch fsNormal FlatsSearch->ShowModal();
Из формы FlatsSearch вызывается Result1 fsMDIChild из этой формы вызывается Fl_Red fsNormal Fl_Red->ShowModal();
И из формы Fl_Red проводится Update
Формы FlatsSearch и Fl_Red Auto_create forms
Форма Result1 Available Forms
Отредактировано Topik — 07/06/2004, 17:31 |
|
olegenty |
Отправлено: 08.06.2004, 06:18 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
Ну то, что ты не умеешь пользоваться отладчиком — и так понятно, иначе топика бы не было.
набери в справке поисковую фразу "Debug"...
как вообще можно не пользоваться отладчиком? лично для меня — загадка...
и, зачем такой сложный интерфейс? можно просто передавать идентификатор между формами... тогда вызывающая форма будет всего одна... и куча вызываемых, но на одном уровне...
|
|
Topik |
Отправлено: 08.06.2004, 11:13 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Сложный интерфейс нужен, во-первых для опыта, а во вторых для удобства работы пользователей
При выпадании в ошибку дебагер останавливается на Result1->Query1->Active=true;, даже если закоментить эту строку все равно выпадает при любом обращении к Result1 в форме Fl_Red (форма из которой проводится Update)
при наведении мышкой на Result1-> появляется попап Result1=NULL
что это значит? |
|
olegenty |
Отправлено: 08.06.2004, 11:49 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
ВОт то и значит, что экземляра этой твоей формы не существует, а ты к нему пытаешьмя обратиться. вот и ищи код, который убивает экземпляр. (если это Child с Action = caFree — то вот тебе и ответ на вопрос...)
|
|
Topik |
Отправлено: 08.06.2004, 12:15 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Убрал Action Free, тот же эффект, хотя он все равно не мешал, т.к. стоял насобытие Close(), а я его не закрывал, при открытии окно редактирования |
|
olegenty |
Отправлено: 08.06.2004, 13:45 |
|
Ветеран
Группа: Модератор
Сообщений: 2412
|
возвращаюсь к тому, с чего начал: отлаживай.
вот тебе ещё вариант: форма создаётся, как new? у тебя точно установлена та переменная, к которой ты обращаешься? а то может в CPP у тебя и есть переменная-форма Result1, но ты её НИКОГДА не инициируешь, а делаешь вот, например, так:
TResult1 *f = new TResult1(Application);
тогда тоже не удивительно...
|
|
Topik |
Отправлено: 08.06.2004, 13:58 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
а как ее инициировать? |
|
Admin |
Отправлено: 08.06.2004, 20:46 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
Ну как я и написал в своем первом ответе по теме:
QUOTE | Вряд-ли из-за работы с базой, тут скорее всего что-то другое,
или обращаетесь к уже удаленному объекту (например форме), |
так оно и оказывается.
А где удаляете форму — ищите по шагам, как и сказали — с помощью
отладчика.
А вообще можете пойти любым удобным путем:
1 Поставить между строчек кучу что-то типа:
ShowMessage((int)Result1);
2 Можете в интересующем коде поставить кучу точек
прерывания — счелкните левой кнопкой мыши на
странице кода (cpp-формы) в сером поле слева — появится
красный кружочек — в этой (этих) точка произойдет
прерывание программы — напротив интересующих строчек
кода, теперь, наведя курсор мыши на код, можете
во всплывающих подсказках смотреть значения переменных
(наведя курсор мыши на эти переменные,
в том числе и значение Result1) — 5 мин и найдете, в каком
месте она становиться NULL
|
|
Topik |
Отправлено: 10.06.2004, 11:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 45
|
Проверил отладчиком (спасибо за подсказку) оказывается Result1 в форме Fl_Red у меня с самого начала NULL, видимо я неправильно обращаюсь к дочернему объекту
Стал вопрос, как правильно обратиться к уже созданному объекту типа fsChild из формы типа fsNormal? |
|