Seite 1 von 1

Fotos darstellen 1.90.331

Verfasst: Di, 06. Aug 2019 20:32
von saul
Hallo,
ich habe mir ein kleines Lagerprogramm geschrieben und möchte mir Bilder der eingelagerten Teile mit jedem Datensatz anzeigen lassen.
In den Xbase Hilfedateien bin ich auf die SDI Demo gestoßen. Dort werden ja Fotos der Parts abgebildet.

Bin ich überhaupt auf der richtigen Spur um so etwas selbst zu verwirklichen?

In der Datendatei Parts.dbf gibt es ein Feld, was in meinem DBF Viewer als <bitmap/binary> dargestellt wird. Was ist das für ein Feld und wo kann ich mehr darüber erfahren? Hat das was mit der FOXCDX Database engine zu tun?

mfg
Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: Di, 06. Aug 2019 21:25
von georg
Hallo, Wolfgang -


im Programm sdidemo.prg (etwas Zeile 37) wird die parts.dbf über FOXCDX geöffnet. Wenn Du mehr über die mit dem FoxDbe-Modul verfügbaren Datentypen wissen willst, solltest Du in der Hilfe mal nach FOXDBE suchen. Da findest Du dann auch Hinweise zum Erstellen, sowie zu den Memo-Feldtypen der FoxDbe.

In der dbesys.prg werden beide Compound DBEs, DBFNTX und FOXCDX, zur Laufzeit bereitgestellt.

Re: Fotos darstellen 1.90.331

Verfasst: Di, 06. Aug 2019 21:41
von Jan
Wolfgang,

klar kann man auch mit der 1.9 Bilder darstellen. Da hat sich eigentlich nichts geändert.

FOXCDX hat neben dem normalen Memofeld Typ M noch ein Memofeld Typ V. Das ist ein binäres Memo. Ich selber speichere da auch teilweise Bilder drin. Man muß sich nur bewußt sein das die dbf dann natürlich sehr schnell sehr groß werden kann.

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 7:07
von saul
Moin,
wäre es da nicht besser in der dbf einen Dateinamen zu speichern und diese Datei in ein Fenster zu laden. Geht so etwas überhaupt?
Wenn die DBF durch die Bilder groß wird, belastet das ja auch die Netzwerkgeschwindigkeit oder?

Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 7:15
von georg
Guten Morgen, Wolfgang -


beides ist möglich, sowohl ein Speichern des Bildes in der DBF-/FPT-Datei, als auch ein Verlinken auf eine externe Bilddatei. Was sinnvoller ist, das muss der Programmierer (oder sein Auftraggeber) jeweils selbst entscheiden.

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 7:16
von Manfred
Hallo Wolfgang,
so mache ich das imer. Es wird nur der Dateiname (mit oder ohne verzeichnis) gespeichert. Und dann eben entsprechend gehandelt, wenn das Bild/die DAtei benötigt wird. Entweder kopiert, oder am Bildschirm (z.B. auf einem Static) angezeigt. Oder Du rufst ein externen Programm auf, das weiter mit dem Bild arbeitet.

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 7:26
von Jan
Moin Wolfgang,

das kommt immer drauf an.

Du hast natürlich Recht: Wenn zu viele zu große Bilder in einer dbf liegen, dann ist das irgendwann nicht mehr gut. Wenn das aber nur sehr viele kleine Bilder sind, dann ist das kein Problem mehr. Ich habe z. B. ein Programm geschrieben, das je Datensatz ein Bild von ca. 3 - 10 KB ablegt. Da müssen dann schon so richtig viele Sätze kommen, bis das problematisch wird.

Der Vorteil der Bilder in der dbf ist halt, das da niemand so einfach ran kommt. Das die nicht mal eben versehentlich gelöscht werden können. Das ich mich um Pfade nicht zu kümmern brauche.

