REP-02 Source

Für Fragen, Anregungen, Lob, Kritik, Feedback und was einem sonst noch so einfällt - rund um die 3rd European Xbase++ Developers Conference im November 2007 in Berlin
Antworten
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

REP-02 Source

Beitrag von AUGE_OHR »

hi,

erstmal einen Dank an die beiden "Referenten" (ist das richtig?) für ihren
Source, ohne die hätte ich beim "Einstieg" in die Report Generatoren
"kein Land" gesehen

Nun wo ich aber eine Zeitlang damit gearbeitet habe bin ich doch über
etliche grössere und einige kleinere Probleme gestossen so das ich paar
Ergänzungen in den Sourcen gemacht habe.

Code: Alles auswählen

PROCEDURE LL13_Init()
*  hJob := LlJobOpen(-1) // open job with default system language,
                                 one job for whole app

  hJob := LlJobOpen(CMBTLANG_GERMAN) // open job with GERMAN
Das (-1) steht so auch in den 3 L&L Beispielen und bedeutet "default".

Wenn man nun aber eine anderes OS() hat, wie chinesisch, wird also
versucht "chinesich" zu laden und wenn man das "extra $$$" Kit nicht
hat passiert "gar nix".

Code: Alles auswählen

PROCEDURE LlPublishData(...)
DO CASE
  CASE aType[i] $ "V" // BLOB
  IF lAsFields
      LlDefineFieldExtHandle(hJob               ,;
                            aField[i]           ,;
                            TillBMP(MyContens) ,;
                            LL_DRAWING_HBITMAP  ,0)
Bislang werden nur "Text" Memos erkannt. Wenn man Bitmaps in "V"
Memo hat muss man die über "Handle" von Bitmaps nach L&L laden.

Code: Alles auswählen

PROCEDURE LL_PrintMixed(..)

* publish fields
LlPublishData(.T.,hJob ...  )

DbSelectArea(cDataSource1)
*LlPublishData(.F.,hJob ...  )
LlPublishData(.T.,hJob ...  )

DbSelectArea(cDataSource2)
je nachdem wie man Master/Detail im Designer gestaltet kann man mit
FELDern oder Variabeln arbeiten.
Bei DBF die mit SET RELATION verknüpft sind kann man somit auch die
Detail DBF FELDer direkt im Designer verwenden ... es denn : Es gibt ein
FELD was genau so in der anderen DBF heist dann "knallt" es.

so was hab ich bei FRAX gelernt :

a.) Sprachen Problem ... da sind jede Menge *.XML da
b.) BLOB Problem ... durch die "AlaskaBmpNoHeader" Class gelöst
c.) FELDer/Variablen ... naja wenn man raus hat das man zuerst einen
Button in der Toolbox anclicken muss bevor man die FELD zuweisung macht.

Fortstetzung folgt ...

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

Beitrag von AUGE_OHR »

hi,

erstmal eine Frage an L&L User :
Ich benutze ja die Function LlPublishData() um die Daten "bereit" zu
stellen. Wenn ich also ein Bitmap (mit Handle) habe und durch die
Function LlPublishData() "durch bin", kann ich die dann "löschen" ???

nun hab ich mich auch mit FRAX beschäftigt und hier noch paar Tips

Code: Alles auswählen

SELECT 3
USE myDBF
*FrPrn:SetWorkArea("myDBF" , 3 )
FrPrn:SetWorkArea("myDBF" , SELECT() )
Man sollte :SetWorkArea() direkt nach dem USE setzen.
Statt einer festen Zahl kann man dann auch SELECT() verwenden.

Bei FRAX "wirkt" ein in Xbase++ gesetzter "FILTER" NICHT.
Hierzu muss man wohl eine FRAX Methode aufrufen (wer weiss das ? )

wenn man nun z.b. von den Record beginnen will auf dem man gerade
steht so muss man

Code: Alles auswählen

FrPrn:SetWorkArea("myDBF" , SELECT(), , {FR_RB_CURRENT , FR_RE_LAST,0})
verwenden sonst beginnt FRAX scheinbar immer am Anfang.

ach so, in der Demo von FRAX kann man zwar nur 5 Seiten drucken,
aber die Preview ist unbegrenzt ( < 8192 Seiten)

gruss by OHR
Jimmy
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

AUGE_OHR hat geschrieben:hi,
Bei FRAX "wirkt" ein in Xbase++ gesetzter "FILTER" NICHT.
Hierzu muss man wohl eine FRAX Methode aufrufen (wer weiss das ? )

wenn man nun z.b. von den Record beginnen will auf dem man gerade
steht so muss man

Code: Alles auswählen

FrPrn:SetWorkArea("myDBF" , SELECT(), , {FR_RB_CURRENT , FR_RE_LAST,0})
verwenden sonst beginnt FRAX scheinbar immer am Anfang.
1. FRAX berücksichtigt SetFilter() ebenso wie SetScope()
2. Es ist richtig, FRAX druckt, wenn nicht weiter angegeben, immer vom Anfang einer DB.

Gruß, Olaf
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

Beitrag von AUGE_OHR »

hi,
Lewi hat geschrieben:
AUGE_OHR hat geschrieben: Bei FRAX "wirkt" ein in Xbase++ gesetzter "FILTER" NICHT.
1. FRAX berücksichtigt SetFilter() ebenso wie SetScope()
deshalb sagte Spirin Sergey " :)) It's intresting way to scope data :) "
weil ich ein SKIP(-500) gemacht haben ...

mal sehen wie nun auf das 8K Problem reagiert DENN :

Er hat den Selben Fehler gemacht wie ich ..."

Ich hatte ja den Thread mit der "Handle" Frage eröffnet als das Thema
anfing. Daraus wurde ja nun ein RAM Problem da ich ALLE Bitmaps im
RAM hielt. Dies schien mir notwendig, ist es aber scheinbar nur für das
Preview was "danach" kommt ?

Also die "Blackbox" von Tom wie folgt erweitert:

Code: Alles auswählen

STATIC aBMPHandle := {} // Array am Anfang anlegen

PROCEDURE LlPublishData(...)
   ...
   LlDefineFieldExtHandle(hJob               ,;
                                     aField[i]           ,;
   CreateBitmapHandle(MyContens, XBPBMP_FORMAT_WIN3X) ,;
                      LL_DRAWING_HBITMAP  ,0)
   ...
RETURN

Function CreateBitmapHandle(...)
LOCAL oBmp := XbpBitmap():New():Create()
   ...
/*  
  jedes Handle im Array ablegen
*/

  oBmp:Destroy()
  IF nHandle > 0
     AADD(aBMPHandle, {RECNO(),nHandle} )
  ELSE
     AADD(aBMPHandle, {RECNO(), -1        } )
  ENDIF
RETURN (nHandle)


PROCEDURE LL_PrintList(...)
/*
  in der Schleife werden nun die Datensätze übergeben  
*/

   nRet := LlPrint(hJob)
   DO WHILE
      IF lFromDb
        * database
        LlPublishData(.T.,hJob,aField,aType,aLen,aDec)
/*
  und nun der Druckjob
*/
      * print fields
      nRet:=LlPrintFields(hJob)
      ...

/*
  nun die Handle wieder löschen
*/
      IF lFromDb
         DO WHILE .T.
             nPosi := AScan( aBMPHandle, {|x| x[1] == RECNO()} )
             IF nPosi > 0
                IF aBMPHandle[nPosi][2] > 0
                   DeleteObject(aBMPHandle[nPosi][2])
                ENDIF
                ADEL(aBMPHandle,nPosi)
                ASize( aBMPHandle, Len(aBMPHandle)-1 )
             ELSE
                EXIT
             ENDIF
         ENDDO

         DbSkip(1)
   ENDDO
RETURN
so nun "frisst" er auch einen 500 Seiten Report ohne das er an die 2GB
Limit Grenze stösst. Nachteil : so geht wohl die Preview nicht mehr (nicht
ausprobiert) aber das ist mir eh egal da die Preview anscheinend *.EMF
Dateien dafür temporär anlegt und somit aus Sicherheits Gründen eh
ausfällt.

So damit wäre das Thema List und Label / Xbase++ Memo wohl soweit
erledigt ...

Frage : wie komme ich bei L & L oder FRAX nachträglich an eine Drucker
Auswahl ?

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

Beitrag von AUGE_OHR »

hi,
AUGE_OHR hat geschrieben: Frage : wie komme ich bei L & L oder FRAX nachträglich an eine Drucker
Auswahl ?
DIe Frage ist leider immer noch offen. Ich weiss das ich im Designer
eine "Vor-Auswahl" treffen kann/muss, aber wie komme ich da ohne
Designer ran ?

Der eigendliche Grund für den neuen Beitrag ist jedoch ein anderes
Thema nämlich "Language Pack" für LL13. Ich hab ja schon geschrieben
das man

Code: Alles auswählen

