Oprettet man. d. 27. august 2012 kl. 17:46:41

snestrup2000
snestrup2000 (10.840 point. Point ude: 30)

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

Skrevet man. d. 27. august 2012 kl. 17:47:49| #1

snestrup2000
snestrup2000 (10.840 point)
UPS...

RTL skal læses som RTF -- sorry !

Skrevet man. d. 27. august 2012 kl. 19:56:14| #2

skovjuul
skovjuul (9.940 point)
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;

Skrevet man. d. 15. oktober 2012 kl. 20:35:05| #3

skovjuul
skovjuul (9.940 point)
Var det noget du kunne bruge til noget eller blev det for snørklet? :)

Skrevet tir. d. 16. oktober 2012 kl. 12:43:31| #4

snestrup2000
snestrup2000 (10.840 point)
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

Skrevet ons. d. 31. oktober 2012 kl. 11:46:06| #5


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

Main.FormClose bliver omgået når brugeren logger ud af...

Oprettet den 20. maj 2013 kl. 23.52
skovjuul giver 60 point for svar | Giv et svar »

Internet Explorer : tillad POPUPS'

Oprettet den 8. maj 2013 kl. 16.21
snestrup2000 giver 30 point for svar | Giv et svar »

Delphi 2007 og Firebird 2.5

Oprettet den 8. maj 2013 kl. 10.45
2Mida giver 100 point for svar | Giv et svar »

Seneste guides

Slettet
Håndtering af tekstoversættelse i...
Parameteriseret tekstformatering i C#
C++ Historie og Programmering - Del 1







Tips & Tricks fra PC World

Teaser billede

Her er seks Google Labs-funktioner, som du skal slå til med det samme

Gmail Labs giver dig adgang til en masse smarte funktioner, som Googles ingeniører leger med i øjeblikket.


Anmeldelser fra PC World

Teaser billede

Test: Samsung Galaxy S4 er et hit - trods gøglertricks

Kan Samsung beholde førertrøjen i det store Android-race? Galaxy S4 er smækfyldt med innovative funktioner, men også med en del gøgl. Er det for meget? Få vores dom over Samsungs nye topmodel.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du få 1 terabyte gratis plads hos Flickr

Yahoo har relanceret sin fototjeneste Flickr med 1 terabyte gratis plads til brugernes billeder og videoer.


Nyheder fra Computerworld

Teaser billede

Ny opfindelse: Oplad din mobil på 20 sekunder

Med ny opfindelse kan din mobiltelefon blive fuldt opladet på blot 20 sekunder.


IT Kurser
Samarbejdspartnere

Udgiver · © 2013 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger