Merci thewolf... En procédant comme vous l'indiquez, la DLL est bien trouvée. Mais le message d'erreur suivant apparaît : "TMySql50C connection can not work with the installed MySql client version: Expected (5.0), got (5.7.14)...
Merci thewolf... En procédant comme vous l'indiquez, la DLL est bien trouvée. Mais le message d'erreur suivant apparaît : "TMySql50C connection can not work with the installed MySql client version: Expected (5.0), got (5.7.14)...
J'ai aussi la 5.7.14 et d'après le tutoriel, il faudrait utiliser le connecteur correspondant c'est-à-dire estampillé 57.
Or, dans Lazarus 1.6.4 que j'utilise, cela s'arrête au 56. Je n'ai pas essayé de l'utiliser.
J'ai donc installé la version 1.8 qui elle contient un connecteur "57".
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Il existe un patch pour Lazarus 1.6.4 : http://www.bononiadocta.it/Lazarus/Sqldb.tar.bz2.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Merci. J'ai réussi à l'installer et magie, TMySQL57Connection est apparu dans l'onglet Sqldb.
Donc petit essai de connexion à la base location et là, l'erreur "Can not load default MySql library ("libmysql.dll" or"libmysql.dll") Check your installation" que je pensais avoir résolue en copiant libmysql.dll dans les deux sous-répertoires réapparaît.
Donc en résumé :
Windows 10 64 bits + Wamp 64 bits
Lazarus 1.6.4 32 bits : problème
Lazarus 1.8 64 bits : OK
Dans l'exemple 1, il faudrait ajouter "Dans l'inspecteur d'objets, renommez la fiche principale (Form1 par défaut) en MainForm." comme c'est le cas dans l'exemple 2.
Dans III-A :
Pour suivre ce tutoriel, j'utilise localhost mais à quoi correspond exactement "192.168.0.1", je suppose que c'est si la base est sur un site distant. Cela m'intéresserait d'en savoir un peu plus, au cas où ...HostName
192.168.0.1 (dans ma configuration) ou localhost (si votre serveur MySQL tourne sur votre machine)
IV-A : il faut ajouter l'unité db à la clause uses sinon EDatabaseError n'est pas reconnu.
IV-C : tel que le code est proposé, à l'ouverture du programme, le dbgrid affiche la liste des tables (ce qui est logique puisque c'est la requête sql en cours et que l'événement lbTablesSelectionChange n'est pas encore déclenché).
Pour contourner ce problème, j'ai ajouté la ligne suivante à la fin de la procédure ShowTables :
procedure lbTablesSelectionChange : je pense que la commande "DBGrid1.Clear;" n'est pas utile, je me trompe ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part if SQLQuery1.RecordCount > 0 then lbTables.ItemIndex:= 0;
Telle que la procédure est proposée, j'ai un comportement bizarre : quand je change de table, le grid affiche une première colonne vierge en plus de la table demandée.
Ce n'est pas le cas en inversant les deux premières commandes (close en premier puis clear) ! ou en supprimant le clear.
IV-D : en jouant avec le TDBNavigator, l'utilisation du dernier bouton (refresh) déclenche l'exception
"Must apply updates before refreshing data."
procedure CommitChanges : manque la double apostrophe à "d'enregistrement"
Est-il possible d'avoir un peu plus d'explications sur le fonctionnement des 3 contrôles nécessaires à la connexion du programme à la base de données (j'ai l'habitude d'utiliser sqlite avec un seul composant : TSqlite3Dataset et c'est bien plus simple). D'où notamment ici :
- "if SQLTransaction1.Active" : pourquoi vérifier la transaction et pas la connexion ?
- "SQLQuery1.ApplyUpdates;" : je suppose que cela applique les changements ... mais à quoi ?
- "SQLTransaction1.Commit;" : du coup, que fait cette commande ?
Bon, me voila arrivé au bout de l'exemple 2, encore merci pour cet excellent tutoriel. Reste à travailler sur l'application complète !
Voilà le genre de remarques qui vont permettre d'améliorer ou corriger le tutoriel.
Bonne idée, c'est fait.
Mon réseau local fonctionne (comme 90% des réseaux domestiques, sans doute) dans la plage d'adresses 192.168.0. Mon serveur Apache/MySQL a comme IP fixe 192.168.0.1 et distribue à mon PC de travail (et à tous les PC connectés, d'ailleurs) une adresse 192.168.0.xxx. Tu peux éventuellement simuler un réseau local et monter un serveur sur une machine virtuelle.
En effet ! C'est fait.
C'est extrêmement fugace et la solution de contournement n'y change rien, en fait (sans vouloir te froisser). La solution est de lier le DBGrid au DataSource après l'appel à ShowTables. Mais la remarque est bonne et mérite que j'ajoute un petit encadré.
On dirait bien, en effet. Je l'ai retirée.
Je n'observe personnellement pas cette colonne supplémentaire. Toutefois, ayant enlevé le clear, je suppose que le souci n'en est plus un pour toi ?
Mince, c'est vrai, le refresh nécessite que la méthode ApplyUpdates du SQLQuery ait été exécutée. Comme ce bouton n'a pas de fonction dans l'exemple, il peut être supprimé dans les propriétés du DBNavigator. Je modifie le chapitre en conséquence.
Bien vu ! C'est corrigé (et c'était correct dans le code complet à la fin du chapitre).
Sur le wiki, il y a un diagramme expliquant la hiérarchie et les liens entre les différents composants : http://wiki.freepascal.org/SQLdb_Pro...re_des_classes.
- "if SQLTransaction1.Active" : ce test évite de déclencher une exception "Operation cannot be performed on an inactive dataset".
- "SQLQuery1.ApplyUpdates" : le SQLQuery mémorise tous les changements dans son dataset interne ; exécuter ApplyUpdates permet d'envoyer les modifications vers le serveur.
- "SQLTransaction1.Commit" : par défaut, MySQL travaille en mode autocommit, c'est-à-dire que toute requête entraîne des modifications directes dans la base de données. Mais pas avec les composants SQLdb, qui utilisent des transactions. C'est en quelque sorte le composant TSQLTransaction qui décide si les modifications doivent être appliquées (commit), annulées (rollback), etc.
Un petit saut vers la FAQ MySQL pourrait peut-être t'éclairer mieux que moi ?
Je te remercie en tout cas pour toutes tes remarques. Je t'ai d'ailleurs rajouté à la liste des relecteurs techniques du tutoriel.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Bonjour.
Cela n'a rien de fugace, l'affichage est permanent jusqu'à je que je clique sur une des tables dans le listbox. Lier le DBGrid au DataSource après l'appel à ShowTables n'y change rien comme je m'y attendais (à part l'affichage "fugace" de la liste des tables, que je ne remarque pas, ma machine étant rapide).C'est extrêmement fugace et la solution de contournement n'y change rien, en fait (sans vouloir te froisser). La solution est de lier le DBGrid au DataSource après l'appel à ShowTables. Mais la remarque est bonne et mérite que j'ajoute un petit encadré.
C'est normal car, quand on remplit par code un listbox, aucune entrée n'est sélectionnée donc l'événement lbTablesSelectionChange n'est pas déclenché ... or c'est dans cet événement que la requête est mise à jour !
Je crois que tu es sous Linux et peut-être que le comportement de TListbox est différent ?
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Effectivement, sous Windows il n'y a pas de sélection automatique du premier élément, donc j'ai modifié le code source comme tu le proposais.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Bizarre et dommage d'avoir un comportement différent suivant le système d'exploitation. Cela ne va pas dans le sens de Lazarus (Write once, compile anywhere) !
Donc si j'ai bien compris, sous Linux l'événement onSelectionChange est déclenché à chaque ajout d'un item dans le listbox. Ce qui rend indispensable le déplacement de l'affectation au grid de son datasource. Sinon, chaque table est chargée à tour de rôle ce qui serait gênant pour des tables de grande taille !
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
je ne comprends pas : qu'est-ce qui le déclenche ?
Je n'ai pas de réponse, même après avoir tracé l'événement et scruté le code source du composant. La différence est peut-être tout simplement à chercher entre GDI et GTK ?
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Bonjour.
A quoi cela sert-il de définir ainsi les champs, cela a été fait lors de la création de la table et le query va donc récupérer ces informations ... D'ailleurs, que se passerait-il si on fait une erreur et introduit une incohérence (ordre différent, nom mal orthographié, erreur de type, mauvaise taille) ?Tant que nous sommes dans l'inspecteur d'objets, nous allons définir les différents champs de la table Voitures dans les propriétés de SQLQueryVoitures. Repérez la propriété FieldDefs et ...
Pour l'anecdote, ayant cliqué par mégarde sur le champ "DataField" d'un contrôle alors que son datasource était renseigné, j'ai effectivement été bloqué et ai eu le message comme quoi c'était impossible de récupérer les champs ... mais cela a aussi effacé tout ce que j'avais saisi dans le query !
Du coup, n'ayant pas le courage de recommencer, j'ai continué sans et cela fonctionne parfaitement ainsi !
V-C-1. TDBGrid
Width + MaxWidth
pas de MaxWidth chez moi mais un MaxSize ! Je suppose que c'est équivalent ?
V-C-5
Pourquoi créer une "property Enregistre" avec FEnregistre, la procedure SetEnregistre ?
J'aurais tout simplement déclaré une variable globale au début de la partie implementation.
J'en profite pour cette question : quelle est la différence entre "strict private" et "private" ?
La définition des champs peut enlever toute ambiguïté par rapport aux types utilisés dans la base de données. Il est vrai qu'avec les types basiques utilisés dans l'exemple, on pourrait franchement s'en passer et laisser le dataset récupérer automatiquement les définitions de champs dans la base de données. En cas d'erreur de nom de champ, celui-ci est tout simplement ignoré. Par curiosité, on pourrait expérimenter le mélange des champs (je ne suis pas sûr que cela ait une incidence), des erreurs de taille...
Pour que Lazarus puisse aller récupérer les champs dans la base de données, il faudrait que la connexion soit active au moment de la conception, ce qui impliquerait de temporairement assigner les propriétés HostName, DatabaseName, UserName et Password.
Non, c'est bien MaxSize. Je corrige.
Le principe d'une variable globale me semble sortir de la philosophie du tout-objet ?
Comme l'explique Gilles Vasseur dans son tutoriel sur les principes fondamentaux de la POO :
- strict private : l'élément n'est visible que par un élément de la même classe dans l'unité de la déclaration ;
- private : l'élément n'est visible que par un élément présent dans l'unité de la déclaration.
Règles du forum
Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
Mes tutoriels et sources Pascal
Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager