Avatar billede uthsen Nybegynder
23. september 2003 - 12:28 Der er 32 kommentarer og
1 løsning

Pickture inside a database Hjælp

Jeg vil kunne hente f.eks. *.jpeg,*. bmp mfl ind i mit program og gemme det i min tabel
Har nu fulgt kapittel 1 til og med kapitel 4 på siden :
http://delphi.about.com/library/weekly/aa010101a.htm
men når jeg kompilerer
og klikker på btnShowImage får jeg denne besked:
Project Project1.exe raised exception class EJPEG with massage 'JPEG error#68'.Process stopped. Use Step or Run to continue.

Får altså aldrig et billede frem.
Da "delphi.about.com" har lavet et eksempel til download,benyttede jeg mig af tilbudet fra siden :


http://delphi.about.com/library/code/ncaa030601a.htm

Compilerede det i delphi7 og

fik fejlen:
[Fatal Error] Required package 'RXBDE5'not found

Gik så til denne side for at få hjælp, men forgæves!!!

har set på: Discuss about questions, comments, problems and solutions related to this chapter! http://forums.about.com/ab-delphi/messages?lgnF=y&msg=1790.1

Er der nogen,der kan hjælpe?
Gerne give et EKSEMPEL der virker gerne med OpenPicktureDialog!
Eller helst sende et lille projekt, der virker!
For at gemme jpeg biller i tabel skal man så anvende ADOTable? Kan det overhovedet ikke lade sig gøre at gemme jpeg i blop feltet i en paradox-tabel?
I det program, jeg skal kunne hente bl.a. jpeg-billeder,har jeg fra start anvent en paradox-tabel,men det skal jeg måske ændre for at kunne gemme jpeg.
Avatar billede morten_s Nybegynder
23. september 2003 - 12:35 #1
Gemme i Blob felt (SQLquery):

procedure TdlgPicture.OKBtnClick(Sender: TObject);
var
  Jpg : TJPEGImage;
  MemStream : TMemoryStream;
  CheckId, CheckIntId : Integer;
  CheckIdStr: String;
  TimeNow: string;
begin
  if bgImage.Picture.Graphic = nil then
  begin
    ShowMessage(LoadPic);
    Exit;
  end;
  Jpg := TJPEGImage.Create;
  Jpg.Assign(Image1.Picture.Graphic);
  MemStream := TMemoryStream.Create;
  Jpg.SaveToStream(MemStream);
  with qPic do
  begin
    Close;
    SQL.Text := 'SELECT Id FROM pics WHERE Id = '+ IntToStr(PicId);
    Open;
    CheckIdStr := FieldByName('Id').AsString;
    if CheckIdStr <> '' then
      CheckId:= StrToInt(CheckIdStr)
    else
      CheckId:= -1;
    Close;
    DisableControls;
    SQL.Clear;
    if CheckId <> PicId then  //(New pic)
    begin
      SQL.Add('INSERT INTO intpic (Id , PicDateTime, Pic) VALUES(:Id, :PicDateTime, :Pic)');
      ParamByName('Id').AsInteger:= PicId;
    end else
      SQL.Add('UPDATE intpic SET PicDateTime = :PicDateTime, Pic = :Pic WHERE Id =  '+ IntToStr(PicId));
    DateTimeToString(TimeNow, 'yyyy-mm-dd hh:nn:ss', Now);
    ParamByName('PicDateTime').AsString:= TimeNow;
    ParamByName('Pic').SetBlobData(MemStream.Memory, MemStream.Size);
    ExecSQL;
    EnableControls;
  end;
  Jpg.Free;
  MemStream.Free;
end;

end.


Hente fra Blob

procedure TLoadView.LoadBgPic(Id: Integer; var bgImage: TImage);
var
  qTemp: TSQLQuery;
  dsTemp: TDataSource;
  CheckId: Integer;
  JpegDbDate, JpegFileDateStr: String;
  JpegFileDate: TDateTime;
  Jpg : TJPEGImage;
  S : TStream;
  PicFileName : String;
begin
  bgImage.Picture.Graphic := nil;
  try
    qTemp:= TSQLQuery.Create(self);
    qTemp.SQLConnection:= DM.SQLConFalcoDB;
    dsTemp:= TDataSource.Create(self);
    dsTemp.DataSet:= qTemp;
    with qTemp do
    begin
      Close;
      SQL.Text := 'SELECT Id, PicDateTime FROM intpic WHERE Id = '+ IntToStr(Id);
      Open;
      CheckId := FieldByName('Id').AsInteger;
      JpegDbDate := FieldByName('PicDateTime').AsString;
    end;
    Jpg := TJpegImage.Create;
    PicFileName := ExeStartUpPath+'Pic'+IntToStr(Id)+'.jpeg';
    if FileExists(PicFileName) then
    begin
      JpegFileDate := FileDateToDateTime(FileAge(PicFileName));
      DateTimeToString(JpegFileDateStr, 'yyyy-mm-dd hh:nn:ss', JpegFileDate);
      // ShowMessage('Fil: '+ DateTimeToStr(JpegFileDate) + 'DB: ' + DateTimeToStr(JpegDbDate));
      if JpegFileDateStr >=  JpegDbDate then
      begin
    // ShowMessage('Load from disk');
        try
          bgImage.Picture.LoadFromFile(PicFileName);
        except
          on EInvalidGraphic do
          begin
            bgImage.Picture.Graphic := nil;
            Jpg.Free;
            ShowMessage(ReloadPic);
            Exit;
          end;
        end;
        exit;
      end; //if JpegFileDate >=  JpegDbDate then
    end;  //if FileExists(PicFileName) then
    if JpegDbDate <> '' then
    begin
      ShowMessage(NewPic);
      with qTemp do
      begin
        Close;
        SQL.Text := 'SELECT * FROM intpic WHERE Id = '+IntToStr(Id);
        Open;
      end;
      S := dsTemp.DataSet.CreateBlobStream(dsTemp.DataSet.FieldByName('Pic'), bmRead);
      Jpg.LoadFromStream(S);
      Jpg.SaveToFile(ExeStartUpPath+'Pic'+IntToStr(Id)+'.jpeg');
      try
        bgImage.Picture.Bitmap.Assign(Jpg);
      except
        on EInvalidGraphic do
        begin
          bgImage.Picture.Graphic := nil;
          S.Free;
          Jpg.Free;
          ShowMessage(ReloadPic);
          Exit;
        end;
      end;
      S.Free;
      Jpg.Free;
      end;
  finally
    qTemp.Free;
    dsTemp.Free;
  end;
  bgImage.SendToBack;
end;
Avatar billede uthsen Nybegynder
23. september 2003 - 12:45 #2
Gemme i Blob felt (SQLquery):
Er det noget nyt jeg nu skal lave- Hvad er SQLquery?
Holder lige pause til i aften!!
Avatar billede uthsen Nybegynder
23. september 2003 - 22:58 #3
Jeg er slemt ked af at skulle til at sætte mig ind i endnu en tabeltype. Det hele handlede om at gemme jpg billeder i blop-felt. Gik fra Paradox og opgraderede for at få Ado componenterne med i delphi. Skulle så følge beskrivelsen om picture inside a database fra www.delphi.about.com, hvilket jeg har gjort uden at nå et resultat. Og hver gang er der nye ting som skal gennemgås og nye problemer opstår. Derfor vil jeg helst ikke forvirres af at skulle kende og kunne alle componenterne, mere end jeg allerede er på nuværende tidspunkt. Er er ikke nogen der kan klare fejlen fra www.delphi.about.com. Eller komme med et eksempel indenfor nævnte tabeltyper?:)
Morten: Jeg er sikker på dit eksempel vil kunne virke og jeg er glad for din respons på mit spørgsmål, men jeg kan altså ikke kapere mere nyt stof på nuværende tidspunkt.
Avatar billede janbb Juniormester
24. september 2003 - 03:46 #4
Det er dumt af dig at afvise svarene så hurtigt - det er smartere at gøre det når spørgsmålet er løbet 'tør', hvis det altsaa er en løsning man stiler imod.Dit spørgsmål er ikke et af de lette og hvis du ikke kender begrebet SQL er det måske for avanceret et emne du har valgt at starte med.Uden at have nærlæst morten s's kode er jeg tilpas imponeret og tror at det ikke er så tosset en løsning på et problem der normalt ikke tilbydes løsninger på.
Billedformaterne har været et problem i mange år.Nå jeg vil i hvert fald prøve dem af, men jeg må osse tilføje at jeg er blevet skuffet nogle gange hvor jeg troede de virkede, men jeg ikke formåede at få dem til det.
Avatar billede janbb Juniormester
24. september 2003 - 03:54 #5
Openpicturedialog er efter mit kendskab kun gangbar med bmp-formatet og jeg tror der skal mere end alm. 'mirakelmageri' til lige at lave det om - ellers ville borland selv have gjort det for mange år siden.
Avatar billede janbb Juniormester
24. september 2003 - 04:03 #6
Der findes dog i demoerne et program 'copyproj.exe' med tilhørene kildekide jo, der beviser at det kan lade sig gøre, men koden er så kompliceret at det i hvert fald for mit vedkommende næppe i min levetid vil være noget jeg får mulighed for at indbygge i mine programmer, medmindre nogen 'holdt mig i hånden' et par dage mindst.
Avatar billede janbb Juniormester
24. september 2003 - 04:15 #7
\Help\Examples\Jpeg

