Programming Using the API 
101 
4.7.3. Handling Chart and Crosstab Objects 
The easiest way to work with charts and crosstabs is to insert them into the report 
container. See chapter "a) Application optimization 
At first, variable definitions which are to be constant during printing, can be pulled 
out of the print  loop.  If you want to always print your company name in the letter 
head with lists, it's best to define it outside the loop before LlPrintWithBoxStart(). 
b) Is the variable / field used? 
You  can  also  query  which  variables  or  fields  are  used  in  the  expressions.  If  the 
number of potential variables or fields is much bigger than the actually used number 
or getting  the  data  values  is  complex  (sub  queries, calculations, etc.) using  these 
functions  is  worth  it.  Calling  LlGetUsedIdentifiers()  returns  all  variables  and  fields 
used  in  the  project.  LlGetUsedIdentifiersEx()  furthermore  allows  to  differentiate 
between the type (variable or field). 
You  should  call  this  function  before  print  start  and  later  only  pass  the  fields  or 
variables from your data source which will actually be used. 
c) Global "Dummy"-job 
Some of the system libraries (e.g. riched20.dll) used by List & Label seem to cause 
resource  losses  under  certain  circumstances.  These  are very small but  incur  with 
every load and unload of the DLL. 
These DLLs are loaded or unloaded by List & Label with every open or close of the 
"first" job. Therefore you should avoid a frequent LlJobOpen() / LlJobClose() in your 
application  or  to  start  a  dummy  job  at  start  and  keep  it  open  until the end.  The 
permanent loading and unloading of the DLLs is avoided and besides the achieved 
speed optimization also the resource losses won't occur anymore. 
4.5. Printing Relational Data" for a detailed explanation.  
However, for label and card projects it might be interesting to access these objects 
separately.  
In the following chapter whenever "chart" is mentioned "crosstab" also applies. 
Besides  working  with  the  report  container,  there  are  two  different  modes  when 
handling  chart  objects.  Choose  the  one  you  require  via  the  option 
LL_OPTION_USECHARTFIELDS.  In  principle,  printing  charts  is  similar  to  printing 
tables, i.e. you first declare a data record you wish to pass to the chart object and 
pass this record afterwards. 
Standard Mode (Default) 
This mode can only be used with list projects and does not require any changes to 
existing projects. The chart objects are fed with the same data as the table objects, 
an LlPrintFields() sends data to both chart objects and table objects. However, the 
charts  only  accumulate  the  data  and  are  not  printed  right  away.  This  mode  is 
Best pdf to text converter for - Library software component:C# PDF Convert to Text SDK: Convert PDF to txt files in C#.net, ASP.NET MVC, WinForms, WPF application
C# PDF to Text (TXT) Converting Library to Convert PDF to Text
www.rasteredge.com
Best pdf to text converter for - Library software component:VB.NET PDF Convert to Text SDK: Convert PDF to txt files in vb.net, ASP.NET MVC, WinForms, WPF application
VB.NET Guide and Sample Codes to Convert PDF to Text in .NET Project
www.rasteredge.com
Programming Using the API 
102 
included for compatibility reasons and can be used to easily fill charts that are linked 
to table objects. 
Enhanced Mode 
This mode is activated by setting the option LL_OPTION_USECHARTFIELDS to TRUE. 
In this case, besides variables and fields you have special chart fields available. These 
can  be  declared  similarly  to  normal  fields  via  API  calls.  This  mode  offers  more 
flexibility than the standard mode; your users may 
•  use chart objects wherever they like (no printing order has to be obeyed) 
•  use chart objects in label / card projects. 
LlPrintFields() in this mode does not have any influence on the charts, the analogous 
command in the  enhanced  mode is LlPrintDeclareChartRow(). This API call passes 
the data  currently defined to the chart objects. Which chart objects are addressed 
can be determined by the parameter:  
Value 
Meaning 
LL_DECLARECHARTROW_-
FOR_OBJECTS 
The data is passed to all chart objects not 
contained in table columns. 
LL_DECLARECHARTROW_-
FOR_TABLECOLUMNS 
The  data  is  passed  to  all  chart  objects  in 
table columns. 
For charts within a label project, the following pseudo code would apply: 
<print start> 
(LlPrintStart, 
LlPrintWithBoxStart) 
<while  
- no error and not finished>  
<define variables> 
<while  
- no error or  
- not finished (ex. i = 1..12)> 
<define chart fields (ex. Month = MonthName[i])> 
<send data to chart controls> 
(LlPrintDeclareChartRow(LL_DECLARECHARTROW_FOR_OBJECTS)) 
<print objects>  
(LlPrint) 
Library software component:Online Convert PDF to Text file. Best free online PDF txt
Online PDF to Text Converter. Download Free Trial. Convert a PDF to Text. Just upload your file by clicking on the blue button or drag
www.rasteredge.com
Library software component:C# PDF Convert to Images SDK: Convert PDF to png, gif images in C#
Graphics, and REImage in C#.NET Project. Best PDF converter SDK for Visual Studio .NET for converting PDF to image in C#.NET application.
www.rasteredge.com
Programming Using the API 
103 
<no warning, no abortion: next record> 
<done> 
(LlPrintEnd) 
Of course, all chart fields used must also be declared before calling the Designer, in 
order to enable your users to use them at all. 
4.8. Using the DOM-API (Professional/Enterprise Edition 
Only) 
This  chapter  is  only  required  if  you're  not  working  with  one  of  the  components 
.NET/VCL,  where  a type safe object  model for accessing the DOM functionality is 
available. If you're using one  of  these  components, you may skip this chapter and 
turn to one of the DOM samples for a quick start. 
In order to create project files dynamically for the runtime or to edit existing project 
files by code, you can use the List & Label DOM functions. 
Library software component:Purchase RasterEdge Product License Online
Buy Now. Raster XImage.Raster for .NET. Best .NET imaging SDK Buy Now. OCR XImage.OCR for .NET. Scan text from raster images, like jpeg, tiff, scanned pdf.
www.rasteredge.com
Library software component:C# PDF Text Highlight Library: add, delete, update PDF text
PDF Page in C#.NET Class. Best PDF document reader SDK control that can highlight PDF text in Visual C# .NET framework application.
www.rasteredge.com
Programming Using the API 
104 
4.8.1. Basic Principles 
Each "object" within a project file has its own handle ("DOM handle"). The functions of 
the DOM-API use this handle to uniquely identify objects. An "object" in this sense is 
any  designer  object,  but  also  other  elements  such  as  auxiliary  lines,  project 
parameters etc. The DOM viewer included in  the scope of supply enables  a quick 
overview  of  all  objects,  their  value  and  other  properties.  In  addition,  properties  / 
values  can  be  changed  with  the  viewer,  and  saved  in  the  project.  The  clipboard 
function enables any object or property to be copied to the clipboard for further use.  
The functions relevant for the DOM-API are divided into 2 groups: first of all, project 
files  can  be  loaded,  created  and  saved.  The  functions  LlProjectOpen(), 
LlProjectClose()  and  LlProjectSave()  are  available  for  this  purpose.  The  function 
Library software component:C# WPF PDF Viewer SDK to convert and export PDF document to other
Best PDF Viewer control as well as a powerful .NET An advanced .NET WPF PDF converter library for converting Export PDF text content to TXT file with original
www.rasteredge.com
Library software component:C# PDF Print Library: Print PDF documents in C#.net, ASP.NET
XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. C#.NET rotate PDF pages, C#.NET search text in PDF A best PDF printer control for Visual Studio .NET and
www.rasteredge.com
Programming Using the API 
105 
LlProjectOpen() returns the DOM handle for the project object. This then provides the 
basis for using the other functions.  
DOM Functions 
LlDomGetObject 
With this function, important subobjects can be obtained from the project object. In 
order to obtain the object list, for example, 
HLLDOMOBJ hProj = LlProjectOpen(hJob, LL_PROJECT_LIST, "c:\\filename.lst",  
LL_PRJOPEN_AM_READONLY); 
HLLDOMOBJ hObjList;  
INT nRet = LlDomGetObject(hProj, "Objects", &hObjList); 
can  be  used.  The  other  available  objects  correspond  to  the  entries  in  the  tree 
structure in the DOM viewer: "Layout", "ProjectParameters", "Settings", "SumVars" and 
"UserVars". A description of the individual objects with most properties can be found 
in the reference chapter; the emphasis here is on the principle of working with the 
DOM functions.  
LlDomGetSubobjectCount 
Serves to query the number of subobjects in the specified list. To query the number 
of objects in the project, for instance, use 
INT nObjCount; 
INT nRet = LlDomGetSubobjectCount(hObjList, &nObjCount); 
LlDomGetSubobject 
Returns the DOM handle of the specified subobject. In addition to the DOM handle 
for the list, parameters are the index (0-based) and a pointer for return of the handle. 
The code for a DOM handle to the first object in the projectfile is 
HLLDOMOBJ hObj; 
INT nRet = LlDomGetSubobject(hObjList, 0, &hObj); 
LlDomCreateSubobject 
Creates  a  new  subobject  in  the  specified  list. Parameters  are the list  handle,  the 
insertion position, the desired type and a handle pointer for the new object. In order 
to insert a new text object at the beginning of the object list, use 
Library software component:VB.NET PDF Convert to Tiff SDK: Convert PDF to tiff images in vb.
Free VB.NET Guide to Render and Convert PDF Document to TIFF in Visual Basic Class. Best VB.NET adobe PDF to Tiff converter SDK for Visual Studio .NET.
www.rasteredge.com
Library software component:C# PDF Text Add Library: add, delete, edit PDF text in C#.net, ASP
XDoc.HTML5 Viewer. XDoc.Windows Viewer. XDoc.Converter. View & Process. A best PDF annotation SDK control for Visual Studio .NET can help to add text to PDF
www.rasteredge.com
Programming Using the API 
106 
HLLDOMOBJ hObj; 
INT nRet = LlDomCreateSubobject(hObjList, 0, _T("Text"), &hObj); 
You  can  create  the  following  objects  within the  object  list with the  help  of  these 
functions, for example: 
Object type 
Required third parameter 
Line 
"Line" 
Rectangle 
"Rectangle" 
Ellipse 
"Ellipse" 
Drawing 
"Drawing" 
Text 
"Text" 
Template 
"Template" 
Barcode 
"Barcode" 
RTF 
"RTFText" 
HTML 
"LLX:LLHTMLObject" 
Report container (may contain tables, 
charts and crosstabs) 
"ReportContainer" 
Gauge 
"Gauge" 
Further possible values for other lists (e.g. field list within a table) can be found in the 
DOM Viewer's online help. 
LlDomDeleteSubobject 
Deletes the specified subobject. In order to delete the first object in the object list, 
for example, use the code 
INT nRet = LlDomDeleteSubobject(hObjList, 0); 
LlDomSetProperty 
Allows you to set a property for the specified object. In order to allow the pagebreak 
for a text object, for example, you need 
INT nRet = LlDomSetProperty(hObj, _T("AllowPageWrap"), _T("True")); 
Library software component:C# PDF Text Box Edit Library: add, delete, update PDF text box in
with .NET PDF Library. A best PDF annotator for Visual Studio .NET supports to add text box to PDF file in Visual C#.NET project.
www.rasteredge.com
Programming Using the API 
107 
The transfer parameter for the value must be a valid List & Label formula. A special 
feature results for properties that contain character strings (e.g. the content of a text 
paragraph): character strings must be set in quotation marks within the Designer, to 
enable  their  use  as  a  valid  formula.  Therefore,  in  order  to  transfer  the  fixed  text 
"combit",  the  parameter  "'combit'"  must  be  used.  This  also  applies  for  fixed  font 
names, for example;  once  again, "'Verdana'" must be transferred,  for example, not 
"Verdana".  
Example  code:  LlDomSetProperty(hObj,  _T("Contents"),  _T("'")  +  sProjectTitle  + 
_T("'")); 
In order  to  set the values  of nested  properties,  such  as  the  color  of  a filling,  the 
property name "<Parent property>.<Child property>" can be used, so for example 
INT nRet = LlDomSetProperty(hObj, _T("Filling.Color"), _T("LL.Color.Black")); 
LlDomGetProperty 
Reads out the value of a property. It is advisable to determine the necessary buffer 
length first  of all by  transferring  a NULL buffer,  as usual,  and then  to  allocate  an 
adequately large buffer: 
INT nBufSize = LlDomGetProperty(hObj, _T("AllowPageWrap"), NULL, 0); 
TCHAR* pszBuffer = new TCHAR[nBufSize]; 
INT nRet = LlDomGetProperty(hObj, _T("AllowPageWrap"), pszBuffer, nBufSize); 
… 
delete[] pszBuffer; 
For simplification, objects (but not lists!) can also be "tunneled through" using the full 
stop as hierarchy separator, as for example: 
... 
//US: Get the page coordinates for the first page 
LlDomGetProperty(hRegion, _T("Paper.Extent.Horizontal"), 
pszContainerPositionWidth, nBufSize); 
Units 
Many properties contain information on sizes, widths etc. These are - if transferred as 
fixed  numbers  -  interpreted  and  returned  as  SCM  units  (1/1000  mm)  and  are 
therefore independent of the selected unit system. In order to place an object in a 
(fixed) position 5 mm from the left margin, you would use  
INT nRet = LlDomSetProperty(hObj, _T("Position.Left"), _T("5000")); 
Programming Using the API 
108 
If  the  property  is  to  contain  a  formula  rather  than  a  fixed  value,  the  function 
UnitFromSCM  must  be  used,  in  order  to  be  independent  of  the  units.  An  inside 
margin  with  an  indent  of  10  mm  on  odd  and  5  mm  on  even  pages  would  be 
produced with 
INT nRet = LlDomSetProperty(hObj, _T("Position.Left"), T("Cond(Odd(Page()), 
UnitFromSCM(10000), UnitFromSCM(5000))")); 
4.8.2. Examples 
Creating a Text Object 
The following code creates a new project, inserts a text object inside which is a new 
paragraph with the content "DOM", and saves the project: 
HJOB hJob = LlJobOpen(-1); 
// Create new project 
HLLDOMOBJ hProj = LlProjectOpen(hJob,LL_PROJECT_LIST,"c:\\simple.lst", 
LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE); 
// Get object list 
HLLDOMOBJ hObjList;  
LlDomGetObject(hProj, "Objects", &hObjList); 
// Create text object 
HLLDOMOBJ hObj; 
LlDomCreateSubobject(hObjList, 0, _T("Text"), &hObj); 
LlDomSetProperty(hObj, _T("Name"), _T("My new Textobject")); 
// Get paragraph list 
HLLDOMOBJ hObjParagraphList;  
LlDomGetObject(hObj, _T("Paragraphs"), &hObjParagraphList); 
// Create new paragraph and create contents 
HLLDOMOBJ hObjParagraph;  
LlDomCreateSubobject(hObjParagraphList, 0, _T("Paragraph"), &hObjParagraph); 
LlDomSetProperty(hObjParagraph, _T("Contents"), _T("DOM")); 
// Save project 
LlProjectSave(hJob, NULL); 
LlProjectClose(hJob); 
LlJobClose(hJob); 
Programming Using the API 
109 
Creating a Table 
This  example  shows  the  creation  of  a  table  object  inside  a  report  container  and 
creates a new dataline and three columns inside it.  
Please note that, even if you do not use the APIs to control the report container, you 
must create a report container with exactly one table. 
HJOB hJob = LlJobOpen(-1); 
// Create new project 
HLLDOMOBJ hProj = LlProjectOpen(hJob, LL_PROJECT_LIST, "c:\\simple.lst",  
LL_PRJOPEN_CD_CREATE_ALWAYS | LL_PRJOPEN_AM_READWRITE); 
// Get object list 
HLLDOMOBJ hObjList;  
LlDomGetObject(hProj, "Objects", &hObjList); 
// Create report container and set properties 
HLLDOMOBJ hObjReportContainer; 
LlDomCreateSubobject(hObjList, 0, 
_T("ReportContainer"),&hObjReportContainer); 
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")); 
// Get subobject list and create table inside it 
HLLDOMOBJ hObjSubItems;  
LlDomGetObject(hObjReportContainer, _T("SubItems"), & hObjSubItems); 
HLLDOMOBJ hObjTable; 
LlDomCreateSubobject(hObjSubItems, 0, _T("Table"), &hObjTable); 
// Get line list 
HLLDOMOBJ hObjTableLines;  
LlDomGetObject(hObjTable , _T("Lines"), &hObjTableLines); 
// Get data line list 
HLLDOMOBJ hObjTableData;  
LlDomGetObject(hObjTableLines , _T("Data"), &hObjTableData); 
// Create new line definition 
HLLDOMOBJ hObjTableLine;  
LlDomCreateSubobject(hObjTableData, 0, _T("Line"), &hObjTableLine); 
LlDomSetProperty(hObjTableLine,_T("Name"), _T("My new table line")); 
// Get header list 
HLLDOMOBJ hObjTableHeader; 
LlDomGetObject(hObjTableLines , _T("Header"), &hObjTableHeader); 
// Create new line definition 
Programming Using the API 
110 
HLLDOMOBJ hObjTableHeaderLine;  
LlDomCreateSubobject(hObjTableHeader, 0, _T("Line"), &hObjTableHeaderLine); 
// Get field list for headers 
HLLDOMOBJ hObjTableHeaderFields; 
LlDomGetObject(hObjTableHeaderLine , _T("Fields"), &hObjTableHeaderFields); 
// Get field list for data lines 
HLLDOMOBJ hObjTableDataFields; 
LlDomGetObject(hObjTableLine , _T("Fields"), &hObjTableDataFields); 
TCHAR aczVarName[1024];  
int nItemCount = 3; 
for (int i=0; i < nItemCount; i++) 
 
sprintf(aczVarName, "'Var%d'", i); 
// Create new field in header and set properties 
HLLDOMOBJ hObjHeaderField; 
LlDomCreateSubobject(hObjTableHeaderFields, 0, _T("Text"), 
&hObjHeaderField); 
LlDomSetProperty(hObjHeaderField, _T("Contents"), aczVarName); 
LlDomSetProperty(hObjHeaderField,_T("Filling.Style"), _T("1")); 
LlDomSetProperty(hObjHeaderField,_T("Filling.Color"),  
_T( "RGB(204,204,255)")); 
LlDomSetProperty(hObjHeaderField,_T("Font.Bold"), _T("True")); 
LlDomSetProperty(hObjHeaderField,_T("Width"), _T("50000")); 
sprintf(aczVarName, "Var%d", i); 
// Create new field in data line and set properties 
HLLDOMOBJ hObjDataField;  
LlDomCreateSubobject(hObjTableDataFields, 0, _T("Text"), 
&hObjDataField); 
LlDomSetProperty(hObjDataField,_T("Contents"), aczVarName); 
LlDomSetProperty(hObjDataField,_T("Width"), _T("50000")); 
// Save project 
LlProjectSave(hJob, NULL); 
LlProjectClose(hJob); 
LlJobClose(hJob); 
Setting the Project Parameters 
The following code sets project parameters in an existing List & Label project for fax 
and mail dispatch: 
HJOB hJob = LlJobOpen(-1); 
Documents you may be interested
Documents you may be interested