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

Lazarus Pascal Discussion :

DataSet générique dans un composant


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut DataSet générique dans un composant
    Bonjour,

    Dans un composant, j'ai un code de ce type
    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
    function TmySQLtoSGtoSQL.SQLBlobToStr(aQuery : TZQuery; aField : TField) : String;
    {public}
    var
     aStream : TMemoryStream;
    begin
     Result := '';
     with aQuery do
      if not(aField.isNull) then
       try
        aStream := TMemoryStream.Create;
        TBlobField(aField).SaveToStream(aStream);
        Result := MemStreamToString(aStream);
       finally
        aStream.Free;
       end;
    end;
    Il fonctionne correctement à condition que la Form qui l'emploie, utilise un TzQuery. Mais si -et c'est le cas- j'ai également un TzReadOnlyQuery voire un TsqlQuery, y a-t-il un moyen d'utiliser un DataSet générique ?

    Pour l'instant j'ai dû me résoudre à employer :
    • SQLBlobToStr(aQuery : TZQuery; aField : TField) : String;
    • SQLBlobToStr2(aQuery : TZReadOnlyQuery; aField : TField) : String;


    J'avais pensé un moment déclarer aQuery : TDataset mais j'obtiens une Error: Identifier not found "ZReadOnlyQueryX". Peut-on faire mieux, par exemple, déclarer un aDataSet lié à une série de DataSets "possibles" : zQuery, ZReadOnlyQuery, sqlQuery ?

    Cordialement. Gilles
    Dernière modification par Invité ; 05/11/2011 à 09h22.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Sur quelle ligne se situe exactement cette erreur ?

    Citation Envoyé par selzig Voir le message
    Pour l'instant j'ai dû me résoudre à employer :
    • SQLBlobToStr(aQuery : TZQuery; aField : TField) : String;
    • SQLBlobToStr2(aQuery : TZReadOnlyQuery; aField : TField) : String;
    A défaut de dataset générique, pourquoi ne pas utiliser la surcharge de redéfinition ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function SQLBlobToStr(aQuery : TZQuery; aField : TField) : String; overload;
    function SQLBlobToStr(aQuery : TZReadOnlyQuery; aField : TField) : String; overload;
    As tu essayé ceci ?
    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
    function SQLBlobToStr(aDataset: TDataSet; aFieldName: String): String;
    var
      aStream: TMemoryStream;
      aField: TField;
    begin
      Result := '';
      with aDataset do
        aField := FieldByName(aFieldName);
      if not aField.isNull then
      begin
        aStream := TMemoryStream.Create;
        try
          TBlobField(aField).SaveToStream(aStream);
          Result := MemStreamToString(aStream);
        finally
          aStream.Free;
        end;
      end;
    end;
    Sinon, quelle est l'arbre hiérarchique de ces classes ?
    --
    Philippe.
    Philippe.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Depuis que Lazarus fonctionne "nativement" sur mes Macs (notamment au niveau du Debug), je l'ai ressorti de mes cartons.

    je rencontre à nouveau un problème que j'avais évoqué, il y a quelques temps (comme "Invité").
    Cela concerne une dbGrid corrigée.
    En réalité 2 problèmes :
    Premier problème : j'utilise Unidac. J'incorpore le paquet nécessaire dans le composant. Mais si le paquet n'est pas installé, au lieu d'un UniSQLquery, j'utilise un SQLquery natif. Pour l'instant les ressources du composant sont celles-ci :
    Nom : 01.png
Affichages : 332
Taille : 38,1 Ko

    1. Y a-t-il un moyen de rendre le paquet dclunidac10 "facultatif" donc de vérifier lors de l'installation du paquet si Unidac est installé ?
    2. Y a-t-il un moyen dans le code du composant de savoir si le DataSource.Dataset de la dbGrid posée sur la Form est un UniQuery ou un SQLQuery natif ?


    Le point 2 du premier problème pourrait être facilement contourné s'il y avait une méthode élégante (i.e. simple et pratique) de résoudre la question, que j'avais anciennement posée, peut-on créer un code générique. Dans ce cas précis je crois que non. Exemple de ligne posant problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSortedColumnName := TUNIQuery(DataSource.DataSet).IndexFieldNames;
    vs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FSortedColumnName := TSQLQuery(DataSource.DataSet).IndexFieldNames;
    A savoir que la réponse de Philippe est efficace mais nécessiterait dans mon cas une multitude de "function ....; overload;.

    Merci. Cordialement. Gilles
    Dernière modification par Invité ; 11/03/2019 à 10h37.

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Une autre solution serait de tester le dataset en prenant comme paramètre le père de tous les composant de base... s'ils ont été construits sur une base commune.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if DataSource.DataSet is   TUNIQuery  Then
      FSortedColumnName := (DataSource.DataSet as TUNIQuery).IndexFieldNames
    else 
      if DataSource.DataSet is   TSQLQuery  Then
      FSortedColumnName := (DataSource.DataSet as TSQLQuery).IndexFieldNames
    else 
      ... ;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    oui mais si la personne qui veut installer le composant ne possède pas Unidac, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if DataSource.DataSet is TUNIQuery  Then
    va générer une erreur puisque la classe TUNIQuery est inconnue dans ce cas.

    Je pensais plus à une directive de compilation comme je l'ai utilisée pour gérer le mode test avec Delphi. La générer est simple mais poser la question qui lancera la génération me semble plus difficile : Comment vérifier que TUniQuery est dispo (et installé) dans l'IDE donc que le paquet Unidac est installé (ou ZeosLib) ?

    Cordialement. Gilles

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Je ne comprends pas bien le problème

    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
    {$DEFINE UNIDAC}
    {$.DEFINE ZEOLIB}
     
    Use  ...
      {$IFDEF UNIDAC}
        UnitUniDac
      {$ENDIF}
    {$IFDEF ZEOLIB}
        UnitZeoLib 
      {$ENDIF}
    ;
    ....
     
     {$IFDEF UNIDAC}
        if DataSource.DataSet is   TUNIQuery  Then
           FSortedColumnName := (DataSource.DataSet as TUNIQuery).IndexFieldNames
      {$ENDIF}
    {$IFDEF ZEOLIB}
       if DataSource.DataSet is   TSQLQuery  Then
         FSortedColumnName := (DataSource.DataSet as TSQLQuery).IndexFieldNames
      {$ENDIF}
      ... ;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Est-ce que la solution de serait pas d'utiliser des TDataSource, ou éventuellement de regarder comment ils font pour se connecter à n'importe quel DataSet ?
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    {$DEFINE UNIDAC}
    {$.DEFINE ZEOLIB}
    Bonjour,

    c'est votre réponse que je ne comprends pas bien. La présence du {$DEFINE UNIDAC} est conditionnelle : si Unidac est installé alors.... Et c'est justement là qu'est le problème. Comment vérifie-t-on que UNIDAC est installé dans le .lpk du paquet du nouveau composant.

    j'ai bien la référence dans le packagefile.xml. (<Name Value = "dclunidac10"/>. Je pense être capable dans le lpk d'utiliser <Conditionals Value="if ... -dUnidac;"/>. Je crois avoir trouvé la variable permettant de situer le répertoire de compilation (enfin il y en a 2 : la principale et la secondaire). Mais pour l'instant cela résiste encore un peu. Ensuite oui, le {$DEFINE UNIDAC} étant présent ou pas, je peux utiliser votre solution.

    Citation Envoyé par tintinux Voir le message
    Est-ce que la solution de serait pas d'utiliser des TDataSource, ou éventuellement de regarder comment ils font pour se connecter à n'importe quel DataSet ?
    Je n'avais pas penser à cela. J'approfondis votre proposition.

    Merci pour vos aides. Cordialement. Gilles.

Discussions similaires

  1. [C#/Oracle 10] Récupérer un curseur générique dans un dataset
    Par aurelien.tournier dans le forum Accès aux données
    Réponses: 3
    Dernier message: 11/06/2007, 16h04
  2. Réponses: 4
    Dernier message: 27/07/2005, 11h51
  3. Les champs dans un composant ADOStorecProc
    Par ZIED dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/06/2005, 11h32
  4. Ecrire du texte en couleurs dans un composant
    Par wutang dans le forum Composants
    Réponses: 11
    Dernier message: 12/07/2004, 10h55
  5. Une image dans un composant ?
    Par bjl dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/03/2003, 11h28

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