2014-11-17 13 views
0

델파이에서 세부 정보 테이블에 알 수없는 이미지 파일 이름이 저장되어 있습니다. 이러한 이미지 파일은 Bitmaps, Jpegs, PNGS 및 ICO 파일이 될 수 있습니다.이동 중에도 db에서 이미지 표시

이동 중에도 목록보기 나 목록 상자에로드하고 표시하는 패러다임/모범 사례는 무엇입니까?
나는 어떻게 든 그들을 마스터 테이블의 OnBeforeScroll 이벤트에서 ImageList에로드하고 목록보기에 할당해야합니다. 사용 된 데이터베이스 구성 요소는 dbGO입니다.

미리 정의 된 크기의 축소판 만 표시하면됩니다 (VCL 프로그램에서).

+2

어떤 부분이 당신을 위해 문제를 해결합니까? 파일을 TPicture에로드 하시겠습니까? 비트 맵을 imagelist에 추가 하시겠습니까? imagelist와 Dataset/Listview/Listbox 사이를 추적하고 있습니까? – bummi

+0

@bummi 위의 모든 것, 슬프게도. –

+0

@bummi 사실 당신의 의견은 제 질문에 거의 답합니다. 그래서 나는 TPicture를 인스턴스화하고, 파일에서로드하고, imagelist에 추가하고 모든 세부 테이블 레코드에 대해 반복해야한다고 생각합니다. 답변으로 의견을 넓힐 수 있다면 기꺼이 받아 들일 것입니다. –

답변

3

가장 간단한 방법은 다른 그래픽 형식의로드가 이미 구현되어 있고 다른 이미지 클래스를주의해야하기 때문에 TPicture를 사용하는 것입니다.
필수 단위가 with와 같이 여기에 포함되도록해야합니다. jpeg, gifimg 및 pngimg.
TPicture.LoadFromFile을로드 한 후 Imagelist의 크기가있는 준비된 Bitmap에 이미지가 그려지며 가운데 맞춤 및 크기 조절됩니다.
마지막 단계는 비트 맵으로 teh AddBitmap 프로 시저를 호출하고 마스크에 대해 nil을 호출하는 것입니다.

// make sure you included the needed units 
// uses pngImage,jpeg,gifimg; 

Procedure LoadImagesFromDataset2ImageList(il: TImageList; DS: TDataset; const FileFieldname: String); 
var 
    P: TPicture; 
    bmp: TBitmap; 

    Function CalcRectAndPrepare: TRect; // calculate Rect for here centered/streched output 
    var // and fill the bitmap with the desired beckground color 
    f: Double; 
    begin 
    bmp.Canvas.Brush.Color := clWhite; 
    bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height)); 
    if P.Width > P.Height then 
     f := bmp.Width/P.Width 
    else 
     f := bmp.Height/P.Height; 
    Result.Left := Round(bmp.Width - P.Width * f) div 2; 
    Result.Top := Round(bmp.Height - P.Height * f) div 2; 
    Result.Right := bmp.Width - Result.Left; 
    Result.Bottom := bmp.Height - Result.Top; 
    end; 

begin 
    P := TPicture.Create; 
    bmp := TBitmap.Create; 
    try 
    bmp.Width := il.Width; 
    bmp.Height := il.Height; 
    DS.First; 
    while not DS.Eof do 
    begin 
     if FileExists(DS.Fieldbyname(FileFieldname).asString) then 
     begin 
     P.LoadFromFile(DS.Fieldbyname(FileFieldname).asString); 
     bmp.Canvas.StretchDraw(CalcRectAndPrepare, P.Graphic); 
     il.Add(bmp, nil); 
     end; 
     DS.Next; 
    end; 
    finally 
    P.Free; 
    bmp.Free; 
    end; 
end; 
+0

위대한, 그냥 내가 알고 싶은. –

1

엄청난 수의 이미지가있는 것처럼 "알 수없는 번호"라는 소리가납니다. 사전 미리보기 이미지가 도움이 될 것입니다. 응용 프로그램이 모든 이미지에 대한 축소판을 만들어 별도의 데이터베이스에 보관하면 CPU 리소스 사용량이 줄어들어 축소 될 수 있습니다. 또한 마스터 데이터베이스에서 미리보기 이미지 데이터베이스를 참조 할 수 있습니다.

RAM이 한계가 될 수 있는지 확인해야 할 한 가지는 예를 들어 과 동일한 썸네일을 참조하는 1000 개의 데이터베이스 레코드를로드하는 경우 응용 프로그램에서 실제 축소판의 인스턴스가 얼마나 많이 생성되는지입니다. 데이터베이스 액세스 구성 요소는 1000 개 이상의 이미지 개체 (필요한 것보다 1000 배 더 많은 RAM 사용)를 할당하거나 1000 번 참조되는 하나만 할당합니다. 또한 이미지 데이터의 할당 해제가 중요합니다.

+0

예, 엄지 손톱은 확실히가는 길입니다. 퍼포먼스와 관련하여 전체 크기 이미지를 이동 중에로드하는 것은 허용되지 않습니다. 나는 레코드를 삽입하는 동안 그들을 만들 것이라고 생각합니다. –