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

Bases de données Delphi Discussion :

[IB][Delphi] Afficher et éditer un Blob par un LoadFromStream


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut [IB][Delphi] Afficher et éditer un Blob par un LoadFromStream
    L'application développée sous Delphi7 et IB6 utilise pour certaines éditions des "modéles" Office ( .xlt ou .dot ).
    Ces modéles sont actuellement des fichiers sur le réseau ( ce qui les rend "fragiles", et complique les éventuelles migrations, nom de chemin... ).
    Pour fiabiliser et rendre l'application plus homogène j'ai chargé ces fichiers dans des blobs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      if Opendialog1.Execute then
      begin
        with ibdsBlob do
        begin
          ....
          Insert;
          ibdsBlobNOM_BLOB.value := extractFilename(opendialog1.FileName);
          ibdsBlobRESERVOIR.LoadFromFile(opendialog1.FileName);
          Post;
        end;
      end;
    Je n'ai trouvé d'autre solution pour les afficher et les éditer que de les "réécrire" et de les "réouvrir" :
    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
     
    procedure TForm1.ouvre_Xl(filename : AnsiString);
      var
        vMSExcel,vLink,vReadOnly : variant;
        vXLWorkbooks, vXLWorkbook : variant;
        vFilename : AnsiString;
      begin
        vFileName := 'c:\temp\'+filename ;
        ibdsBlobRESERVOIR.SavetoFile(vfilename);
        try
          vMSExcel := GetActiveOleObject('Excel.Application');
        except
         vMSExcel := CreateOleObject('Excel.Application');
        end;
        vMSExcel.Visible := true;
        vLink := unassigned;
        vReadOnly := False;
        vXLWorkbooks := vMSExcel.Workbooks;
        vXLWorkbook := vXLWorkbooks.Open(vFileName, vLink, vReadOnly);
    end;
    puis d'effacer par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     DeleteFile(vfilename);
    Je suis persuadé qu'il existe une méthode plus performante et plus "propre" pour lancer l'application ( Excel ou Word) et passer le contenu du Blob par un LoadFromStream...mais je n'y arrive pas !

    Quelques lumiéres la dessus ?
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Si vXLWorkbooks.Open accepte les TMemoryStream tu peux faire

    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
    
    procedure TForm1.ouvre_Xl(filename : AnsiString);
      var
        vMSExcel,vLink,vReadOnly : variant;
        vXLWorkbooks, vXLWorkbook : variant;
        MSFile : TMemoryStream;
      begin
        MSFile := TMEmoryStream.Create;
        try
          TBlobField(ibdsBlob.FieldByName('RESERVOIR')).SaveToStream(MSFile);
          try
            vMSExcel := GetActiveOleObject('Excel.Application');
          except
           vMSExcel := CreateOleObject('Excel.Application');
          end;
          vMSExcel.Visible := true;
          vLink := unassigned;
          vReadOnly := False;
          vXLWorkbooks := vMSExcel.Workbooks;
          vXLWorkbook := vXLWorkbooks.Open(MSFile, vLink, vReadOnly);
        finally 
          MsFile.Free;
        end;
    end;
    A tester, je ne sais pas si ca fonctionne totalement comme ça avec IB, mais ca te donne une piste
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci de cette réponse quasi instantanée !
    Le test :
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        vXLWorkbook := vXLWorkbooks.Open(MSFile, vLink, vReadOnly);
    renvoit
    type non autorisé dans appel Variant Dispatch
    ( il s'agit de MSFile )

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Papino
    Merci de cette réponse quasi instantanée !
    Le test :
    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        vXLWorkbook := vXLWorkbooks.Open(MSFile, vLink, vReadOnly);
    renvoit

    ( il s'agit de MSFile )
    Je m'en doutais un peu ^^.
    il n'y a pas une fonction qui permet d'avoir genre vXLWorkbooks.LoadFromStream() ou une fonction du type ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    En furetant dans cette direction, je n'ai trouvé que des réponses de ce type !!!
    J'ai l'impression que seuls les chinois ( et peut être les coréens ? ) se sont intéressés au problème.
    Cet exemple peut il servir ?
    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
     
    procedure LoadFromStream(ADOTable1: TAdoTable)
    var
      TMemoryStream
      vStream: TADOBlobStream;
    begin
      try    
        vStream := TADOBlobStream.Create(TBlobField(ADOTable1.FieldByName("BlobField")), bmread);
        if (OleContainer1.State = osOpen) or (OleContainer1.State = osUIActive) then
        begin
          OleContainer1.DestroyObject;
        end;
        vStream.Position := 0;
        Olecontainer1.LoadFromStream(vStream);
      except
      end;
    end;
    ... je me sens un peu limité par mes connaissances en informatique et en mandarin...

    [edit]J'ai retiré les commentaires en mandarin. Trop peu de personnes parmi nous le lit couramment. Donc ils sont inutiles. Pascal Jankowski[/edit]

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Mon mandarin n'est pas meilleur que le tien

    Je pense qu'il faudrait que tu vois comment fonctionne les OleContainer
    Pour ma part j'ai jamais utilisé donc je ne serais pas d'une grande aide.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/04/2006, 22h54
  2. [REPORT] afficher un champs image (BLOB)
    Par kchikeche dans le forum Oracle
    Réponses: 2
    Dernier message: 05/12/2005, 10h23
  3. [MFC] afficher une page web accessible par login
    Par hiko-seijuro dans le forum MFC
    Réponses: 6
    Dernier message: 31/08/2005, 18h32
  4. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13
  5. [VB6] Datagrid afficher ou cacher des colonnes par code
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 06/02/2003, 17h19

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