anoniem Geplaatst: 26 september 2002 Delen Geplaatst: 26 september 2002 Ik ben bezig met een proggie waarmee ik een artikelbestand kan bekijken en/of wijzigen. In dat artikelbestand zit ook een foto van het desbetreffende artikel. De bedoeling is dat ik op een knop 'bladeren...' kan klikken, m.b.v. een OpenPictureDialog een bestand kan kiezen, dat verkleind wordt naar 150x100 pixels (met nauwelijks kwaliteitsverlies), en vervolgens wordt weergegeven in een DBImage. Alles is gelukt, behalve het verkleinen. Vervolgens moet het verkleinde plaatje in de DBImage in de database worden gestopt. Weet iemand hoe dat moet? PS: De code voor de knop 'bladeren' op dit moment: [code:1:820a0d1ca5] procedure TArtikelenForm.Button1Click(Sender: TObject); begin if OpenPictureDialog1.Execute then begin DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; end; [/code:1:820a0d1ca5] Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Hee! Bekende vraag! Sorry dat ik niet antwoordde... had te weinig tijd en vergat het... Hoe wil je het plaatje opslaan in de database? Als BMP of JPG? Ik weet namelijk hoe het moet :D Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Okee hier is het antwoord (je kan in dit geval alleen BMP bestanden openen en ze worden ook als BMP opgeslagen): [code:1:5b8f0da8b8] procedure TForm1.Button1Click(Sender: TObject); const // Nieuwe breedte en hoogte, deze kan je zelf aanpassen Breedte = 100; Hoogte = 150; var // Bestandsnamen OrigineelBestand, NieuwBestand: String; // Images Origineel, Nieuw: TImage; begin // Bestand openen en vragen waar hij opgeslagen moet worden if opdOpenen.Execute and spdOpslaan.Execute then begin OrigineelBestand := opdOpenen.FileName; NieuwBestand := spdOpslaan.FileName; end else // EXIT komt uit het oude Turbo Pascal en breekt de procedure af; hij stopt hier EXIT; // Originele plaatje aanmaken en instellen Origineel := TImage.Create(Application); Origineel.Picture.LoadFromFile(OrigineelBestand); Origineel.Stretch := True; Origineel.Width := Breedte; Origineel.Height := Hoogte; // Nieuwe plaatje maken en overnemen Nieuw := TImage.Create(Application); Nieuw.Width := Origineel.Width; Nieuw.Height := Origineel.Height; Nieuw.Canvas.StretchDraw(Rect(0, 0, Breedte, Hoogte), Origineel.Picture.Graphic); Nieuw.Picture.SaveToFile(NieuwBestand); // Free moet altijd na een Create!!! Anders blijft het in het geheugen achter!! Origineel.Free; Nieuw.Free; end; [/code:1:5b8f0da8b8] Het commentaar spreekt voorzich denk ik. Succes, Johan Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Johan, ik ben er helemaal zelf uit gekomen! Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen? PS: Voor DBImage heb ik een nieuw component geïnstalleerd die wel JPEG accepteert, had ik problemen mee, weet je nog? [code:1:7ff7cc4452] function TArtikelenForm.ZoomBitmap(Img1: TBitmap; ZoomFactor:Real;Sender: TObject): TBitmap; begin Result := TBitmap.Create; Result.PixelFormat := Img1.PixelFormat; Result.Palette := Img1.Palette; Result.Width := Round(Img1.Width * ZoomFactor); Result.Height := Round(Img1.Height * ZoomFactor); Result.Canvas.StretchDraw(Rect(0,0,Result.Width, Result.Height),Img1); end; procedure TArtikelenForm.Button1Click(Sender: TObject); var MyBMP : TBitmap; MyJPEG : TJPEGImage; ZFactr:Real; begin if OpenPictureDialog1.Execute then begin try Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); except on EInvalidGraphic do Image1.Picture.Graphic := nil; end; Image1.Stretch:= False; MyJPEG := TJPEGImage(Image1.Picture.Graphic); with MyJPEG do begin MyBMP := TBitmap.Create; with MyBMP do begin Width := MyJPEG.Width; Height := MyJPEG.Height; Assign(Myjpeg); ArtikelenForm.Canvas.Draw(0,0,MyJPEG); Refresh; ZFactr := StrToFloat(Edit1.Text); DBImage1.Width := Round(Image1.Picture.Width * Zfactr); DBImage1.Height := Round(Image1.Picture.Height * Zfactr); DBImage1.Picture.graphic := ZoomBitmap(MyBmp,Zfactr,Self); assign(DBImage1.Picture.graphic); end; With MyJpeg do begin assign(DBImage1.Picture.graphic); end; end; end; end; [/code:1:7ff7cc4452] Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen? Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Goedzo! :D Je leer het wel... Dit is echt goed hoor! Misschien nog iets beter inspringen voor betere leesbaarheid maar verder is het heel goed! [quote:e1b7a44e13="George W. Bush"][code:1:e1b7a44e13] function TArtikelenForm.ZoomBitmap(Img1: TBitmap; ZoomFactor:Real;Sender: TObject): TBitmap; [/code:1:e1b7a44e13][/quote:e1b7a44e13] De Sender hoeft er niet bij hoor, deze gebruik je hier niet. [quote:e1b7a44e13="Jitser"][code:1:e1b7a44e13] begin Result := TBitmap.Create; Result.PixelFormat := Img1.PixelFormat; Result.Palette := Img1.Palette; Result.Width := Round(Img1.Width * ZoomFactor); Result.Height := Round(Img1.Height * ZoomFactor); Result.Canvas.StretchDraw(Rect(0,0,Result.Width, Result.Height),Img1); end; [/code:1:e1b7a44e13] Weet jij trouwens hoe ik de inhoud van DBImage weer kan wissen?[/quote:e1b7a44e13] Jah... DBImage1.Picture := nil; En dan opslaan? :roll: volgens mij werkt dat wel! Ga zo door :wink: Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Ben trouwens benieuwd hoe dat eruit ziet... Waarom gebruik je hier geen Create bij MyJPEG? Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 DBImage1.Picture := nil; werkt idd. Bedankt. Ik heb echter nog een probleem met het ID. Dit moet een uniek nummer zijn en staat op auto_increment. Als ik een nieuw artikel wil toevoegen krijg ik keurig het laatst gebruikte ID + 1. Als je echter na het toevoegen, meteen nog een artikel wil toevoegen gaat hij niet naar het volgende nummer maar blijft hij bij dat nummer van het vorige artikel steken. Waar ligt dat aan? Dit is de code waarmee ik een nieuw record start: [code:1:71bee96316] procedure TArtikelenForm.ToolButton2Click(Sender: TObject); var ArtikelIDD: Integer; begin If not ArtikelenTabel.Eof then ArtikelenTabel.Refresh; ArtikelenTabel.Last; ArtikelenTabel.Insert; ArtikelIDQuery.Open; ArtikelIDD := ArtikelIDQuery.FieldByName('ArtikelID').AsInteger; DBEdit1.text := IntToStr(ArtikelIDD+1); end; [/code:1:71bee96316] Toevoegen doe heel simpel via ArtikelenTabel.Post;. Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Ik denk dat je eerst een Post achter het statement moet zetten. Weet niet precies hoe dat met ZEOS gaat (is er nog niet voor Delphi 7), het is maar een probeerseltje... Quote Link naar reactie
anoniem Geplaatst: 26 september 2002 Auteur Delen Geplaatst: 26 september 2002 Eerst een Post doen werkt niet, krijg de melding 'dataset not in edit or insert mode' Ik denk dat het probleem zit bij het feit dat het nummer uit een Query komt, maar de post enzo gaat via een Tabel. Bij de Post wordt de tabel bijgewerkt, maar de Query niet. Kan ik dit veranderen? Quote Link naar reactie
anoniem Geplaatst: 27 september 2002 Auteur Delen Geplaatst: 27 september 2002 Vast wel :) Eens kijken...[code:1:f454926960]procedure TArtikelenForm.ToolButton2Click(Sender: TObject); var ArtikelIDD: Integer; begin if not ArtikelenTabel.Eof then begin ArtikelenTabel.Refresh; ArtikelenTabel.Last; ArtikelenTabel.Insert; ArtikelIDQuery.Open; ArtikelIDD := ArtikelIDQuery.FieldByName('ArtikelID').AsInteger; DBEdit1.text := IntToStr(ArtikelIDD+1); end; end;[/code:1:f454926960] Wat is ArtikelIDD voor object? En waar gebruik je ArtikelIDQuery voor? Ik denk dat je hier met een Query en met een Tabel dezelfde tabel opent... Quote Link naar reactie
anoniem Geplaatst: 27 september 2002 Auteur Delen Geplaatst: 27 september 2002 Aha dat is een integer... :lol: :lol: Probeer eens voor DBEdit.Text := ... te zetten: ArtikelenTabel.Edit en daarna (dus na DBEdit.Text := ...) ArtikelenTabel.Post. Quote Link naar reactie
anoniem Geplaatst: 29 september 2002 Auteur Delen Geplaatst: 29 september 2002 ben ik weer! Weet iemand hoe ik in een DBComboBox de items kan laten komen uit tabel 2, en de keuze (het item dat je kiest) die je maakt opslaan in Tabel 1? Quote Link naar reactie
Aanbevolen berichten
Om een reactie te plaatsen, moet je eerst inloggen