er bibbet hvor du kan finde programmet

og ikke i demoer som jeg vist kom til at skrive.
Avatar billede janbb Juniormester
24. september 2003 - 04:25 #8
Jeg kan så trøste dig med at de er andre måder at få billeder i databaser, men det er ikke spor let.Det er derimod brugen af SQL-tabeller.Jeg troede osse det var svært indtil jeg bad om en lille indføring her på Eksperten.No big deal.
Blobfelter derimod ..
Avatar billede janbb Juniormester
24. september 2003 - 04:46 #9
Din idee med at starte med at bruge en paradox-tabel er ikke så dum, da der er flere fasciliteter tilknyttet umiddelbart, derfor kan man løbe sur i ADO, der ellers er mere 'comme il fout'.Du mu bare ikke forlange for meget fra starten, da opendialog ikke dur til jpg-filer.Du skal bruge cut and paste fra clipboard, så er det let som ingenting, men du har så brug for en procedure eller et program til at få filerne over på clipboardet.
Man kan jo lægge copyproj.exe ind i sit eget program som et slags værktøj og køre dem simultant.
Avatar billede janbb Juniormester
24. september 2003 - 04:54 #10
Altså knapper i programmet med:
procedure Tpicpro.Button1Click(Sender: TObject);
begin
dbimage1.pastefromclipboard;
end;

procedure Tpicpro.Button2Click(Sender: TObject);
begin
dbimage1.CopyToClipboard;
end;
Avatar billede uthsen Nybegynder
24. september 2003 - 08:02 #11
Det var helt sikkert dumt at afvise Mortens svar.Jeg var selt ikke klar over mit problem var af de specielt svære. Jeg har ikke så megen erfaring ud i delphi og troede det var et begynder problem. Jeg vil nu se lidt nærmere på dine kommentarer  og også på Mortens ide.Soltabeller må jeg jo kunne finde noget om på eksperten siden du har fået en indføring. Du skal på nuværende tidspunkt have tak for du gav dig tid til at gøre mig klogere :)
Avatar billede uthsen Nybegynder
24. september 2003 - 11:08 #12
Til janbb
Forsøgte at blive klogere og fulgte http://www.eksperten.dk/spm/249958 af Janbb
Citat fra spørgsmålet Start:

En form, datasource, dbgrid, Query, database placerer du på din form.

Databasen sætter du til at pege på din db-fil ( evt. dbdemos filerne )
din query sætter du til at pege på din database din datasource sætter du til din query og sidst din dbgid sætter du til at pege på din datasource. så skriver du følgende i din query comp. sql prop. :

select * from <tabel navn>

der efter sætter du active til true og du skulle gerne se alle record, du kan også begrænse dit "udtræk" :

select * from <tabel navn> where <Feltnavn> < 25

Kig i hjælpe filen LocalSQL der står lidt og mulighederne med ansi92 sql

/Martin
Citat fra spørgsmålet Slut.


Forsøger nu at eftergøre eksemplet:

Fra citat: En form, datasource, dbgrid, Query, database placerer du på din form.
----------Dette er gjort


Fra citat: Databasen sætter du til at pege på din db-fil ( evt. dbdemos filerne )
------- Sætter AliasName til min database ved navn
M.db til "M.DB. Er det rigtigt? Eller hvor(i hvilket felt) sættes den til at pege på min database M.db


Fra citat: din query sætter du til at pege på din database.
-------Det eneste jeg kan få lov at vælge i Query1Datasource er"DataSource1"
Det accepteres ikke at jeg skriver Database1.
Forlader Query1Datasource blank og går videre.


Fra citat: din datasource sætter du til din query
------Gjort..sat til Query1




Fra citat: og sidst din dbgid sætter du til at pege på din datasource.
-----Gjort...DBGrid1DataSource peger nu på DataSourse1


Fra citat: så skriver du følgende i din query comp. sql prop. : select * from <tabel navn>

-----Går til Query1 Properties og ind under SQL ... Og skriver i code editoren:  select * from <M.DB>
Er det rigtigt og det rigtige sted?





