hi,
Manfred hat geschrieben:
soll man nicht generell auf Replace verzichten und den Zuweisungsoperator := benutzten. Ich meine ich hätte das irgendwo mitbekommen.
Ich denke wenn man eine PPO daraus macht sind beide gleich.
Ich schreibe gerne REPLACE damit ich im Source "sehe" wo ein RLOCK()
notwendig ist. Allerdings sind das dann auch Function/Procedure also
"alter" Code wie auch die DragDrop Routinen.
Also nun zum "Problem" : sehen wir uns nochmal den :datalink an
Code: Alles auswählen
::Bildnr:dataLink := {|x| IIf( PCOUNT()==0,;
Trim( (::CHINABMP)->BILDNR ),; // different
JPGTEST->ARTNR := x ) } // Alias()
AAdd( ::editControls, ::Bildnr )
Im Codeblock haben wir ja das
IIF dann das
:setdata sowie
das
:getdata. Das ganze ist nun eine GUI Maske mit paar XbpSLE
einem XbpStatic für das Bitmap und die üblichen XbpPushbutton so wie
man das vom XPPFD.EXE Formdesigner und Class Code gewohnt ist.
Wenn man nun unter GUI einen "neuen" Datzensatz editieren will so
nimmt man dafür den "Ghostrec" ( = Lastrec()+1 ). Ein neuer Datensatz
ist ja auch gewöhnlich "leer"
Nun füge ich also per Dragdrop z.b. aus dem Explorer ein Bitmap in meine
Anwendung indem ich es auf die XbpStatic ziehe und dort "loslasse".
Code: Alles auswählen
::oSHow:DragEnter := {| aState,oData | DragEnterBMP(aState,oData)}
::oSHow:DragLeave := {| aState,uNIL | DragLeaveBMP(aState,)}
::oSHow:DragDrop := {| aState,oData | DragDropBMP(aState,oData,::oSHow, ... )
STATIC FUNCTION DragLeaveBMP(aState,oData)
// hm ...
RETURN NIL
STATIC FUNCTION DragEnterBMP(aState,oData)
LOCAL cBuffer
IF oData:QueryGetFormat(XBPCLPBRD_FILELIST) == .T.
* IF oData:QueryGetFormat(XBPCLPBRD_BITMAP) == .T.
RETURN XBP_DROPMODE_COPY
ENDIF
RETURN XBP_DROPMODE_NONE
STATIC FUNCTION DragDropBMP(aState,oData,oDraw ... )
LOCAL aFiles := oData:GetData(XBPCLPBRD_FILELIST)
LOCAL i, iMax := LEN(aFiles)
LOCAL oBmp := XbpBitmap():new():create()
LOCAL nWide, nHigh
...
oBmp:Loadfile(aFiles[1])
oDraw:setCaption(oBmp)
IF JPGTEST->(EOF()) .OR. (RECNO() = LASTREC()+1)
JPGTEST->(DbAppend())
ENDIF
Wenn ich also aus dem Explorer ein Bitmap per dragdrop "anfasse" und
in mein XbpStatic "eintrete" (ENTER) so wird DragEnterBMP() ausgeführt.
Ich erhalte nun ein Array mit den "FullPathName" der Dateien.
Nun muss das Bild aber erst in ein XbpBitmap Object "laden" um es
"anzuzeigen" was in DragDropBMP() geschied. Da ich nur 1 Bild anzeigen
kann/will verwende ich also nur :Loadfile(aFiles[1])
Ich hatte ja vorhin schon über den "Ghostrec" erzählt. Wenn ich also auf
sowas gestanden habe wird jetzt ein APPEND BLANK gemacht.
Und nun zu meinem "Fehler"
Code: Alles auswählen
IF JPGTEST->(DbRLock())
// FELDer MIT :datalink
REPLACE JPGTEST->ARTNR WITH cCHINANR
REPLACE JPGTEST->FILENAME WITH OnlyFile(aFiles[1])
// FELDer ohne :datalink
// Memo Type "V" Bitmap
REPLACE JPGTEST->DATA WITH oBmp:setBuffer( ,;
XBPBMP_FORMAT_WIN3X )
// Memo Type "M" Text
REPLACE JPGTEST->FILEPATH WITH aFiles[1]
IF nWide > nHigh
REPLACE JPGTEST->LANDSCAPE WITH .T.
ELSE
REPLACE JPGTEST->LANDSCAPE WITH .F.
ENDIF
JPGTEST->(DbRUnlock())
ENDIF
RETURN XBP_DROPMODE_COPY
Der Code ist doch ok, also wieso rede ich von "Fehler" und "leeren"
FELDern ?
Lösungs Ansatz : Der "User" ist schuld ...
Nachdem ich also per dragdrop das Bild in meiner Application "sah"
dachte ich "alles klar" also OK geclickt ... klingelt es ?
gruss by OHR
Jimmy
p.s. Ich "weiss" ja das mindesten 2 Leute es "wissen".
Die Antwort sollte von jemanden kommen "dem jetzt ein Licht"
aufgegangen ist und möglichst NICHT von jemanden der es schon
vorher "wusste", Danke !!!