У меня есть программа, АРМ администратора компьютерного магазина, вроде когда я беру изображения из БД все нормально картинка отображается в DBImagе, но когда жму кнопку "ДОБАВИТЬ" (Добавиьт данные в таблицу) он выбивает ошибку поэтому даже проверить не могу работоспособность добавления. Помогите пожалуйто с добавлением буду очень благодарен. В архиве прикрепленном снизу вся прога с БД. ВСЕ РАЗАРХИВИРУЙТЕ В ОДНУ ПАПКУ
Прикрепленные файлы
P2.zip ( 1.23 мегабайт )
Кол-во скачиваний: 226
P1.zip ( 1.72 мегабайт )
Кол-во скачиваний: 218
P3.zip ( 147.15 килобайт )
Кол-во скачиваний: 205
P4.zip ( 741.19 килобайт )
Кол-во скачиваний: 218
Ну, во-первых, вот это:
if (Form2->DataSource1->DataSet->FieldByName("Photo")==NULL)- неправильно. У тебя никогда не поймается таким образом пустая строка. Ловить пустоту надо вот так:
if ((Form2->DataSource1->DataSet->FieldByName("Photo")->AsString).IsEmpty())
if ((Form2->DataSource1->DataSet->FieldByName("Photo")->AsString).IsEmpty()) // Изменения здесь
{
Form2->ADOQuery1->Edit();
Form2->DataSource1->DataSet->FieldValues["Photo"]= "none.jpg"; // и здесь
}
strphoto = Form2->DataSource1->DataSet->FieldValues["Photo"];
Form2->DataSource1->DataSet->Post();
Form2->DBImage1->Stretch=true;
Form2->DBImage1->Picture->LoadFromFile("photo\\" + strphoto);
if (Form2->DataSource1->DataSet->FieldByName("Photo")==NULL)- неправильно. У тебя никогда не поймается таким образом пустая строка. Ловить пустоту надо вот так:
if ((Form2->DataSource1->DataSet->FieldByName("Photo")->AsString).IsEmpty())
if ((Form2->DataSource1->DataSet->FieldByName("Photo")->AsString).IsEmpty()) // Изменения здесь
{
Form2->ADOQuery1->Edit();
Form2->DataSource1->DataSet->FieldValues["Photo"]= "none.jpg"; // и здесь
}
strphoto = Form2->DataSource1->DataSet->FieldValues["Photo"];
Form2->DataSource1->DataSet->Post();
Form2->DBImage1->Stretch=true;
Form2->DBImage1->Picture->LoadFromFile("photo\\" + strphoto);
Form2->DBImage1->Picture->LoadFromFile("photo\\" + strphoto);
Так... Ну, у тебя весь бардак - из-за того, что при нажатии на кнопку "Обзор" ты выбираешь файл, это меняет рабочую папку, и, соответственно, при дальнейших попытках открыть файл у тебя ничего не получается: папка изменилась, абсолютный путь - другой, программа аварийно завершается. После того, как бала нажата кнопка "Обзор", восстанавливай текущую папку (через SetCurrentDir), причем не только тогда, когда Execute завершилась удачно, а в любом случае. А fname присваивай не полное имя файла, а только ExtractFileName(Form3->OpenDialog1->FileName)... Тогда у тебя в любое время
а) будет правильная текущая папка;
б) будет правильное короткое имя файла изображения.
Разумеется, если ты хочешь подгружать изображения и из других папок - то это все надо делать по-другому, тогда надо вычислять относительный путь к файлу JPG от текущей папки (той, где лежит EXE-шник)
Прежде, чем с этим заморачиваться - ты сделай, чтобы у тебя к моменту открытия Form3 набор данных был уже открыт, те DBEdit-ы, которые лежат на форме, чтоб хоть как-то функционировали. А то смысл такой формы в чем? Не назначено DBEdit-ам ни RecordSet-а, ни имени поля в базе. Открылась форма, пытаешься ввести что-то - "а фиг тебе, я ни на что не реагирую". В топку такую форму, зачем она нужна, если не связана с базой, и не позволяет менять данные на лету? Или что, я должен в открытой форме выбрать название изображения, вслепую ее закрыть (а кнопочка Отмена не работает, закрывать приходится крестиком), а потом прямо в DBGrid-е изменять данные? Меня такое приложение мало интересует, я им заниматься не буду.
Второе: ты сравни свой скриншот с моим. Почему у тебя форма выглядит как положено, а у меня - нет? Это что, из серии "на мониторах больше 17 инч - не запускать, и только для Windows 7"? Приложение идет тем же лесом, что и из-за неадекватной формы. Исправляй работоспособность Form3, и внешний вид, и присоединяй проект. Только я тебя прошу: не надо мне твои obj-файлы и файлы истории. Убери все лишнее, зачем мегабайтные tds-файлы туда сюда перекачивать? Они мне на фиг не сдались, у меня все равно Builder 2009. Только MDB, CPP, H и BPR, все остальное любой откомпилирует сам...
DFM - файлы добавь в проект, а то восстанавливать форму не очень хочется вручную.
Значит, смотри, что я сделал:
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();
}
Form2->DBImage1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "photo\\" + strphoto);, теперь все прекрасно добавляется и ничего никуда не вылетает.
// при выделении товара показывать информацию о нем
void __fastcall TForm1::Button1Click(TObject *Sender)память?
{
int i;
char *k=new char[5]; // <--- Вот тут
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 ...
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;
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();
}
Form2->DBImage1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "photo\\" + strphoto);, теперь все прекрасно добавляется и ничего никуда не вылетает.
// при выделении товара показывать информацию о нем
void __fastcall TForm1::Button1Click(TObject *Sender)память?
{
int i;
char *k=new char[5]; // <--- Вот тут
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;