Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

calikey 14. Apr 2015 09:15

Datenbank: Mybase • Version: xe7 • Zugriff über: lokal

JPG im Blob Feld wird extrem groß
 
So habe die meisten Probleme gelöst. nur Leider wird ein JPG was ich in mein Blob Feld lade extrem groß. JPG größe 1,19 mb wird zu 27mb in der Datenbank. Habe das die feld def als FTgraphic und als normal blob versucht. in der clientdataset ist die feld def grad <FIELD attrname="Arbeitsvertragimg" fieldtype="bin.hex" SUBTYPE="Graphics"/> definiert

als Quellcode hab ich es so versucht, es funktioniert auch nur eben wird die Datenbank extrem groß.
Delphi-Quellcode:
procedure TForm2.btnLoadClick(Sender: TObject);
var
   SPicFileName: string;
   JP : TJPegImage;
   C : TClipboard;
begin
  if OpenPictureDialog1.Execute then
  begin
    JP := TJPegImage.Create;
    C:= TClipboard.Create;
    SPicFileName:= OpenPictureDialog1.FileName;
    try
      JP.LoadFromFile(SpicFileName);
      C.Assign(JP);
      DBImage1.PasteFromClipboard;

    finally
    JP.Free;
    C.Free;
  end;
  end;

Bernhard Geyer 14. Apr 2015 09:18

AW: JPG im Blob Feld wird extrem groß
 
Du lädst eine JPEG, kopierst es in die Zwischenablage und von dort in die DB.
Über diesen Umweg wird das JPEG ein Bitmap. Und ein BMP ist nunmal fast immer viel größer als ein JPEG.

mkinzler 14. Apr 2015 09:19

AW: JPG im Blob Feld wird extrem groß
 
Du fügst auch nicht die Jpegdatei, sondern das unkomprimierte Bild ein.

Sir Rufo 14. Apr 2015 09:21

AW: JPG im Blob Feld wird extrem groß
 
Der Hauptfehler ist doch schonmal der Weg die Daten in das Control zu packen anstatt direkt in die Datenmenge. Der Rest sind doch nur noch Folgefehler mit falschen Schlussfolgerungen.

calikey 14. Apr 2015 09:24

AW: JPG im Blob Feld wird extrem groß
 
Bin noch anfänger :-)
Aber wie lad ich jetzt am blödesten ins feld ohne das es zur bmp wird?

mkinzler 14. Apr 2015 09:40

AW: JPG im Blob Feld wird extrem groß
 
Lade die Datei in den Blob(stream)

http://www.componentace.com/blob-jpeg-field-delphi.htm

calikey 14. Apr 2015 10:26

AW: JPG im Blob Feld wird extrem groß
 
so hab das jetzt mal etwas für mich angepasst. leider bekomme ich bei meinem angepassten code nur denn Fehler:
[dcc32 Fehler] doku.pas(135): E2076 Diese Form des Methodenaufrufs ist nur für Klassenmethoden oder Konstruktoren zulässig
Delphi-Quellcode:
procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if (sdBlob.Execute) then
  begin
     Tclientdataset.Edit; //fehler hier E2076 
    begin
      FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
      BlobStream := Tclientdataset.CreateBlobStream(tclientdataset.FieldByName('Arbeitsvertragimg'),bmRead); //fehler hier E2076
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      BlobStream.Free;
      FileStream.Free;
      Tclientdataset.Post; //fehler hier E2076
      tclientdatasetAfterScroll(tclientdataset); //fehler hier E2010
    end;
end;
end;

DeddyH 14. Apr 2015 10:28

AW: JPG im Blob Feld wird extrem groß
 
Statt Tclientdataset musst Du den Namen Deines ClientDatasets (vermutlich ClientDataset1?) angeben.

calikey 14. Apr 2015 10:37

AW: JPG im Blob Feld wird extrem groß
 
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;

Hab mal beide versuch mit clientdataset1 und auch beide datasource aber leider immer noch der fehler

mkinzler 14. Apr 2015 10:39

AW: JPG im Blob Feld wird extrem groß
 
Delphi-Quellcode:
 Tclientdataset1.Edit;
?

calikey 14. Apr 2015 10:42

AW: JPG im Blob Feld wird extrem groß
 
Da schimpft delphi undeklarierter bezeichner Tclientdataset1 und auch edit1

DeddyH 14. Apr 2015 10:45

AW: JPG im Blob Feld wird extrem groß
 
Versuch es doch mal so:
Delphi-Quellcode:
procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if sdBlob.Execute then
  begin
    clientdataset1.Edit;
    BlobStream := nil;
    FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
    try
      BlobStream := clientdataset1.CreateBlobStream(clientdataset1.FieldByName('Arbeitsvertragimg'),bmRead);
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      clientdataset1.Post;
      clientdataset1(clientdataset1);
    finally
      BlobStream.Free;
      FileStream.Free;
    end;
  end;
end;

calikey 14. Apr 2015 10:52

AW: JPG im Blob Feld wird extrem groß
 
Delphi schimpft da wieder das alles undeklariert ist

calikey 14. Apr 2015 10:56

AW: JPG im Blob Feld wird extrem groß
 
ich hau mal denn ganzen quell text rein vielleicht bringt das hilfe
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    MainMenu1: TMainMenu;
    OpenPictureDialog1: TOpenPictureDialog;
    SavePictureDialog1: TSavePictureDialog;
    Button1: TButton;
    Button2: TButton;
    odBlob: TOpenDialog;
    sdBlob: TSaveDialog;
    DBCtrlGrid1: TDBCtrlGrid;
    Photo: TImage;
    Procedure btnLoadClick(Sender: TObject);
    procedure tclientdatasetAfterScroll(DataSet: TDataSet);



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

var
  Form2: TForm2;


implementation

{$R *.dfm}

uses Unit1, ABOUT;


procedure TForm2.TclientdatasetAfterScroll(DataSet: TDataSet);
var
  JpegImage: TJPEGImage;
  BlobStream: TStream;
begin
  if (not Tclientdataset.FieldByName('Arbeitsvertragimg').IsNull) then
    begin
      BlobStream := Tclientdataset.CreateBlobStream(Tclientdataset.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;



procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if sdBlob.Execute then
  begin
    Tclientdataset.Edit;
    BlobStream := nil;
    FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
    try
      BlobStream := Tclientdataset.CreateBlobStream(Tclientdataset.FieldByName('Arbeitsvertragimg'),bmRead);
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      Tclientdataset.Post;
      Tclientdataset(Tclientdataset);
    finally
      BlobStream.Free;
      FileStream.Free;
    end;
  end;
end.

DeddyH 14. Apr 2015 10:57

AW: JPG im Blob Feld wird extrem groß
 
Welche Daten zeigt Dein Grid denn an, wenn Du kein ClientDataset auf dem Formular hast?

calikey 14. Apr 2015 10:59

AW: JPG im Blob Feld wird extrem groß
 
Vor und nachname der person

mkinzler 14. Apr 2015 11:00

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

Zitat von calikey (Beitrag 1297640)
Vor und nachname der person

Aber wo kommen die her?

DeddyH 14. Apr 2015 11:01

AW: JPG im Blob Feld wird extrem groß
 
Du musst doch irgendwo eine Datenmenge haben, wo das Zeugs auch drinsteht :gruebel:

calikey 14. Apr 2015 11:02

AW: JPG im Blob Feld wird extrem groß
 
die clientdataset ist in form1 und die daten also pass bild kopie arbeitsvertrag ... sollen halt unter extra form angezeigt werden also form 2

mkinzler 14. Apr 2015 11:04

AW: JPG im Blob Feld wird extrem groß
 
Dann muss es
Delphi-Quellcode:
Form1.Tclientdataset.Edit;
usw. heissen.

DeddyH 14. Apr 2015 11:05

AW: JPG im Blob Feld wird extrem groß
 
Ah, dann ergänz im gezeigten Code mal überall ClientDataset1 um den Präfix "Form1.", also so:
Delphi-Quellcode:
Form1.ClientDataset1

calikey 14. Apr 2015 11:21

AW: JPG im Blob Feld wird extrem groß
 
ok jetzt kommt nur noch 1 fehler
[dcc32 Fehler] doku.pas(165): E2010 Inkompatible Typen: 'TDataSet' und 'class of TDataSet'

Delphi-Quellcode:
    procedure tclientdatasetAfterScroll(DataSet1: TDataSet);



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

var
  Form2: TForm2;


implementation

{$R *.dfm}

uses Unit1, ABOUT;


procedure TForm2.TclientdatasetAfterScroll(DataSet1: TDataSet);
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;



procedure TForm2.btnLoadClick(Sender: TObject);
var
  FileStream: TFileStream;
  BlobStream: TStream;
begin
  if sdBlob.Execute then
  begin
    Form1.clientdataset1.Edit;
    BlobStream := nil;
    FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);
    try
      BlobStream := Form1.clientdataset1.CreateBlobStream(Form1.clientdataset1.FieldByName('Arbeitsvertragimg'),bmRead);
      FileStream.CopyFrom(BlobStream,BlobStream.Size-BlobStream.Position);
      Form1.clientdataset1.Post;
      TclientdatasetAfterScroll(TDataSet); // fehler 2010
    finally
      BlobStream.Free;
      FileStream.Free;
    end;
  end;
