IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAP Crystal Reports Discussion :

[TOPIC OFFICIEL] Comment utiliser le RDC de Crystal en Delphi ? [FAQ]


Sujet :

SAP Crystal Reports

  1. #1
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut [TOPIC OFFICIEL] Comment utiliser le RDC de Crystal en Delphi ?
    1er Partie importer le RDC en temps que composant VCL

    Pour utiliser le RDC sous Delphi il faut l'importer (Le RDC n'est rien d'autre que des objets COM)

    Pour ajouter le viewer : Component -> Import ActiveX control.... et la tu prend Crystal Report Viewer Control qui te donnera un TCRViewer.

    Pour ajouter le moteur : Projet -> Import Type Library... et la tu prend Crystal Report ActiveX Designer Run Time Library qui te donnera entre autre un TApplication et un TReport.
    Je te conseil de modifier le nom de toutes les classes P.Ex. TApplication en TCRApplication. Sinon certain classe du RDC seront en confli avec d'autre déjà existante dans Delphi.

    Après cela tu aura entre autre deux nouveaux fichiers CRVIEWERLib_TLB.pas et CRAXDRT_TLB.pas.
    Je te conseil d'aller te ballader un peux dedans pour voir de quoi il en retourne.

  2. #2
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    2e Première utilisation.

    Pour pouvoir fair un apérçu avec le RDC il nous faut au minimum 3 classes. TCRviewer - Pour l'apérçu, TCRReport - contient le rapport et TCRApplication - pour charger le raport.

    Créer un projet Delphi vide avec une feuille FORM1
    TCRViewer est c'est un composant visuel, on peut alors le placer sur FORM1 comme n'importe quel autre composant Delphi (DragAndDrop)

    ON ajoute encore un bouton (Button1) avec une méthode sur l'évement onClick.

    Maintenant voici comment on affiche un rapport :
    On l'ouvre -> crReport := crApplication.OpenReport(FileName, crOpenReportByTempCopy);
    On dit au viewer quel rapport il doit afficher -> crViewer91.ReportSource := crReport;
    Et on affiche le rapport -> crViewer91.ViewReport;

    Et voilà c'est fini.

    Ceci donne le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, OleCtrls, CRVIEWER9Lib_TLB, CRAXDRT_TLB;
     
    type
      TForm1 = class(TForm)
        CRViewer91: TCRViewer9;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      crApplication : IApplication;
     
    implementation
    uses COMOBJ;
    {$R *.DFM}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
       CommonDialog : TOpenDialog;
       crReport : IReport;
    begin
     
       CommonDialog := TOpenDialog.Create(Self);
       CommonDialog.Filter := 'Crystal Reports (*.rpt)|*.rpt';
       if CommonDialog.Execute then begin
          try
             Cursor := crHourGlass;
             crReport := crApplication.OpenReport(CommonDialog.FileName, crOpenReportByTempCopy);
     
             //Any Database logon, parameter field, select formula code would go here
     
             crViewer91.ReportSource := crReport;
             crViewer91.ViewReport;
             while crViewer91.IsBusy do begin
                //Delphi 6 may have a different object instead of 'forms'
                forms.Application.ProcessMessages;
             end;
             Cursor := crDefault;
     
             //After user is done viewing report, release it
             crReport._Release;
          except
          on E: EOLEException do ShowMessage (E.Message);
          end;
       end;
       CommonDialog.Free;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //Instantiate the one global reference to the RDC Application object
    crApplication := CreateOLEObject('CrystalRuntime.Application.9') as IApplication;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    //Release application object at close of project
    crApplication._Release();
    end;
     
    end.

  3. #3
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    Salut,
    Merci pour ce topic ,

    J'ai essayé de compiler ,
    J'ai tout d'abord eu une erreur sur CreateOLEObject (identificateur non déclaré), j'ai rajouté l'unité ComObj dans les uses

    puis après l'erreur :

    Types incompatibles : 'TCrApplication' et 'IApplication'

    que dois faire ?

  4. #4
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    C'est bizzard que tu ai ce message. TCRApplication et le wrappeur et IApplication ll'interface COM.

    Sur quel ligne tu as l'erreur.
    Est-ce que par hazard tu à changé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crApplication : IApplication;
    en ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crApplication : TCrApplication;
    : :
    Parce que cette exemple travaile directement sur l'interface.

  5. #5
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    C'est en effet une erreur de ma part ,...

    J' ai posé les composants TCrApplication et TCrReport sur ma fiche au lieu d'ajouter un IApplication et un IReport ...

    Merci bcp sur_uix.
    Djob.

  6. #6
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    Ensuite beaucoup de demande on été faite pour pouvoir lier une image dynamiquement.
    http://www.developpez.net/forums/viewtopic.php?t=102168
    http://www.developpez.net/forums/viewtopic.php?t=66466

    Pour cela Crystal nous propose quelque chose mais en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    This code applies to Section Format Events in a DSR. 
     
    'Section 3 is the detail section
    Private Sub Section3_Format(ByVal pFormattingInfo As Object)
     
      'Pass the path from field3 to the Visual Basic LoadPicture function. 
    'The picture is then loaded into the OLE Object
    Set Picture1.FormattedPicture = LoadPicture(Field3.Value)
     
    End Sub
    ON constate que Crystal à pensé à tout, car ce code n'est pas très compliqué.

    IL faut :
    1. Placer un objet OLE, appelé Picture1, dans un section, appelé Section3.
    2. Traper l'événement Format de la Section du rapport.
    3. Et dans l'événement Format, modifier l'objet Picture avec l'image qui se trouve sur votre disque. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Picture1.FormattedPicture = LoadPicture(Field3.Value)
     
    Field3 pourait être un FormulaField qui retourne
    "pic" + ToText({Hetype.Type,0}) + ".jpg"
    Maintenat le plus compliqué c'est le point 2, car cela demande pas mal de notion COM en Delphi. Dans le fichier CRAXDRT_TLB.pas on a la section "ISection" et sont événement "ISectionEvent".
    Il faut faire un wrappeur pour ces deux interface.
    Voici ce que je vous propose :

    Pour l'en-tête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
      TCrSectionFormat = procedure (Sender: TObject; const pFormattingInfo: IDispatch) of object;
     
      TCrSection = class(TOleServer)
       private
         FOnFormat : TCrSectionFormat;
         FIntf:        ISection;
         function      GetDefaultInterface: ISection;
       protected
         procedure InitServerData; override;
         procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
       published
         property OnFormat: TCrSectionFormat read FOnFormat write FOnFormat;
       public
         constructor Create(AOwner: TComponent); override;
         destructor  Destroy; override;
         procedure Connect; override;
         procedure ConnectTo(svrIntf: ISection);
         procedure Disconnect; override;
         property  DefaultInterface: ISection read GetDefaultInterface;
         property Intf:ISection read FIntf;
      end;
    Pour le coprs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    { TCrSection }
     
    procedure TCrSection.Connect;
    var
      punk: IUnknown;
    begin
      if FIntf = nil then
      begin
        punk := GetServer;
        ConnectEvents(punk);
        Fintf:= punk as ISection;
      end;
    end;
     
    procedure TCrSection.ConnectTo(svrIntf: ISection);
    begin
      Disconnect;
      FIntf := svrIntf;
      ConnectEvents(FIntf);
    end;
     
    constructor TCrSection.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    end;
     
    destructor TCrSection.Destroy;
    begin
      inherited Destroy;
    end;
     
    procedure TCrSection.Disconnect;
    begin
      if Fintf <> nil then
      begin
        DisconnectEvents(FIntf);
        FIntf := nil;
      end;
    end;
     
    function TCrSection.GetDefaultInterface: ISection;
    begin
      if FIntf = nil then
        Connect;
      Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation');
      Result := FIntf;
    end;
     
    procedure TCrSection.InitServerData;
    const
      CServerData: TServerData = (
        ClassID:   '{AF3768D4-6120-4E28-96DD-63FD2DC27B7A}';
        IntfIID:   '{AF376806-6120-4E28-96DD-63FD2DC27B7A}';
        EventIID:  '{AF37684B-6120-4E28-96DD-63FD2DC27B7A}';
        LicenseKey: nil;
        Version: 500);
    begin
      ServerData := @CServerData;
    end;
     
    procedure TCrSection.InvokeEvent(DispID: TDispID;
      var Params: TVariantArray);
    begin
      case DispID of
        -1: Exit;  // DISPID_UNKNOWN
       1: if Assigned(FOnFormat) then
                FOnFormat(Self, Params[0]);
      end; {case DispID}
    end;

    Vous ajouter cela dans le fichier CRAXDRT_TLB.pas
    Maintenat vous avez une classe TCrSection qui ce connecte sur n'importe quel section du rapport et vous propose l'événement OnFormat(...)

    Pour l'utiliser c'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      FRptSection := TCRSection.Create(nil);
      FRptSection.OnFormat := FormatOLE;
      FRptSection.ConnectTo(crReport.Sections.Get_Item('DetailSection1'));
    FormatOLE est votre procedure qui serra appelé par l'événement onFormat. C'est la dedans que vous coderai le chargement de l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    var
      strPath : string;
      oPicture: TPicture;
      pd: IPictureDisp;
      oBitmap : TBitmap;
    {...}
     
              oPicture := TPicture.Create;
              try
                oBitmap := LoadGraphicsFile(strPath);
                oPicture.Bitmap := oBitmap ;
                GetOLEPicture(oPicture, pd);
                Picture1.FormattedPicture := pd;
              finally
                oPicture.Free;
                oBitmap.Free;            
                oBitmap := nil;            
                pd := nil;
              end;
    Voilà si vous voulez en savoir plus sur la création de la classe TCrsection, allez plutôt sur le forum Delphi.
    Bonne chance

  7. #7
    Membre actif
    Avatar de Djob
    Inscrit en
    Août 2002
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 215
    Points : 279
    Points
    279
    Par défaut
    ça marche vraiment très bien... !!! Y upi !!
    et encore : x1000

    (J'avais écumé sans succès, les forums pour trouver cette solution ..)

    Maintenant, je vais essayer d'adapter cete solution sous C++ Builder..
    ( j'en ai besoin pour utiliser le toolkit C++ de Lotus...
    Il semblerait que l 'installation du RDC sous Builder avec cette meme procedure pose quelques problemes de compilation chez moi...(erreurs dans le code généré, mais ça provient peut être de mon environnement ...)

    et encore MERCI sur_uix !

  8. #8
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    Y a pas de quoi

    Il y a encore un point sur lequel il faut être prudent, c'est la libération des interfaces. N'oublié pas de détruire correctement tout vos objects Crystal.

    Si vous travaillé directement sur l'interface faite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FIReport.__Release;
    FIReport := nil;
    Et si vous utiliser une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FTCrReport.Intf.__Release;
    FTCrReport.Free;
    FTCrReport := nil;
    C'est un des consultants de Crystal qui m'a dit de faire le __Release, au début je ne faisait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    FTCrReport.Free;
    FTCrReport := nil;
    Et j'avais des problèmes lorsque je quitais mon application.
    Donc prudence.
    Voilà amusez vous bien

  9. #9
    Membre confirmé
    Avatar de sur_uix
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 550
    Points
    550
    Par défaut
    Hello tout le monde il y aura bientôt un FAQ de ce topic dans la FAQ de Delphi.

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 39
    Points : 16
    Points
    16
    Par défaut
    kikoo je suis en VB.Net et je voi pas dutous ou je peu implementer du code dans le crystal report

    je n'ai acces qu'a : CrystalReport1.rpt ou a CrystalReport1.vb(lorsque je fait afficher tous les fichiers) dans le second ya du code mais je ne voi pas ou je peu implementer koi que ce soit

    qu'elle qu'un peu m aider avec VB.Net ??

    je ne voi pas ou je peu choper : CRAXDRT_TLB.pas.

  11. #11
    Nouveau membre du Club
    Inscrit en
    Décembre 2005
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 72
    Points : 35
    Points
    35
    Par défaut crystal + delphi
    bonjour à tous j'ai essayé la procédure citée tout en haut pour lancer un état crée sous crystal reports 11 mais j'arrive pas à trouver les ActiveX que tu as cité tu peux bien m'expliquer si tu le permettais et merci.

  12. #12
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    J'ai lu avec beaucoup d'intéret l'article de sur_uix concernant la méthode pour pouvoir lier une image dynamiquement en Crystal Reports avec le RDC.

    Je suis en train d'adapter cette méthode avec Crystal Reports 8.0 et Delphi 2007. J'ai fait tous qui est nécessaire (installation de CRViewerlib_tlb.pas et CRAXDRT_tlb.pas), mais le problème c'est que l' événement Format ("Onformat") ne se produit pas ?! Je pense que l' événement se produit dès qu'on commence avec l' affichage du rapport (CRViewer.Viewreport) ?

    La procédure qui serra appelé par l' événement "OnFormat", je l'ai declaré comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm1.FormatDetailSection4(Sender : TObject ; const pFormattingInfo: IDispatch);
    et la déclaration de la section dans l' événement "FormCreate" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     FRptSection := TCRSection.CREATE(nil);
     FRptSection.OnFormat := Form1.FormatDetailSection4;
     FRptSection.ConnectTo(CRReport.Sections[4]);
    J' espère que c'est juste ou est-ce que j'ai fait des erreurs ?

    Merçi en avance pour m'aider ...



    Citation Envoyé par sur_uix Voir le message
    Ensuite beaucoup de demande on été faite pour pouvoir lier une image dynamiquement.
    http://www.developpez.net/forums/viewtopic.php?t=102168
    http://www.developpez.net/forums/viewtopic.php?t=66466

    Pour cela Crystal nous propose quelque chose mais en VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    This code applies to Section Format Events in a DSR. 
     
    'Section 3 is the detail section
    Private Sub Section3_Format(ByVal pFormattingInfo As Object)
     
      'Pass the path from field3 to the Visual Basic LoadPicture function. 
    'The picture is then loaded into the OLE Object
    Set Picture1.FormattedPicture = LoadPicture(Field3.Value)
     
    End Sub
    ON constate que Crystal à pensé à tout, car ce code n'est pas très compliqué.

    IL faut :
    1. Placer un objet OLE, appelé Picture1, dans un section, appelé Section3.
    2. Traper l'événement Format de la Section du rapport.
    3. Et dans l'événement Format, modifier l'objet Picture avec l'image qui se trouve sur votre disque. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Picture1.FormattedPicture = LoadPicture(Field3.Value)
     
    Field3 pourait être un FormulaField qui retourne
    "pic" + ToText({Hetype.Type,0}) + ".jpg"
    Maintenat le plus compliqué c'est le point 2, car cela demande pas mal de notion COM en Delphi. Dans le fichier CRAXDRT_TLB.pas on a la section "ISection" et sont événement "ISectionEvent".
    Il faut faire un wrappeur pour ces deux interface.
    Voici ce que je vous propose :

    Pour l'en-tête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
      TCrSectionFormat = procedure (Sender: TObject; const pFormattingInfo: IDispatch) of object;
     
      TCrSection = class(TOleServer)
       private
         FOnFormat : TCrSectionFormat;
         FIntf:        ISection;
         function      GetDefaultInterface: ISection;
       protected
         procedure InitServerData; override;
         procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
       published
         property OnFormat: TCrSectionFormat read FOnFormat write FOnFormat;
       public
         constructor Create(AOwner: TComponent); override;
         destructor  Destroy; override;
         procedure Connect; override;
         procedure ConnectTo(svrIntf: ISection);
         procedure Disconnect; override;
         property  DefaultInterface: ISection read GetDefaultInterface;
         property Intf:ISection read FIntf;
      end;
    Pour le coprs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    { TCrSection }
     
    procedure TCrSection.Connect;
    var
      punk: IUnknown;
    begin
      if FIntf = nil then
      begin
        punk := GetServer;
        ConnectEvents(punk);
        Fintf:= punk as ISection;
      end;
    end;
     
    procedure TCrSection.ConnectTo(svrIntf: ISection);
    begin
      Disconnect;
      FIntf := svrIntf;
      ConnectEvents(FIntf);
    end;
     
    constructor TCrSection.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
    end;
     
    destructor TCrSection.Destroy;
    begin
      inherited Destroy;
    end;
     
    procedure TCrSection.Disconnect;
    begin
      if Fintf <> nil then
      begin
        DisconnectEvents(FIntf);
        FIntf := nil;
      end;
    end;
     
    function TCrSection.GetDefaultInterface: ISection;
    begin
      if FIntf = nil then
        Connect;
      Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation');
      Result := FIntf;
    end;
     
    procedure TCrSection.InitServerData;
    const
      CServerData: TServerData = (
        ClassID:   '{AF3768D4-6120-4E28-96DD-63FD2DC27B7A}';
        IntfIID:   '{AF376806-6120-4E28-96DD-63FD2DC27B7A}';
        EventIID:  '{AF37684B-6120-4E28-96DD-63FD2DC27B7A}';
        LicenseKey: nil;
        Version: 500);
    begin
      ServerData := @CServerData;
    end;
     
    procedure TCrSection.InvokeEvent(DispID: TDispID;
      var Params: TVariantArray);
    begin
      case DispID of
        -1: Exit;  // DISPID_UNKNOWN
       1: if Assigned(FOnFormat) then
                FOnFormat(Self, Params[0]);
      end; {case DispID}
    end;

    Vous ajouter cela dans le fichier CRAXDRT_TLB.pas
    Maintenat vous avez une classe TCrSection qui ce connecte sur n'importe quel section du rapport et vous propose l'événement OnFormat(...)

    Pour l'utiliser c'est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      FRptSection := TCRSection.Create(nil);
      FRptSection.OnFormat := FormatOLE;
      FRptSection.ConnectTo(crReport.Sections.Get_Item('DetailSection1'));
    FormatOLE est votre procedure qui serra appelé par l'événement onFormat. C'est la dedans que vous coderai le chargement de l'image.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    var
      strPath : string;
      oPicture: TPicture;
      pd: IPictureDisp;
      oBitmap : TBitmap;
    {...}
     
              oPicture := TPicture.Create;
              try
                oBitmap := LoadGraphicsFile(strPath);
                oPicture.Bitmap := oBitmap ;
                GetOLEPicture(oPicture, pd);
                Picture1.FormattedPicture := pd;
              finally
                oPicture.Free;
                oBitmap.Free;            
                oBitmap := nil;            
                pd := nil;
              end;
    Voilà si vous voulez en savoir plus sur la création de la classe TCrsection, allez plutôt sur le forum Delphi.
    Bonne chance

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/08/2014, 08h38
  2. Comment utiliser Firebird 2.5 (x64) sous delphi
    Par colorid dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/02/2014, 11h54
  3. Réponses: 18
    Dernier message: 25/06/2007, 09h45
  4. Réponses: 3
    Dernier message: 04/05/2006, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo