begin B := MyQuery.CreateBlobStream(MyQuery.FieldByName(\'PicBlob\'),bmReadWrite); // Du kan så stream til B // det skulle være det der skal til // har du problemer kan du kigge i hjælpen // under Blobstream end;
begin B := TMemoryStream.Create; Bitmap.SaveToStream(B); querry1.sql.add(\'insert into :picid, :picblob \'); querry1.Params.ParamByName(\'picblob\').AsBlob := B.Memory^
eller :
VAR B : TStringStream;
begin B := TStringStream.Create(\'\'); Bitmap.SaveToStream(B); querry1.sql.add(\'insert into :picid, :picblob \'); querry1.Params.ParamByName(\'picblob\').AsBlob := PChar(B.DataString);
Første eks. kan du bruge til at hente billedet ind Image.LoadFromStream(B), du laver bare en alm TStream i stedet for en Blobstream, og så kan du prøve det andet eks. til at gemme dem
Hvis du vil se på det i aften, så er min privatmail:
perdb@ofir.dk
Opgaven i sin helhed går ud på at indlæse et grafikbillede af typen BMP, JPEG, JPG, WMF,EMF fra HardDisken(Button1) eller fra databasen (button2) vise det i et TImage.
Det viste billede skal hvis det er indlæst fra Harddisken kunne gemmes i en SQL database (via BDE), og jeg tænker det er bedst at gemme som JPEG aht. at spare på pladsen i DB\'en
Der er 500 point (dette spg, + spg under til den som løser opgaven)
procedure TForm1.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; end;
procedure TForm1.Button2Click(Sender: TObject); VAR Jpg : TJpegImage; S : TMemoryStream; begin Jpg := TJpegImage.Create; Jpg.Assign(Image1.Picture.Bitmap); S := TMemoryStream.Create; Jpg.SaveToStream(S); Jpg.Free; Query1.SQL.Text := \'INSERT INTO PICS ( PicID, Pic ) VALUES( :PicID, :Pic )\'; Query1.Prepare; Query1.Params.ParamByName(\'PicID\').AsInteger := 1; Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size); Query1.ExecSQL; S.Free; Query2.Close; Query2.Open; end;
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); VAR S : TStream; Jpg : TJpegImage; begin Jpg := TJpegImage.Create; S := Query2.CreateBlobStream(Query2.FieldByName(\'Pic\'),bmRead); Jpg.LoadFromStream(S); Image2.Picture.Bitmap.Assign(Jpg); S.Free; Jpg.Free; end;
procedure TForm1.FormActivate(Sender: TObject); begin Query2.Open; end;
end.
DFM filen :
object Form1: TForm1 Left = 330 Top = 107 Width = 514 Height = 522 Caption = \'Form1\' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = \'MS Sans Serif\' Font.Style = [] OldCreateOrder = False OnActivate = FormActivate PixelsPerInch = 96 TextHeight = 13 object Image1: TImage Left = 20 Top = 25 Width = 105 Height = 105 end object Image2: TImage Left = 370 Top = 30 Width = 105 Height = 105 end object Button1: TButton Left = 150 Top = 25 Width = 75 Height = 25 Caption = \'Læs fra disk\' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 150 Top = 60 Width = 75 Height = 25 Caption = \'Gem i table\' TabOrder = 1 OnClick = Button2Click end object DBGrid1: TDBGrid Left = 20 Top = 145 Width = 461 Height = 326 DataSource = DataSource1 TabOrder = 2 TitleFont.Charset = DEFAULT_CHARSET TitleFont.Color = clWindowText TitleFont.Height = -11 TitleFont.Name = \'MS Sans Serif\' TitleFont.Style = [] end object Query1: TQuery DatabaseName = \'BMP_SQL\' Left = 145 Top = 100 end object Query2: TQuery DatabaseName = \'BMP_SQL\' SQL.Strings = ( \'SELECT PicID, Pic\' \'FROM \"Pics.DB\" Pics\') Left = 100 Top = 180 end object DataSource1: TDataSource DataSet = Query2 OnDataChange = DataSource1DataChange Left = 140 Top = 180 end object OpenPictureDialog1: TOpenPictureDialog Left = 70 Top = 5 end end
Allerførst, tak for dit eksempel det ser ud til at løse de fleste af mine problemer.
Der er dog lige et par småting
1. Posten eksistere allerede i min db når billedet ligges ind, så det er vel nærmest en update jeg skal bruge, jeg har prøvet at bytte lidt rundt på syntaksen uden held, måske du har et hint til det rigtige SQL kald.
2. Med ovenstående kode kan jeg håndtere BMP, og med lidt tilretninger JPEG, men hvad med wmf og emf ?
3. Er der nogen måde at teste på hvilket format et billede har ud over at kigge på filextension ?
4. Hører måske ikke lige til dette spg. men anyway hvordan læser jeg dato og tid på en fil
VAR S : TSearchRec; aDato : String; begin if FindFirst(\'\',faANYFILE,S) then begin aDato := DateTimeToStr(FileDateToDateTime(S.Time)); end; FindClose(S);
Jeg har arbejdet lidt med det igår aftes desværre virker det ikke endnu, min kode ser sådan her ud:
procedure TtpDlg.SpeedButton1Click(Sender: TObject); var Jpg : TJpegImage; S : TMemoryStream; if OpenPictureDialog1.Execute then begin LEditBgPic.Text := OpenPictureDialogInt.FileName; if FileExists(LEditBgPic.Text) then begin ImageBgPic.Picture := nil; ImageBgPic.Picture.LoadFromFile(LEditBgPic.Text); ImageBgPic.Stretch := True; Jpg := TJpegImage.Create; Jpg.Assign(ImageBgPic.Picture.Bitmap); S := TMemoryStream.Create; Jpg.SaveToStream(S); Jpg.Free; Query1.SQL.Clear; Query1.SQL.Text := \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :Pic\'; Query1.Prepare; //<-------HER GÅR DET GALT Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size); Query1.ExecSQL; S.Free; end else ImageBgPic.Picture := nil; end; end;
Det er på denne linie der er problemer
Query1.Prepare;
Ved RunTime får jeg fejlen no SQL staement avaliabel
Query1.Close; >- HER HAR JEG INDSAT CLOSE Query1.SQL.Clear; Query1.SQL.Text := \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :Pic\'; Query1.Prepare; //<-------HER GÅR DET GALT Query1.Params.ParamByName(\'Pic\').SetBlobData(S.Memory,S.Size); Query1.ExecSQL;
Query1.Close; >- HER HAR JEG INDSAT CLOSE Query1.SQL.Clear; Query1.SQL.Add( \'UPDATE MyPicTable WHERE ID = \'+IntToStr(IdSelectedPic)+ \'SET Pic = :BgPic\'); Query1.Prepare; //<-------HER GÅR DET GALT Query1.Params.ParamByName(\'BgPic\').SetBlobData(S.Memory,S.Size); Query1.ExecSQL;
Først skal du ihvert fald ændre dit statement til det jeg skrev WHERE skal stå til sidst, jeg har lige checket dette på den table jeg sendte til dig det kørte uden fejl :
Du kan lave en EMF med TMetaCanvas.Create og så Draw\'e frem og tilbage til en Bitmap
Synes godt om
Ny brugerNybegynder
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.