Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   JPG im Blob Feld wird extrem groß (https://www.delphipraxis.net/184681-jpg-im-blob-feld-wird-extrem-gross.html)

DeddyH 14. Apr 2015 14:51

AW: JPG im Blob Feld wird extrem groß
 
Das, was zur Laufzeit in der Filename-Eigenschaft dieses Dialogs steht.

Sherlock 14. Apr 2015 15:23

AW: JPG im Blob Feld wird extrem groß
 
Calikey, bevor hier einer der Beteiligten einen Herzinfarkt bekommt, oder entnervt aufgibt: Bitte lies Dir das durch: http://www.delphipraxis.net/41047-tu...ortgeschr.html

Ehrlich!

Sherlock

calikey 14. Apr 2015 16:03

AW: JPG im Blob Feld wird extrem groß
 
Bin froh das man soviel gedult hat. Ich muss mich erst mal um meine kleine kümmern und lese mir heute abend denn link durch. Ich schreib dann heute abend weiter. Bedanke mich erst mal ganz herzlich bei allen die bis jetzt geholfen haben.

calikey 18. Apr 2015 11:47

AW: JPG im Blob Feld wird extrem groß
 
So beim compelieren ist mir eine warnung auf gefallen
[dcc32 Warnung] doku.pas(171): W1036 Variable 'BlobStream' ist möglicherweise nicht initialisiert worden

himitsu 18. Apr 2015 12:27

AW: JPG im Blob Feld wird extrem groß
 
nicht initialisiert = nichts zugewiesen
Delphi-Quellcode:
var
  i: Integer;
begin
  if i = 0 then ; // nicht initialisiert

var
  i: Integer;
begin
  i := 0;
  if i = 0 then ; // initialisiert

DeddyH 18. Apr 2015 12:32

AW: JPG im Blob Feld wird extrem groß
 
Heißt in Deinem Fall: Du greifst anscheinend auf die Variable zu, bevor CreateBlobStream aufgerufen wurde bzw. in bestimmten Fällen kann es sein, dass diese Methode gar nicht aufgerufen wird, Du greifst aber trotzdem auf die Variable zu. Wieso, weshalb, warum, das kannst nur Du wissen, wir kennen den Code ja nicht.

calikey 18. Apr 2015 15:16

AW: JPG im Blob Feld wird extrem groß
 
So quellcode
bei BlobStream.Free; meldet er denn hinweis
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    odBlob: TOpenDialog;
    sdBlob: TSaveDialog;
    Button3: TButton;
    frxReport1: TfrxReport;
    Photo: TImage;
   
    procedure btnLoadClick(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure tPhotoAlbumAfterScroll(ClientDataSet1: TClientDataSet);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;


implementation

{$R *.dfm}

uses Unit1, ABOUT;



procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if sdBlob.Execute then
  BlobStream := nil;
  FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
  begin
    Form1.clientdataset1.Edit;
    try
      BlobStream := Form1.clientdataset1.CreateBlobStream(Form1.clientdataset1.FieldByName('Arbeitsvertragimg')AS TBlobField, bmWrite );
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      Form1.clientdataset1.Post;
    finally
      BlobStream.Free; // hier ist der hinweis
      FileStream.Free;
      Form1.clientdataset1.Post;
      tPhotoAlbumAfterScroll (Form1.clientdataset1)

    end;
  end;
end;

procedure TForm2.Button12Click(Sender: TObject);
begin
frxreport1.showreport;
end;

procedure TForm2.Button13Click(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if (sdBlob.Execute) then
    begin
      FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
      BlobStream := Form1.clientdataset1.CreateBlobStream(Form1.clientdataset1.FieldByName('Arbeitsvertragimg'),bmRead);
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      BlobStream.Free;
      FileStream.Free;
    end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Form1.clientdataset1.Open;
end;

procedure TForm2.tPhotoAlbumAfterScroll(ClientDataSet1: TClientDataSet);
var
  JpegImage: TJPEGImage;
  BlobStream: TStream;
begin
  if (not Form1.clientdataset1.FieldByName('Arbeitsvertragimg').IsNull) then
    begin
      BlobStream := Form1.clientdataset1.CreateBlobStream(Form1.clientdataset1.FieldByName('Arbeitsvertragimg'),bmRead);
      JpegImage := TJPEGImage.Create;
      try
        JpegImage.LoadFromStream(BlobStream);
        Photo.Picture.Assign(JpegImage);
        Photo.Visible := True;
      finally
        JpegImage.Free;
        BlobStream.Free;
      end;
    end
  else
    Photo.Visible := False;
end;


END.

DeddyH 18. Apr 2015 15:26

AW: JPG im Blob Feld wird extrem groß
 
Zitat:

Delphi-Quellcode:
if sdBlob.Execute then
  BlobStream := nil;

Das heißt, dass BlobStream nur auf nil gesetzt wird, wenn der Benutzer den Dialog bestätigt hat. Der restliche Code wird aber unabhängig davon trotzdem ausgeführt. Damit das nicht geschieht, musst Du den kompletten Code nach der If-Abfrage mit einem begin-end-Block einschließen.

[edit] Kleiner Tipp: drück doch mal STRG+D, damit der Code-Formatter die Einrückungen korrigiert, dann fällt so etwas schon rein optisch auf. [/edit]

mkinzler 18. Apr 2015 15:26

AW: JPG im Blob Feld wird extrem groß
 
Delphi-Quellcode:
Es fehlen einige begin und end

procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if sdBlob.Execute then
  begin //  <-
    BlobStream := nil;
    FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
    begin
      Form1.clientdataset1.Edit;
      try
        BlobStream :=    Form1.clientdataset1.CreateBlobStream(Form1.clientdataset1.FieldByName('Arbeitsvertragimg')AS TBlobField, bmWrite );
        FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
        Form1.clientdataset1.Post;
      finally
        BlobStream.Free; // hier ist der hinweis
        FileStream.Free;
      end; // <-
      Form1.clientdataset1.Post;
      tPhotoAlbumAfterScroll (Form1.clientdataset1)
    end;
   end; // <- 
  end;
end;

DeddyH 18. Apr 2015 15:29

AW: JPG im Blob Feld wird extrem groß
 
Ätsch, schneller :tongue:

calikey 18. Apr 2015 16:06

AW: JPG im Blob Feld wird extrem groß
 
ok der hinweis ist weg danke :-)

nur leider wird immer noch nichts gespeichert.
im debugger steht folgendes.
Delphi-Quellcode:
procedure TBlobField.SaveToFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;

procedure TBlobField.SaveToStream(Stream: TStream);
var
  BlobStream: TStream;
begin
  BlobStream := DataSet.CreateBlobStream(Self, bmRead);
  try
    Stream.CopyFrom(BlobStream, 0);
  finally
    BlobStream.Free;
  end;
end;

procedure TBlobField.SaveToStrings(Strings: TStrings);
var
  BlobStream: TStream;
begin
  BlobStream := DataSet.CreateBlobStream(Self, bmRead);
  try
    if DataType = ftWideMemo then
      Strings.LoadFromStream(BlobStream, TEncoding.Unicode)
    else
      Strings.LoadFromStream(BlobStream);
  finally
    BlobStream.Free;
  end;
end;

procedure TBlobField.SaveToStreamPersist(StreamPersist: IStreamPersist);
var
  BlobStream: TStream;
  Size: Longint;
  Header: TBytes;
  GraphicHeader: TGraphicHeader;
begin
  BlobStream := DataSet.CreateBlobStream(Self, bmRead);
  try
    Size := BlobStream.Size;
    if Size >= SizeOf(TGraphicHeader) then
    begin
      SetLength(Header, SizeOf(TGraphicHeader));
      BlobStream.Read(Header, 0, Length(Header));
      Move(Header[0], GraphicHeader, SizeOf(TGraphicHeader));
      if (GraphicHeader.Count <> 1) or (GraphicHeader.HType <> $0100) or
        (GraphicHeader.Size <> Size - SizeOf(GraphicHeader)) then
        BlobStream.Position := 0;
    end;
    StreamPersist.LoadFromStream(BlobStream);
  finally
    BlobStream.Free;
  end;
end;

DeddyH 18. Apr 2015 16:20

AW: JPG im Blob Feld wird extrem groß
 
Der VCL-Code nützt uns nichts, zeig uns lieber die Stelle in Deinem, direkt bevor er in die gezeigte Unit springt.

khh 18. Apr 2015 16:20

AW: JPG im Blob Feld wird extrem groß
 
Muss es denn sein die Bilder in der DB zu speichern?
Das ist eigentlich keine so gute Idee.
Bilder sollten m.E. auf der Platte und nur der Pfad in der DB gespeichert werden.

Gruss KH

Bernhard Geyer 18. Apr 2015 16:25

AW: JPG im Blob Feld wird extrem groß
 
Zitat:

Zitat von khh (Beitrag 1298338)
Muss es denn sein die Bilder in der DB zu speichern?
Das ist eigentlich keine so gute Idee.
Bilder sollten m.E. auf der Platte und nur der Pfad in der DB gespeichert werden.

Für beide Wege (Bilder in DB/Bilder in Dateisystem) gibt es Argumente dafür und dagegen. Darüber gabs schon ein paar Diskussionen
Und ich halte es für besser die Bilder in der DB zu haben.

DeddyH 18. Apr 2015 16:25

AW: JPG im Blob Feld wird extrem groß
 
Wenn wir noch im letzten Jahrtausend wären, würde ich Dir da zustimmen :roll:

mkinzler 18. Apr 2015 16:26

AW: JPG im Blob Feld wird extrem groß
 
Diese Diskussion hatten wir schon öfterst und kann nicht so eindeutig, wie von Dir hier angedeutet beantwortet werden. Das sollten wir auch nicht in diesem Thread.

calikey 18. Apr 2015 18:09

AW: JPG im Blob Feld wird extrem groß
 
ok dann anderen weg wie muss ich denn um schreiben das ein pfad angelegt wird und der dann in der datenbank kommt. vieleicht funktioniert das dann besser als der blob


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz