cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012
-
19 mars 2010 à 23:08
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012
-
24 mars 2010 à 12:25
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 24 mars 2010 à 12:25
v1.4.2
Bonjour à tous,
Je laisse le mode du source sur "débutant" malgré l'évolution du code grâce à vos contributions.
Merci à tous ceux qui ont participé à ce projet car j'ai beaucoup appris au fil des changements.
Cordialement.
Christophe
defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 8 août 2011 24 mars 2010 à 02:00
C'est fou ce que pipotron aura fait papoter.
Christophe, tu peux enlever "débutant" à ton introduction.
L'évolution de ce code aura été vraiment intéressante à suivre.
A+
Dom
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 24 mars 2010 à 00:48
ceci n'a rien à voir avec une préférence personnelle ... le but étant d'apprendre quelque chose à un débutant alors autant lui montrer le chemin correct .. ces opérateurs ("is" & "as") sont mis à disposition pas Delphi afin de vérifier et de transtyper en toute sécurité des objets (voir l'aide de Delphi à ce sujet)
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 24 mars 2010 à 00:01
Oui je ne contrôle pas car on ne mets cette procedure QUE sur les listbox, donc vérif inutile à mon gout.
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 23 mars 2010 à 23:16
Salut,
voici une petite modification au code de JulioDelphi qui ne faisait pas de contrôle sur le type de la classe et une simplification de la procédure "BtnGenereClick" ...
je te laisse voir ça tout seul !!
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var i : integer;
begin
// On va traiter les 9 TListBox
for i:=1 to 9 do
with TListBox(FindComponent('List'+IntToStr(i))) do
begin
// RandomRange renvoie un entier aléatoire entre 0 et le nombre d'expressions du TListBox
// qui va définir l'expression choisie
// On sélectionne l'expression choisie
ItemIndex := RandomRange(0, Items.Count);
// Et on sauvegarde le texte
Liste[i] := Items[ItemIndex];
end;
PrintPipo;
end;
// Procédure commune aux 9 TListBox, on récupère l'évènement et on sauvegarde
// l'expression à la position définie dans la propriété "Tag".
procedure Tf_Main.ListXClick(Sender: TObject);
begin
// On récupère l'évènement du TListBox
if (Sender is TListBox) then
begin
with (Sender as TListBox) do
// On définit l'expression sélectionnée
Liste[Tag] := Items[ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
end;
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 23 mars 2010 à 17:26
@P007TOD,
Merci pour la note, cà fait toujours plaisir ;)
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 23 mars 2010 à 12:54
v1.4.1
Merci JulioDelphi,
J'ai hésité à faire cette modification jugeant que c'était une astuce d'initié mais après tout, comme je l'ai comprise en tant que débutant, çà ne devrait pas créer de problèmes aux autres. Donc modification faite !
A+
Christophe
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 22 mars 2010 à 22:18
Hello
Pourquoi autant de redondance ? Et si j'avais 1000 listes ?
procedure Tf_Main.List1Click(Sender: TObject);
begin
// On définit l'expression sélectionnée
Liste[1] := List1.Items[List1.ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
fois 9 !!!
Je te propose de mettre dans chaque .TAG de tes listes leur index puis mettre cette procédure unique pour toutes les listes :
procedure Tf_Main.ListXClick(Sender: TObject);
var MaListe: TListBox;
begin
MaListe:= TListBox(Sender);
// On définit l'expression sélectionnée
Liste[MaListe.Tag] := MaListe.Items[MaListe.ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
;)
p007tod
Messages postés6Date d'inscriptionjeudi 18 mai 2006StatutMembreDernière intervention 1 mars 2024 22 mars 2010 à 19:33
bravo pour la réactivité.
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 22 mars 2010 à 14:37
Bonjour et merci pour vos remarques,
Le code a été modifié selon la proposition de Dom et la position du programme définie à poScreenCenter.
A+
Christophe
defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 8 août 2011 22 mars 2010 à 12:07
for i:=1 to 9 ! désolé j'avais ajouté 'è' et 'h'
comme quoi il faudrait déclarer une constante pour la taille du tableau voy.
A moins que quelqu'un ait une idée pour le rendre dynamique ?
Dom
defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 8 août 2011 22 mars 2010 à 12:03
exact
je propose cela :
procedure Tf_Main.PrintPipo;
const voy:array [1..9] of char =('a','e','é','è','i','o','u','y','h');
var s:string; i:integer;
begin
// On affiche dans le TMemo l'ensemble des expressions choisies aléatoirement
s:=Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]);
for i:=1 to 7 do s:=StringReplace(s,'de '+voy[i],'d'''+voy[i],[rfReplaceAll]);
// Vide le composant TMemo de tout texte
Memo.Clear;
Memo.Lines.Add(s);
end;
A+
Dom
p007tod
Messages postés6Date d'inscriptionjeudi 18 mai 2006StatutMembreDernière intervention 1 mars 2024 22 mars 2010 à 10:50
Bonjour
Bravo, on se régale. deux remarques dans les StringReplace il ne faut pas oublier les 'de é' et autres,par exemple "il convient de étudier" et d'autre part il vaut mieux utiliser la position de form poScreenCenter sinon quand on utilise deux écrans la form se centre sur les deux écrans et il y a la moitié sur chaque.
charles_ioda
Messages postés3Date d'inscriptiondimanche 10 septembre 2006StatutMembreDernière intervention23 juillet 2007 22 mars 2010 à 08:10
Mais alors qui a écrit le discourt de (Martine Aubry, François Bayrou, Xavier Bertrand)
Y aurait-il un nègre là-dessous ?
DRJEROME
Messages postés436Date d'inscriptionjeudi 9 janvier 2003StatutMembreDernière intervention 5 février 2015 21 mars 2010 à 17:10
Salut,
il y a quelques années j'avais vu dans Science et Vie un truc dans ce style qui permettait de créer du bla-bla qui se casait à toutes les sauces dans les discours, je ne l'ai jamais retrouvé (dans les années fin 70 ou début 80).
Je suis heureux de voir la création du présent Pipotron, super !
C'est génial ;)
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 20 mars 2010 à 20:38
Re Dom,
Voilà j'ai intégré ton code , je l'ai juste mis à mon goût pour n'afficher qu'une fois le texte dans le TMemo.
Bonne soirée je ne veux pas louper france-angleterre ;)
A+
Christophe
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 20 mars 2010 à 18:49
Merci Dom,
En effet je m'étais demander comment faire ce correctif pour que cela fasse plus français.
J'étais parti dans les StrCopy et tutti quanti mais en effet c'est plus simple en voyant ta solution.
Je me penche dessus demain pour l'intégrer à mon code.
En tout cas , merci ca me dépanne bien.
defis91
Messages postés65Date d'inscriptionsamedi 29 octobre 2005StatutMembreDernière intervention 8 août 2011 20 mars 2010 à 17:39
Bonjour Christophe
Une minuscule contribution...
procedure Tf_Main.PrintPipo;
var s:string;
begin
// Vide le composant TMemo de tout texte
Memo.Clear;
// On affiche dans le TMemo l'ensemble des expressions choisies aléatoirement
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]));
s:=Memo.Text;
s:=StringReplace(s,'de a','d''a',[rfReplaceAll]);
s:=StringReplace(s,'de e','d''e',[rfReplaceAll]);
s:=StringReplace(s,'de i','d''i',[rfReplaceAll]);
s:=StringReplace(s,'de o','d''o',[rfReplaceAll]);
s:=StringReplace(s,'de u','d''u',[rfReplaceAll]);
Memo.Clear;
Memo.Lines.Add(s);
end;
Jean-Pierre petit avait aussi fait un Logotron en Basic, dont on peut récupérer les phrases.
A+
Dom
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 20 mars 2010 à 15:21
v1.1.1
Pour me rapprocher le plus possible de l'originale il est maintenant possible de choisir soi-même ses expressions.
JulioDelphi
Messages postés2226Date d'inscriptiondimanche 5 octobre 2003StatutMembreDernière intervention18 novembre 201014 20 mars 2010 à 14:15
Je n'ai pas regardé le code, mais l'idée j'adoooore !
Je le prends ! Merci
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 20 mars 2010 à 11:21
Merci pour vos réponses,
J'ai en fait choisi un mixe de vos 2 codes en écrivant
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var Num, i : integer;
Liste : array[1..9] of String;
begin
Memo.Clear;
for i:=1 to 9 do
begin
Num :=TListBox(FindComponent('List'+IntToStr(i))).Items.Count ;
Num := RandomRange(0, Num);
TListBox(FindComponent('List'+inttostr(i))).ItemIndex :=Num;
Liste[i]:=TListBox(FindComponent('List'+inttostr(i))).Items.Strings[Num];
end;
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]));
end;
Cela fonctionne très bien, merci encore.
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 20 mars 2010 à 09:36
salut
utilise findcomponent qui permet de retriuver un composnt par son nom
du genre:
for i:=1 to 9 do
begin
Num :=TListBox(FindComponent('List'+inttostr(i))).Items.Count ;
Num := RandomRange(0, Num);
TListBox(FindComponent('List'+inttostr(i))).ItemIndex :=Num;
TListBox(FindComponent('List'+inttostr(i))):=TListBox(FindComponent('List'+inttostr(i))).Strings[Num];
end;
je n'ai pas testé le code mais cela devrai marcher
jlne
Debiars
Messages postés285Date d'inscriptionlundi 16 juin 2003StatutMembreDernière intervention11 février 2018 20 mars 2010 à 09:26
Bonjour Christophe,
En réponse à ta demande je propose ceci :
Remplace Liste1 à Liste 9 par Liste : array[1..9] of string;
Ajoute la fonction suivante qui te renverra le nom de la ListBox à traiter :
function Tf_Main.List(no : byte) : TListBox;
begin
result := FindComponent('List'+ IntToStr(no)) as TListBox;
end;
et modifie la procédure BtnGenereClick comme ceci :
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var Num,i : integer;
begin
// Vide le composant TMemo de tout texte
Memo.Clear;
for i := 1 to 9 do
begin
Num := RandomRange(0, List(i).Items.Count);
List(i).ItemIndex := Num;
Liste[i] := List(i).Items.Strings[Num];
end;
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5],
Liste[6], Liste[7], Liste[8], Liste[9]]));
end;
ça simplifie, n'est-ce pas ... et j'ai testé bien entendu.
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 20 mars 2010 à 02:51
Je n'ai pas encore regardé le code, désolé.
Mais je peux corriger un truc, c'est que l'idée originale vient d'un polytechnicien, il y a plusieurs décennies déjà.
A l'époque, la cible était plutôt les discours pseudo-scientifico-économico-politiques, si je me souviens bien.
Mais il aurait été vraiment marrant de mettre ça à la sauce "pseudo informaticien" (pour le fun ;)
Voilà pour la forme.
Pour le fond, j'ai confiance en l'avenir... ;)
cs_Christophe67
Messages postés80Date d'inscriptionlundi 2 juin 2003StatutMembreDernière intervention15 juin 2012 19 mars 2010 à 23:08
Bonjour à tous,
Je me doute qu'il doit y avoir le moyen d'optimiser la répétition de code suivante à l'aide d'une boucle:
J'ai essayé avec for I := 1 to 9 do
et en remplacant les numéros par [i] mais çà n'allait pas.
Si une âme charitable veut bien m'initier ce n'est pas de refus.
24 mars 2010 à 12:25
Bonjour à tous,
Je laisse le mode du source sur "débutant" malgré l'évolution du code grâce à vos contributions.
Merci à tous ceux qui ont participé à ce projet car j'ai beaucoup appris au fil des changements.
Cordialement.
Christophe
24 mars 2010 à 02:00
Christophe, tu peux enlever "débutant" à ton introduction.
L'évolution de ce code aura été vraiment intéressante à suivre.
A+
Dom
24 mars 2010 à 00:48
24 mars 2010 à 00:01
23 mars 2010 à 23:16
voici une petite modification au code de JulioDelphi qui ne faisait pas de contrôle sur le type de la classe et une simplification de la procédure "BtnGenereClick" ...
je te laisse voir ça tout seul !!
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var i : integer;
begin
// On va traiter les 9 TListBox
for i:=1 to 9 do
with TListBox(FindComponent('List'+IntToStr(i))) do
begin
// RandomRange renvoie un entier aléatoire entre 0 et le nombre d'expressions du TListBox
// qui va définir l'expression choisie
// On sélectionne l'expression choisie
ItemIndex := RandomRange(0, Items.Count);
// Et on sauvegarde le texte
Liste[i] := Items[ItemIndex];
end;
PrintPipo;
end;
// Procédure commune aux 9 TListBox, on récupère l'évènement et on sauvegarde
// l'expression à la position définie dans la propriété "Tag".
procedure Tf_Main.ListXClick(Sender: TObject);
begin
// On récupère l'évènement du TListBox
if (Sender is TListBox) then
begin
with (Sender as TListBox) do
// On définit l'expression sélectionnée
Liste[Tag] := Items[ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
end;
23 mars 2010 à 17:26
Merci pour la note, cà fait toujours plaisir ;)
23 mars 2010 à 12:54
Merci JulioDelphi,
J'ai hésité à faire cette modification jugeant que c'était une astuce d'initié mais après tout, comme je l'ai comprise en tant que débutant, çà ne devrait pas créer de problèmes aux autres. Donc modification faite !
A+
Christophe
22 mars 2010 à 22:18
Pourquoi autant de redondance ? Et si j'avais 1000 listes ?
procedure Tf_Main.List1Click(Sender: TObject);
begin
// On définit l'expression sélectionnée
Liste[1] := List1.Items[List1.ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
fois 9 !!!
Je te propose de mettre dans chaque .TAG de tes listes leur index puis mettre cette procédure unique pour toutes les listes :
procedure Tf_Main.ListXClick(Sender: TObject);
var MaListe: TListBox;
begin
MaListe:= TListBox(Sender);
// On définit l'expression sélectionnée
Liste[MaListe.Tag] := MaListe.Items[MaListe.ItemIndex];
// On l'affiche dans le TMemo
PrintPipo;
end;
;)
22 mars 2010 à 19:33
22 mars 2010 à 14:37
Le code a été modifié selon la proposition de Dom et la position du programme définie à poScreenCenter.
A+
Christophe
22 mars 2010 à 12:07
comme quoi il faudrait déclarer une constante pour la taille du tableau voy.
A moins que quelqu'un ait une idée pour le rendre dynamique ?
Dom
22 mars 2010 à 12:03
je propose cela :
procedure Tf_Main.PrintPipo;
const voy:array [1..9] of char =('a','e','é','è','i','o','u','y','h');
var s:string; i:integer;
begin
// On affiche dans le TMemo l'ensemble des expressions choisies aléatoirement
s:=Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]);
for i:=1 to 7 do s:=StringReplace(s,'de '+voy[i],'d'''+voy[i],[rfReplaceAll]);
// Vide le composant TMemo de tout texte
Memo.Clear;
Memo.Lines.Add(s);
end;
A+
Dom
22 mars 2010 à 10:50
Bravo, on se régale. deux remarques dans les StringReplace il ne faut pas oublier les 'de é' et autres,par exemple "il convient de étudier" et d'autre part il vaut mieux utiliser la position de form poScreenCenter sinon quand on utilise deux écrans la form se centre sur les deux écrans et il y a la moitié sur chaque.
22 mars 2010 à 08:10
Y aurait-il un nègre là-dessous ?
21 mars 2010 à 17:10
il y a quelques années j'avais vu dans Science et Vie un truc dans ce style qui permettait de créer du bla-bla qui se casait à toutes les sauces dans les discours, je ne l'ai jamais retrouvé (dans les années fin 70 ou début 80).
Je suis heureux de voir la création du présent Pipotron, super !
C'est génial ;)
20 mars 2010 à 20:38
Voilà j'ai intégré ton code , je l'ai juste mis à mon goût pour n'afficher qu'une fois le texte dans le TMemo.
Bonne soirée je ne veux pas louper france-angleterre ;)
A+
Christophe
20 mars 2010 à 18:49
En effet je m'étais demander comment faire ce correctif pour que cela fasse plus français.
J'étais parti dans les StrCopy et tutti quanti mais en effet c'est plus simple en voyant ta solution.
Je me penche dessus demain pour l'intégrer à mon code.
En tout cas , merci ca me dépanne bien.
20 mars 2010 à 17:39
Une minuscule contribution...
procedure Tf_Main.PrintPipo;
var s:string;
begin
// Vide le composant TMemo de tout texte
Memo.Clear;
// On affiche dans le TMemo l'ensemble des expressions choisies aléatoirement
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]));
s:=Memo.Text;
s:=StringReplace(s,'de a','d''a',[rfReplaceAll]);
s:=StringReplace(s,'de e','d''e',[rfReplaceAll]);
s:=StringReplace(s,'de i','d''i',[rfReplaceAll]);
s:=StringReplace(s,'de o','d''o',[rfReplaceAll]);
s:=StringReplace(s,'de u','d''u',[rfReplaceAll]);
Memo.Clear;
Memo.Lines.Add(s);
end;
Une autre, charger des fichiers pour initialiser les TListbox par les pipotrons du site :
http://bluepsi.free.fr/cybertechno/pipotron/pipotron.html
Jean-Pierre petit avait aussi fait un Logotron en Basic, dont on peut récupérer les phrases.
A+
Dom
20 mars 2010 à 15:21
Pour me rapprocher le plus possible de l'originale il est maintenant possible de choisir soi-même ses expressions.
20 mars 2010 à 14:15
Je le prends ! Merci
20 mars 2010 à 11:21
J'ai en fait choisi un mixe de vos 2 codes en écrivant
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var Num, i : integer;
Liste : array[1..9] of String;
begin
Memo.Clear;
for i:=1 to 9 do
begin
Num :=TListBox(FindComponent('List'+IntToStr(i))).Items.Count ;
Num := RandomRange(0, Num);
TListBox(FindComponent('List'+inttostr(i))).ItemIndex :=Num;
Liste[i]:=TListBox(FindComponent('List'+inttostr(i))).Items.Strings[Num];
end;
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5], Liste[6], Liste[7], Liste[8], Liste[9]]));
end;
Cela fonctionne très bien, merci encore.
20 mars 2010 à 09:36
utilise findcomponent qui permet de retriuver un composnt par son nom
du genre:
for i:=1 to 9 do
begin
Num :=TListBox(FindComponent('List'+inttostr(i))).Items.Count ;
Num := RandomRange(0, Num);
TListBox(FindComponent('List'+inttostr(i))).ItemIndex :=Num;
TListBox(FindComponent('List'+inttostr(i))):=TListBox(FindComponent('List'+inttostr(i))).Strings[Num];
end;
je n'ai pas testé le code mais cela devrai marcher
jlne
20 mars 2010 à 09:26
En réponse à ta demande je propose ceci :
Remplace Liste1 à Liste 9 par Liste : array[1..9] of string;
Ajoute la fonction suivante qui te renverra le nom de la ListBox à traiter :
function Tf_Main.List(no : byte) : TListBox;
begin
result := FindComponent('List'+ IntToStr(no)) as TListBox;
end;
et modifie la procédure BtnGenereClick comme ceci :
procedure Tf_Main.BtnGenereClick(Sender: TObject);
var Num,i : integer;
begin
// Vide le composant TMemo de tout texte
Memo.Clear;
for i := 1 to 9 do
begin
Num := RandomRange(0, List(i).Items.Count);
List(i).ItemIndex := Num;
Liste[i] := List(i).Items.Strings[Num];
end;
Memo.Lines.Add(Format(PipoLine, [Liste[1], Liste[2], Liste[3], Liste[4], Liste[5],
Liste[6], Liste[7], Liste[8], Liste[9]]));
end;
ça simplifie, n'est-ce pas ... et j'ai testé bien entendu.
20 mars 2010 à 02:51
Mais je peux corriger un truc, c'est que l'idée originale vient d'un polytechnicien, il y a plusieurs décennies déjà.
A l'époque, la cible était plutôt les discours pseudo-scientifico-économico-politiques, si je me souviens bien.
Mais il aurait été vraiment marrant de mettre ça à la sauce "pseudo informaticien" (pour le fun ;)
Voilà pour la forme.
Pour le fond, j'ai confiance en l'avenir... ;)
19 mars 2010 à 23:08
Je me doute qu'il doit y avoir le moyen d'optimiser la répétition de code suivante à l'aide d'une boucle:
...
Num := RandomRange(0, List2.Items.Count);
List2.ItemIndex := Num;
Liste2 := List2.Items.Strings[Num];
...
J'ai essayé avec for I := 1 to 9 do
et en remplacant les numéros par [i] mais çà n'allait pas.
Si une âme charitable veut bien m'initier ce n'est pas de refus.
Merci d'avance !