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 :

SQLite3, Zeos et RichMemo [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 771
    Par défaut SQLite3, Zeos et RichMemo
    Bonjour,

    voilà, j'essaie d'enregistrer dans une base SQLite, un texte mis en forme saisi dans un RichMemo.

    J'utilise les composants ZeosLib (7.0.3), et Lazarus 1.0.4.

    Je n'arrive pas à enregistrer correctement les textes et encore moins à les récupérer.

    Quelqu'un a déjà fait cela ?

    Merci d'avance

    JS

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

    C'est la mise en forme que vous n'arrivez pas à enregistrer ? A restituer dans un (autre) RichMemo après enregistrement et relecture dans la base ? ou cela concerne uniquement le texte contenu dans le RichMemo ? Parce qu'en réalité, il y a 2 problèmes. Si vous voulez afficher votre RichMemo dans une dbGrid (ou une StringGrid), évidemment le texte brut suffit. Mais si après lecture dans la base, vous voulez également l'afficher à nouveau dans un Richmemo, là, il faut enregistrer en plus les attributs du texte ce qui implique l'enregistrement dans de 2 champs différents de votre table. Il faudrait utiliser pour le 2ème champ les fonctions Load/SaveRichText.
    J'ai lu mais pas testé (je ne les utilise plus) que les RichMemo avaient (eu) des problèmes avec l'UTF8 et sous Nux... A regarder de près, même si je suppose que cela a été réglé depuis le temps : http://bugs.freepascal.org/view.php?id=19624

    Cordialement. Gilles
    Dernière modification par Invité ; 07/01/2013 à 11h39.

  3. #3
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 771
    Par défaut
    Tout d'abord merci d'avoir répondu, ensuite mon problème est assez bizarre.

    Après plusieurs recherche il s'avère en fait que c'est l'utilisation des "MemoryStream" qui pose problème.

    Je m'explique. Afin d'enregistrer et lire du texte mis en forme dans une base SQLite j'utilise les possibilités des champs blob et du composant RichMemo de lire et ecrire dans des stream. Afin de ne pas solliciter le disque dur, je suis passé par des MemoryStream. Le problème est que ça ne fonctionne pas. Si je passe par des FileStream, tout roule. Mais, dans ce cas, je dois écrire sur le disque le filestream depuis le champsblob ou depuis le RichMemo pour le lire à nouveau et le mettre soit dans le RichMemo ou dans le champ blob.

    En gros, j'ai les schémas suivants :

    ChampBlob --> fichier temporaire --> RichMemo
    et
    RichMemo --> fichier temporaire --> ChampBlob

    Ça fonctionne, mais ce n'est pas très optimisé au niveau du disque dur.

    Du coup, je me demandais s'il ne serait pas plus simple de faire comme je fais déjà pour les blob images, que je stocke sur le disque dur (dans un dossier spécifique) et dont seul le nom est stocké dans la base...

    JS

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 942
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 942
    Billets dans le blog
    6
    Par défaut
    Pardon pour cette question, mais as-tu essayé avec des MemoryStream dont tu avais remis la Position à 0 avant de les passer pour lecture ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 771
    Par défaut
    A priori, je dirais... non ? Mais plus réellement, ce serait !

    Bref, que veux-tu dire exactement ? Je ne suis pas du tout, mais alors pas du tout, familiarisé avec les stream...

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 261
    Par défaut
    Bonsoir,

    Les TMemoryStream utilisent un "curseur" qui permet de lire ou d'écrire à partir d'une certaine position identifiée par la propriété MS.position. Souvent après une écriture (WriteToStream par exemple) le curseur est situé en fin du flux. Si on veut lire le flux depuis le début, certaines fonctions nécessitent de repositionner ce curseur au début par
    MS.position:=0 ou par
    MS.seek(0,soFromBeginning)
    sinon le curseur se trouvant à la fin, rien ne sera lu.

    André

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bon alors j'ai commencé les premiers tests.
    Il est nécessaire sous GTK2 d'utiliser le patch suivant pour installer le TRichMemo
    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
    Index: gtk2/gtk2richmemo.pas
    ===================================================================
    --- gtk2/gtk2richmemo.pas	(wersja 1314)
    +++ gtk2/gtk2richmemo.pas	(kopia robocza)
    @@ -31,9 +31,9 @@
       // LCL
       LCLType, Controls, Graphics,
       // Gtk2 widget
    -  GtkDef,
    -  GTKWinApiWindow, GtkGlobals, GtkProc, InterfaceBase,
    -  GtkWSControls,
    +  Gtk2Def,
    +  GTK2WinApiWindow, Gtk2Globals, Gtk2Proc, InterfaceBase,
    +  Gtk2WSControls,
       // RichMemo
       WSRichMemo;
     
    @@ -98,7 +98,7 @@
     class procedure TGtk2WSCustomRichMemo.SetCallbacks(
       const AGtkWidget: PGtkWidget; const AWidgetInfo: PWidgetInfo);
     begin
    -   TGtkWSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
    +   TGtk2WSWinControl.SetCallbacks(PGtkObject(AGtkWidget), TComponent(AWidgetInfo^.LCLObject));
     end;
     
     class function TGtk2WSCustomRichMemo.CreateHandle(const AWinControl: TWinControl; const AParams: TCreateParams): TLCLIntfHandle;
    Réf. : http://bugs.freepascal.org/view.php?id=17319

    Pour l'instant, les tests ont l'air plutôt négatifs :la string reste désespérément vide quels que soient nos codes... mais ce qui me semble le plus inquiétant c'est que sans passer par la string, donc en restant avec le Stream, cela ne passe pas non plus.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      ms1 : TMemoryStream;
    begin
      try
        ms1 := TMemoryStream.Create();
        try
          //ms1.Seek(0, soFromBeginning);
          ms1.Position:= 0;
          RichMemo1.SaveRichText(ms1);
     
          //ms1.Seek(0, soFromBeginning);
           ms1.Position :=0;
           RichMemo2.LoadRichText(ms1);
        except
          showmessage('Oups');
        end;
      finally
        ms1.Free;
      end;
    end;
    Impossible de répliquer le contenu du RichMemo1 dans le RichMemo2 avec ce code... et pas de déclenchement d'exceptions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RichMemo1.SaveRichText(ms1);
     ms1.Seek(0, soFromBeginning); {ou  ms1.Seek(0, soBeginning) ou ms1.Poistion := 0}
     showmessage(intTostr(ms1.size));
    renvoie 0.

    Cela ne fonctionne pas mieux fonctionner en Win7 64 bits. L'appel RichMemo1.SaveRichText(ms1) renvoie une erreur RichEditWndProc RunError(216). La méthode incriminée semble être la ligne 373 SendMessage(RichEditWnd, EM_STREAMOUT, SF_RTF, LPARAM(@cbs) ); dans
    class function TRichEditManager.SaveRichText(RichEditWnd: Handle; ADst: TStream): Boolean; du fichier Win32RichMemoProc...

    Je m'y prends peut-être mal. Il va falloir prendre contact avec le forum de Lazarus... avec mon "broken english" . Je verrai cela demain. Dites donc Jon Shannow, cela laisse supposer des talents luinguistiques dans la langue de Shakespeare... Je peux faire un petit compte-rendu en français... for translation
    Cordialement. Gilles
    Dernière modification par Invité ; 08/01/2013 à 23h09.

  8. #8
    Membre prolifique Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2011
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2011
    Messages : 4 771
    Par défaut
    Citation Envoyé par selzig Voir le message
    Bon alors j'ai commencé les premiers tests.
    Il est nécessaire sous GTK2 d'utiliser le patch suivant pour installer le TRichMemo
    S'il n'y a que cela, ce n'est pas très grave...

    Citation Envoyé par selzig Voir le message
    Pour l'instant, les tests ont l'air plutôt négatifs :la string reste désespérément vide quels que soient nos codes... mais ce qui me semble le plus inquiétant c'est que sans passer par la string, donc en restant avec le Stream, cela ne passe pas non plus.
    Ça c'est plus embêtant...


    Citation Envoyé par selzig Voir le message
    Impossible de répliquer le contenu du RichMemo1 dans le RichMemo2 avec ce code... et pas de déclenchement d'exceptions.

    Cela ne fonctionne pas mieux fonctionner en Win7 64 bits. L'appel RichMemo1.SaveRichText(ms1) renvoie une erreur RichEditWndProc RunError(216). La méthode incriminée semble être la ligne 373 SendMessage(RichEditWnd, EM_STREAMOUT, SF_RTF, LPARAM(@cbs) ); dans
    class function TRichEditManager.SaveRichText(RichEditWnd: Handle; ADst: TStream): Boolean; du fichier Win32RichMemoProc...

    Je m'y prends peut-être mal. Il va falloir prendre contact avec le forum de Lazarus... avec mon "broken english" . Je verrai cela demain. Dites donc Jon Shannow, cela laisse supposer des talents luinguistiques dans la langue de Shakespeare... Je peux faire un petit compte-rendu en français... for translation
    Cordialement. Gilles
    Aïe !
    Fort maille innegliche, no problaime. Ail canne rouiatte ouate you tell (guillaume), inn heu parfaicte innegliche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [D 2005][MySQL][Zeos] ResultSet
    Par aragom dans le forum Bases de données
    Réponses: 5
    Dernier message: 21/08/2006, 23h31
  2. [ZEOS] récupérer le SQLCODE ?
    Par qi130 dans le forum Bases de données
    Réponses: 1
    Dernier message: 27/09/2005, 23h09
  3. zeos / liste des tables
    Par Tcheby dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/09/2005, 20h29
  4. EmptyTable Zeos
    Par defluc dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/08/2005, 13h46
  5. Réponses: 5
    Dernier message: 09/12/2002, 22h23

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