Fra citat: der efter sætter du active til true og du skulle gerne se alle record, du kan også begrænse dit "udtræk" :

-----Dette virker selvfølgelig ikke, da det allerede i starten kiksede.... Hvordan gør man?
Avatar billede janbb Juniormester
24. september 2003 - 14:19 #13
unit martins2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables, Db, Grids, DBGrids;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    Query1: TQuery;
    Database1: TDatabase;
    DataSource1: TDataSource;
    Table1: TTable;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

end.


Såå simpelt.
Avatar billede janbb Juniormester
24. september 2003 - 14:25 #14
Du skal så self. indstille dit query-staement til fx 'select * in ...'

hvor de tre prikker erstattes af navnet på din tabel. * står for 'all' (- der er hjælp til querysproget vistnok hvis du vil 'mere').
Avatar billede janbb Juniormester
24. september 2003 - 14:39 #15
Check udfra eksemplet om du har glemt noget.Properties skal self. sættes.Det er somme tider lettere hvis man lægger sin database i samme bib. som sit program.Du kan jo 'snyde' og gemme dit program i bibbet hvor du har din database.Tabelprop. giver så altid i en rullemenu eks. på hvilke tabeller, der er tilgængelige og så kan du checke om navnet på den du er ude efter er med.
Avatar billede janbb Juniormester
24. september 2003 - 14:41 #16
Dette trick giver vistnok succes selvom du har klumret med alias.
Avatar billede uthsen Nybegynder
24. september 2003 - 19:10 #17
Eksemplet omtaler ingen tabelcomponent. Og så let er det nu ikke at få  disse komponenter rigtigt forbundet. Jeg har gemt projektet i samme mappe som min database "M.DB"
Avatar billede janbb Juniormester
24. september 2003 - 22:24 #18
Nej man behøver vist ikke tabel-komponenten.Man skal huske at forbinde sine 'ting' Dbgrid osv til sin datasource og self lade datasoursen ref. til sin tabel.Det er ikke ret meget anderledes end en standarddatabase med min. 'udstyr'.Det er den eneste måde at komme i 'hug' på.Lav dem igen og igen mange mange gange hver dag indtil det er lissom at snyde næse.Lad vær og læn dig tilbage i stolen og ryge cigar fordi det det lykkes en enkelt sølle gang.
Avatar billede janbb Juniormester
25. september 2003 - 05:15 #19
uthzen: Jeg har prøvet at kigge på morten s's kode igen og det er for svært for mig - kan ikke se sammenhængen til hvilken slags liste filerne bliver hentet fra.Men vi må håbe der en dag kommer noget lettere.Du behøver ikke give mig nogen points for mine forsøg på entusiasme.Der kommer en lille tilføjelse (et spm jeg så forleden - skal lige finde det).
Avatar billede janbb Juniormester
25. september 2003 - 05:28 #20
Nu har jeg fundet spm-et og det var jo dit spm., hvor stoney gav noget kode der så ret smart ud og jeg prøvede det straks og kunne ikke få det til at virke
http://www.eksperten.dk/spm/401264
Avatar billede uthsen Nybegynder
25. september 2003 - 09:36 #21
Kære Jan
Ja, det er rigtigt, det var mit spørgsmål. Stone's kode virker fint her og jeg kan hente Jpeg billeder ind og gemme dem: Min kode ser således ud:

procedure TStart.Gem1Click(Sender: TObject);
var
Currentfile: string;



begin
  if
OpenPictureDialog1.Execute then//openpicturedialog op
begin
currentfile:= OpenPictureDialog1.FileName;
Dbimage1.Picture.LoadFromFile(currentfile);
Dbimage1.CopyToClipboard;

Dbimage1.height:=225 ;
  Dbimage1.width:=241;
  Dbimage1.PasteFromClipboard;
end;
end;

Problemet med Stones kode er, at den jo gemmer jpeg-billederne i bmp-format og min database, derfor vokser mere end nødvendigt. det var også derfor jeg forsøgte mig med svaret fra snowball- Dette virkede bare ikke!!
Men det må altså kunne lade sig gøre.
Du kan stole på jeg prøver om og om igen og synes ikke bare jeg læner mig tilbage!
Har det fakrisk som min yngste søn, som synes det er svært at lære at læse, men jeg kan jo se fra mine andre sønner, en dag KAN de det.
Man kommer faktisk sjældent gratis til noget.

Jan jeg er glad for din respons på mit spørgsmål. Er spændt på om du kan få Mortens kode til at virke. Du er jo store skridt foran mig:)