end;

mkinzler 14. Apr 2015 11:23

AW: JPG im Blob Feld wird extrem groß
 
Und welche Zeile wäre das?
Delphi-Quellcode:
TclientdatasetAfterScroll(Form1.ClientDataSet1);

calikey 14. Apr 2015 11:25

AW: JPG im Blob Feld wird extrem groß
 
das ist diese
Delphi-Quellcode:
TclientdatasetAfterScroll(TDataSet); //2010

DeddyH 14. Apr 2015 12:10

AW: JPG im Blob Feld wird extrem groß
 
Delphi-Quellcode:
TclientdatasetAfterScroll(Form1.clientdataset1)

himitsu 14. Apr 2015 12:22

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

Zitat von DeddyH (Beitrag 1297657)
Delphi-Quellcode:
TclientdatasetAfterScroll(Form1.clientdataset1)

Glaub nicht.
Er will ein Event aufrufen? ... das liegt auf einer Form ... also muß man Dieses dort auch aufrufen. :angle:

Also
Delphi-Quellcode:
ClientDataSet1AfterScroll(Form1.ClientDataSet1);
,
aber vermutlich eher so
Delphi-Quellcode:
Form1.ClientDataSet1AfterScroll(Form1.ClientDataSet1);
, da das Event vermutlich auf der selben Form liegt, wie das DataSet. :gruebel:
Oder notfalls auch indirekt über
Delphi-Quellcode:
Form1.ClientDataSet1.OnAfterScroll(Form1.ClientDataSet1);
.
[edit] siehe nachfolgenden Beitrag.

Wie ich das sehe, benutzt diese Methode praktisch ausschließlich vorwiegend Komponenten/Funktionen der Form1, also gehört diese Methode auch in TForm1 rein, wo sie dann von Form2 aus aufgerufen wird, mit Übergabe das Dateinamen als Parameter.
So oft, wie hier die böse globale Variable
Delphi-Quellcode:
Form1
benutzt werden musste. Immer wenn man solche globalen Variablen verwenden muß, vorallem bei der Masse, sollte man dringend nachsehn, was man hier falsch macht.



Allgemein würde ich aber dringend das Studium eines Grundlagen-Tutorials empfehlen.
> Typen <> Objektinstanzen und Variablen, sowie Parameter ... was ist das und wie benutzt man es
> und wie benennt man Komponenten/Funktionen (sprechende Bezeichner)

DeddyH 14. Apr 2015 12:25

AW: JPG im Blob Feld wird extrem groß
 
Glaub doch.
Zitat:

Delphi-Quellcode:
type
  TForm2 = class(TForm)
    MainMenu1: TMainMenu;
    ...
    procedure tclientdatasetAfterScroll(DataSet: TDataSet);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

Für die Benennung der Methode kann ich ja nix.

himitsu 14. Apr 2015 12:30

AW: JPG im Blob Feld wird extrem groß
 
Ohh. OK, dann ist die Benennung doch echt böse.

Hab meine letzte Antwort versucht entsprechend anzupassen. :oops:

calikey 14. Apr 2015 14:13

AW: JPG im Blob Feld wird extrem groß
 
