C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < [1] 2 >
Не проводится Update
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



Хоть бы кто ответил sad.gif
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 мин решить свою проблему: воспользуйся отладчиком. и увидишь, какого именно объекта уже не существует при обращении. smile.gif
Topik
Отправлено: 07.06.2004, 15:34


Дежурный стрелочник

Группа: Участник
Сообщений: 45



А как воспользоваться дебагером smile.gif
** 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?
стр.: (2) < [1] 2 >
Вернуться в Работа с базами данных в C++Builder