27. august 2012 - 17:46 Der er 4 kommentarer og
1 løsning

Stream fra en Database til Visning .

HEJ,

Fra en database har jeg en stream (skal være STREAM pga. data'ene i samme stream (personlige data)), som jeg skal vise på "anmodning".

Jeg har 2 krav til denne "stream-viser". Den skal kunne vise billeder (jpeg, BMP, TIFF, GIff , whatever) og den skal kunne håndtere virksomme links. (A la HTML <a href ="#link1">nnnn</A> ----- <a name="link1">..</A> .)

Læsning/skrivning til basen sker som ren tekst (AnsiString // Stream), så der er ingen problemer her.

Jeg har overvejet 3 muligheder:

1: HTML
2: PDF
3: RTL

ad 1.)
HTML er godt, idet du kan vise alt med HTML. MEN det er uanvendeligt når jeg skal gøre det som STREAM (med Billeder) i en Twebbrowsr. Jeg kan ikke gemme en normal STREAM i HTML med links til JPEG-filer. Det vil bryde reglen om de personlige data, hvis billederne må ligge på "offentlige" filer. Jeg kan gemme filen som MHTML (mime-formatet) men for at få den frem på Twebbrowseren SKAL jeg over en fil-løsning... Og så er jeg lige vidt.... Og samtidig skal jeg have mulighed for at indlægge ny tekst (tilføjes den "gamle"). Jeg kan ikke på nettet finde ret meget om MIME og Delphi. (Indy (til delp 7) har en MIME komponent, men den kan jeg ikke få til at funke..)

Ad 2.)
Jeg er ikke så godt kendt med PDF-løsninger, så her er en mulighed. Jeg er dog ikke kendt med Delphi PDF -komponenter, som kan vise, oprette og ændre PDF-dokumenter. Og hvor jeg kan oprette LINKS. Har ADOBE PDF-reader en xxx_TLB fil, som kan dette ? (husk billederne !)..

Ad 3:)
Har en RTL komponent, som kan det hele bortset fra LINKS. Så hvis der ikke kommer meget gode grunde til at ændre dette vil dette blive løsningen. Trænger dog lidt (meget?) hjælp til det med LINKS i RTL-filer (The Delphi way).

KRISTIAN
27. august 2012 - 17:47 #1
UPS...

RTL skal læses som RTF -- sorry !
Avatar billede skovjuul Nybegynder
27. august 2012 - 19:56 #2
Hola

jeg har netop kæmpet med en løsning jeg tror du kan bruge. Den kan pt vise billeder, xlsx og pdf filer fra en database hvor de tidligere er blevet gemt og hive dem frem igen, mon ikke du kan modificere den til også at vise links.

Håber ikke det bliver for uoverskueligt.

På formen er bare en TPictureList, TImage og en TMemo.

Kodestart:
unit visfiler;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Imaging.GIFImg, Vcl.Imaging.PngImage, Vcl.Imaging.JPeg, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.ExtCtrls, AdvPanel, frmdmcont, DBAdvPicture, AdvPicture, Vcl.StdCtrls, PictureList,
  Data.DB, ShellApi, Vcl.ComCtrls, bdrutils, Bde.DBTables;

type
  TfrmVisFiler = class(TForm)
    AdvPanel1: TAdvPanel;
    AdvPanel2: TAdvPanel;
    PictureList: TPictureList;
    Memo1: TMemo;
    imageBig: TImage;
    procedure PictureListDblClick(Sender: TObject);
    procedure PictureListClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    iEntry_Id: integer;
    procedure FillFileList;
    Procedure DestroyFileList;
  public
    { Public declarations }
    procedure Execute(sagsnr: integer);
  end;

var
  frmVisFiler: TfrmVisFiler;
  ListOfFiles: TList;

implementation

{$R *.dfm}

procedure TfrmVisFiler.DestroyFileList;
var
  i:integer;
begin
  if ListOfFiles.Count >0 then begin
    for I := 0 to ListOfFiles.Count-1 do begin
      TPicInfoClass(ListOfFiles.Items[i]).Free;
    end;
    ListOfFiles.Free;
  end;
end;

procedure TfrmVisFiler.Execute(sagsnr: integer);
begin
  iEntry_Id := sagsnr;
  FillFileList;
  ShowModal;
  DestroyFileList;
end;