so es sind keine fehler mehr und es lässt sich compilieren nur leider passiert nichts.
fehler meldung im programm die syntax für denn dateiname verzeichnissname oder datenträgerbezeichnung ist falsch?:(

mkinzler 14. Apr 2015 14:16

AW: JPG im Blob Feld wird extrem groß
 
Und wie sieht dieser aus?

DeddyH 14. Apr 2015 14:24

AW: JPG im Blob Feld wird extrem groß
 
Und wann genau tritt der Fehler auf? Ich tippe bei einem LoadFromFile oder SaveToFile des ClientDatasets, aber das ist nur geraten.

himitsu 14. Apr 2015 14:32

AW: JPG im Blob Feld wird extrem groß
 
Und wie lautet der Dateiname? (inkl. Pfad)




Tipp 1: Strg+C funktioniert auch bei Fehlerdialogen und im Log der IDE. (via Strg+V als Text in den Beitragseditor einfügen)

Tipp 2: Du könntest dir ein Tutorial suchen "Was ist ein Debugger und wie benutzt man den".

Satzzeichen und die Großschreibung

calikey 14. Apr 2015 14:35

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

Zitat von DeddyH (Beitrag 1297688)
Und wann genau tritt der Fehler auf? Ich tippe bei einem LoadFromFile oder SaveToFile des ClientDatasets, aber das ist nur geraten.

genau richtig ich wähle eine jpg datei aus und dann kommt der fehler

calikey 14. Apr 2015 14:38

AW: JPG im Blob Feld wird extrem groß
 
constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
var
LShareMode: Word;
begin
if (Mode and fmCreate = fmCreate) then
begin
LShareMode := Mode and $FF;
if LShareMode = $FF then
LShareMode := fmShareExclusive; // For compat in case $FFFF passed as Mode
inherited Create(FileCreate(AFileName, LShareMode, Rights));
if FHandle = INVALID_HANDLE_VALUE then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
end

Sherlock 14. Apr 2015 14:40

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

Zitat von calikey (Beitrag 1297694)
constructor TFileStream.Create(const AFileName: string; Mode: Word; Rights: Cardinal);
var
LShareMode: Word;
begin
if (Mode and fmCreate = fmCreate) then
begin
LShareMode := Mode and $FF;
if LShareMode = $FF then
LShareMode := fmShareExclusive; // For compat in case $FFFF passed as Mode
inherited Create(FileCreate(AFileName, LShareMode, Rights));
if FHandle = INVALID_HANDLE_VALUE then
raise EFCreateError.CreateResFmt(@SFCreateErrorEx, [ExpandFileName(AFileName), SysErrorMessage(GetLastError)]);
end

Wozu postest Du das?

:?

Sherlock

calikey 14. Apr 2015 14:41

AW: JPG im Blob Feld wird extrem groß
 
habe im debugger ein halte punkt bei der fehlermeldung gesetzt und das steht drin :-)

DeddyH 14. Apr 2015 14:42

AW: JPG im Blob Feld wird extrem groß
 
Also anscheinend in der Zeile
Zitat:

Delphi-Quellcode:
FileStream := TFileStream.Create(sdBlob.FileName,fmCreate);

Falls ja, finde ich das jetzt etwas merkwürdig. Lass Dir doch sdBlob.FileName einmal ausgeben, kannst das auch hier posten, aber es würde mich wundern, wenn ein Dialog einen ungültigen Dateinamen zurückgibt.

himitsu 14. Apr 2015 14:42

AW: JPG im Blob Feld wird extrem groß
 
Wie TFileStream.Create aussieht, wissen wir auch schon.
Wichtiger ist es zu wissen was "in" sdBlob.FileName drin steht.

mkinzler 14. Apr 2015 14:45

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

Zitat von calikey (Beitrag 1297693)
Zitat:

Zitat von DeddyH (Beitrag 1297688)
Und wann genau tritt der Fehler auf? Ich tippe bei einem LoadFromFile oder SaveToFile des ClientDatasets, aber das ist nur geraten.

genau richtig ich wähle eine jpg datei aus und dann kommt der fehler

Wo wählst Du sie aus?

Und wo übergibst Du diese? Wohin? Fragen über Fragen.

calikey 14. Apr 2015 14:51

AW: JPG im Blob Feld wird extrem groß
 
Delphi-Quellcode:
    sdBlob: TSaveDialog;
oder die daten vom object inspektor?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr.
Seite 1 von 2  1 2      

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