공군에 근무하는 장교입니다.
최근 개발 업무 진행 중 애로 사항이 있어서 글을 올립니다.
한글 3.0으로 작성한 화일을 어떤 형태로든지 oracle db에 저장하고, oracle db
에 저장된 화일을 델파이 프로그램 실행 상태에서 한글 3.0을 이용해(ole를 이용해야할 것 같음) 화면에서 조회 및 수정 작업을 할 수 있는 방법이 있는지요?
avi화일을 db에 저장하고, 저장했던 화일을 다시 avi화일로 바꾸는 방법에
대해서는 찾았는데 한글은 어떻게 해야 하는지요?
아시는 분은 최대한 빨리 연락부탁드립니다.(hajch74@hanmail.net)
관련된 정보라도 부탁드립니다.(이번 주 까지는 해결해야 됩니다.)
도움이 될지 모르겠지만 제가 다른 곳에서 찾은 내용을 보냅니다.
[팁] AVI파일을 DB에 저장, DB에서 불러와서 재생
제목 : AVI파일을 DB에 저장하고, DB에서 불러와서 재생하기
AVI화일을 DB에 저장할때는 BLOB 형의 Field에 저장할수 있습니다.
파라독스 테이블을 쓸때는 Binary 형의 필드타입에 저장할수 있습니다.
DB에 저장하고, 불러올때 가장 쉬운 방법은
Blob 형의 필드의 데이타를 임시 화일로 만들어서 그것을
다시 재생하는 겁니다.
그리고 화일을 테이블에 저장할때나 테이블의 내용을 파일로 만들때는
Stream을 사용합니다.
아래 예제를 보시면 쉽게 이해가 가실겁니다.
아래 예제에서사용한 콤포넌트는
Table: 데이타를 저장할 DB
MediaPlayer ; AVI를 재생하기 위해
Panel : AVI를 재생할때 화면 보이는곳
Button1 : AVI화일 저장
Button2 : DB에서 AVI화일 불러와서 재생
OpenDialog : AVI화일을 선택하기 위해
////////////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, MPlayer, ExtCtrls ;
type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Table1: TTable;
Table1Test1: TStringField;
Table1TestBlob: TBlobField;
Button2: TButton;
Panel1: TPanel;
MediaPlayer1: TMediaPlayer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
FileName : string;
implementation
{$R *.DFM}
function GetTemporaryFileName : string;
const
MAX_PATH = 144;
var
lpPathBuffer : PChar; //경로를 위한 버퍼
lpBuffer : PChar; //파일 이름을 위한 버퍼
begin
GetMem(lpBuffer, MAX_PATH);
GetMem(lpPathBuffer, MAX_PATH);
//임시 경로명을 얻어 온다
GetTempPath(MAX_PATH, lpPathBuffer);
//임시 파일명을 얻어 온다.
GetTempFileName(lpPathBuffer, 'tmp' , 0, lpBuffer);
//메모리에서 버퍼 해제
FreeMem(lpPathBuffer, MAX_PATH);
//임시 파일명을 리턴한다.
result := StrPas(lpBuffer);
//메모리에서 버퍼를 해제 한다.
FreeMem(lpBuffer, MAX_PATH);
end;
//Save 버튼을 눌렀을때
procedure TForm1.Button1Click(Sender: TObject);
var
FileStream : TFileStream;
BlobStream : TBlobStream;
begin
if OpenDialog1.Execute then
begin
//작업하는 동안에 메세지 처리를 할수 있게 한다.
Application.ProcessMessages;
//Save, Play 버튼이 동작하지 않게 한다.
Button1.Enabled := False;
Button2.Enabled := False;
//Blob에 AVI를 저장하기 위해 AVI화일을
//FileStream형태로 저장한다.
FileStream := TFileStream.Create(OpenDialog1.FileName,
fmOpenRead);
Table1.Edit;//Table을 Edit상태로 바꾼다.
//BlobStream을 만든다.
//Table1TestBlob는 Table1의 필드 명이 TestBlob인
//TField 타입변수다. Table1의 필드 에디터에서 이 이름을
//찾으면 된다.
BlobStream := TBlobStream.Create(Table1TestBlob, bmReadWrite);
//스트림의 시작점을 찾는다.
BlobStream.Seek(0, soFromBeginning);
//혹시 있을지 모르는 데이타를 지운다.
BlobStream.Truncate;
//FlieStream을 BlobStream에 저장한다.
BlobStream.CopyFrom(FileStream, FileStream.Size);
//스트림을 해제한다.
FileStream.Free;
BlobStream.Free;
Table1.Post;
Button1.Enabled := True;
Button2.Enabled := True;
end;
end;
//Load버튼을 눌렀을때, 현재 레코드로 부터 Blob데이타를
//불러와서 MediaPlayer를 사용하여 재생까지 한다.
procedure TForm1.Button2Click(Sender: TObject);
var
FileStream : TFileStream;
BlobStream : TBlobStream;
begin
//BlobStream을 만든다.
BlobStream := TBlobStream.Create(Table1TestBlob,bmRead);
if BlobStream.Size = 0 then
begin
BlobStream.Free;
exit;
end;
MediaPlayer1.Close;
MediaPlayer1.FileName := '';
MediaPlayer1.Display := panel1;
Panel1.Refresh;
if FileName <> '' then
DeleteFile(FileName);
FileName := GetTemporaryFileName; //임시 파일 이름을 얻는다
//임시 파일 스트림을 만든다.
FileStream := TFileStream.Create( FileName,
fmCreate or fmOpenWrite );
//파일스트림에 BlobStream을 복사한다.
FileStream.CopyFrom(BlobStream, BlobStream.Size);
FileStream.Free;
BlobStream.Free;
//AVI 파일을 재생하기 위해 MediaPlayer를 설정한다.
MediaPlayer1.FileName := FileName;
MediaPlayer1.DeviceType := dtAviVideo;
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
//폼이 종료될때
procedure TForm1.FormDestroy(Sender: TObject);
begin
MediaPlayer1.Close;
MediaPlayer1.FileName := '';
if FileName <> '' then
DeleteFile(FileName);
end;
end.