Fotos darstellen 1.90.331

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Fotos darstellen 1.90.331

Beitrag 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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.
Gruß
Hubert
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag von Jan »

Wolfgang,

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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) 230-mal heruntergeladen
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Fotos darstellen 1.90.331

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Fotos darstellen 1.90.331

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Fotos darstellen 1.90.331

Beitrag 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.
gruss by OHR
Jimmy
Antworten