Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

Подружить TDBImage и jpeg. Как лучше всего?   Найти похожие ветки 

 
DVM ©   (2007-05-31 11:15) [0]

Пока ничего не приходит в голову как заменить TDBImage на обычный TImage и грузить данные из BLOB поля в него.

Есть еще варианты?


 
clickmaker ©   (2007-05-31 11:27) [1]

как вариант, написать наследника, переопределить CreateHandle и грузить через TJpegImage


 
PEAKTOP(banned)   (2007-05-31 12:39) [2]

Идем в модуль DBCtrls.pas, копируем класс TDBImage (декларацию и методы и implementation) и всталяем в новый модуль, обзывая как-нибудь по другому, например TxcDBImage. Далее переопределяем методы

.......
implementation
uses
 ........,   Jpeg,  PngImage1, .......;
..............
procedure TxcDBImage.LoadPicture;
var
 Jpeg    :TJpegImage;
 Png     :TPngImage;
 Strm    :TMemoryStream;
 Buff    :array[0..9]of Byte;
begin
 if((not FPictureLoaded)and(Assigned(FDataLink.Field)))then
   if(FDataLink.Field.IsBlob)then
     begin
     Strm := TMemoryStream.Create;
     TBlobField(FDataLink.Field).SaveToStream(Strm);
     Strm.Seek(0, soFromBeginning);
     Strm.Read(Buff, SizeOf(Buff));
     Strm.Seek(0, soFromBeginning);
     if((Buff[0]=$FF)and(Buff[1]=$D8)and(Buff[2]=$FF)and(Buff[3]=$E0)and(Buff[4]=$00) and
        (Buff[5]=$10)and(Buff[6]=$4A)and(Buff[7]=$46)and(Buff[8]=$49)and(Buff[9]=$46))th en
       begin
       Jpeg   := TJpegImage.Create;
       Jpeg.LoadFromStream(Strm);
       Jpeg.DIBNeeded;
       FPicture.Bitmap.Assign(Jpeg);
       Jpeg.Free;
       end
      else
       begin
       if((Buff[0]=$89)and(Buff[1]=$50)and(Buff[2]=$4E)and(Buff[3]=$47)and(Buff[4]=$0D) and
          (Buff[5]=$0A)and(Buff[6]=$1A)and(Buff[7]=$0A)and(Buff[8]=$00)and(Buff[9]=$00))th en
         begin
         Png   := TPngImage.Create;
         Png.LoadFromStream(Strm);
         FPicture.Bitmap.Assign(Png);
         Png.Free;
         end
        else
         FPicture.Assign(FDataLink.Field);
       end;
     Strm.Free;
     if(Assigned(FAfterPictureLoaded))then
       FAfterPictureLoaded(Self);
     end;
end;

procedure TxcDBImage.Paint;
var
 Size: TSize;
 R: TRect;
 S: string;
 DrawPict: TPicture;
 Form: TCustomForm;
 Pal: HPalette;
 Jpeg    :TJpegImage;
 Png     :TPngImage;
 Strm    :TMemoryStream;
 Buff     :array[0..9]of Byte;
begin
 with Canvas do
 begin
   Brush.Style := bsSolid;
   Brush.Color := Color;
   if FPictureLoaded or (csPaintCopy in ControlState) then
     begin
     DrawPict := TPicture.Create;
     Pal := 0;
     try
       if (csPaintCopy in ControlState) and Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
         begin

         Strm := TMemoryStream.Create;
         TBlobField(FDataLink.Field).SaveToStream(Strm);
         Strm.Seek(0, soFromBeginning);
         Strm.Read(Buff, SizeOf(Buff));
         Strm.Seek(0, soFromBeginning);
         if((Buff[0]=$FF)and(Buff[1]=$D8)and(Buff[2]=$FF)and(Buff[3]=$E0)and(Buff[4]=$00) and
            (Buff[5]=$10)and(Buff[6]=$4A)and(Buff[7]=$46)and(Buff[8]=$49)and(Buff[9]=$46))th en
           begin
           Jpeg   := TJpegImage.Create;
           Jpeg.LoadFromStream(Strm);
           Jpeg.DIBNeeded;
           DrawPict.Bitmap.Assign(Jpeg);
           Jpeg.Free;
           end
          else
           begin
          if((Buff[0]=$89)and(Buff[1]=$50)and(Buff[2]=$4E)and(Buff[3]=$47)and(Buff[4]=$0D) and
              (Buff[5]=$0A)and(Buff[6]=$1A)and(Buff[7]=$0A)and(Buff[8]=$00)and(Buff[9]=$00))th en
             begin
             Png   := TPngImage.Create;
             Png.LoadFromStream(Strm);
             DrawPict.Bitmap.Assign(Png);
             Png.Free;
             end
            else
             DrawPict.Assign(FDataLink.Field);
           end;
         Strm.Free;

         if DrawPict.Graphic is TBitmap then
           DrawPict.Bitmap.IgnorePalette := QuickDraw;
         end