Stones kode er jeg faktisk glad for og den er dog bedre end før, hvor jeg kun kunne hente bmp.
Avatar billede janbb Juniormester
25. september 2003 - 15:22 #22
Jeg har osse prøvet og prøvet, men det kniber lidt med selvtilliden i øjeblikket selvom det er snart 20 år siden jeg granskede de første SQL-kommandoer i en lille bog der hed DBase.Er det så voldsomt din databasefil vokser ?.Er du sikker på den ikke ville vokse lisså meget med JPG-filer.Jeg har en billeddatabase hvor jeg har gemt ikke særlig mange billeder og den fylder 50 Mb.Hvis jegg kunne få stones kode til at virke og jeg vil da prøve igen så ville jeg da egtl. være ligeglad med hvordan billederne var anbragt, men bekymre mig om at hvis jeg skulle have den ud igen.Men så kan man jo lave dem om i paint-programmet der følger med windows eller noget tilsvarende.
Jeg ville da gerne give morten s 200 points hvis han ville forklare hvordan lige hans kode virker og skal sættes ind i programmet.Prøvede bare at anbringe proceduren på en knap igår, men fik da en masse fejlmeddelser fra starten men det skyldes måske bl. a. at mit program, der er lidt mere gammeldags end dit.
Mit indtryk er dog at du ikke behøver bekymre dig om atlave SQL-kommandoerne.De er jo anbragt i progrankoden.
Avatar billede stoney Nybegynder
25. september 2003 - 15:26 #23
Hvis I kan vente til i aften skal jeg lave et eks. til jer.
Jeg vil bruge ADO/Access og SQL

Stoney
Avatar billede janbb Juniormester
25. september 2003 - 15:30 #24
Iøvrigt hyggeligt med lidt snak om andet end 'kodeverdenen'.:)
Avatar billede janbb Juniormester
25. september 2003 - 15:33 #25
stoney: jada og du skal nok få point af mig osse.
Avatar billede stoney Nybegynder
25. september 2003 - 23:30 #26
Med dette eks. kan du gemme/vise jpg/bmp billeder.
Hvis du vil have flere formater burde du selv kunne rette til.

http://www.tradestone.dk/tradestone/eksperten/eks404672/eks404672.zip

Stoney
Avatar billede janbb Juniormester
26. september 2003 - 15:24 #27
uthsen: fik stones bmp-version til at virke efter din anvisning.Tak.
Det kniber lidt med stoneys flotte program da jeg slæber rundt med en gammel version af delphi, men jeg kan gætte mig til at det virker bedre i din.
Den compilerede version er jo ok.
Avatar billede janbb Juniormester
26. september 2003 - 15:25 #28
Har lagt nogen points til Stoney.
Avatar billede uthsen Nybegynder
26. september 2003 - 20:43 #29
Kære Stoney Tusind, tak skal du have for det fine program. Jeg vil nu give se nærmere på din kode. Det var lige, hvad jeg søgte. Da jeg synes I begge bør have point, skal jeg lige have lidt vejledning. Hvor dan giver jeg jer begge point?
Jan det var godt du fik Stones kode til at virke.. tak for ind interesse!
Stoney. tak for dit fine program. jeg glæder mig til at få det flettet ind i mit eget.
I øjeblikket ser det ud som om jeg kun kan give Janbb point. . Bliver jeg  nød til at vente til I begge igen giver en kommentar?
Avatar billede janbb Juniormester
27. september 2003 - 15:42 #30
uthsen: hvis ikke stoney lægger et svar kan du lææge et svar selv og acceptere svaret, hvorved du får dine points tilbage.Du kan så lægge et spm. ud med nogen points til stoney hvis du vil.Du behøver som sagt ikke give mig nogen points - det skulle jo snarere være omvendt, men det er god skik at lukke sine spm. når de er færdige.
Avatar billede uthsen Nybegynder
28. september 2003 - 15:23 #31
Jeg forstår det stadig ikke helt. Skriver jeg bare i spørgsmåls titlen." Point til Stoney og venter så på Stoney reagerer og skriver en kommentar, så jeg kan give ham sin belønning?
Avatar billede janbb Juniormester
29. september 2003 - 01:58 #32
Tak for pointene.Og Ja m.h.t. metoden, der ofte bruges bortset fra at det self. er et svar der skal lægges før man kan aflevere pointene.
Avatar billede janbb Juniormester
29. september 2003 - 02:00 #33
Og man skal helst skrive en ref. til spm.et der gives point for.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester