Saisie automatique dans un Champ dbmémo à pd'une dblookuplistbox

Résolu
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012 - 21 mars 2008 à 05:48
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 31 mars 2008 à 20:47
Bonjours à tous de AEC1.
Si quelqu'un à une petite minute pour jeter un coup d'oeil sur mon petit souci qui me fait tourné en bourique, je l'en remercie par avance.
Dans une application base de données Delphi.
Pour mettre une ligne d'une dblookuplistbox dans un dbmemo je sais faire, mais chaque ligne que je met écrase celle déjà dans le dbmémo, alors que je souhaiterais qu'elle si ajoute à la suite afin de composer un texte diront-nous semi-automatique qui correspond à des explications types dans un context précis des autres données d'un enregistrement.
Egalement le copié / collé d'un dbmémo à un autre serais bien que cela soit possible.
Merci d'avance à tous.

21 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 mars 2008 à 19:53
Oui, c'est normal, la propriété lines n'existe pas pour le dbedit..
Tout dépend de ce que tu veux faire exactement, bien sûr.
ex: sur le double-clic tu peux faire ceci :

procedure TForm1.DBLookupListBox1DblClick(Sender: TObject);
begin
MonQuery.Append;
DBEdit1.text := DBLookupListBox1.SelectedItem;
MonQuery.Post;

ainsi sur chaque double-clic, tu remplis la table liée au DBEdit.
(attention au doublon toutefois..)

ou faire une édition
MonQuery.Edit;
DBEdit1.text := DBLookupListBox1.SelectedItem;
MonQuery.Post;
mais dans ce cas, il faut s'assurer d'être sur le bon enregistrement...
->>> nécessiter de faire une liaison quelque part ou de lancer un Locate.

merci de cliquer "réponse acceptée" si çà te convient

@+
cantador
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
27 mars 2008 à 05:52
Merci cantador
Effectivement c'est tout simple et je suis passé à côté sachant que j'utilise les "edit" depuis longtemps comme tout le monde.
Merci encore de ta patience et encore merci à tous ceux qui font que ce site soit conviviale pour des passionnés autodidactes et non professionnels.
A très bientôt le plaisir et peut-être je pourrais déposer  à mon tour  des prg  qui puissent interresés la communauté Delphi.
AEC1
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 mars 2008 à 14:09
"et je suis passé à côté sachant que j'utilise les "edit" depuis longtemps comme tout le monde."

On en est tous là..
Il faut revenir aux sources et çà fait du bien..

et NE PAS OUBLIER DE CLIQUER sinon
cantador va se mettre en colère !

cantador
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
27 mars 2008 à 17:18
Bonjours cantador
Excuse-moi pour le clique oublié.
Je promet de ne plus le refaire hi hi  ....
Ne te met pas en colère, ce serais dommage et puis j'aurais surement encore besoin de tes services. En tous cas tu m'as quand même beaucoup aidé et je t'en remercie.
A une chose encore, le dbedit fonctionne très bien déjà quand on utilise les paramètres de ce composant sauf que tu as fais la même chose avec du code.
Cela dit, je souhaité seulement pouvoir ajouter autant de lignes mise bout à bout venant de la dblookuplist dans un dbedit. Bien sur sans dépassé le maximum du nombre de caractères dans celui-ci que j'aurais déffini par avance dans mon fichier.
Merci et à bientôt.
AEC1
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 mars 2008 à 19:54
non non rassure toi, c'était une boutade..
Je me mets rarement en colère..Enfin de temps en temps je hausse un peu le ton car il y en a qui dépasse les bornes..
Je n'ai pas pu te donner la paramétrage pour faire apparaître le LOOKUP
mais c'est simple avec la listsource, le keyfields et la ListFields.

Cela dit, je souhaité seulement pouvoir ajouter autant de lignes mise bout à bout venant de la dblookuplist dans un dbedit. Bien sur sans dépassé le maximum du nombre de caractères dans celui-ci que j'aurais déffini par avance dans mon fichier.

