begin process at 2010 02 10 10:07:16
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Divers

 > 

Débutant(e)

 > 

TEdit ou TCombobox à l'interieur d'un TMemo


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

TEdit ou TCombobox à l'interieur d'un TMemo

jeudi 22 janvier 2009 à 12:51:46 | TEdit ou TCombobox à l'interieur d'un TMemo

Oniria

Bonjour,

Je suis actuellement en train de me faire un logiciel de test de langue anglaise (Bulats). Parmis les épreuves du test, il y en a une où il faut compléter un texte avec des trous.

J'ai donc utilisé un TMemo pour afficher le texte à trou (contenu dans un fichier), à l'intérieur de ce mémo, là ou il y a un trou à remplir, j'ai placé un texte fixe  : XXXXXXXXX, pour repérer les trous dans le memo. Ensuite, je parcoure le MEMO à la recherche de ce texte et dès que je le trouve, j'essaie de placer soit un combobox, soit un TEdit , soit un TCombobox par dessus pour permettre au candidat de remplir ou de sélectionner un mot.
Sauf que je ne parvient pas à placer correctement mon TEdit (ou TCombobox) sur le TMemo.

Le programme que j'ai essayé de faire est dépendant de la police, et de l'ordinateur sur lequel il fonctionne (j'ai essayé sur plusieurs PC). Voici le bout de code qui me pose probléme :

FMain.P_Audio.Visible:=true;//
         FMain.P_Text_Choice.Visible:=true;
         FMain.B_AudioScript.Visible:=False;
         FMain.B_Ecoute_Audio2.Visible:=False;
         FMain.B_Ecoute_Audio1.Visible:=False;
         hc:=FMain.B_AudioScript.Canvas.TextHeight('O')+1; // B_Audioscript est un TImage dont la proprièté TFont est la même que celle du Memo
         //tc:=FMain.B_AudioScript.Canvas.TextWidth('OOOOOOOOOO'); // Comme le Memo n'a pas de TCanvas, j'ai essayé de faire comme ca
         tc:=10*10+4; // mais ce n'est pas concluant

        // les combos à placer au dessus des différents trous

         FMain.ComboBox1.Width:=tc;
         FMain.ComboBox2.Width:=tc;
         FMain.ComboBox3.Width:=tc;
         FMain.ComboBox4.Width:=tc;
         FMain.ComboBox5.Width:=tc;
        
         FMain.ComboBox1.Height:=hc-8;
         FMain.ComboBox2.Height:=hc-8;
         FMain.ComboBox3.Height:=hc-8;
         FMain.ComboBox4.Height:=hc-8;
         FMain.ComboBox5.Height:=hc-8;

         FMain.ComboBox1.Visible:=True;
         FMain.ComboBox2.Visible:=True;
         FMain.ComboBox3.Visible:=True;
         FMain.ComboBox4.Visible:=True;
         FMain.ComboBox5.Visible:=True;
        
         FMain.ComboBox1.ItemIndex:=-1;
         FMain.ComboBox2.ItemIndex:=-1;
         FMain.ComboBox3.ItemIndex:=-1;
         FMain.ComboBox4.ItemIndex:=-1;
         FMain.ComboBox5.ItemIndex:=-1;

         FMain.Edit1.Visible:=False;
         FMain.Edit2.Visible:=False;
         FMain.Edit3.Visible:=False;
         FMain.Edit4.Visible:=False;
         FMain.Edit5.Visible:=False;
         k:=1;
         for i:=0 to FMain.M_Text_choice.Lines.Count-1 do // Je parcoure toutes les lignes du Memo
           begin
             texte:=FMain.M_Text_choice.Lines.Strings[i];
             j:=pos('XXXXXXXXXX',texte);                       // à la recherche de la chaine XXXXXXX
             while j>0 do
               begin
                 texte1:=copy(texte,1,j-1);
                 delete(texte,1,j+9);
                 texte:=texte1+'OOOOOOOOOO'+texte; // Cette chaine, je la change en OOOOOOO de manière à pouvoir refaire une détection sur la même ligne
                 FMain.M_Text_choice.Lines.Strings[i]:=texte;
                 //j:=trunc(FMain.B_AudioScript.Canvas.TextWidth(texte1)*1.2);
                 j:=length(texte1)*10;
                 case k of    // en fonction du numéro du trou actuel, on place soit Combobox1 sur le trou 1, combobox 2 sur le trou 2 etc...
                   1 : begin
                         FMain.ComboBox1.Left:=j;
                         FMain.ComboBox1.Top:=i*hc+4;
                   end;
                   2 : begin
                         FMain.ComboBox2.Left:=j;
                         FMain.ComboBox2.Top:=i*hc+4;
                   end;
                   3 : begin
                         FMain.ComboBox3.Left:=j;
                         FMain.ComboBox3.Top:=i*hc+4;
                   end;
                   4 : begin
                         FMain.ComboBox4.Left:=j;
                         FMain.ComboBox4.Top:=i*hc+4;
                   end;
                   5 : begin
                         FMain.ComboBox5.Left:=j;
                         FMain.ComboBox5.Top:=i*hc+4;
                   end;
                 end;
                 k:=k+1;
                 j:=pos('XXXXXXXXXX',texte);
               end;
           end;
         FMain.ComboBox1.Color:=clWhite;
         FMain.ComboBox2.Color:=clWhite;
         FMain.ComboBox3.Color:=clWhite;
         FMain.ComboBox4.Color:=clWhite;
         FMain.ComboBox5.Color:=clWhite;     

Merci à ceux qui pouront me dire comment faire pour connaitre la position en pixel d'un texte dans un TMemo

Oniria
jeudi 22 janvier 2009 à 14:33:53 | Re : TEdit ou TCombobox à l'interieur d'un TMemo

Caribensila

Membre Club

Salut Oniria,

«Comme le Memo n'a pas de TCanvas»
Il suffit de lui en assigner un.
Note que la méthode est valable pour tous les compos qui n'ont pas de Canvas!..

Il me semble qu'avec cet exemple tu devrais t'en tirer:

procedure TForm1.Button1Click(Sender: TObject);
  var
              DC    : HDC;
              Fonte: HFONT;
  begin
  DC := GetDC(Memo1.Handle); //Un Device Context pour le Memo
  SetBkMode(DC, TRANSPARENT); //Background remains untouched
  Fonte := CreateFont(
                      0, // logical height of font
                      0, // logical average character width
                      0, // angle of escapement
                      0, // base-line orientation angle
                      FW_NORMAL, // font weight
                      0, // italic attribute flag
                      0, // underline attribute flag
                      0, // strikeout attribute flag
                      DEFAULT_CHARSET, // character set identifier
                      0, // output precision
                      CLIP_DEFAULT_PRECIS, // clipping precision
                      DEFAULT_QUALITY, // output quality
                      DEFAULT_PITCH or FF_DONTCARE, // pitch and family
                      PChar('Arial') // pointer to typeface name string
                      );
  SelectObject(DC, Fonte);
  TextOut(DC, 10, 20, PChar('Mon texte...'), Length('Mon texte...'));

  DeleteObject(Fonte);
  ReleaseDC(Memo1.Handle, DC);
end

jeudi 22 janvier 2009 à 14:47:45 | Re : TEdit ou TCombobox à l'interieur d'un TMemo

Oniria

Bonjour,

Merci pour la réponse.

Ce que je cherche à faire c'est dimentionner un TEdit avec la taille de la chaine 'XXXXXXX' en pixel et de le placer au dessus de cette chaine.
Le but est de cacher cette chaine de référence. Pour placer mon TEdit, j'utilise la propriété Left et Top du composant.
Ce que je n'arrive pas à faire c'est de convertir une position en X caractére et Y ligne du TMemo vers des pixels qui me permettront de placer mon TEdit dessus. De plus, ma méthode pour connaitre la taille de la chaine XXXXXXXXX en pixel n'est pas élégante et ne fonctionne pas bien non plus.

Ta méthode, je la place précieusement de coté car je vois d'autre utilisation sympa avec mais elle ne répond pas à mon probléme.

Merci encore.

Oniria
jeudi 22 janvier 2009 à 17:44:49 | Re : TEdit ou TCombobox à l'interieur d'un TMemo

Francky23012301

Membre Club
Mais non Cari a raison car ce dernier admet les propriétés TextWidth et TextHeight qui te renvoyent la largueur et la hauteur d'un string en pixel .

Par contre tu devrais revoir ton code : il y a de l'optimisation à faire


Cette discussion est classée dans : texte, visible, false, fmain, hc


Répondre à ce message

Sujets en rapport avec ce message

simplification du code [ par dk ] voila je sais que parfois on peut fortement simplifier son code grace par exemple a la propriete (sender as T...)mais par exemple si g ,lors d'un clik Petit problème avec showmodal [ par Youyou0214 ] Salut tout le monde,j'ai un problème avec showmodal, quand je suis dans une form je veux passer à une autre et faire disparaître celle dans laquelle j pb avec la recherce d'une donnée dans une base oracle [ par anilane ] je travaille avec delphi 7 et oracle 9i  voila j'ai une fentre d'acces cad qu'il faux introduire le mot de pass et le nom de l'utilisateur je veux eff conseil pour compléter le nom d'une variable par calcul [ par xzenou ] Coucou bon ben pour mon premier message j'ai quelque conseils à vous demandez. procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;   Shift: passage du nom d'objet sur une fonction [ par Dreus ] Hello la foule, j'aimerai simplifier le bout de code ce-dessous par une fonction, je pensais passer en paramètre le nom de l'image exemple "Ouvertur image [ par smail002 ] salut tous ya til un petie code source pour se proget j ai trau d image dan mon proget il ya tout model mobile nokia stp donne moi tou simple c supprimer une ligne dans un fichier texte [ par grod0026 ] bonsoir voila j essaye de supprimer une ligne dans un fichier texte, Donc j'ouvre mon fichier original et le temporaire. si l'enregistrement est égal Récupérer le contenu (texte) depuis une adresse internet http://www.etc.... [ par Goofyjp ] Bonjour, Je suis sous Delphi V7 Une adresse internet HTTP://WWW.site_etc fournit du texte Ascii. En fait il s'agit d'un buffer-tampon rempli avec du faire défiler du texte en continu [ par Jean ] Comment faire défiler du texte en continu SVP. ?Merci d'avance. Crée un editeur de texte avec recherche, le texte qu'on trouve le mettre en couleur . [ par Crée un editeur de texte avec recherche. ] Je suis débutant en delphi 6 (mais je connais la programmation en clipper). Je veux crée un simple éditeur de texte. Ma question est : quand je veut f


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,858 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales