Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Загрузка изображения в компонент Image

Автор: ITProf
Дата сообщения: 11.02.2005 14:08
Проект хранится в папке C:\Project\
Изображения хранятся в папке C:\Project\Images
Есть база с текстовым полем "Foto" в котором хранятся имена файлов фотографий сотрудников в виде "Images\foto1.jpg"
На форме есть компонент "Image" и "DBNavigator".
На OnClick по навигатору стоит обработчик, который обновляет изображение в компоненте "Image" таким образом:

Image.Picture.LoadFromFile(DataModule1.ADOTable.FieldValues['Foto']);

Если просто перемещаться по таблице используя навигатор, то все отображается нормально.

Есть на форме кнопка, которая добавляет новое фото:

procedure TForm.ButtonClick(Sender: TObject);
begin
if OpenPictureDialog.Execute
then
begin
DataModule1.ADOTable.Edit;
DataModule1.ADOTable.FieldValues['Foto'] := OpenPictureDialog.FileName;
DataModule1.ADOTable.Post;
Image_Foto.Picture.LoadFromFile(OpenPictureDialog.FileName);
end;
end;

Т.е. новая картинка добавляется в базу и отображается в "Image" нормально.

НО!!! Если после добавления картинки нажать на навигатор, он переходит на следующую запись в таблице, в которой в поле "Foto" стоит "\Images\foto1.jpg". По идее картинка в "Image" должна обновится, однако выскакивает ошибка:

Project Project.exe raised exception class EFOpenError with message 'Cannot open file "C:\Project\Images\Images\foto1.jpg. Process stopped. Use Step or Run to continue.

Вопрос: откуда в пути взялось "C:\Project\Images", ведь значение пути берется из ячейки, в которой есть только "Images\foto1.jpg".

Автор: Sleepwalker
Дата сообщения: 11.02.2005 14:22
як...
> Изображения хранятся в папке C:\Project\Images
> в виде "Images\foto1.jpg"

если сложить вместе - это и получится

правда, я че-то не совсем понял... откуда у тебя в базе берется "Images\foto1.jpg" если ты делаешь DataModule1.ADOTable.FieldValues['Foto'] := OpenPictureDialog.FileName, который сохраняет полное имя файла?
в случае с добавление понятно, почему работает, ведь ты делаешь Image_Foto.Picture.LoadFromFile(OpenPictureDialog.FileName), а значит картинка не из базы грузится... кстати, а ты картинки небось с нуля сам ручками заносил, а не добавлял этой программой?
Автор: ITProf
Дата сообщения: 11.02.2005 14:55
Sleepwalker

Да, в некотороые поля я картинки (путь к ним) занес вручную. Оттуда в базе и взялись
"Images\foto1.jpg".
Но ведь когда я перемещаюсь по базе, то все работает и картиночки меняются. Почему глюк наступает только после втсавки новой картинки?
Автор: ITProf
Дата сообщения: 14.02.2005 14:21
Все равно какие-то глюки с путем к файлам картинок.

Вот что происходит:

1. При перемещении по базе в компонент Image загружается картинка, путь которой берется из поля Foto. Он имеет вид "Images\foto1.jpg". Здесь все работает.
2. Удаляем фото из базы. При этом в поле Foto заносится значение "Images\No_foto.jpg"
Тут тоже все работает.
3. Всавляем вместо удаленной фотки другую путем выбора файла через компонент OpenPictureDialog. При этом в базу записывается полный путь к фото: "C:\Project\Images\foto2.jpg".
4. А вот если теперь попытаться перейти на другое поле, то выскакивает ошибка. Мол не могу найти файл "C:\Project\Images\Images\foto1.jpg".

Image.Picture.LoadFromFile(DataModule1.ADOTable.FieldValues['Foto'])

Хотя по идее должен искаться файл по адресу, который вбит в поле Foto, а это адрес "Images\foto1.jpg".

Вопрос: Почему подставляется полный адрес и как от этого избавится?
Автор: OdesitVadim
Дата сообщения: 14.02.2005 16:30
Когда ты используеш OPENDialog, ты изменяеш текущую директорию. Изначально при запуске текущей была та, откуда был запуск программы.
установить текущей нужню директорию можно с помощью SetCurrentDir(нужная_директория).
узнать где находтиться твоя прога - такой конструкцией ExtractFileDir(Application.ExeName)
способ номер два. один раз получаеш путь к каталогу твоей проги и делаеш так(или что-то в этом роде )

Код:
На OnClick по навигатору стоит обработчик, который обновляет изображение в компоненте "Image" таким образом:

Image.Picture.LoadFromFile(ExtractFileDir(Application.ExeName)+'\'+DataModule1.ADOTable.FieldValues['Foto']);
Автор: ITProf
Дата сообщения: 14.02.2005 17:03
OdesitVadim

Спасибо БОЛЬШОЕ!

Это именно то, что нужно!
Автор: ITProf
Дата сообщения: 15.02.2005 14:32
OdesitVadim


Цитата:
Image.Picture.LoadFromFile(ExtractFileDir(Application.ExeName)+'\'+DataModule1.ADOTable.FieldValues['Foto']);


Это то, да не совсем то, что нужно...
Теперь после добавления картинки через OpenDialog, выскакивает вот такая ошибка:

Мол, не могу найти файл "C:\Project\C:\Project\Images\foto1.jpg"

Это, конечно, решается путем вставки после каждого вызова OpenDialog команды

SetCurrentDir(ExtractFileDir(Application.ExeName));

Но, по-моему, это избыточность кода... Или так и должно быть?
Автор: OdesitVadim
Дата сообщения: 15.02.2005 16:01
если у тебя все картинки хранятся в папке Images, то тогда сохраняй только имя файла. Зачем сохранять лишний текст. вытянуть имя файла с длиного пути можно функцией ExtractFileName(). А путь к базе с картинками получай вначале с помощью такой строки
PathToBaseImage:=ExtractFileDir(Application.ExeName)+'\image';
А далее по тексту обработчика кнопки пишем
Image.Picture.LoadFromFile(PathToBaseImage+DataModule1.ADOTable.FieldValues['Foto']);

Страницы: 1

Предыдущая тема: Delphi + изображение в базе Access


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.