2012-07-19 4 views
3

이전에 이런 질문을 받았지만 찾을 수없는 것 같습니다. 아래 코드를 사용하여 MS Access 데이터베이스에서 이미지를 표시합니다. 그러나 다음을 수행하는 방법을 알고 싶습니다.다른 양식의 절차를 호출 하시겠습니까?

- 아래 절차를 따르고 다른 형식으로 '호출'할 수 있습니까?

시나리오 : 3 가지 양식. 세 개의 테이블, 하나의 데이터베이스. TADOTable 구성 요소 및 TADOConnection을 통해 테이블에 액세스합니다.

각 양식에는 데이터베이스 (btnShowImage)가있어 데이터베이스에서 사진을 볼 수 있습니다. 현재 작동하려면 폼에 함수를 추가 한 다음 btnShowImage.OnClick에 함수를 추가해야합니다. 아래에 표시된대로 프로 시저를 추가합니다. 이것은 세 가지 형식 모두에서 발생합니다. 내 질문은 : 어쨌든 더 효율적으로 만들 수 있습니까? 이 코드를 세 가지 형식 모두에 추가하는 것은 약간 지루한 것처럼 보입니다. 기본적으로 동일한 경우 (이 과정에서 테이블 이름은 세 가지 형식 모두에서 다릅니다). 각 양식에서이 코드를 모두 사용하지 않고도이 작업을 수행하는 간단한 방법 (이미지 표시)이 있습니까?

도움 주셔서 감사합니다.

CODE :

...uses 
    JPEG, ADODB, DB 

function JpegStartsInBlob(PicField: TBlobField): integer; 
var 
    bS: TADOBlobStream; 
    buffer: Word; 
    hx: string; 
begin 
    Result := -1; 
    bS := TADOBlobStream.Create(PicField, bmRead); 
    try 
    while (Result = -1) and (bS.Position + 1 < bS.Size) do begin 
     bS.ReadBuffer(buffer, 1); 
     hx := IntToHex(buffer, 2); 
     if hx = 'FF' then begin 
     bS.ReadBuffer(buffer, 1); 
     hx := IntToHex(buffer, 2); 
     if hx = 'D8' then 
      Result := bS.Position - 2 
     else if hx = 'FF' then 
      bS.Position := bS.Position - 1; 
     end; 
    end; 
    finally 
    bS.Free 
    end; 
end; 

procedure Tfrm3.btnShowImageClick(Sender: TObject); 
var 
    bS: TADOBlobStream; 
    Pic: TJPEGImage; 
begin 
    bS := TADOBlobStream.Create(table1.FieldByName('Photo') 
    as TBlobField, bmRead); 
    bS.Seek(JpegStartsInBlob(table1.FieldByName('Photo') as TBlobField), 
    soFromBeginning); 
    Pic := TJPEGImage.Create; 
    Pic.LoadFromStream(bS); 
    frmOne.Image1.Picture.Graphic := Pic; 
    Pic.Free; 
    bS.Free; 
end; 

코드에 발견 : 나는 거의 있었다 3 개 가지 형태의 버튼에서 호출해야했습니다 코드를 가지고 있다면 내가 할 것이 무엇 http://delphi.about.com/od/database/l/aa030601d.htm

+0

새 단위를 만들고 거기에 절차를 입력하십시오. 그런 다음 모든 양식에서 사용하십시오 ... – Adam

+0

내 생각도 있지만, 어떻게 각각의 테이블 이름을 바꿀까요? – coder123

+1

또는 데이터베이스 연결과 함께 [TDataModule] (http://www.delphipages.com/forum/showthread.php?t=208044)에 넣으십시오. –

답변

5

각 개별 형식의 컨텍스트와 몇 가지 구체적인 차이점을 제외하고 어디서나 코드를 가져 와서 단위로 넣고 차이를 매개 변수로 바꾸는 것입니다. 예를 들면 다음과 같습니다.

procedure LoadJPEGImage(field: TBlobField; image: TImage); 
var 
    bS : TADOBlobStream; 
    Pic : TJPEGImage; 
begin 
    bS := TADOBlobStream.Create(field, bmRead); 
    Pic := TJPEGImage.Create; 
    try 
    bS.Seek(JpegStartsInBlob(field), soFromBeginning); 
    Pic.LoadFromStream(bS); 
    image.Picture.Graphic := Pic; 
    finally 
    Pic.Free; 
    bS.Free; 
    end; 
end; 

이제 코드는 양식이나 세부 사항을 신경 쓰지 않습니다. 읽을 수있는 TBlobField와 그림을 그릴 TImage가 필요하며, 원하는만큼 여러 형식에서 사용할 수 있습니다.

+0

멋지다, 나는 그것을 생각하지 않았다라고 생각할 수 없다. 메이슨 감사합니다! – coder123

+1

@ Coder123 : 항상 분명하지는 않습니다. 그러나 리팩터링 할 기회를 찾기 시작하면 기술이 유용 할 수있는 패턴을 더 많이 보게됩니다. :) –

+0

빠른 질문, 양식을 선언하면 다른 양식으로 초기화하는 절차는 어떻게 생깁니 까? – coder123