.............

end

После этого TxcDBImage поддерживает PNG, JPEG. Можно еще GIF до кучи привязать. Мне просто было лень.

З.Ы. Библиотека JPEG - стандартная от Бормана, библиотеку PNG взял от компонента THTMLViewer, если нет, можно просто убить эту часть из исходника.


 
DVM ©   (2007-05-31 13:26) [3]


> PEAKTOP(banned)  

Спасибо, я пока по-простому решил через обычный TImage. Но все равно пригодится.


 
sniknik ©   (2007-05-31 14:10) [4]

> Но все равно пригодится.
легко, даже если не хочется делать свой компонент, инсталировать в дельфи (ну или может нельзя как у нас), пользуясь "типа стандартным" TDBImage... (на форме его размещать)
делаешь объявления до формы,

type
 TxcDBImage = class(TDBImage)  //это как дополнение к коду в [2]
   procedure LoadPicture;
   procedure Paint;
 end;

 TDBImage = class(TxcDBImage);  //фокус

 TForm1 = class(TFopm)
   DBImage1: TDBImage;  //положенный на форму "стандартный" вернее уже нестандартный компонент
   ...

все, теперь "стандартный" будет понимать jpeg.

кстати в аксесс ты можеш встретится не только с просто картинкой, а с обьектом у которого есть префикс указывающий чем эту картинку открывать...
можеш сделать такую, открыть таблицу в аксессе так чтобы аксесс занимал пол экрана. во второй половине окно проводника, найди в проводнике любую картинку/документ и перетаскивай в поле таблицы (должно быть типа обьект OLE, т.е. того же в какой рисунки сохраняешь),  посмотри что будет.


 
PEAKTOP(banned)   (2007-05-31 14:49) [5]

> TDBImage = class(TxcDBImage);  //фокус

Ага, а потом ловим ошибки периода компиляции по всему юниту и зависимым юнитам о несовместимости классов TDBImage и TDBImage. А по законам Мерфи это произойдет ровно через полгода, когда проект разрастется, отработает и закроется, и все участники забудут, где-что-прикручено. :)


 
Виталий Панасенко ©   (2007-05-31 15:12) [6]

А чем "халява" не угодила ? я о JEDI компонентах


 
DVM ©   (2007-05-31 16:33) [7]


> я о JEDI компонентах

Я изо всех сил стараюсь не использовать сторонние компоненты. Даже свои стараюсь не применять. А джеди вообще монстр из монстров.


 
DVM ©   (2007-05-31 16:36) [8]


> кстати в аксесс ты можеш встретится не только с просто картинкой,
>  а с обьектом у которого есть префикс указывающий чем эту
> картинку открывать

Не я не встречусь. Я в базу картинки сам и кладу программой на делфи.
Напрямую в акцесс базу открывать никто не будет.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.042 c
2-1189529913
Black_Tomcat
2007-09-11 20:58
2007.10.07
Через ScrollBar.Hadle изменить позицию ScrollBar.


3-1180274821
Nic
2007-05-27 18:07
2007.10.07
Импортировать базу даненых в SQL Server 2000


15-1189424595
MZ
2007-09-10 15:43
2007.10.07
Управление пользователями FireBird


2-1189508158
Korneley
2007-09-11 14:55
2007.10.07
Неясности с отрисовкой SubItem у ListView


1-1185344333
NKT
2007-07-25 10:18
2007.10.07
Многодокументальное прило жение . Создание новой нестан. формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский