С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Kasiman
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93
1

DBImage и DBGrid, что не так?

21.04.2013, 19:22. Просмотров 1989. Ответов 3
Метки нет (Все метки)

Быть может я задаю слишком много вопросов, но я спрашиваю то, с чем никак не могу справиться самостоятельно.
На форме лежит DBGrid и DBImage, в DBGrid'е есть колонка под названием "артикул", так же в папке с проектом лежат изображения, имя которых совпадает с текстом подходящей ячейки из колонки "Артикул".
Например, есть строка, в поле "Артикул" этой строки написано "1000", тогда в папке есть изображение с именем "а1000.jpg".
Требуется при нажатии на какую либо строку в таблице, отобразить в DBImage подходящее этой строке изображение.
Так же в эту таблицу можно добавить строку, заполнить ее и привязать изображение.
Все это я реализовал вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TForm1::DBGrid1CellClick(TColumn *Column)
{
 Form1->DBImage1->Picture->LoadFromFile("a"+DBEdit1->Text+".jpg");
}
 
//-------------------------------------------------
 
void __fastcall TForm1::Button5Click(TObject *Sender)  //привязать изображение
{
  if (DBEdit1->Text=="")  // значение ячейки "Артикул", данной строки
    MessageBox(0,"Введите артикул!","Ошибка",MB_OK);
  else
    {
     if (Form1->OpenPictureDialog1->Execute())
       {
        AnsiString sFileName = Form1->OpenPictureDialog1->FileName;
        AnsiString newname( "C:\\Users\\касиман\\Desktop\\проект\\a" + DBEdit1->Text + ".jpg" );
        MoveFile( sFileName.c_str( ), newname.c_str( ) );
       }
    }
}
При нажатии на какую либо строку таблицы, высвечивается нужное изображение, все работает. При нажатии Button5, появляется OpenDialog, я выбираю изображение и оно переносится в папку с проектом и получает нужное имя. Но после этого на DBImage ничего не высвечивается, даже при выборе других строк, которые до этого срабатывали, появляется ошибка что то вроде "не могу открыть файл 'а1000.jpg' ". Получается так будто этого файла нет в папке, но он там есть и все должно срабатывать.
При перезапуске программы все работает, и даже та строка, к которой я привязывал изображение показывает его.
В чем дело, что не так?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.04.2013, 19:22
Ответы с готовыми решениями:

Как вывести изображение из поля BLOB БД *.FDB на каждую запись DBGrid в DBImage
Вот сделал но тут не меняется изображение когда перебираю записи в DBGrid ...

Как связать DBGrid и DBImage
Есть компоненты dbimage и dbgrid, нужно чтобы картинка сохранялась в dbgrid...

Сделать так, чтобы при проверке данных код не очищал DBGrid
Уважаемые программисты, помогите не могу сообразить. Есть код: ...

Сделать так, чтобы при нажатии кнопки все поля в форме DBGrid заполнились
Есть форма для DBGrid, чтобы заполнить поля. Теперь мне необходимо чтобы при...

После удаления компонента ComboBox выдает сообщение, что с ним что-то не так, хотя его нигде в этом файле нет
Unresolved external '__fastcall...

3
nick42
Практикантроп
4347 / 2351 / 415
Регистрация: 23.09.2011
Сообщений: 5,007
22.04.2013, 22:55 2
По моему его (файла) там действительно нет. MoveFile перемещает файл, удаляя оригинал из исходной папки.
0
Lelik-pahan
1364 / 782 / 175
Регистрация: 25.11.2009
Сообщений: 1,597
Завершенные тесты: 1
22.04.2013, 23:52 3
Kasiman, нужно использовать абсолютные пути к картинкам, а не просто их имена.
Когда ты запускаешь программу, активной директорией является директория, где лежит экзешник и твои картинки. И когда ты загружаешь картинку только по имени файла, программа её находит. При использования опэн диалога, ты меняешь активную директорию, и твоя программа уже не находит там картинки с заданным именем.

C++
1
 Form1->DBImage1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName) + "a" + DBEdit1->Text + ".jpg");
Добавлено через 10 минут
Чтобы код не был таким громоздким, директорию с программой можно записать в переменную в начале программы и потом подставлять её
C++
1
2
3
String workPath;  //в классе формы
workPath = ExtractFilePath(Application->ExeName);  //в конструкторе формы
Form1->DBImage1->Picture->LoadFromFile(workPath + "a"+DBEdit1->Text+".jpg");  //далее используем переменную

или перед каждым обращением к файлам снова меняй текущую директорию (но на мой взгляд гораздо лучше просто использовать полные пути)
C++
1
2
SetCurrentDir(ExtractFileDir(Application->ExeName));
Form1->DBImage1->Picture->LoadFromFile("a"+DBEdit1->Text+".jpg");
Добавлено через 5 минут
P.S. И ещё, в твоём коде не нужно писать Form1-> при обращении к компонентам первой формы, т. к. ты пишешь код внутри функций (методов) этого класа
1
Kasiman
1 / 1 / 2
Регистрация: 11.11.2012
Сообщений: 93
23.04.2013, 00:34  [ТС] 4
Цитата Сообщение от nick42 Посмотреть сообщение
По моему его (файла) там действительно нет. MoveFile перемещает файл, удаляя оригинал из исходной папки.
Это верно, но вы не совсем правильно поняли (или я не совсем доходчиво обьяснил) MoveFile относится к тому файлу, который я выбираю в диалоговом окне, а выбираю я там изображение НЕ из папки проекта.

Добавлено через 4 минуты
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
Kasiman, нужно использовать абсолютные пути к картинкам, а не просто их имена.
Когда ты запускаешь программу, активной директорией является директория, где лежит экзешник и твои картинки. И когда ты загружаешь картинку только по имени файла, программа её находит. При использования опэн диалога, ты меняешь активную директорию, и твоя программа уже не находит там картинки с заданным именем.
Спасибо большое, еще не опробовал, но по логике должно сработать. По поводу того что OpenDialog меняет активную директорию - не знал, похоже в этом и было дело.
Еще раз ОГРОМНОЕ СПАСИБО!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2013, 00:34

Что лучше StringGrid или DBGrid ???
Есть устройства у которых есть несколько параметров. Надо это все записать в...

DBImage
Понимаю что тем подобных много но не одна не помогла решить проблему...

Показать в DBImage .JPG
Вопрос очень зализанный, но просто данный код был когда то работоспособным на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru