+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

Geschütztes Feld

designer

(sabrina ettl) #1

Hallo,
wir nutzen z.Z. die Demo von List & Label in Verbindung mit Microsoft Visual Foxpro.
Unsere Kunden sollen mit dem Designer gewisse Berichte anpassen können.
Einige Felder müssen aber zwingend ausgegeben werden.
Wie kann ich sicherstellen, dass
1.) das Feld nicht gelöscht werden kann
2.) das Feld in jeden Fall ausgegeben wird - also u.A. sollte es nicht möglich sein die Hintergrundfarbe und die Schriftfarbe auf die gleiche Farbe zu setzen.

eine Alternative wäre: dieses Feld im Designer unsichtbar zu schalten

  • Wie ist das Problem lösbar ?

(combit - Jochen Bartlau) #2

Ich würde in diesem Fall das betreffende Objekt per LlDesignerProhibitEditingObject gegen Bearbeitung sperren. Sie müssen dann lediglich im Designer einen eindeutigen Namen für die zu sperrenden Objekte vergeben und diese API-Funktion ab dann vor dem Designeraufruf nutzen.

Alternativ können Sie das Objekt mit Hilfe der DOM-Funktionen auch dynamisch erst zur Druckzeit in das Objektmodell des Berichts einfügen - dann ist es im Designer vollkommen unsichtbar, zur Druckzeit aber dennoch vorhanden.


(sabrina ettl) #3

Hallo,
die Funktion “LlDesignerProhibitEditingObject” sieht gut aus.
Das Objekt kann nicht mehr ausgewählt werden und kann somit nicht gelöscht werden.

Allerdings könnte der Anwender ein weißes Foto drüber legen.
Somit würde mein geschütztes Feld nicht ausgegeben werden.

-> mein geschütztes Feld sollte allerdings IMMER ausgegeben werden.
Haben Sie noch eine Idee ?

Vielen Dank !


(Oliver Hambrecht) #4

Hallo,

ich denke, dass dann nur die Variante mit Hilfe von DOM, die jbartlau bereits als zweite Möglichkeit nannte, in Frage kommen würde um die Anforderung abzubilden.

Grüße


(sabrina ettl) #5

Hallo,
gibt es sonst keine Möglichkeit ?
Ich hätte das gerne über LlDesignerProhibitEditingObject gelöst.
So sehe ich das geschützte Feld im Designer…


(combit - Jochen Bartlau) #6

Wenn das Feld im Designer sichtbar ist kann ein böswilliger Benutzer immer irgendwas drüber legen. Ansonsten bleibt nur eine Kombination aus (z.B. eher dezenter) fest verdrahteter Watermark und einem Objekt im Designer. Man könnte aber natürlich zur Druckzeit das Objekt im Objektmodell suchen und in der Z-Order nach oben schieben. Dafür müsste es aus der Hierarchie gelöscht und ganz unten wieder eingefügt werden, so dass es zuletzt gedruckt wird.


(sabrina ettl) #7

die Foxpro Beispiele geben das leider nicht her.
Können Sie mir da ein Beispiel geben?


(combit - Jochen Bartlau) #8

Leider nein, mit FoxPro kenne ich mich nicht wirklich gut aus.

Wenn Sie möchten melden Sie sich doch einmal kurz beim Support. Im Prinzip könnten Sie das Generate Dynamic Project Files (DOM)-Beispiel für C++ ansehen, da wird ebenfalls mit direkten DLL-Funktionen gearbeitet. Im Kapitel 5.8 der Programmierer-Referenz sind die wichtigen Funktionen mit vielen Beispielen dokumentiert.


(sabrina ettl) #9

Hallo,
leider komme ich mit der Demo nicht weiter.
Ich habe folgenden Code:

lnJob=LLJobOpen(-1)
x1=LLProjectOpen(m.lnjob, LL_PROJECT_LIST, “C:\temp\simple.lst”, LL_PRJOPEN_CD_OPEN_EXISTING+LL_PRJOPEN_AM_READWRITE+LL_PRJOPEN_EM_IGNORE_FORMULAERRORS)
x2=LlDomGetProject(m.lnjob, @x1)