PROCEDURE LL13_Init() 
*  hJob := LlJobOpen(-1) // open job with default system language, 
hJob := LlJobOpen(CMBTLANG_GERMAN) // open job with GERMAN 
NICHT mit (-1) sondern der Constanten arbeiten sollte sonst startet die
Application auf einem "fremden" OS() erst gar nicht.
Durch den "Trick" startet nun die Xbase++ Application auf den chinesischen
PC aber es kommt eine "Warnung":
Your Licence does not include processing of Multibyte or Unicode Characters.
Processing multibyte Characters might cause unpredictable behaviour.
wenn ich nun auf "OK" clicke geht es zwar weiter, aber der "modal-State"
geht nun soweit das er weitere "clicks" nicht mehr annimmt bis er "fertig"
ist. Die CPU steht dabei bei "nur" 20-30% ... ???

kennt jemand das Problem ? kann man Designer/Preview als "nicht-modal"
laufen lassen und wenn wie ?
gruss by OHR
Jimmy
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Die Zuordnung eines Drucker für den den Ausdruck kann über die Methode :PrintOptions:SetPrinter() erfolgen:

Code: Alles auswählen

cOldPrinter := oFraxObject:PrintOptions:SetPrinter( [<cPrinter>] )
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi Jimmy,

bei L&L kannst Du den Drucker über die Funktion
LlSetPrinterInPrinterFile() setzen.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
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

Beitrag von AUGE_OHR »

hi,

danke euch beiden für eure Antworten
Lewi hat geschrieben:Die Zuordnung eines Drucker für den den Ausdruck (FRAX)
kann über die Methode :PrintOptions:SetPrinter() erfolgen:

Code: Alles auswählen

cOldPrinter := oFraxObject:PrintOptions:SetPrinter( [<cPrinter>] )
Markus hat geschrieben: bei L&L kannst Du den Drucker über die Funktion LlSetPrinterInPrinterFile() setzen.
gruss by OHR
Jimmy
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

List & Label LL_OPTION_CODEPAGE ?

Beitrag von AUGE_OHR »

hi
You also need to set the codepage if the codepage you need differs
from the destination system (LL_OPTION_CODEPAGE). Default is the
system's codepage, which is disallowed in your license. This setting
affects all printing and string handling.
Ich weiss einfach nicht wo ich danach suchen soll ... ist es

Code: Alles auswählen

LLSetOption(LL_Option_CodePage,????) 
Die Antwort war ja auf die Frage wie ich List & Label auf einem
chinesischen OS() zum laufen bekomme da meine Licence "german"
ist. Soll ich also also 049 "einbrennen" ?
gruss by OHR
Jimmy
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Jimmy.

Alle - etwa vierzigtausend - Optionen beziehen sich entweder auf LlSetOption() oder LlSetOptionString() (jeweils in der Doku nach der Funktion suchen, was, wie ich weiß, sehr fuddelig ist, weil PDF nicht unbedingt geeignet für eine brauchbare Stichwortsuche ist). In diesem Fall müßte das hier richtig sein:

Code: Alles auswählen

LLSetOption(hJob,LL_OPTION_CODEPAGE,????)
LL_OPTION_CODEPAGE ist ein Define aus CMBTL13.CH. hJob ist Dein Job-Handle. Die Option mußt Du jetzt noch selbst raussuchen.
Herzlich,
Tom
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

Beitrag von AUGE_OHR »

Hi,
Markus Walter hat geschrieben: bei L&L kannst Du den Drucker über die Funktion
LlSetPrinterInPrinterFile() setzen.
ich habe mir die Function nun mal angesehen und Probleme mit den
Parametern was ich da verwenden soll ...

Code: Alles auswählen

FUNCTION LlSetPrinterInPrinterFile(hLlJob,;
                                   nObjType,;
                                   pszObjName,;
                                   nPrinterIndex,;
                                   pszPrinter,;
                                   pDevMode)
leider werde ich auch aus dem help file nicht viel schlauer
[Visual Basic]
Overloads Public Sub LlSetPrinterInPrinterFile( _
ByVal projectType As LlProject, _
ByVal projectFile As String, _
ByVal printerIndex As LlPrinterIndex, _
ByVal printerSettings As PrinterSettings, _
ByVal pageSettings As PageSettings _
)
Parameter
projectType -> Projekttyp
projectFile -> Dateiname des Projekts
printerIndex -> Druckerindex
printerSettings -> Druckereinstellungen
pageSettings -> Seiteneigenschaften
ausser hLlJob ( handle von LlJobOpen(CMBTLANG_GERMAN) ) weiss ich
nicht was ich bei den anderen Parameter einsetzten soll ...

please help !
gruss by OHR
Jimmy
Antworten