De toute façon si c'est un champ de table ton texte sera tronqué à la longueur déclarée.

Pour mettre des lignes bout à bout (tu nous fais un pullover..)
Tu peux passer par une variable intermédiaire :
var
conca : string;
begin
conca := conca + TaChaine;
.....

mais avant d'aller plus loin, il me faut plus d'explications :

combien as-tu de champs (TDBEdit) à éditer :
un seul ou plusieurs ?
et si c'est un seul, est ce tjrs le même champ ?

@+

cantador
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
28 mars 2008 à 05:43
Bonjours cantador
Efectivement je n'ai qu'un champ dbedit. Plutôt que de passer par le composant lui-même, par ses paramètres, je pensais que par un code au niveau de la dblookuplist je pouvais choisir en double clique dans cette liste autant de lignes que je souhaite et qui se mettent bout à bout dans le champ dbedit. Bien sur se sont des messages très cours et qui sont sensés tenir dans la dimension du dbedit prévu au départ.
Pour l'instant, quand je clique dans la list j'écrase le choix précédent au lieu de l'ajouter.
Cela n'est peut être pas possible, alors je m'orienterais vers un autre dbmemo si je ne puis faire autrement. Mais je trouvais cela quand même sympa de le faire quand on à peut d'info pour composer une seule ligne d'info.
Merci à toi quand même, à un de ses moments.
AEC1
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
28 mars 2008 à 19:55
procedure TForm1.DBLookupListBox1DblClick(Sender: TObject);
var
conca : string;
begin
   conca := '';
    conca := DBEdit.text;  {on récupère ce qu'il y a dans le dbedit}
    conca := Conca + DBLookupListBox1.SelectedItem;
    MonQuery.edit;
    DBEdit.text := Conca;    // On écrase la nouvelle valeur
    MonQuery.Post;
end;

çà devrait marcher..

cantador
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
30 mars 2008 à 07:56
Bonjours Cantador
Merci pour ton aide, Cela devrais pouvoir fonctionné dans le contexte de l'application que je réalise. A bientôt .
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
30 mars 2008 à 09:00
Re salut Cantador
J'ai fait un essai et ton code fonctionne, mais il y à un mais, il fonctionne trop bien.
Quand je clique sur une ligne de la dblookuplist j'ai deux fois celle celle-ci mise bout à bout. Je me suis peut-être mal expliquer, je souhaitais remplir le dbedit d'une ligne de cette liste puis ensuite cliquer sur une autre ligne de cette même liste qui donc se serais ajouter à la première sans l'écrasé. Que je puisse le faire autant de fois que le permet la longueur du champ du dbedit.
AEC1
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
30 mars 2008 à 13:37
Quand je clique sur une ligne de la dblookuplist j'ai deux fois celle celle-ci mise bout à bout.



J'avais prévu un double-clic et non un clic par précaution..sinon çà devient ingérable..


Pour la manip, j'ai bien compris.
Donc deux conditions :

Eviter de faire rentrer deux fois la même chaîne.
Fixer la limite de la taille à la longueur du champ.

procedure TForm1.DBLookupListBox1DblClick(Sender: TObject);
var
conca : string;
begin
   conca := '';
    conca := DBEdit.text;  {on récupère ce qu'il y a dans le dbedit}
    if conca <> DBLookupListBox1.SelectedItem then
        conca := Conca + DBLookupListBox1.SelectedItem;
    MonQuery.edit;
    DBEdit.text := Conca;    // On écrase la nouvelle valeur
    MonQuery.Post;
end;

Essaie cette solution et vérifie que la chaîne se tronque toute seule sinon on ajoutera un truc en plus..

cantador
3
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
31 mars 2008 à 20:38
Bonjours Cantador
C'est bon, cela fonctionne très bien. Il faut seulement faire attention  quand  on  saisi dans le champ on clique une fois sur une première ligne de  la dblookuplistbox puis sur une seconde d'un choix différent et tout roule bien seulement comme le champ dbedit est relativement cours environ une quarantaine de caractères, il faut que chaqu'une de mes lignes pré-programmées dans la liste soit elles aussi plutôt courtes. De toutes façon, au troisième clique éventuel cette ligne sera tronquée automatiquement.
Merci encore pour ton aide précieuse, il ne manque qu'un peut d'imagination!...
Merci et Amitiés....
AEC1
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
31 mars 2008 à 20:47
il faut que tu cogites un peu ton truc et après tu pourras reprendre le débat..


@bientôt

cantador
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
21 mars 2008 à 19:09
DBMemo.Lines.Add('toto');
DBMemo.Lines.Add('tata');

cantador
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
23 mars 2008 à 06:57
Bonjours cantador de AEC1
Merci d'avoir répondu à ma petite requête.
Si je puis abusé encore c'est parce que je ne saisie pas bien la syntaxe entre
la dblookuplistbox et le DBmemo car effectivement ajouter des lignes dans le DBmemo est une chose, mais comment on peut en cliquant dans la dblookuplistbox sur la ligne qui t'intérresse ajouter cette ligne et pas une autre dans le DBmemo.Passe-tu pas une variable spécifique?
Merci à toi et à un de ces moment. Salutations.
AEC1
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
23 mars 2008 à 13:18
Non non c'est simple il faut utiliser un évènement du dblookuplistbox
soit le OnClick, le OnMouseDown et envoyer l'item de la liste directement dans le Memo.

cantador
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
24 mars 2008 à 07:58
bonjours cantador de AEC1
j'ai déjà utiliser les paramètres propres à la dblookuplistbox en tant que la source et la cible dans la liste des paramètres automatiques mais quand je clique dans la dblookuplistbox cela m'écrase à chaque fois le mémo déjà écrit. Donc si j'ai bien compris il me faut évité d'utiliser se système car quelque soit le code utilisé il ne sera jamais pris en compte car par défault il utilise le paramètrage direct de la lookuplistbox.
merci de me comfimer tous cela et merci encore pour ta patience.
AEC1
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
24 mars 2008 à 08:01
AEC1
Oui j'oublier, comment fait-tu pour que la selection faite dans la lookuplistbox soit la bonne à copier dans le dbmemo. A la place de ton toto ou tata, utilise-tu une variable.
salutations.
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 mars 2008 à 13:26
voilà :
la base est dbdemos.mdb, deux query, un dbLookupListBox et un Memo
(on peut facilement transposer pour un DBMemo en faisant une édition du champ)

J'ai choisi pour évènement le double-clic car il se prête bien..mais on peut aussi faire plein d'autres chose comme le drag an drop par exemple..

unit Unit1;


interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids, DBCtrls;


type
  TForm1 = class(TForm)
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    DataSource1: TDataSource;
    DBLookupListBox1: TDBLookupListBox;
    ADOQuery2: TADOQuery;
    DataSource2: TDataSource;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure DBLookupListBox1DblClick(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;


var
  Form1: TForm1;


implementation


{$R *.dfm}




procedure TForm1.FormCreate(Sender: TObject);
begin
  ADOQuery1.Open;
  ADOQuery2.Open;
end;


procedure TForm1.DBLookupListBox1DblClick(Sender: TObject);
begin
Memo1.Lines.Add(DBLookupListBox1.SelectedItem);
end;


end.

cantador
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
24 mars 2008 à 13:29
nb :
la table principale est Orders(adoquery1) et pour le lookup, j'ai pris customer(adoquery2)

cantador
0
AEC1 Messages postés 98 Date d'inscription mercredi 31 octobre 2007 Statut Membre Dernière intervention 24 décembre 2012
25 mars 2008 à 05:44
Bonjours cantador
Merci pour tes infos, je vais essayer cela et te tiens informé de ce que j'aurais fait.
Je comprend le problème et ses differentes pssibilités mais pour les appliquer cela est un peut plus floue. Merci du temps que tu m'as accordé et de m'avoir mis sur la voie.
A très bientôt le plaisir.
AEC1
0
Rejoignez-nous