procedure TfrmVisFiler.FillFileList;
var
  SqlTxt: string;
  Save_Cursor: TCursor;
  BlobStream: TStream;
  pngfile : TPngImage;
  bmpfile : TBitmap;
  giffile : TGifImage;
  jpgfile : TJPeGImage;
  picfile : TPicture;
  rscfile: string;
  tmpPicInfoClass: TPicInfoClass;
begin
  //Get image from DB
  Save_Cursor := Screen.Cursor;
  try
    try
      Screen.Cursor := crSQLWait;
      dmCont.qGetComboBoxFills.Active := false;
      dmCont.qGetComboBoxFills.SQL.Clear;
      SqlTxt := 'select * from bdrattachments where entry_id = '+inttostr(iEntry_Id)+' order by filenmb asc';
      dmCont.qGetComboBoxFills.SQL.Add(SqlTxt);
      dmCont.qGetComboBoxFills.Open;
      dmCont.qGetComboBoxFills.First;
      while(not dmCont.qGetComboBoxFills.Eof)do begin
        tmpPicInfoClass := TPicInfoClass.Create;
        tmpPicInfoClass.ext := dmCont.qGetComboBoxFills.FieldByName('extension').AsString;
        tmpPicInfoClass.caption := dmCont.qGetComboBoxFills.FieldByName('caption').AsString;
        tmpPicInfoClass.comment := dmCont.qGetComboBoxFills.FieldByName('comment').AsString;
        BlobStream := dmCont.qGetComboBoxFills.CreateBlobStream(dmCont.qGetComboBoxFills.FieldByName('filedata'),bmRead); //BlobStream; //Burde der være en .create here først
        tmpPicInfoClass.filedataraw := TMemoryStream.Create;
        tmpPicInfoClass.filedataraw.LoadFromStream(BlobStream);

        rscfile := tmpPicInfoClass.ext;
        Delete(rscfile,1,1); //remove . in .xxx
        if POS(Uppercase(tmpPicInfoClass.ext), '.JPEG .JPG .BMP .GIF .PNG')>0 then begin
          picfile := TPicture.Create;
          try
            try
              Picturelist.Thumbnails.Add;
              Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Caption := tmpPicInfoClass.caption;
              Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Source := tsPicture;

              if (Uppercase(rscfile) = 'JPG') or (Uppercase(rscfile) = 'JPEG') then begin
                jpgfile := TJpegImage.Create;
                try
                  jpgfile.LoadFromStream(tmpPicInfoClass.filedataraw);
                  picfile.Assign(jpgfile);
                  Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Picture := picfile;
                finally
                  jpgfile.Free;
                end;
              end
              else if Uppercase(rscfile) = 'BMP' then begin
                bmpfile := TBitMap.Create;
                try
                  bmpfile.LoadFromStream(tmpPicInfoClass.filedataraw);
                  picfile.Assign(bmpfile);
                  Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Picture := picfile;
                finally
                  bmpfile.Free;
                end;
              end
              else if Uppercase(rscfile) = 'GIF' then begin
                giffile := TGifImage.Create;
                try
                  giffile.LoadFromStream(tmpPicInfoClass.filedataraw);
                  picfile.Assign(giffile);
                  Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Picture := picfile;
                finally
                  giffile.Free;
                end;
              end
              else if Uppercase(rscfile) = 'PNG' then begin
                pngfile := TPngImage.Create;
                try
                  pngfile.LoadFromStream(tmpPicInfoClass.filedataraw);
                  picfile.Assign(pngfile);
                  Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Picture := picfile;
                finally
                  pngfile.Free;
                end;
              end;
            except on e:Exception do
              MessageDlg('Kunne ikke tilføje fil til fil-liste: '+e.Message, mtError, [mbOK], 0);
            end;
          finally
            picfile.Free;
          end;
        end
        else if POS(Uppercase(tmpPicInfoClass.ext), '.PDF .DOC .DOCX .XLS .XLSX')>0 then begin
          picfile := TPicture.Create;
          bmpfile:=TBitmap.Create;
          try
            try
              bmpfile.LoadFromResourceName(hInstance,rscfile);
              picfile.Bitmap := bmpfile;
              Picturelist.Thumbnails.Add;
              Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Picture := picfile;
              Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Caption := tmpPicInfoClass.caption;
              Picturelist.Thumbnails[PictureList.Thumbnails.Count-1].Source := tsPicture;
            except on e:Exception do
              MessageDlg('Kunne ikke tilføje fil til fil-liste: '+e.Message, mtError, [mbOK], 0);
            end;
          finally
            bmpfile.Free;
            picfile.Free;
          end;
        end;
        BlobStream.Free;
        ListOfFiles.Add(tmpPicInfoClass);
        dmCont.qGetComboBoxFills.Next;
      end;
      Picturelist.Refresh;
    except on E:Exception do
      begin
        MessageDlg('Problemer med at hente vedhæftede filer.  ' + E.Message, mtError, [mbOK], 0);
      end;
    end;
  finally
    dmCont.qGetComboBoxFills.Close;
    Screen.Cursor := Save_Cursor;
  end;
end;

procedure TfrmVisFiler.FormCreate(Sender: TObject);
begin
  ListOfFiles := TList.Create;
end;

procedure TfrmVisFiler.PictureListClick(Sender: TObject);
begin
  //Get image from DB
  imageBig.Picture := PictureList.Thumbnails[PictureList.ItemIndex].Picture;
  Memo1.Text := TPicInfoClass(ListOfFiles.Items[PictureList.ItemIndex]).comment; // Items[ListOfFiles.IndexOf(PictureList.ItemIndex)]. comment;
end;

procedure TfrmVisFiler.PictureListDblClick(Sender: TObject);
var
  SqlTxt, strTempFileName: string;
  Save_Cursor: TCursor;
  BlobStream: TStream;
begin
  //Get image from DB
  Save_Cursor := Screen.Cursor;
  try
    try
      Screen.Cursor := crSQLWait;
      dmCont.qGetComboBoxFills.Active := false;
      dmCont.qGetComboBoxFills.SQL.Clear;
      SqlTxt := 'select filedata from bdrattachments where entry_id = '+ inttostr(iEntry_Id)+ ' and filenmb = '''+ inttostr(PictureList.ItemIndex) +'''';
      dmCont.qGetComboBoxFills.SQL.Add(SqlTxt);
      dmCont.qGetComboBoxFills.Open;
      dmCont.qGetComboBoxFills.First;

      BlobStream := dmCont.qGetComboBoxFills.CreateBlobStream(dmCont.qGetComboBoxFills.FieldByName('filedata'),bmRead);
      BlobStream.Seek(0, soFromBeginning);

      //Gemmer filen i brugerens windows temp folder
      strTempFileName := SJWinTmpPath + 'bdrtmpfil'+ TPicInfoClass(ListOfFiles.Items[PictureList.ItemIndex]).ext;
      with TFileStream.Create(strTempFileName, fmCreate) do
        try
          CopyFrom(BlobStream, BlobStream.Size)
        finally
          Free
        end;
      if POS(Uppercase(TPicInfoClass(ListOfFiles.Items[PictureList.ItemIndex]).ext), '.JPEG .JPG .BMP .GIF .PNG')>0 then begin
        ShellExecute(
          0,
          'open',
          'c:\Windows\System32\rundll32.exe',
          PChar('c:\Windows\System32\shimgvw.dll,ImageView_Fullscreen ' + strTempFileName),
          nil,
          SW_NORMAL);
      end
      else if POS(Uppercase(TPicInfoClass(ListOfFiles.Items[PictureList.ItemIndex]).ext), '.PDF .DOC .DOCX .XLS .XLSX')>0 then begin
        ShellExecute(
          0,
          'open',
          PChar(strTempFileName),
          nil,
          nil,
          SW_NORMAL);
      end
      else
        MessageDlg('Du har ingen programmer installeret der kan vise denne filtype!', mtError, [mbOK], 0);

    except on E:Exception do
      MessageDlg('Problemer med at hente filen.', mtError, [mbOK], 0);
    end;
  finally
    BlobStream.Free;
    dmCont.qGetComboBoxFills.Active := false;
    Screen.Cursor := Save_Cursor;
  end;

end;
Avatar billede skovjuul Nybegynder
15. oktober 2012 - 20:35 #3
Var det noget du kunne bruge til noget eller blev det for snørklet? :)
16. oktober 2012 - 12:43 #4
Desværre, det var ikke lige det.

Men jeg har talt med "brugeren"; han er lidt utilfreds med resultatet, men har accepteret det (nødtvungent). (Og det er også begrænset hvad man kan få for 0,00 kr. i hyre.)

Så hvis der ikke er kommentarer (ønske om point etc. ) vil jeg lukke spm. i næste uge.

Kristian
31. oktober 2012 - 11:46 #5
LUKKER
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester