1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
У меня есть программа, АРМ администратора компьютерного магазина, вроде когда я беру изображения из БД все нормально картинка отображается в DBImagе, но когда жму кнопку "ДОБАВИТЬ" (Добавиьт данные в таблицу) он выбивает ошибку поэтому даже проверить не могу работоспособность добавления. Помогите пожалуйто с добавлением буду очень благодарен. В архиве прикрепленном снизу вся прога с БД. ВСЕ РАЗАРХИВИРУЙТЕ В ОДНУ ПАПКУ
1) на Form3 вместо Edit1 добавил DBEdit4, связал его с полем Photo набора данных. Естественно, что в обработчике кнопки "Обзор" я заношу имя файла не в Edit1, а в DBEdit4. 2) с обработкой "Применить" у тебя - полный бардак. Я сделал так:
void __fastcall TForm3::Button2Click(TObject *Sender) { // Ничего заносить в поле Photo уже не надо, это делается автоматически //Form2->DataSource1->DataSet->FieldValues["Photo"];// присваиваем имя фотографии товара
Form2->ADOQuery1->Edit(); // Тебе не нужно ДОБАВЛЯТЬ запись, достаточно ее ОБНОВИТЬ Form2->DataSource1->DataSet->Post(); Form2->DBImage1->Stretch=true; // Вот так я добиваюсь того, чтобы изображение читалось из текущей папки + /photo ВСЕГДА Form2->DBImage1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "photo\\" + fname);
// Вот этого тоже делать не надо, не оставляй набор данных в открытом состоянии, // не ты один можешь работать с базой, это будет мешать остальным... // при выделении товара показывать информацию о нем // Form2->ADOQuery1->Edit(); Form3->Close(); }
Точно так же, как и тут, я переделал строку в LoadPhoto() :
Form2->DBImage1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "photo\\" + strphoto); // при выделении товара показывать информацию о нем
, теперь все прекрасно добавляется и ничего никуда не вылетает.
Теперь еще кое-что: 1) у тебя программа не завершается корректно, остается висеть в процессах. При отладке работе из Билдера это видно, просто снимаешь ее с выполнения через Ctrl+F2 и все. А вот если запустить программу из проводника - то потом ее приходится снимать из диспетчера задач. Ищи причину. 2) утечка памяти. Ты выделяешь
void __fastcall TForm1::Button1Click(TObject *Sender) { int i; char *k=new char[5]; // <--- Вот тут
память? Где освобождение? CodeGuard тут же поднимает тревогу. Кстати, то, что ты делаешь - вообще неправильно. Как минимум потому, что выделять память надо на один символ больше, чем будешь использовать, для завершающего нуля. Ты этого не сделал. Исправляй эти недочеты тоже...
Добавлено через 12 мин. Да, кстати, еще одно... Весь вот этот ужас:
Цитата
if (Form2->ComboBox1->ItemIndex==0) { Form2->ADOQuery1->SQL->Add("Select * FROM Акустика"); Form2->ADOQuery1->SQL->Add("WHERE (Наименование LIKE'%"+Edit1->Text+"%') ORDER by Наименование ASC"); Form2->ADOQuery1->Open(); Form2->DataSource1->DataSet=Form2->ADOQuery1; // LoadPhoto(); } else if (Form2->ComboBox1->ItemIndex==1) { Form2->ADOQuery1->SQL->Add("Select * FROM Материнки"); Form2->ADOQuery1->SQL->Add("WHERE (Наименование LIKE'%"+Edit1->Text+"%') ORDER by Наименование ASC"); Form2->ADOQuery1->Open(); Form2->DataSource1->DataSet=Form2->ADOQuery1; //LoadPhoto(); } else ...
(и так далее еще 8 раз) - очень просто укладывается в 4 строки, независимо от количества таблиц в базе:
Form2->ADOQuery1->SQL->Add("Select * FROM " + ComboBox1->Text); Form2->ADOQuery1->SQL->Add("WHERE (Наименование LIKE'%"+Edit1->Text+"%') ORDER by Наименование ASC"); Form2->ADOQuery1->Open(); Form2->DataSource1->DataSet=Form2->ADOQuery1;
Угу? Главное, чтобы текст в комбобоксе совпадал с названием таблицы.
То же самое касается и десяти кнопок для выбора показываемой таблицы. Достаточно сделать один обработчик, работающий с Caption-ом Sender-а, и назначить его всем кнопкам. Не нужен тут Copy+Paste...