Problème de caption popupmenu [Résolu/Fermé]

Signaler
Messages postés
6
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
16 octobre 2006
-
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
-
Bonjour,
j'ai actuellement un soucis avec un programme que j'essaue de faire...
Je m'explique :

J'utilise un Tmemo qui me récupères les données d'un fichier et qui créé un popupmenu avec le contenu de ce fichier txt voilà le code :
procedure TForm1.FormCreate(Sender: TObject);
var
x:integer;
item:TmenuItem;
begin
x := 0;
popupmenu2.Items.Clear;
memo1.Clear;
Memo1.Lines.LoadFromFile('raisons.txt');
nbq := memo1.lines.Count;
while x < nbq do begin
Item := TMenuItem.Create(Self);
Item.Caption := Gauche('*',memo1.lines[x]);
Item.OnClick := est1Click;
popupmenu2.Items.Add(item);
x:= x+1;
end;
end;

Jusque là ca fonction très bien si j'affiche mon popupmenu, il est présent dans l'ordre que j'ai voulu etc...
Le soucis est le suivant :
Je voudrais maintenant faire un test quand je clique sur un des éléments du popupmenu qui recherche dans le Tmemo le caption correspondant pour pouvoir lancer l'action Droite('*',memo1.lines[x]);
j'avais donc penser à ce code :

procedure TForm1.est1Click(Sender: TObject);
var
x:integer;
begin
x := 0;
while x < nbq do begin
if popupmenu2.Items.Caption = Gauche('*',memo1.lines[x]) then
SendToRoomDirect(Droite('*',memo1.lines[x]));
x := x+1;
end;
end;

Seulement popupmenu2.Items.Caption est toujours vide... donc la condition n'est jamais vérifiée...

Auriez-vous un coup de pouce pour que je puisse trouver la valeur du caption de la partie du menu sur laquelle je clique (je fais un screen pour expliquer de quelle caption je parle)
 voilà je voudra réussir à récupérer essai2 quand je clique dessus

Merci d'avance !

8 réponses

Messages postés
2106
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5
Salut,

tu as une erreur ds ton code:

while x < nbq do begin
if popupmenu2.Items.Caption = Gauche('*',memo1.lines[x]) then

Voilà ce que tu dois faire:
while x < nbq do begin
if  TMenuItem(Sender).Caption = Gauche('*',memo1.lines[x]) then

Sender étant le control qui a executé l' événement OnClick, tu récupère le MenuItem comme cela : TMenuItem(Sender)

A+
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Utilise le TAG de l'itemmenu, et pour chaque ligne du mémo transformée en itemmenu, tu lui mets (dans l'itemmenu créé) le TAG au n° de la ligne. ainsi quand tu clic sur un itemmenu, tu sais quel est son TAG (grace au sender par exemple) et donc tu trouvés ta ligne dans le memo direct.
me suis je fait comprendre ? ^^
Messages postés
6
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
16 octobre 2006

merci infiniment a vous deux :)
ca marche parfaitement maintenant
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
procedure TForm1.FormCreate(Sender: TObject);
var
  x    : integer;
  item : TmenuItem;
begin
  popupmenu2.Items.Clear;
  memo1.Clear;
  memo1.Lines.LoadFromFile('raisons.txt');

  nbq := Memo1.Lines.Count;

  for x := 0 to nbq-1 do begin
      Item         := TMenuItem.Create(PopuMenu2);
      Item.Caption := Gauche('*',memo1.lines[x]);
      Item.OnClick := est1Click;
      Item.Tag     := x;
      popupmenu2.Items.Add(Item);
  end;
end;




procedure TForm1.est1Click(Sender: TObject);
begin
  SendToRoomDirect(Droite('*',memo1.lines[(Sender as TMenuItem).Tag]));
end;





par contre je suis curieux de voir le code des fonctions Gauche et Droite ?

<hr size="2" width="100%" />Croc (click me)
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Je propose :

function Gauche(const SubStr : String; const s : String; Position : Integer = 1) : String;
var p : Integer;
begin
  p := Pos(SubStr, s, Position);
  if p<=0
    then Result := s
    else Result := System.Copy(s, 1, p-1);
end;
et donc droite :
function Droite(const SubStr : String; const s : String; Position : Integer = 1) : String;
var p : Integer;
begin
  p := Pos(SubStr, s, Position);
  if p<=0
    then Result := ''
    else Result := System.Copy(s, p+Length(SubStr), Length(s));
end;

Mon site DELPHI =)
Messages postés
6
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
16 octobre 2006

alors les fonctions gauche et droite viennent d'ici , je trouve le fichier FonctionsChaine.pas remarquablement bien réalisé donc je m'en sert :)

Pour le reste ca fonctionne tres bien grâce à Mauricio et Julio :)
Messages postés
6
Date d'inscription
mercredi 15 juin 2005
Statut
Membre
Dernière intervention
16 octobre 2006

je me permets de poster dans le meme thread vu que c'est le même logiciel que je créé...
j'ai un autre petit soucis... voici les exe du logiciel si vous voulez tester quand vous mettez "toujours au dessus" (j'utilise stayontop) parfois mon logiciel repasse derriere d'autres fenetre quand meme... je sais pas pourquoi... et ca m'enerve... aurieez vous déjà rencontré ce probleme?
Messages postés
2226
Date d'inscription
dimanche 5 octobre 2003
Statut
Modérateur
Dernière intervention
18 novembre 2010
13
Autre probleme, autre post ! Merci =)
Ce post est considéré comme "resolu", tu auras moins de personnes qui viendront dans ce thread pour t'aider. ouvre en un autre, c'est gratuit ^^

Mon site DELPHI =)