diff options
Diffstat (limited to 'odk/examples/OLE/delphi/InsertTables/SampleCode.pas')
-rw-r--r-- | odk/examples/OLE/delphi/InsertTables/SampleCode.pas | 393 |
1 files changed, 393 insertions, 0 deletions
diff --git a/odk/examples/OLE/delphi/InsertTables/SampleCode.pas b/odk/examples/OLE/delphi/InsertTables/SampleCode.pas new file mode 100644 index 000000000..fb4d7308c --- /dev/null +++ b/odk/examples/OLE/delphi/InsertTables/SampleCode.pas @@ -0,0 +1,393 @@ +{*********************************************************************** + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************} +unit SampleCode; + +interface + +uses + Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, + StdCtrls, ComObj, Variants; + + type + TSampleCode = class + + function Connect() : boolean; + procedure Disconnect(); + + function CreateDocument(bReadOnly : boolean) : boolean; + + procedure InsertTable(sTableName : String; dbPointer : String); + + procedure InsertDatabaseTable( + oDoc : Variant; + sTableName : String; + oCursor : Variant; + iRows : Integer; + iColumns : Integer; + dbPointer : String ); + function CreateTextTable( + oDoc : Variant; + oCursor : Variant; + sName : String; + iRow : Integer; + iColumn : Integer) : Variant; + function getCellContent( + sBookmarkName : String ) : Variant; + function getDatabasePointer( + sTableName : String; + sCellname : String ) : String; + procedure InsertBookmark( + oDoc : Variant; + oTextCursor : Variant; + sBookmarkName : String ); + function CreateBookmarkName( + sTableName : String; + sCellName : String; + sDatabasepointer : String ) : String; + procedure ChangeCellContent( + oDoc : Variant; + sTableName : String; + sCellName : String; + dValue : Double ); + function GetBookmarkFromDBPointer( + oDoc : Variant; + sBookmarkName : String) : Variant; + function GetBookmarkFromAddress( + oDoc : Variant; + sTableName : String; + sCellAddress : String) : Variant; + function JumpToBookmark( + oBookmark : Variant) : Variant; + function CreateUniqueTablename(oDoc : Variant) : String; + + private + StarOffice : Variant; + Document : Variant; + + { Private-Deklarationen } + public + { Public-Deklarationen } + end; + +implementation + +{ Insert a table texttable and insert in each cell a Bookmark with the address + of the cell and database pointer +} + +function TSampleCode.Connect() : boolean; +begin + if VarIsEmpty(StarOffice) then + StarOffice := CreateOleObject('com.sun.star.ServiceManager'); + + Connect := not (VarIsEmpty(StarOffice) or VarIsNull(StarOffice)); +end; + +procedure TSampleCode.Disconnect(); +begin + StarOffice := Unassigned; +end; + +function TSampleCode.CreateDocument(bReadOnly : boolean) : boolean; +var + StarDesktop : Variant; + LoadParams : Variant; + CoreReflection : Variant; + PropertyValue : Variant; +begin + StarDesktop := StarOffice.createInstance('com.sun.star.frame.Desktop'); + + if (bReadOnly) then begin + LoadParams := VarArrayCreate([0, 0], varVariant); + CoreReflection := StarOffice.createInstance('com.sun.star.reflection.CoreReflection'); + + CoreReflection + .forName('com.sun.star.beans.PropertyValue') + .createObject(PropertyValue); + + PropertyValue.Name := 'ReadOnly'; + PropertyValue.Value := true; + + LoadParams[0] := PropertyValue; + end + else + LoadParams := VarArrayCreate([0, -1], varVariant); + + Document := StarDesktop.LoadComponentFromURL( 'private:factory/swriter', '_blank', 0, LoadParams); + + CreateDocument := not (VarIsEmpty(Document) or VarIsNull(Document)); +end; + + +function TSampleCode.getCellContent( + sBookmarkName : String ) : Variant; +var + oBookmark : Variant; + oTextCursor : Variant; +begin + oBookmark := GetBookmarkFromDBPointer( Document, sBookmarkName ); + oTextCursor := JumpToBookmark( oBookmark ); + + getCellContent := oTextCursor.Cell.Value; + +end; + + +function TSampleCode.getDatabasePointer( + sTableName : String; + sCellname : String ) : String; +var + oBookmark : Variant; + sBookmarkName : String; + iPos : Integer; +begin + oBookmark := GetBookmarkFromAddress( Document, sTableName, sCellName ); + + sBookmarkName := oBookmark.getName(); + + iPos := Pos('/%', sBookmarkName); + while Pos('/%', sBookmarkName) > 0 do + begin + iPos := Pos('/%', sBookmarkName); + sBookmarkName[iPos] := '%'; + end; + + Delete( sBookmarkName, 1, iPos+1); + getDatabasePointer := sBookmarkName; +end; + + +procedure TSampleCode.InsertTable(sTableName : String; dbPointer : String); +var + oCursor : Variant; +begin + { create a cursor object on the current position in the document } + oCursor := Document.Text.CreateTextCursor(); + + { Create for each table a unique database name } + if (sTableName = '') then + sTableName := createUniqueTablename(Document); + + InsertDatabaseTable( Document, sTableName, oCursor, 4, 2, dbPointer ); + + ChangeCellContent( Document, sTableName, 'B2', 1.12 ); +end; + +procedure TSampleCode.InsertDatabaseTable( + oDoc : Variant; + sTableName : String; + oCursor : Variant; + iRows : Integer; + iColumns : Integer; + dbPointer : String); +var + oTable : Variant; + sCellnames : Variant; + iCellcounter : Integer; + oCellCursor : Variant; + oTextCursor : Variant; + sCellName : String; +begin + oTable := CreateTextTable( oDoc, oCursor, sTableName, iRows, iColumns ); + sCellnames := oTable.getCellNames(); + + For iCellcounter := VarArrayLowBound( sCellnames, 1) to VarArrayHighBound(sCellnames, 1) do + begin + sCellName := sCellnames[iCellcounter]; + + oCellCursor := oTable.getCellByName(sCellName); + oCellCursor.Value := iCellcounter; + oTextCursor := oCellCursor.getEnd(); + InsertBookmark( + oDoc, + oTextCursor, + createBookmarkName(sTableName, sCellName, dbPointer)); + end; +end; + +{ + +' Change the content of a cell +} + +procedure TSampleCode.ChangeCellContent( + oDoc : Variant; + sTableName : String; + sCellName : String; + dValue : Double ); +var + oBookmark : Variant; + oTextCursor : Variant; + sBookmarkName : String; +begin + oBookmark := GetBookmarkFromAddress( oDoc, sTableName, sCellName ); + oTextCursor := JumpToBookmark( oBookmark ); + oTextCursor.Cell.Value := dValue; + + { create a new bookmark for the new number } + sBookmarkName := oBookmark.getName(); + oBookmark.dispose(); + InsertBookmark( oDoc, oTextCursor, sBookmarkName ); +end; + + +{ ' Jump to Bookmark and return for this position the cursor } + +function TSampleCode.JumpToBookmark( + oBookmark : Variant) : Variant; + +begin + JumpToBookmark := oBookmark.Anchor.Text.createTextCursorByRange( + oBookmark.Anchor ); +end; + + +{ ' Create a Texttable on a Textdocument } +function TSampleCode.CreateTextTable( + oDoc : Variant; + oCursor : Variant; + sName : String; + iRow : Integer; + iColumn : Integer) : Variant; +var + ret : Variant; +begin + ret := oDoc.createInstance( 'com.sun.star.text.TextTable' ); + + ret.setName( sName ); + ret.initialize( iRow, iColumn ); + oDoc.Text.InsertTextContent( oCursor, ret, False ); + + CreateTextTable := ret; +end; + + +{ 'create a unique name for the Texttables } +function TSampleCode.CreateUniqueTablename(oDoc : Variant) : String; +var + iHighestNumber : Integer; + sTableNames : Variant; + iTableCounter : Integer; + sTableName : String; + iTableNumber : Integer; + i : Integer; +begin + sTableNames := oDoc.getTextTables.getElementNames(); + iHighestNumber := 0; + For iTableCounter := VarArrayLowBound(sTableNames, 1) to VarArrayHighBound(sTableNames, 1) do + begin + sTableName := sTableNames[iTableCounter]; + i := Pos( '$$', sTableName ); + iTableNumber := strtoint( Copy(sTableName, i + 2, Length( sTableName ) - i - 1 ) ); + + If iTableNumber > iHighestNumber then + iHighestNumber := iTableNumber; + end; + createUniqueTablename := 'DBTable$$' + inttostr(iHighestNumber + 1); +end; + + +{' Insert a Bookmark on the cursor } +procedure TSampleCode.InsertBookmark( + oDoc : Variant; + oTextCursor : Variant; + sBookmarkName : String); +var + oBookmarkInst : Variant; +begin + oBookmarkInst := oDoc.createInstance('com.sun.star.text.Bookmark'); + + oBookmarkInst.Name := sBookmarkName; + oTextCursor.gotoStart( true ); + oTextCursor.text.InsertTextContent( oTextCursor, oBookmarkInst, true ); +end; + + +function TSampleCode.CreateBookmarkName( + sTableName : String; + sCellName : String; + sDatabasepointer : String ) : String; +begin + createBookmarkName := '//' + sTableName + '/%' + sCellName + '/%' + sDatabasePointer + ':' + sCellName; +end; + +{ ' Returns the Bookmark the Tablename and Cellname } +function TSampleCode.GetBookmarkFromAddress( + oDoc : Variant; + sTableName : String; + sCellAddress : String) : Variant; +var + sTableAddress : String; + iTableNameLength : Integer; + sBookNames : Variant; + iBookCounter : Integer; +begin + sTableAddress := '//' + sTableName + '/%' + sCellAddress; + iTableNameLength := Length( sTableAddress ); + + sBookNames := oDoc.Bookmarks.getElementNames; + + for iBookCounter := VarArrayLowBound(sBookNames, 1) to VarArrayHighBound(sBookNames, 1) do + begin + If sTableAddress = Copy( sBookNames[iBookCounter], 1, iTableNameLength) then + begin + GetBookmarkFromAddress := oDoc.Bookmarks.getByName(sBookNames[iBookCounter]); + exit; + end; + end; +end; + +{ ' Returns the Bookmark the Tablename and Cellname } +function TSampleCode.GetBookmarkFromDBPointer( + oDoc : Variant; + sBookmarkName : String) : Variant; +var + sBookNames : Variant; + iBookCounter : Integer; +begin + sBookNames := oDoc.Bookmarks.getElementNames; + + for iBookCounter := VarArrayLowBound(sBookNames, 1) to VarArrayHighBound(sBookNames, 1) do + begin + If Pos(sBookmarkName, sBookNames[iBookCounter]) = (1 + Length(sBookNames[iBookCounter]) - Length(sBookmarkName)) then + begin + GetBookmarkFromDBPointer := oDoc.Bookmarks.getByName(sBookNames[iBookCounter]); + exit; + end; + end; +end; + +end. + + |