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

Composants FMX Delphi Discussion :

[XE8] TDBGrid vs TStringGrid avec FireDac


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut [XE8] TDBGrid vs TStringGrid avec FireDac
    Bonjour

    Voila quelques temps que je suis en train de reconstruire ma base de développement et d'outils en fmx.
    Coté BD, j'ai choisi Firedac puisque c'est visiblement ce qui est préconisé à l'heure actuelle.

    Je viens de D2007/BDE/Paradox/TTable/DBGrid, qui bien qu'obsolète fonctionne encore à merveille même sur des volumes conséquents à mon échelle (45 users / tables avec > 5 Millions de lignes), avec des désavantages bien sur mais c'est pas le sujet, et je suis en mode TSE ce qui arrange aussi les choses vu que la base n'est pas client/Serveur.

    Très bonne idée d'automatiser le mappage TControl <-> DB avec LiveBinding - même si un peu lourd - afin d'éviter de dédoubler les TControls orientés données ou pas. (TEdit/TDBEdit, TCheckBox/TDBCheckbox etc...).

    MAIS car bien sur il y a un mais... ce mappage est très bien lorsque les données à mapper sont légères (comme les TControl pour un enregistrement unique style TEdit par exemple).

    Etant donné que j'ai choisi FMX, je suis bien obligé d'abandonner la TDBGrid pour la TStringGrid.
    Cela m'a vraiment intrigué. Bizarre ce changement car ce sont 2 composants très différents l'un de l'autre dans la philosophie.
    Un contient des données, l'autre non. Et cela est confirmé, c'est un peu la catastrophe à moins que vous m'éclairiez (et j'en ai besoin) !

    D'un coté, avec mon vieux D2007/BDE/TDBGrid, j'affiche instantanément 10000 lignes dans une TDBGrid, et je me positionne ou je veux instantanément, (bien que je suis conscient que seuls les datas réellement affichées sont stockées et chargées dans cette zone tampons pour affichage au fur et à mesure par une mécanique de 'paging')

    De l'autre... Le LiveBinding sur la TStringGrid... très lente (forcément car chargement des 10000 lignes dans la grille!), ca pompe de la mémoire, ca pompe sur le CPU. (bien qu'objectivement assez rapide pour le boulot que ca fait mais c'est pas le bon boulot!).
    Pas de paging prévu ? c'est pourtant plus qu'à la mode avec les mobiles et les défilements d'informations (java/android est blindé de callback dans ce but)!

    Et je ne parle pas du fetching par bloc, ce n'est pas la même chose. Car l'accès aux données d'une requête en FetchAll est rapide elle, donc ça ne résoudra rien, j'ai essayé.

    De plus j'ai bien remarqué qu'il faut abandonner le TFDTable pour un TFDQuery sinon les perfs sont en chutes libres, ca m'arrange pas car il était très pratique de créer les Fields manuellement dans le composant Table afin d'optimiser l'accès plutôt que par un FieldByName qui effectue une recherche dans les champs (enfin ca, c'est peut être optimisé j'ai pas vérifié).

    A moins d'avoir loupé une étape, et je l'espère car je suis un peu désespéré, est-ce qu'une solution existe pour afficher une grille de 10000 lignes venant d'une table de manière instantanée (car seule une 50 lignes maxi sont en général visibles en même temps sur l'écran) dans une grille sous FMX ???

    Quelle régression si ce n'est pas le cas... ou alors il faut qu'il y ait une vraie raison technique pour ne pas l'avoir fait, laquelle ?

    J'ai pas mal cherché, j'avais un petit espoir avec TMS, mais non, leur Grid repose sur le même système.

    Merci pour vos commentaires
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  2. #2
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Tu as regardé du côté de TFDMemTable pour gérer en tampon tes 10000 lignes avant de les envoyer dans ton TStringGrid.

  3. #3
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    +1 pour ALWEBER

    je ne connais pas bien FMX mais je m'orienterai également vers TFDMemTable qui permettra de rapatrier les données dans une table mémoire. (Et pourquoi pas utiliser le mode déconnecté....)

    Citation Envoyé par TicTacToe Voir le message
    De plus j'ai bien remarqué qu'il faut abandonner le TFDTable pour un TFDQuery sinon les perfs sont en chutes libres, ca m'arrange pas car il était très pratique de créer les Fields manuellement dans le composant Table afin d'optimiser l'accès plutôt que par un FieldByName qui effectue une recherche dans les champs (enfin ca, c'est peut être optimisé j'ai pas vérifié).
    Après avoir défini la requête dans le FDQuery clic droit puis "Editeur de champs" puis dans la petite fenêtre qui s'ouvre CTRL+A pour ajouter des champs ou CTRL+N pour créé un champ (calculé par exemple).
    Les champs créés par CTRL+A auront un nom de type FDQueryNomChamp.

  4. #4
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Merci pour vos réponses

    Barbibulle, oui merci pour les fields dans les FDQuery, j'ai été un peu vite

    Par contre pour TFDMemTable, je vais toujours essayer mais sans conviction puisque ce qui prend du temps c'est visiblement la recopie des données dans la StringGrid via le LiveBinding.
    Faire intervenir une FDMemTable, c'est ajouter un élément intermédiaire entre le FDQuery et la TStringList, mais sait-on jamais... et puis ca va pomper encore un peu plus de mémoire aussi j'imagine
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  5. #5
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par TicTacToe Voir le message
    Par contre pour TFDMemTable, je vais toujours essayer mais sans conviction puisque ce qui prend du temps c'est visiblement la recopie des données dans la StringGrid via le LiveBinding.
    Faire intervenir une FDMemTable, c'est ajouter un élément intermédiaire entre le FDQuery et la TStringList, mais sait-on jamais... et puis ca va pomper encore un peu plus de mémoire aussi j'imagine
    Heu oui à y réfléchir a mon avis ça ne servira à rien.

    Il y a déjà dans le TFDQuery une mise en cache similaire à TFDMemTable. Donc le test avec le FetchAll a permet de tout récupérer.

    C'est quelle version de Delphi ?

    Moi j'ai souvenir d'avoir testé les FMX il y a pas mal de temps et j'avais constaté que l'interface était moins véloce que du VCL mais bon je n'ai peut être pas les bonnes pratiques...

    Et pour commencer voir pour ne pas rapatrier les 10 000 lignes...

    Je regarderai dans les options FetchOptions du composant TFDQuery voir s'il y a moyen de récupérer de manière paginé ou du moins par bloc piloté par la stringgrig/livebinding...

  6. #6
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Peut etre en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDQuery.FetchOptions.AutoFetchAll = afDisable;
    et en laissant le mode en fmOnDemand

  7. #7
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Citation Envoyé par Barbibulle Voir le message
    Peut etre en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FDQuery.FetchOptions.AutoFetchAll = afDisable;
    et en laissant le mode en fmOnDemand
    Nos messages se sont croisés.

    Et oui c'est écrit en gros et gras XE8 !

  8. #8
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    oui pour les FDMemTable je vais quand même tenter ne serait-ce que pour apprendre à les utiliser, car cela manquait vraiment sous le BDE en D2007.

    Pour la version de Delphi c'est dans le sujet

    Pour les options Fetch, c'est ce que j'ai tenté en 1er (voir dans mon sujet de départ) en essayant de paginer moi même de manière grossière.

    Mais je n'ai pas trouvé cela satisfaisant au niveau vitesse, et de plus si je souhaite me positionner directement sur l'avant dernière ligne (au hasard ),
    il faut faire autant de fetch que nécessaire (et au final, 10 fetch de 1000 lignes est finalement bien plus lent qu'un seul optimisé de 10000).
    Le rendu final est assez médiocre coté utilisateur, temps d'attente désagréable par a-coup.

    Alors peut-être qu'en creusant il serait possible de le faire, mais c'est un effort considérable alors qu'il y a tant d'outils performant dans ces nouvelles moutures.
    Ce serait dommage de ré-inventer la roue!

    Si cela n'est pas possible (d'avoir l'équivalent d'une mécanique DBGrid), cela m’intéresse aussi de le savoir, je ré-orienterai ma stratégie de dév...
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  9. #9
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par TicTacToe Voir le message
    oui pour les FDMemTable je vais quand même tenter ne serait-ce que pour apprendre à les utiliser, car cela manquait vraiment sous le BDE en D2007.
    .
    Je vais essayer de retravailler un des exemples que j'utilise pour mes cours.

  10. #10
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Voilà un petit exemple
    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
     
    ...
    type
      TForm2 = class(TForm)
        FDMemTable1: TFDMemTable;
        BindSourceDB1: TBindSourceDB;
        BindingsList1: TBindingsList;
        StringGrid1: TStringGrid;
        LinkGridToDataSourceBindSourceDB1: TLinkGridToDataSource;
        procedure FormCreate(Sender: TObject);
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.fmx}
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i1: integer;
      st1: string;
    begin
      BindSourceDB1.Dataset := nil ;
      st1 := 'ABCDEFABCDEFABCDEFABCDEFABC';
      with FDMemTable1 do
      begin
        FieldDefs.Add('ID', ftInteger);
        FieldDefs.Add('Code', ftString, 10);
        FieldDefs.Add('Name', ftString, 50);
        CreateDataSet;
        with Indexes.Add do
        begin
          Name := 'ID';
          Fields := 'ID';
          Options := [soPrimary] ;
          Active := True;
        end;
      end;
      for i1 := 1 to 100000 do
      begin
        FDMemTable1.Append;
        FDMemTable1.Fields[0].AsInteger := i1;;
        FDMemTable1.Fields[1].AsString := 'N' + i1.ToString;
        FDMemTable1.Fields[2].AsString := st1;
        FDMemTable1.Post ;
      end;
      FDMemTable1.IndexName := 'ID' ;
      FDMemTable1.IndexesActive := true ;
      FDMemTable1.SetRange([1], [100]);
      BindSourceDB1.Dataset := FDMemTable1 ;
    end;
     
    end.
    Après en jouant sur le SetRange il y a de quoi avoir une bonne réactivité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      BindSourceDB1.Dataset := nil ;
      FDMemTable1.SetRange([100], [200]);
      BindSourceDB1.Dataset := FDMemTable1 ;

  11. #11
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    @Paul
    Merci pour tes observations.

    Alors j'étais sur qu'à un moment donné on allait me dire "charge moins de lignes"... Mais non ce n'est pas le sujet et je ne souhaite pas polémiquer autour de cela.
    et c'est vraiment ce que je souhaite pour essayer de recréer un nouveau noyau qui est basé sur un affichage qui peut comporter beaucoup de lignes puis de cibler ce qui nous
    intéresse, soit en se positionnant dessus, soit en filtrant (via index,filter etc...). Et pas l'inverse en filtrant de manière drastique dès le départ sans avoir une vue globale et de navigation libre.

    et même en descendant à 5000 lignes avec peu de colonnes, je suis a 3.2sec de chargement (pour donner une idée). En partant du principe de diminuer le nombre de lignes je n'arriverai pas à mes fins. Un affichage réactif doit descendre en dessous de la demi seconde (donc 780 lignes maxi et pour peu que j'augmente le nombre de colonnes - probable! - il faudrait encore que je descende)
    -> non, quelque part ce n'est pas à moi d'adapter un "bon" nombre de lignes alors qu'il y avait des solutions existantes et qui n'ont pas été reprises. Même si LB par d'un (très) bon sentiment.

    (mais bon là j'ai déjà commencé à polémiquer désolé)

    Donc pour revenir au sujet, LB et StringGrid.

    StringGrid ne sait pas qu'il est piloté par LB, donc je concois que ce n'est pas du coté StringGrid qu'il peut y avoir une amélioration. (Bien qu'il pourrait y avoir une information générique au niveau TControl de liaison avec LB tant LB devient omniprésent...)

    Cependant nous avons cet ensemble d'informations:
    - il y a un élément TBindSource -> a connaissance de la table de départ
    - il y a un élément TLingGridToDataSource -> typé, concu pour relier un StringGrid et un TBindSource (ou autre Datasource) -> il a connaissance de ces éléments
    - Le TStringGrid a tout un tas d'évènements utiles (onCellSelect, onVScrollChange... ) qui peuvent être interceptés par le LB une fois initialisé !

    Avec tous ces éléments, il me semble parfaitement réalisable d'établir un paging ou "Lady loading" pour reprendre tes termes. De plus les éléments déjà chargés le reste et sert de cache.
    (Tant pis pour la RAM au point ou on en est).

    voila, je ne sais pas si les prochaines versions essaierons de résoudre ce type de problème qui est à mon sens une régression dans l'affichage de données DB, même s'il LB est très puissant et apporte énormément de chose pour nous simplifier la vie, et qu'il évite également de l'écriture de composants similaires (TDBEdit/TEdit).

    @Alweber
    Mais on reste dans le principe de diminution du nombre de lignes. Très peu de colonnes. et avec un SetRange de 100 lignes, heureusement qu'il y a de la réactivité en copie
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  12. #12
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Alors j'ai trouvé une solution qui est capable d'afficher instantanément dans une TStringGrid une table d'autant de milliers de lignes qu'on souhaite

    Cette méthode initialise la grille, en nombre de colonnes et de lignes souhaitées. C'est instantané même pour des milliers de lignes

    Initialisation de la grille:
    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 TFrTest.ButtonInitGrilleClick(Sender: TObject);
    var
       i: Integer;
       Column: TStringColumn;
    begin
         chronodebut;
         StringGrid1.BeginUpdate;
         for i := 0 to FDTable.FieldCount - 1 do
           begin
           Column := TStringColumn.Create( Self );
           Column.Header := FDTable.Fields.Fields[ i ].FieldName;
           Column.Parent := StringGrid1;
           end;
         StringGrid1.RowCount := FDTable.RecordCount;
         StringGrid1.EndUpdate;
         chronofin;
    end;
    Chargement des lignes visibles si non déjà chargées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFrTest.VScrollChange(Sender: TObject);
    var
       i, j: Integer;
    begin
         for i := StringGrid1.TopRow to StringGrid1.BottomRow do
           if StringGrid1.Cells[ 0, i ] = '' then
             if FDTable.FindKey( [ i ] ) then
               for j := 0 to FDTable.FieldCount - 1 do
                 StringGrid1.Cells[ j, i ] := FDTable.Fields[ j ].AsString;
    end;
    Alors tout est en dur, et ma 1ere colonne est une clef qui concorde avec ma clef DB. Il faudrait se positionner sur la table avec RecNo (si ca existe toujours).
    De plus, VScrollChange n'est pas forcément l'évènement adéquoit, il faut que je creuse.

    Mais dans le principe, cela fonctionne parfaitement et présente à l'utilisateur une table avec toutes les lignes. Le chargement des lignes non déjà chargées est bien sur quasi instantanés car il ne peut y en avoir au maximum que celle qui sont visibles (donc pas beaucoup).

    Ce système ne passe pas par LB, donc il faut gérer l'autre sens (modification de la grille -> modification des datas) le cas échéant. Mais dans mon cas je le fait rarement à ce niveau.

    Voila... si ça peut en dépanner certains qui sont dans le même cas que moi !
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  13. #13
    Membre éprouvé
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Par défaut
    Suite et fin

    La solution ci-dessus est réalisable mais il faut quand même ré-inventer la roue (synchroniser le curseur table et grille, gérer les calc, les formattages etc...... et je suis sur d'en découvrir au fur-et-à mesure). C'est très enrichissant de ré-inventer la roue mais parfois un peu contre-productif.

    TMS l'a déjà fait visiblement -> TMSFMXLiveGrid
    Que l'on peut faire fonctionner avec LB et qui semble ne charger QUE ce qui est visible (en parcourant la grille, la RAM ne monte pas donc cela doit recharger à chaque fois mais c'est mieux que charger l'ensemble déjà).

    100 000 lignes affichées instantanément!

    Dommage qu'il faille faire appel à un composant tiers (et payant)...

    Allez, ce sera pour Delphi X11
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  14. #14
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par TicTacToe Voir le message
    Suite et fin

    La solution ci-dessus est réalisable mais il faut quand même ré-inventer la roue (synchroniser le curseur table et grille, gérer les calc, les formattages etc...... et je suis sur d'en découvrir au fur-et-à mesure). C'est très enrichissant de ré-inventer la roue mais parfois un peu contre-productif.

    TMS l'a déjà fait visiblement -> TMSFMXLiveGrid
    Que l'on peut faire fonctionner avec LB et qui semble ne charger QUE ce qui est visible (en parcourant la grille, la RAM ne monte pas donc cela doit recharger à chaque fois mais c'est mieux que charger l'ensemble déjà).

    100 000 lignes affichées instantanément!

    Dommage qu'il faille faire appel à un composant tiers (et payant)...

    Allez, ce sera pour Delphi X11
    hum...je serais curieux de savoir comment il font ça

    j'ai tenté de le faire, mais IBindListEditor est particulièrement pauvre comme interface, elle propose une méthode FillList() avec un paramètre IScopeRecordEnumerator qui ne donne pas accès au DataSet mais unique à la liste des record...c'est cette méthode qui rempli les ListView par exemple.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [XE8] découverte, problème avec firedac
    Par frantzgac dans le forum EDI
    Réponses: 8
    Dernier message: 06/07/2015, 14h30
  2. [XE5] Problème de lecture de blob MySQL avec FireDAC
    Par Achillée dans le forum Bases de données
    Réponses: 0
    Dernier message: 17/03/2015, 13h19
  3. [Lazarus] TStringGrid avec propriétés modifiées
    Par larsal007 dans le forum Lazarus
    Réponses: 2
    Dernier message: 09/04/2013, 09h35
  4. Trier un TStringGrid avec des chiffres
    Par ddubois dans le forum Langage
    Réponses: 16
    Dernier message: 16/06/2008, 19h04
  5. [Lazarus] Tdbgrid update SQL avec Mysql5
    Par panjas51 dans le forum Lazarus
    Réponses: 5
    Dernier message: 09/02/2008, 12h55

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