Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Открыть blob поле в соответствующим ему приложении, файл из blob открыть в приложении 
V
    Опции темы
Gella7
  Дата 22.9.2009, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



Я загружаю файл в blob. Файлы могут быть разнве - текстовые, архивы, jpg, pdf....

к примеру файл с расширением djvu

Код

      DataModule2.IBTable1.Append;
      DataModule2.IBTable1File1.LoadFromFile('C:\Nest\nest.djvu');
      DataModule2.IBTable1op.Value := 'djvu';
      DataModule2.IBTable1.Post;



Нужно сделать так, чтобы, допустим при щелчке на кнопку (не важно) файл открывался в соответствующем ему приложении.
Я пока только сделала пересохранение, тоесть берем файл и сохраняем с соответствующим расширением:

Код

Procedure TForm1.Button2Click(Sender: TObject);
Var
FName: string;
Begin
  If (SaveDialog1.Execute) Then
  Begin
    FName := SaveDialog1.FileName;
    DataModule2.IBTable1File1.SaveToFile(FName);
  End;
End;


Но это очень не удобно - сохранять а потом запускать... не могу никак придумать, что делать
PM MAIL   Вверх
former
Дата 22.9.2009, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Gella7 @  22.9.2009,  09:47 Найти цитируемый пост)
Я пока только сделала пересохранение, тоесть берем файл и сохраняем с соответствующим расширением

Gella7, т.е. расширение ты знаешь. Вот по расширению и определяй с помощью какой программы открывать. Можно даже хранить в настройках ассоциации с определенными программами.

Вот пример загрузки из blob без сохранения на диск.
Однако, необходимо помнить, что в этом случае все загруженные данные будут висеть в памяти. Учитывая, что размеры некоторых PDF и DjVu файлов могут быть 50 - 70 Mb:
Цитата(Akella @  21.9.2009,  14:05 Найти цитируемый пост)
пожалей пользователей  smile 


ИМХО: Лучше файлы хранить отдельно, а в БД хранить ссылки на них или только их имена.

Это сообщение отредактировал(а) former - 22.9.2009, 10:01


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Gella7
Дата 22.9.2009, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



Цитата

ИМХО: Лучше файлы хранить отдельно, а в БД хранить ссылки на них или только их имена.


Висеть то, это да... smile  
Я об этом думала, но имена файлов наверняка могут быть одинаковыми. Как то их пометить что-ли какими-нибудь индексами...
Да и все равно, как их запускать-то программно - они ведь все разные, и суть проблемы не меняется.


Цитата

Gella7, т.е. расширение ты знаешь. Вот по расширению и определяй с помощью какой программы открывать. Можно даже хранить в настройках ассоциации с определенными программами.


Я так понимаю, надо будет к каждому приложению код писать для открытия... ну это ладно.
я просто не знаю как. Если с word, excel или текстовый я как-то еще разберусь, например ворд

Код

Wrd:=CreateOleObject('Word.Application');

и так далее.

или это просто сделать? 
PM MAIL   Вверх
former
Дата 22.9.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Gella7 @  22.9.2009,  10:23 Найти цитируемый пост)
Я об этом думала, но имена файлов наверняка могут быть одинаковыми. Как то их пометить что-ли какими-нибудь индексами...

Присваивай уникальное имя при внесении в БД (переименовывай, переноси в хранилище - отдельную папку).
Цитата(Gella7 @  22.9.2009,  10:23 Найти цитируемый пост)
Да и все равно, как их запускать-то программно - они ведь все разные, и суть проблемы не меняется.

Цитата(Gella7 @  22.9.2009,  10:23 Найти цитируемый пост)
Я так понимаю, надо будет к каждому приложению код писать для открытия... ну это ладно.
я просто не знаю как. Если с word, excel или текстовый я как-то еще разберусь, например ворд

Используй ShellExecute. Другими словами, у тебя файлы будут открываться программами, с которыми ассоциировано то, или иное расширение в Windows. Храни расширение отдельным столбцом.

Это сообщение отредактировал(а) former - 22.9.2009, 10:28


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Gella7
Дата 22.9.2009, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



Ну вот как? Лежит допустим какой-нибудь файл с *.ххх расширением, как его взять и запустить программно, независимо от расширения?
Не могу никак докопаться  smile

Добавлено через 1 минуту и 41 секунду
О, значит есть такое... пошла копать
PM MAIL   Вверх
former
Дата 22.9.2009, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Gella7 @  22.9.2009,  10:29 Найти цитируемый пост)
Ну вот как? Лежит допустим какой-нибудь файл с *.ххх расширением, как его взять и запустить программно, независимо от расширения?

Читай про ShellExecute.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Gella7
Дата 22.9.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



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

потому что не могу в эту прекрасную функцию 

Код

ShellExecute (Form1.Handle, nil, 'C:\Nest\nest.djvu', nil, nil, SW_RESTORE);


засунуть этот файл из blob, потому что не могу его от туда вытащить вот так как-то...


вариант 
Цитата

ИМХО: Лучше файлы хранить отдельно, а в БД хранить ссылки на них или только их имена.


