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 :

Affichage "TMemo" dans la cellule d'une dbGrid


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut Affichage "TMemo" dans la cellule d'une dbGrid
    Bonjour,

    Je pratique rarement les dbGrids (mais plus souvent les StringGrids) n'utilisant pas de connexions persistantes.

    Par hasard, j'ai découvert qu'il était possible d'utiliser les SQLite3Connexion en mode ':memory:' et cela pourrait pourrait représenter une simplification de mon code.

    Donc, j'ai bien réussi à utiliser une chaîne SQLite3Connexion-SQLQuery*-DataSource-dbGrid pour enregistrer et lire des fichiers SQLite en mémoire.
    *Rq : impossible de faire fonctionner dans cette config. memory avec SQLite3DataSet

    Je bute sur le problème suivant. J'enregistre (INSERT INTO...) dans un champ TEXT d'une table SQLite le contenu d'un TMemo de 2 lignes [Line1 +LineEnding +Line2] et le restitue (SELECT ...) dans une cellule de la dbGrid.

    D'abord, j'ai éventuellement un problème d'encodage. En relecture sous Win, j'obtiens Line1Line2 sans espace (apparemment) et sous Nux, j'obtiens Line1▓Line2. Eventuellement car pour l'instant, je me demande comment on obtient une cellule multilignes dans la dbGrid... Comme par défaut il semble que le "multilignes" ne soit pas géré, je n'ai aucune certitude.

    Merci.
    Cordialement. Gilles

    Lazarus-1.1-42538-fpc-2.7.1-20130901-win32
    Dernière modification par Invité ; 14/09/2013 à 11h49.

  2. #2
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    hello Selzig,

    cherche Multilines in Grids, DBGrid dans cette page :
    http://wiki.lazarus.freepascal.org/Grids_Reference_Page

    pour le composant DBGrid utilise plutôt la variable DataCol pour indiquer la colonne où se trouve ton champ texte.

    Amicalement, nullosse

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

    Oui, quand je demande comment on gère le multiligne, je m'exprime mal. Je veux dire nativement.
    Citation Envoyé par selzig Voir le message
    ... car pour l'instant, je me demande comment on obtient une cellule multilignes dans la dbGrid... Comme par défaut il semble que le "multilignes" ne soit pas géré, je n'ai aucune certitude.
    Il est vrai que ma formulation ci-dessus est peu explicite.

    J'ai lu un article récent en anglais -j'ai dû mal le comprendre, il faudrait que je le retrouve- où j'ai compris que c'était possible. Au "possible", j'ai associé "incorporé". D'où mon embarras de ne rien trouver dans les propriétés du composant.

    La méthode de votre référence est une méthode où il faut tout faire à la main pour obtenir un minimum d'ergonomie. J'avais déjà fait un début d'approche : http://www.developpez.net/forums/d11...s-multilignes/

    Mais le travail de maintenance au fil des versions est trop important pour des fonctions "primaires" mais indispensables à un niveau minimum d'ergonomie, fonctions qui à mon avis devraient être incorporées depuis longtemps... Comme je ne pratique pas beaucoup Lazarus en ce moment, j'ai cru qu'un progrès avait été réalisé en la matière... et en le rapprochant des SQLite3 en mémoire, un nouveau seuil de productivité -compte tenu des contraintes et des approches que j'ai choisies- aurait retenu mon attention.

    Hélas. Bon, je vais quand même aller voir par curiosité,comment cela se passe du côté des images (blob), histoire de refaire un peu de Pascal... En StringGrid, il y a un autre problème. Peut-être est-il traité "automatiquement" en dbGrid.

    Merci pour votre aide.
    Cordialement. Gilles
    Dernière modification par Invité ; 14/09/2013 à 16h23.

  4. #4
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    hello,

    a titre indicatif, je met en pièce jointe une copie d'écran de l' IHM d'un petit projet que j'ai réalisé en Lazarus avec des composants tsqlquery, tdbgrid, tdbimage, tdbmemo etc... La base de données est en sqlite3 avec la structure suivante :
    cid name type
    ------- ------------------ ---------- --
    0 ID INTEGER
    1 Scientific_Name VARCHAR
    2 Common_Name VARCHAR
    3 Order VARCHAR
    4 Genus VARCHAR
    5 Notes TEXT
    6 Picture BLOB
    7 Image_Link VARCHAR

    Comme on peut le constater pour le champ Notes dans le dbgrid on voit (memo) à la place du texte mais j'affiche dans un TdbMemo le contenu quand on sélectionne une ligne de la dbgrid.
    Pour les images il y a les deux types de gestion possible :
    soit on met l'image dans un blob dans la base de données, soit on met le lien sur un fichier à l'extérieur de la base.

    Amicalement, nullosse
    Images attachées Images attachées  

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

    Pour l'affichage d'un Memo dans une dbGrid, on peut s'inspirer de cette discussion : http://forum.lazarus.freepascal.org/...?topic=14082.0

    En ce qui concerne les images, c'est l'affichage d'une vignette dans une cellule d'une dbGrid qui m'intéresse. Avec une StringGrid c'est non pas l'affichage qui pose problème mais le stockage... Par "construction", les cellules ne peuvent stocker que des chaines de type C (un tableau de char dont la fin est marquée par un caractère nul)... or le binary d'une image contient des caractères nuls n'importe où... et donc ne peut pas être stocké dans une cellule de StringGrid.... Mais pour la persistance de l'image dans les cellules (au rafraîchissement des dernières), elle doit être stockée... J'ai trouvé une solution... comme d'habitude très lourde http://www.developpez.net/forums/d13...sqlbytea-text/

    Je regarderai dans la semaine pour l'affichage des images dans les cellules d'une dbGrid-SQLite3. En attendant, je finis de comparer le "SQLite3 in memory" avec TMemDataSet, TBufDataSet et ZMSQL. A priori, les 2 premiers présentent des "incapacités" et des insuffisances et pour le dernier je rencontre une "difficulté" à le mettre en oeuvre : les exemples fournis avec le paquet d'installation plantent irrémédiablement et comme d'habitude la doc existe mais reste succincte, peu pédagogique et surtout mal utile.

    Mais SQLite3 reste en course: c'est même assez impressionnant en memory. Je regrette vraiment de ne pas avoir découvert ce mode de fonctionnement plus tôt. Ma vieille dbGrid modifiée "memo" fonctionne encore et semble compatible... Reste ce problème d'affichage d'images et vérifier que le stockage tient en memory. Votre exemple montre que cela fonctionne avec un dbImage, donc à priori, on doit pouvoir l'afficher assez simplement et directement dans une cellule de la dbGrid. Enfin, je l'espère.

    Merci pour votre aide.
    Bonne fin de WE. Cordialement. Gilles.

    PS : mes images sont systématiquement stockées dans mes BDD qui sont distantes (par Internet). Toutes mes bases sont pgSQL. Une partie des tables est chargée en StringGrid qui régulièrement (ie en rapport avec les évènements déclenchés par l'utilisateur de la StringGrid) est mise à jour par thread. Dans ces conditions, on ressent peu les 200 ou 500 Km de distance séparant l'utilisateur des BDD. Je sais que c'est un peu original et certainement très contestable mais c'est le choix de développement que j'ai retenu depuis le début. J'optimise la fluidité et pallie ainsi la possible non-persistance de la liaison internet (http://www.developpez.net/forums/d12...-pqconnection/)
    Que je passe les images par ftp ou dans le flux de la base, les temps de chargement sont les mêmes, peut-être même, sont-ils un peu plus courts avec la BDD à cause des temps supplémentaires nécessaires à l'ouverture du FTP. Mais les fonctions transactionnelles et de blocage des bases n'ont aucun équivalent en FTP. Donc dans votre exemple, si 2 utilisateurs veulent changer l'image de votre champignon en "même temps", en FTP le dernier a le dernier mot... En utilisant les blobs, on gère les accès concurrentiels.
    Dernière modification par Invité ; 15/09/2013 à 11h48. Motif: Précisions, lisibilité

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

    Pour les images, cela fonctionne assez facilement


    Le code est assez simple finalement :
    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
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    var
       imageTMP  : TImage;
       streamTMP : TStream;
       CurrField : TField;
    begin
      CurrField := Column.Field;
      if CurrField.DataType = ftBlob then try
        imageTMP  := TImage.Create(nil);
        streamTMP := TStream.Create;
        with (Sender as TDBGrid) do begin
          with DataSource.DataSet do
            streamTMP := CreateBlobStream(Fields[DataCol],bmRead);
          imageTMP.Picture.LoadFromStream(streamTMP);
     
          Canvas.FillRect(Rect);
          Canvas.Draw(Rect.left+1, Rect.Top+1,imageTMP.Picture.Graphic);
        end;
      finally
        streamTMP.Free;
        imageTMP.Free;
      end;
    end;
    Je place le code complet avec la sqlite3.dll (win32) en pièce jointe : la base SQLite3 est construite en mémoire. Une requête de création de table, une requête d'insertion à partir d'une image placée dans un Timage, et une requête de lecture de la table. A remarquer que j'ai préféré détecter la présence d'un ftBlob plutôt que d'utiliser DataCol. En production il faudrait quand même contrôler que tous les blobs de la table affichée sont bien des images.

    Donc résolu mais pour l'affichage des Memos avec mon vieux code... ce qui ne représente pas l'avancée que j'espérais...

    Je retourne à mes langages actuels mais quel plaisir d'avoir un peu reprogrammé en Lazarus.
    Cordialement. Gilles
    Fichiers attachés Fichiers attachés
    Dernière modification par Invité ; 16/09/2013 à 12h30.

Discussions similaires

  1. [AC-2007] Affichage dans les cellules d'une feuille de données
    Par reims87 dans le forum IHM
    Réponses: 2
    Dernier message: 03/11/2011, 08h15
  2. [VxiR2] Affichage contenu de dimension dans un cellule
    Par tomanu dans le forum Webi
    Réponses: 2
    Dernier message: 12/10/2010, 15h02
  3. [MySQL] non affichage d'un zero dans le resultat d'une requete
    Par oceane751 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 08/11/2005, 00h31

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