FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 920, dernière mise à jour : 8 novembre 2019  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

Commentez


SommaireOpenOffice.orgOpenOffice - Gestion des documents (7)
précédent sommaire suivant
 

L'ouverture d'un document s'effectue grâce à la fonction LoadComponentFromURL. La particularité d'OpenOffice.org est la manipulation des noms de fichiers sous la forme d'URL. Ainsi pour l'ouverture du fichier C:\Documents and Settings\Jerome\Mes documents\demo.sxw il faudra passer comme paramètre à la fonction le nom de fichier suivant :
file:///C:/Documents and Settings/Jerome/Mes documents/demo.sxw

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
var 
    OpenDesktop : Variant; 
    LoadParams : Variant; 
    NomFichier : AnsiString; 
begin 
   OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop'); 
   LoadParams := VarArrayCreate([0, -1], varVariant); 
   NomFichier := StringReplace('C:\Documents and Settings\Jerome\Mes documents\demo.sxw' 
                                           , '\', '/', [rfReplaceAll, rfIgnoreCase]); 
   Document := openDesktop.LoadComponentFromURL( 'file:///'+NomFichier, '_blank', 0,  LoadParams); 
end;

Mis à jour le 20 janvier 2014 atlantis

Comme pour l'ouverture d'un document, nous devons utiliser la fonction LoadComponentFromURL. Au lieu de passer comme paramètre l'URL du fichier, nous allons passer un des paramètres suivant, selon le type de document que l'on souhaite obtenir :

  • private:factory/swriter : Document Traitement de texte Writer
  • private:factory/scalc : Document Tableur Calc
  • private:factory/sdraw : Document dessin Draw
  • private:factory/simpress Document présentation Impress
  • private:factory/smath : Document Formule mathématique
  • private:factory/swriter/GlobalDocument : Document Maitre
  • Traitement de texte private:factory/swriter/web : Document HTML

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
var 
    OpenDesktop : Variant; 
    LoadParams : Variant; 
begin 
   OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop'); 
   LoadParams := VarArrayCreate([0, -1], varVariant); 
   Document := openDesktop.LoadComponentFromURL( 'private:factory/swriter', '_blank', 0,  LoadParams); 
end;
Pour créer lun nouveau document en lecture seule :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var 
    OpenDesktop : Variant; 
    LoadParams : Variant; 
    CoreReflection : Variant; 
    PropertyValue : Variant; 
begin 
   OpenDesktop := OpenOffice.createInstance('com.sun.star.frame.Desktop'); 
   LoadParams := VarArrayCreate([0, 0], varVariant); 
   CoreReflection := OpenOffice.createInstance('com.sun.star.reflection.CoreReflection'); 
   CoreReflection 
           .forName('com.sun.star.beans.PropertyValue') 
           .createObject(PropertyValue); 
  
   PropertyValue.Name := 'ReadOnly'; 
   PropertyValue.Value := true; 
  
   LoadParams[0] := PropertyValue; 
  
   Document := OpenDesktop.LoadComponentFromURL( 'private:factory/swriter', '_blank', 0,  LoadParams); 
end;
Savoir si le document est bien créé :
Code delphi : Sélectionner tout
1
2
3
4
5
Var 
  DocumentExist:Boolean; 
Begin 
   DocumentExist := not (VarIsEmpty(Document) or VarIsNull(Document)); 
end;

Mis à jour le 20 janvier 2014 atlantis

Après l'ouverture d'un document il est pratique d'obtenir la confirmation du type de document ouvert La fonction SupportsService permet d'obtenir ce renseignement.

Function SupportsService (argument : string): boolean;
L'argument correspond a l'application testée :

  • com.sun.star.sheet.SpreadsheetDocument : Tableur Calc
  • com.sun.star.text.TextDocument :Traitement de texte Writer
  • com.sun.star.drawing.DrawingDocument : Logiciel de dessinDraw
  • com.sun.star.formula.FormulaProperties : Editeur de Formule mathématique Math

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
if (Document.SupportsService('com.sun.star.sheet.SpreadsheetDocument')) then  
    Showmessage('Document Tableur') else  
  if (Document.SupportsService('com.sun.star.text.TextDocument'))  then  
    Showmessage('Document Traitement de texte') else  
  if (Document.SupportsService('com.sun.star.drawing.DrawingDocument'))  then  
    Showmessage('Document Dessin') else  
  if (Document.SupportsService('com.sun.star.formula.FormulaProperties'))  then  
    Showmessage('Document Formule mathématique') else  
    Showmessage('Type de Document inconnu');

Mis à jour le 20 janvier 2014 atlantis

La fonction StoreAsURL est l'équivalent de la fonction enregistrer sous.

Code delphi : Sélectionner tout
1
2
3
Begin 
  document.storeAsUrl('file:///c:/test.sxw', VarArrayCreate([0, -1], varVariant)); 
end;

Mis à jour le 20 janvier 2014 atlantis

Pour imprimer le document avec l'imprimante par défaut

Code delphi : Sélectionner tout
1
2
3
begin 
  document.print(VarArrayCreate([0, -1], varVariant)); 
end;
Pour imprimer le document sur une imprimante spécifique
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Var 
  printerDesc : variant; 
  PrinterOpt : variant; 
  PropertyValue : Variant; 
  CoreReflection : Variant; 
begin 
   CoreReflection := OpenOffice.createInstance('com.sun.star.reflection.CoreReflection'); 
   CoreReflection 
           .forName('com.sun.star.beans.PropertyValue') 
           .createObject(propertyValue); 
  PrinterDesc :=VarArrayCreate([0, 0], varVariant); 
  propertyValue.Name:= 'Name'; 
  propertyValue.Value := 'FinePrint pdfFactory Pro'; 
  PrinterDesc[0] := propertyValue; 
  Document.setPrinter(PrinterDesc); 
  
  printerOpt := VarArrayCreate([0, -1], varVariant); 
  document.print(PrinterOpt); 
end;
Pour imprimer plusieurs exemplaires
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Var 
  PrinterOpt : variant; 
  PropertyValue : Variant; 
  CoreReflection : Variant; 
begin 
   CoreReflection := OpenOffice.createInstance('com.sun.star.reflection.CoreReflection'); 
   CoreReflection 
           .forName('com.sun.star.beans.PropertyValue') 
           .createObject(propertyValue); 
  
  printerOpt := VarArrayCreate([0, 1], varVariant); 
  propertyValue.Name := 'Pages'; 
  propertyValue.Value := '1-2'; 
  printerOpt[0] := propertyValue; 
  
  propertyValue.Name := 'CopyCount'; 
  propertyValue.Value := 2; 
  printerOpt[1] := propertyValue; 
  
  document.print(PrinterOpt); 
end;

Mis à jour le 20 janvier 2014 atlantis

En utilisant la fonction dispose, le contrôle va être libéré et l'application fermée.
Si vous n'avez pas enregistré le document, celui ci ne sera pas sauvegardé.

Code delphi : Sélectionner tout
1
2
3
begin 
  Document.dispose; 
end;

Mis à jour le 20 janvier 2014 atlantis

Il existe deux façons de coller sous OpenOffice :

  • soit en utilisant le service de macro uno,
  • soit en récupérant les informations directement du presse-papier.

La première solution est simple :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
function IsNullEmpty(AObject: Variant): Boolean; 
begin 
    Result := VarIsEmpty(AObject) or VarIsNull(AObject) or VarIsClear(AObject); 
end; 
  
function CreateUnoService(const AServiceName: String): Variant; 
begin 
    try 
        Result := AApp.createInstance(AServiceName); 
    except 
    end; 
end; 
  
procedure StartOpenOffice; 
begin 
    try 
        if not IsNullEmpty(AApp) then 
            AApp := Unassigned; 
        AApp := CreateOleObject('com.sun.star.ServiceManager'); 
        ADeskTop := CreateUnoService('com.sun.star.frame.Desktop'); 
        AUno := CreateUnoService('com.sun.star.frame.DispatchHelper'); 
        ALocale := CreateUnoService('com.sun.star.Lang.Locale'); 
    except 
        on E: Exception do 
        begin 
            AApp := Unassigned; 
            Abort; 
        end; 
    end; 
end;  
  
function PasteClipBoard: String; 
var 
    OOoClip, OOoClipContents, OOoTypes: Variant; 
    I: Integer; 
begin 
    Result := ''; 
    try 
        OOoClip := CreateUnoService('com.sun.star.datatransfer.clipboard.SystemClipboard'); 
  
        OOoClipContents := OOoClip.getContents; 
        OOoTypes := OOoClipContents.getTransferDataFlavors; 
        For I := VarArrayLowBound(OOoTypes, 1) to VarArrayHighBound(OOoTypes, 1) do 
        begin 
            if OOoTypes[i].HumanPresentableName = 'Unicode-Text' then 
            begin 
                Result := String(OOoClipContents.getTransferData(OOoTypes[i])) + #13#10; 
                Break; 
            end; 
        end; 
    except 
        on E: Exception do 
        begin 
            CTErrorDlg('OfficeReportCreation', [E.Message]); 
            Abort; 
        end; 
    end; 
end; 
  
procedure TForm1.PasteClipBoard; 
var 
	OOoServer, OOoDesktop,  OOoDisp, OOoDocument: variant; 
begin 
        // On vérifie qu'il n'y a pas déja un service openoffice d'instancié 
	if not isNullEmpty(OOoServer) then 
		OOoServer := Unassigned; 
	Screen.Cursor:= crHourglass; 
	try 
		OOoServer 	:= CreateOleObject('com.sun.star.ServiceManager'); 
		OOoDesktop 	:= CreateUnoService('com.sun.star.frame.Desktop'); 
		OOoDisp 	:= CreateUnoService('com.sun.star.frame.DispatchHelper'); 
		OOoDocument := OOoDesktop.LoadComponentFromURL('private:factory/swriter', '_blank', 
												0, VarArrayCreate([0, -1], varVariant)); 
	finally 
		Screen.Cursor:= crDefault; 
	end; 
  
	OOoDisp.executeDispatch(OOoDesktop.CurrentFrame, '.uno:Paste', '', 0, VarArrayCreate([0, -1], varVariant)); 
end;
Seulement si vous avez ouvert votre document en mode caché (hidden), le service de macro n'est pas disponible. Il faut donc récupérer les informations directement depuis le presse-papier :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
function IsNullEmpty(AObject: Variant): Boolean; 
begin 
    Result := VarIsEmpty(AObject) or VarIsNull(AObject) or VarIsClear(AObject); 
end; 
  
function CreateUnoService(const AServiceName: String): Variant; 
begin 
    try 
        Result := AApp.createInstance(AServiceName); 
    except 
    end; 
end; 
  
procedure StartOpenOffice; 
begin 
    try 
        if not IsNullEmpty(AApp) then 
            AApp := Unassigned; 
        AApp := CreateOleObject('com.sun.star.ServiceManager'); 
        ADeskTop := CreateUnoService('com.sun.star.frame.Desktop'); 
        AUno := CreateUnoService('com.sun.star.frame.DispatchHelper'); 
        ALocale := CreateUnoService('com.sun.star.Lang.Locale'); 
    except 
        on E: Exception do 
        begin 
            AApp := Unassigned; 
            Abort; 
        end; 
    end; 
end;  
  
function PasteClipBoard: String; 
var 
    OOoClip, OOoClipContents, OOoTypes: Variant; 
    I: Integer; 
begin 
    Result := ''; 
    try 
        OOoClip := CreateUnoService('com.sun.star.datatransfer.clipboard.SystemClipboard'); 
  
        OOoClipContents := OOoClip.getContents; 
        OOoTypes := OOoClipContents.getTransferDataFlavors; 
        For I := VarArrayLowBound(OOoTypes, 1) to VarArrayHighBound(OOoTypes, 1) do 
        begin 
            if OOoTypes[i].HumanPresentableName = 'Unicode-Text' then 
            begin 
                Result := String(OOoClipContents.getTransferData(OOoTypes[i])) + #13#10; 
                Break; 
            end; 
        end; 
    except 
        on E: Exception do 
        begin 
            CTErrorDlg('OfficeReportCreation', [E.Message]); 
            Abort; 
        end; 
    end; 
end; 
  
procedure TForm1.PasteClipBoard; 
var 
   OOoServer, OOoDesktop, OOoDocument, 
   OOoClip, OOoClipContents, OOoTypes, VariantArr: Variant; 
  
   I: Integer; 
  
   AStr: String; 
begin 
   // On vérifie qu'il n'y a pas déja un service openoffice d'instancié 
   if not isNullEmpty(OOoServer) then 
      OOoServer := Unassigned; 
  
   Screen.Cursor:= crHourglass; 
   try 
      OOoServer    := CreateOleObject('com.sun.star.ServiceManager'); 
      OOoDesktop    := CreateUnoService('com.sun.star.frame.Desktop'); 
  
      // On crée un tableau de variant qui contiendra la propriété "cachée" du document 
      VariantArr := VarArrayCreate([0, 0], varVariant); 
      VariantArr[0] := OOoServer.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); 
      VariantArr[0].Name := 'Hidden'; 
      VariantArr[0].Value := True; 
  
      OOoDocument := OOoDesktop.LoadComponentFromURL('private:factory/swriter','_blank',0,VariantArr); 
   finally 
      Screen.Cursor:= crDefault; 
   end; 
  
   try 
      // On instancie le service openoffice gérant le presse papier 
      OOoClip := CreateUnoService('com.sun.star.datatransfer.clipboard.SystemClipboard'); 
  
      // On récupère le contenu de presse papier 
      OOoClipContents := OOoClip.getContents; 
  
      // On récupère les formats de données compatibles: Unicode-Text, Richtext, Bitmap, HTML-Text 
      OOoTypes := OOoClipContents.getTransferDataFlavors; 
  
      // L'objet récupéré nous donne accès aux propriétés: 
      // HumanPresentableName : le nom du format des données façon "intelligible" ex.: Unicode-Text 
      // MimeType : le nom du format des données ex.: text/plain;charset=utf-16 
      // DataType : le nom des classes d'objet à utiliser pour la conversion ex.: String 
  
      AStr := ''; 
      For I := VarArrayLowBound(oTypes, 1) to VarArrayHighBound(oTypes, 1) do 
      begin 
         // Ce qui nous intéresse, c'est de récupérer une chaine 
         // donc on s'arrete dés que l'on a trouvé une données de type chaine 
         if oTypes[i].HumanPresentableName = 'Unicode-Text' then 
         begin 
            // getTransferData retourne un variant, mais comme on sait que c'est une chaine on caste la valeur de retour. 
            AStr := String(oClipContents.getTransferData(oTypes[i])) + #13#10; 
            break; 
         end; 
      end; 
      // Appel de la fonction getText qui retourne l'ensemble du texte du document sous forme d'objet, 
      // sur lequel on appelle la fonction setString qui écrase le contenu par la valeur chaine          
      OOoDocument.getText.setString(AStr); 
   except 
      on e:Exception do 
         ShowMessage(e.Message + #13#10 + e.ClassName); 
   end; 
end;
Pour plus de détails sur les types de variable que l'on peut trouver dans le presse papier, ils sont répertoriés dans la section '6.2.1 Clipboard' (page 424 du pdf) du 'Developper guide' fourni par la SDK.

Cette QR a été testée sous Delphi 7 entreprise et openoffice 2.0.1

Mis à jour le 10 avril 2014 HumanTool

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2019 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.