Inhalte der Variablen:
lnJob -> 1
x1 -> 0

1.) ist es richtig dass in der Variable x1 (LLProjectOpen) der Wert 0 steht ?
2.) wenn ich den Befehl LlDomGetProject(m.lnjob, @x1) aufrufe, erscheint folgende Fehlermeldung:
Declare DLL call caused an exception


(Günther Schwarze) #10

An sich sieht das gut aus, wenn Du von LlProjectOpen eine 0 bekommst hat zumindest das geklappt. Wie man in FoxPro mit Pointern umgeht müsstest Du selbst besser wissen. Wenn es bei Deinem Aufruf zu einer Schutzverletzung kommt würde ich darauf tippen, dass der an LlDomGetProject übergebene Wert @x1 als Speicheradresse nicht korrekt/gültig ist.

Das einzige, was ich auf die Schnelle finden konnte ist das hier: https://stackoverflow.com/questions/15041322/how-to-deal-with-double-pointers-in-vfp-for-calling-c-based-dll

Du hast zwar keinen Double-Pointer, vielleicht helfen die Tipps aus dem Post aber dennoch weiter? Sorry, ansonsten vielleicht mal in einer FoxPro-Gruppe Dein Glück versuchen? Oder - wie oben von @jbartlau schon angeregt mal beim Support melden?


(sabrina ettl) #11

Hallo,
ich habe folgenden Code versucht:
x8=0
x2=LlDomGetObject(m.lnJob, “Objects”, @x8)

-> x2 enthält den Wert -1
in x8 steht weiterhin der Wert 0
eine exception kommt mit diesem Befehl nicht mehr


(Günther Schwarze) #12

-1 entspricht LL_ERR_BAD_JOBHANDLE, d.h. Du hast keinen gültigen Job. Dann wird auch gar nicht erst irgendwas in x8 kopiert :wink: . Ohne dass Du die Sequenz aus Deinem Post oben zum Laufen bekommst kannst Du nicht weitermachen. Schau doch einfach mal parallel in das, was das Debugtool ausspuckt.


(sabrina ettl) #13

hallo, ich habe den Fehler gefunden. Es liegt leider an den declare Befehlen die mit der List&Label Demo ausgeliefert werden. (Foxpro Beispiele) Ich finde das Produkt interessant, aber das vereinfacht die Ansteuerung nicht unbedingt.
Vermutlich werde ich hier noch einige Fragen stellen.


(sabrina ettl) #14

Hallo,
ich habe mittels Dom ein Feld hinzugefügt und danach eine Eigenschaft gesetzt:
xx88=LlDomSetProperty(hObj, “Name”, “manuell !!!”)
das hat funktioniert

1.) Wie setze ich den Inhalt bzw. den Wert der dann ausgegeben werden soll ?
=LlDomSetProperty(hObj, “Value”, “meinWert”)
hat leider nicht funktioniert

2.) das neue Feld soll ca. 5 cm von unten positioniert werden.
Wie kann ich die Top Position entsprechend verändern?

Vielen Dank !


(combit - Jochen Bartlau) #15

Wenn Sie uns sagen, was genau wie geändert werden muß kann ich Ihnen gerne eine korrigierte Datei zusenden. Die Deklarationsdateien werden automatisch regelbasiert erstellt, so dass auch globale Änderungen schnell erledigt sind.


(combit - Jochen Bartlau) #16

Ich nehme an, sie haben ein Feld vom Typ Text erzeugt? Das Textobjekt arbeitet absatzbasierend, d.h. Sie müssen dann noch einen Absatz für den eigentlichen Inhalt hinzufügen. Im DOM-Kapitel im Handbuch ist ein Beispiel dafür, Sie sind vermutlich genau bis “Absatzliste holen” gekommen, das was noch fehlt ist das, was danach kommt:

HLLJOB hJob = LlJobOpen(-1); 
 