пользователь хочет прицепить файл. Показывает через OpenDialog хде он там у него
файл программно копируется на сервер, при этом запоминается имя, расширение... ну наверное к имени номер его прикрепляется.

Пользователь хочет открыть документ - ShellExecute и все.

и третий извращенный
сохраняется он все-таки в blob. 

а достается так - в зависимости от расширения создается пустой файл 
туда за писывается из blob

Код

  FName := 'ttt.txt';
  DataModule2.IBTable1File1.SaveToFile(FName);


открывается через ShellExecute
потом когда пользователь его закрывает, этот временный файлик удаляется (тоже поди не сложно)


по моему я переработала  smile 



PM MAIL   Вверх
Keeper89
Дата 22.9.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Вариант 1
Вариант former'а с внешним хранением файлов мне нравится, и это можно попробовать реализовать как копирование файлов на сервер с добавлением получившего местоположения в БД.

Вариант 2
1) Загружаем файл в BLOB и записываем расширение.
2) При выборе - создаем временный файл из BLOB'а и открываем ShellExecute, а после закрытия удаляем.


--------------------
PM MAIL WWW   Вверх
dvamaster
Дата 22.9.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 559
Регистрация: 30.6.2004
Где: Россия : Курган

Репутация: 3
Всего: 10



мдя, а вот как запустив через shellexecute отследить закрытие запущеной программы?

Поэтому поводу из MSDN

Цитата

The return value is cast as an HINSTANCE for backward compatibility with 16-bit Windows applications. It is not a true HINSTANCE, however. The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.


возвращаемый результат не HINSTANCE, а код ошибки


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
former
Дата 22.9.2009, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Keeper89 @  22.9.2009,  11:45 Найти цитируемый пост)
2) При выборе - создаем временный файл из BLOB'а и открываем ShellExecute, а после закрытия удаляем. 

Цитата(dvamaster @  22.9.2009,  13:31 Найти цитируемый пост)
мдя, а вот как запустив через shellexecute отследить закрытие запущеной программы?

Необходимо еще учитывать то, что клиентская программа может быть закрыта раньше, viewer-а.
Года 4-е назад делал электронную библиотеку. Файлы хранил отдельно. Экземпляр файла копировал в Temp-папку на клиенте. При запуске клиента и выходе из него очищал временную папку.

Хранить файлы отдельно считаю лучше, т.к.:
- скорость в работе с БД;
- переносимость БД;
- малые затраты на резервное копирование.

Позже хотел сделать собственный viewer (что бы файлы не копировали), но так руки и не дошли.
Конечно это не панацея.

P.S. Точно сказать не могу, но вроде есть способ узнать, каким приложением файл открыт.

Это сообщение отредактировал(а) former - 22.9.2009, 16:35


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Akella
Дата 22.9.2009, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Не знаю, отвечали здесь или нет


Цитата(Gella7 @  22.9.2009,  09:47 Найти цитируемый пост)
Нужно сделать так, чтобы, допустим при щелчке на кнопку (не важно) файл открывался в соответствующем ему приложении.

Сохраняешь файл во временную папку с правильным расширением. А затем ShellExecute()

Это сообщение отредактировал(а) Akella - 22.9.2009, 16:50
PM MAIL   Вверх
former
Дата 22.9.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Akella, чуть выше.  smile  Только кэш на компе у клиента очищать.

Это сообщение отредактировал(а) former - 22.9.2009, 16:57


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Gella7
Дата 23.9.2009, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



К слову, вдруг кому понадобится

создание каталога

Код

CreateDir('C:\Nest\\Test');


удаление каталога со всем содержимым

Код

function TForm1.DelDir(dir: string): Boolean;
var
fos: TSHFileOpStruct;
begin

ZeroMemory(@fos, SizeOf(fos));
with fos do
begin
wFunc := FO_DELETE;
fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
pFrom := PChar(dir + #0);
end;
Result := (0 = ShFileOperation(fos));
End;


Это ко второму способу.

Всем большое спасибо!!! smile 
PM MAIL   Вверх
Gella7
Дата 23.9.2009, 07:59 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.8.2008
Где: г.Кемерово

Репутация: нет
Всего: нет



Может кто-нибудь подскажет что тут не так:

Код

DataModule2.IBQuery1.SQL.Clear;
DataModule2.IBQuery1.sql.text:='INSERT INTO NEST1 (file1) VALUES (:F)';
DataModule2.IBQuery1.params.parseSQL(DataModule2.IBQuery1.sql.text, true);
DataModule2.IBQuery1.ParamByName('F').LoadFromFile('C:\Nest\nest.djvu');
DataModule2.IBQuery1.execsql;


ругается на предпоследнюю строчку и говорит что

not enough actual parameters
PM MAIL   Вверх
Frees
Дата 23.9.2009, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(Gella7 @  23.9.2009,  07:32 Найти цитируемый пост)
создание каталога

лучше наверно ForceDirectories()

тк CreateDir требует что бы путь по которому создаешь папку существовал

Добавлено через 2 минуты и 33 секунды
Код

DataModule2.IBQuery1.ParamByName('F').LoadFromFile('C:\Nest\nest.djvu', ftBlob);



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.