Avatar billede jno Nybegynder
20. juli 2000 - 13:27 Der er 8 kommentarer og
2 løsninger

Bitmap i en Access "OleContainer"

Jeg har en access database med bmp billeder. Billederne er oprettet i såkaldte "OleContainer" felter.

Når jeg i D5 smider et DBImage på en form og lader det pege på et billedfelt i databasen får jeg en fejl der siger "bitmap image is not valid"

Hvad er der galt og skal det gøres på en anden måde ?
Avatar billede sjensen Nybegynder
20. juli 2000 - 13:55 #1
Prøv at se mit svar til:

http://www.eksperten.dk/spm.asp?id=11848

Det kan være at du bare skal bruge et alm. Image og så overføre db billedet til det hver gang tabellen skifter record (f.eks. i AfterScroll):

image1.picture.assign(tabel1.fieldbyname("billedfeltnavn"));

Det burde virke.

Avatar billede jno Nybegynder
20. juli 2000 - 15:12 #2
beklager sjensen men det virker ikke.

jeg har prøvet både med image1.picture.assign(table1photo); (feltet hedder photo og er added til tablet på formen) og med image1.picture.assign(table1.fieldbyname('photo')) i tablets afterscroll event.

Begge giver samme fejl.

Når jeg bare bruger image1.assign(table1photo); får jeg en fejl der siger:
"cannot assign a tblobfield to a timage"

kender du flere muligheder eller er der andre der har nogle ideer ?
Avatar billede zieglersoft Nybegynder
02. august 2000 - 13:24 #3
Du kan prøve følgende i tabellens AfterScroll:

Var
  TBS : TStream;
  BM  : tBitmap;
begin
  TBS := Tabel1.CreateBlobStream(Tabel1Photo, bmRead); // Åben som stream
  Try
    TBS.Position:=79; // Fjern header
    BM:=tBitmap.Create; // Lave en ny bitmap
    Try
      BM.LoadFromStream(TBS); // Load bitmap fra stream
      Image1.Picture.Assign(BM); // Assign bitmap til image
    Finally
      BM.Free;
    End;
  Finally
    TBS.Free;
  End;
end;

Den har jeg selv benyttet ofte (Også til andre typer data)

Avatar billede jno Nybegynder
09. august 2000 - 15:24 #4
zieglersoft det virker stadig ikke. den siger stadig det samme \"bitmap image is not valid\"

jeg har tidligere prøvet med en stream og en bitmap på samme måde, men uden den linie med at fjerne headeren og fik samme fejl

er du sikker på at det skal være 79 ?
for jeg er ret sikker på at det er headeren der er problemet, men jeg kender ikke formatet og ved ikke hvor mange tegn den er på
Avatar billede zieglersoft Nybegynder
09. august 2000 - 15:58 #5
Well, det har altid været 79 med bitmaps (BMP fil). Men nu ved jeg jo ikke hvordan du har fået filen ind i databasen. Denne metode virker ved bitmaps der fysisk ligger i databasen, ikke ved lænker m.m.)

Hvilke database kontroller briger du? Jeg benytter ADO og ikke BDE, det har måske noget at sige.
Avatar billede jno Nybegynder
14. august 2000 - 13:11 #6
zieglersoft du må undskylde der går så langt tid mellem jeg svarer men jeg har været noget uheldig med min pc og kan ikke altid få den til at virke

pt har jeg smadret min delphi (jeg fik lige slettet alle dcu filer fra c drevet) så det tager lidt inden jeg kan prøve igen

jeg ville prøve med en rutine der afprøver forskellige positioner og håbede dermed at finde det rigtige tal

men du hører fra mig når jeg har prøvet igen
Avatar billede sjensen Nybegynder
24. august 2000 - 17:05 #7
jno, jeg faldt over en access database med billeder i, hvor billederne var gemt i et olecontainerfelt sådan som du omtaler.

Jeg prøvede derfor med D5 at åbne en record men fik samme fejl med DBImage som du omtaler.

Jeg prøvede så som zieglersoft skrev med position og det virkede heller ikke med 79. Så lavede jeg et loop hvor jeg prøvede med positions fra 1 til 255 men i alle tilfælde fik jeg samme fejl.

Så det lykkedes mig ikke og jeg opgav det. Men ham der har lavet db\'en fortæller mig at han sagtens kan se billederne i en formular i Access (jeg har ikke selv access installeret og kunne derfor ikke prøve) men han mener at det kun er en reference til billedet og ikke selve billedet (som bitmap) der ligger i feltet. Alle billederne har han desuden liggende et andet sted på disken. Og når han f.eks renamer, eller fjernet, et kan han ikke længere se det i access, men får en fejl.

Så jeg tror sket ikke det kan lade sig gøre med et DBImagefelt.
Avatar billede zieglersoft Nybegynder
24. august 2000 - 17:34 #8
Well, det virker nu fint hvis, og kun hvis, billederne er i databasen, og ikke kun henvisninger til billederne.

Nu har jeg kun testet det med en Access 95 database, så det er muligt det gemmes anderledes i de øvrige access baser.

Her er en alternativ metode:

procedure TForm1.Tabel1AfterScroll(DataSet: TDataSet);
Var
  TBS : TStream;
  BM  : tBitmap;
  POSI: Integer;
  Fundet:Boolean;
  Buffer : Array[0..1] of Char;
begin
  TBS := Tabel1.CreateBlobStream(Tabel1Photo, bmRead); // Åben som stream
  Try
    Fundet:=False;
    POSI:=-1;
    While (Fundet=False) and (POSI<TBS.Size) Do Begin
      Inc(POSI,1);
      TBS.Position:=POSI;
      TBS.Read(Buffer,2);
      If (Buffer[0]=\'B\') and (Buffer[1]=\'M\') Then
        Fundet:=True;
    End;
    If Fundet Then begin
      TBS.Position:=POSI;
      BM:=tBitmap.Create; // Lave en ny bitmap
      Try
        BM.LoadFromStream(TBS); // Load bitmap fra stream
        Image1.Picture.Assign(BM); // Assign bitmap til image
      Finally
        BM.Free;
      End;
    End Else Begin
      Image1.Picture.Assign(Nil);
    End;
  Finally
    TBS.Free;
  End;
end;
Avatar billede jno Nybegynder
30. august 2000 - 09:20 #9
zieglersoft, tak for dit eksempel men det virker desværre ikke hos mig. jeg får en access violation i BM.loadfromstream(TBS) efter at POSI er talt op til 2220. I 2220 og 2221 findes øjensynligt bogstaverne B og M men det er altså ikke rigtigt.

nu har jeg brugt for meget tid på det og har givet op. ham der har databasen må ændre det hvis jeg skal bruge det.

jeg deler point mellem jer og håber så i er tilfredse med det.
Avatar billede zieglersoft Nybegynder
30. august 2000 - 09:28 #10
Noget tyder på at billederne så ikke er i databasen, men kun henvisninger til disse.

Jeg beklager jeg ikke kunne være til mere hjælp
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