// Neues Projekt erzeugen 
LlProjectOpen(hJob,LL_PROJECT_LIST,"c:\\simple.lst", 
 LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE); 
 
HLLDOMOBJ hProj; 
LlDomGetProject(hJob, &hProj); 
 
// Objektliste holen 
HLLDOMOBJ hObjList; 
LlDomGetObject(hProj, "Objects", &hObjList); 
 
// Textobjekt erzeugen 
HLLDOMOBJ hObj; 
LlDomCreateSubobject(hObjList, 0, _T("Text"), &hObj); 
LlDomSetProperty(hObj, _T("Name"), _T("My new Textobject")); 
 
// Absatzliste holen 
HLLDOMOBJ hObjParagraphList; 
LlDomGetObject(hObj, _T("Paragraphs"), &hObjParagraphList); 
 
// Neuen Absatz erzeugen und Inhalt anlagen 
HLLDOMOBJ hObjParagraph; 
LlDomCreateSubobject(hObjParagraphList, 0, _T("Paragraph"), 
&hObjParagraph); 
LlDomSetProperty(hObjParagraph, _T("Contents"), _T("'DOM'")); 
 
// Projekt speichern 
LlProjectSave(hJob, NULL); 

LlProjectClose(hJob); 
LlJobClose(hJob); 

Hierfür müssen Sie lediglich wissen, wie groß die Seite insgesamt ist. Dann können Sie die Eigenschaft Position.Top für das von Ihnen angelegte Objekt über LlDomSetProperty auf den gewünschten Wert setzen. Auch dafür finden Sie im DOM-Kapitel ein Beispiel:

LlDomSetProperty(hObjReportContainer,_T("Position.Left"), _T("27000")); 
LlDomSetProperty(hObjReportContainer,_T("Position.Top"), _T("103500")); 
LlDomSetProperty(hObjReportContainer,_T("Position.Width"), _T("153400")); 
LlDomSetProperty(hObjReportContainer,_T("Position.Height"), _T("159500")); 

Die verwendeten Einheiten sind dabei 1/1000 mm.


(sabrina ettl) #17

Hallo,
ich habe zum Thema DOM noch folgende Fragen:

1.) wenn ich ein Objekt mittels DOM hinzufüge, ist das neue Feld automatisch im Vordergrund ?
Oder muss ich das neue Objekt erst in den Vordergrund bringen?

2.) wie kann die Länge der Seite ermittelt werden?
Regions.Region.Paper.Extent.Vertical ?

3.) ich Öffne das Projekt mittels llProjectOpen,
danach füge ich mittels DOM ein Objekt hinzu
danach speicher ist das Projekt mit LLProjectSave
(unter einem anderen Dateinamen)
und danach gehts weiter mit LlPrintWithBoxStart

oder kann ich mir die Prozedur das Projekt unter einem anderen Dateinamen zu speichern sparen ?


(combit - Jochen Bartlau) #18

1.) Das kommt drauf an an welcher Position Sie das Objekt neu anlegen. Bei LlDomCreateSubObject geben Sie ja den Index an, wo in der Liste Sie das Objekt einfügen wollen. Objekte im Vordergrund müssen ganz hinten in der Liste sein.

2.) Ja, genau, so sollte das eigentlich gehen. Beachten Sie aber, dass Regions wieder eine Liste ist und Sie - auch wenn es nur eine Region gibt - dennoch den ersten Listeneintrag abholen müssen.

3.) Sie können auch direkt nach LlPrintWithBoxStart einfach das aktuelle Projekt direkt per LlDomGetProject erhalten und die Änderung so direkt im Speicher vornehmen.


(sabrina ettl) #19

Hallo, die Nutzung von DOM erfordert wohl List & Label Professional. Wir hätten aber Interesse an der Standard Version.
Somit scheiden wohl (wenn ich das richtig verstanden habe) alle DOM-Funktionen aus :frowning:


(combit - Jochen Bartlau) #20

Richtig, dann bleibt nur LlDesignerProhibitEditingObject.