Von daher ist das immer eine fallweise Abwägung, was jeweils besser ist.

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 7:55
von brandelh
Hi,

die binären Memofelder werden nicht in der DBF, sondern immer in der FPT Datei gespeichert.
Bilder in der DBF wären auf Textfelder angewiesen, die von der Größe stark begrenzt sind.
Der Nachteil der Memofelder ist, dass man nachträglich eine defekte Datei nicht mehr sauber zuordnen kann, das ist mir mit einem Text-Memofeld einmal passiert (vermutlich Kopierfehler DBF/DBT).

Ab der 2.0 kann die FPT Datei sehr groß werden, bei der 1.90 dürften es 2 oder 4 GB sein.
Für kleine Produktbilder hält das eine Weile, die Bilder eines Jahres mit meiner Lumix, sprengen das sofort.

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 19:20
von saul
So, ich war tätig.

Code: Alles auswählen

obild := Xbpstatic():New (,, {round(oCrt:xsize*0.009,0),round(oCrt:ysize*0.195,0)} , {round(oCrt:xsize*0.15,0),round(oCrt:ysize*0.13,0)} )
obild : type    :=XBPSTATIC_TYPE_BITMAP
obild : loadfile("efwd-1.bmp")
obild : caption :=XBPSTATIC_TYPE_BITMAP
obild : create()
In der Hilfe unter :caption stand ich muss die Datei mit loadfile() laden. Leider gibt es mit meinem Code eine Fehlermeldung "Methode unbekannt".
Wo liegt mein Fehler?

mfg
Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 19:47
von Jan
Wolfgang,

:loadfile() ist eine Methode von XbpBitmap(). Du mußt das nehmen, nicht XbpStatic().

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 21:04
von georg
Hallo, Wolfgang -


wenn Du ein XbpStatic() vom Type XBPSTATIC_TYPE_BITMAP haben willst, dann wird das Bitmp über setCaption() geladen. Allerdings muss das Bitmap dann in einer DLL oder als Resource im Programm eingebunden sein.

Wenn Du auf externe Dateien zugreifen willst, solltest Du, wie Jan geschrieben hat, ein XbpBitmap() verwenden.

Re: Fotos darstellen 1.90.331

Verfasst: Mi, 07. Aug 2019 21:37
von AUGE_OHR
saul hat geschrieben: Mi, 07. Aug 2019 19:20 So, ich war tätig.

In der Hilfe unter :caption stand ich muss die Datei mit loadfile() laden. Leider gibt es mit meinem Code eine Fehlermeldung "Methode unbekannt".
Wo liegt mein Fehler?
du brauchst die ganze CLASS BitmapRef aus SdiPart.prg wenn du damit arbeiten willst.

es geht darum die Grösse des Images zu berücksichtigen und den o:Draw() Slot zu nutzen für das "re-paint".
zum ändern der Grösse kann man die Function BMP2BMP benutzen die du hier im Forum findest.

---

ich habe in der Maske/Liste ein Thumb als Vorschau im Memo.
wenn man auf die Vorschau drauf klickt erscheint das ganze Bild was ich von der "Platte" lade.

Re: Fotos darstellen 1.90.331

Verfasst: Do, 08. Aug 2019 7:37
von saul
Moin,

Code: Alles auswählen

oPS := SetAppWindow():presSpace()
oBMP:= XbpBitmap():new( , {10,10 , 100, 100}):create( )
oBMP:loadfile("efwd-1.bmp")
oBMP:draw( oPS )
Ich möchte das Bild in einem xbpcrt Fenster anzeigen lassen.
Daher habe ich mich an die Hilfe für xbpbitmap gehalten und den Code so abgeändert, dass eine Datei geladen wird. Es wird schon das Bild angezeigt. Allerdings scheint die Bildgröße wir festgenagelt unten links in der Ecke. {10,10} für die Position wird scheinbar nicht beachtet. Allerdings kann ich mir nicht erklären was :presSpace() macht. Kann man damit die Position und Größe des Bildes am Bildschirm einstellen oder ist das nur ein Speicherplatz?

Bei der CLASS BitmapRef aus SdiPart.prg wird allerdings die Grafik aus einem Feld dargestellt. Wenn ich das richtig gesehen habe, so wird auch ein xbpStatic erzeugt oder?

Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: Do, 08. Aug 2019 7:44
von Jan
Hallo Wolfgang,

nun, Du hast die Parameter nicht ganz korrekt angegeben. Vorne kommen Owner und Parent, und dann zwei Arrays mit Position und Größe. Dir fehlt vorne ein Parameter, und Du hast Postion und Größe in eines gepackt.

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Fr, 09. Aug 2019 6:54
von saul

Code: Alles auswählen

oPS := SetAppWindow():presSpace()
obild := Xbpstatic():New (,, { 10,10} , { 150, 150} ):create()
oXbp:= XbpBitmap():new( obild ,,,)
oXbp:loadfile("efwd-1.bmp")
oXbp:draw(oPS)
oXbp:create()
Jetzt habe ich ein Static Fenster angelegt und oBild als Parent angelegt. Das Bild erscheint zwar auf dem Bildschirm, aber nicht im Fenster obild. Wenn ich bei draw() oPS weg lasse erscheint das Bild überhaupt nicht.

Wolfgang
Unbenannt.pdf
(63.85 KiB) 232-mal heruntergeladen

Re: Fotos darstellen 1.90.331

Verfasst: Fr, 09. Aug 2019 7:08
von Jan
Wolfgang,

falsche Reihenfolge.

- Erst das Static erstellen
- Dann den oPs z. B. per oPs := XbpPresSpace():new():create(oStatic:winDevice())
- und dann das Bild einbauen per oBitmap := XbpBitmap():new():create(oPs)

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Fr, 09. Aug 2019 8:04
von saul

Code: Alles auswählen

obild := Xbpstatic():New (,, {20,20} , {240,240 }):create()
oPs := XbpPresSpace():new():create(obild:winDevice())
oXbp:= XbpBitmap():new()
oXbp:loadfile("first.bmp")
oXbp:draw(oPS)
Vielen Dank
Das funktioniert jetzt soweit. Wenn das Bild mehr Pixel hat wie das static Fenster macht der Code das Bild passend in das Statik.
Hat der Bild wesentlich weniger Pixel, so erscheint das Bild unten links in der Ecke. Geht das überhaupt, dass man mit wenigen Pixel das Static Fenster komplett ausfüllt? Dazu muss ja das Bild dann rechnerisch vergrößert werden oder sehe ich das falsch?
Ich habe create() für XbpBitmap() vergessen. Trotzdem funktioniert der Code. Lösche ich create() für Xbpstatic() gibt es eine Fehlermeldung. Ist das normal?

Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: Fr, 09. Aug 2019 8:41
von Jan
Wolfgang,

versuch mal:

- beim oBitmap:create() den oPs als Parameter einbauen (wie in meinem Beispiel angegeben)
- im oBitmap:draw als zweiten Parameter ein Array aus 4 Werten einbauen: {links, unten, breite, höhe}. Also die vier Werte in ein Array, nicht wie beim XbpStatic in zwei.
- manchmal habe ich Darstellungsprobleme. Daher habe ich im :draw noch einen weiteren Parameter drin: :draw(oPs, {position+abmessung}, , , GRA_BLT_BBO_IGNORE). Dazu mußt Du dann aber die gra.ch mit einbinden.

Bei mir skaliert der die Bitmaps in beide Richtungen. Also zu große passend klein machen, zu kleine passend groß machen. Sollte daran liegen.

Jan

Re: Fotos darstellen 1.90.331

Verfasst: Sa, 10. Aug 2019 12:46
von saul

Code: Alles auswählen

obild := Xbpstatic():New (,, {20,20} , {240,240 }):create()
oPs := XbpPresSpace():new():create(obild:winDevice())
oXbp:= XbpBitmap():new():create(oPS)
oXbp:loadfile(verzeich+"/bilder/efwd-1.bmp")
oXbp:draw(oPS , { 0 , 0, 240 , 240} ,,, GRA_BLT_BBO_IGNORE)
Das funktioniert jetzt prima. Habe allerdings noch 2 Verständnisfragen wenn ich darf.
obild:hide() versteckt das komplette Objekt (xbpstatic und xbpbitmap).
obild:show() holt aber nur ein leeres static Fenster wieder auf den Bildschirm. Das Bild wird aber nicht mehr angezeigt. Das Verhalten kenne ich so nicht.
Durch

Code: Alles auswählen

oXbp:loadfile("efwd-1.bmp")
obild:draw(oPS , { 0 , 0 , 240, 240 } ,,, GRA_BLT_BBO_IGNORE)
kann ich dann wieder das Bild im Static Fenster darstellen.
1. ist das normal so?
2. Wenn man ständig mit loadfile() Dateien lädt, wird irgendwann mal der Speicher voll oder wird der vorherige Speicher überschrieben?

Wolfgang

Re: Fotos darstellen 1.90.331

Verfasst: So, 11. Aug 2019 3:42
von AUGE_OHR
hi,

man sollte NICHT oXbp als Variabel benutzten da die in der Event-Scheife verändert wird :!:

Code: Alles auswählen

   nEvent := APPEVENT( @mp1, @mp2, @oXbp )
es könnte also später ein völlig anderes Object oder NIL enthalten sein und ein weiteres oXbp:LoadFile() schlägt fehl [-X

zu deinem Code

Code: Alles auswählen

   oImage:loadfile("efwd-1.bmp")
   obild:draw(oPS, ... )
das funktioniert "1 Mal" um ein Bitmap in den Presspace zu "malen". Wenn es "überdeckt" ist wird es "so" nicht "automatisch neu gemalt"

habe paar Kommentare in den Source eingefügt

Code: Alles auswählen

METHOD BitmapRef:create( oParent, oOwner, aPos, aSize, aPresParem, lVisible )
   LOCAL aAttr[ GRA_AA_COUNT ]
   ::xbpStatic:create( oParent, oOwner, aPos, aSize, aPresParem, lVisible )
// Presspace mit Device verknüpfen 
   ::oPS:create( ::xbpStatic:winDevice() )
// Bitmap mit Presspace als oPScompat
   ::oBmp:create( ::oPS )
// Farbe Hintergrund
   aAttr[ GRA_AA_COLOR ] := GRA_CLR_PALEGRAY
   ::oPS:setAttrArea( aAttr )
// DAS ist der Callback Slot zum "malen"
   ::xbpStatic:paint := {|aClip| ::draw(aClip) }
o:Paint() ist ein Callback Slot von XbpWindow() worauf als SuperClass viel XbParts basieren.
ein Bitmap hat keinen Parent sondern die Verknüpfung zu einem XbPart über den Presspace.

Das OS sendet eine Messages wenn "Xbase-Part wurde neu gezeichnet".
die Message (Nachricht) wird nun vom Parent "abgefangen" (o:Paint) und im Codeblock steht nun die Anweisung was passieren soll.

die Anweisung geht an die Child die dann in Aktion treten

Code: Alles auswählen

METHOD BitmapRef:draw( aClip )
// Bitmap neu "malen"
   lRet := ::oBmp:draw( ::oPS, aTarget, aSource, , GRA_BLT_BBO_IGNORE )
Das ganze nennt sich "Owner Draw" weil die App bestimmt wie/was angezeigt wird und nicht das OS

deshalb war mein Tip gleich die ganze CLASS BitmapRef zu verwenden und damit zu experimentieren.