TOUT remplacer et TReplaceDialog

cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010 - 9 avril 2004 à 17:16
cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010 - 17 avril 2004 à 16:33
Bonjour,

J'ai bidouillé via plusieurs sources + modifs perso les procédures d'un TReplaceDialog qui fonctionne impec.

Mais... snifff, sauf que je ne trouve pôô comment obtenir via un appui sur le bouton "Tout remplacer" cette fonction. Si je clique ça fait la même chose que sur "Remplacer", mais pas TOUT remplacer d'un seul coup.

J'ai tenté de me documenter sur ce problème précis + bien regardé et lu l'aide de Delphi 7, mais je ne pige pas comment faire
[Extrait aide Delphi sur TReplaceDialog] :
OnReplace est déclenché quand l'utilisateur clique sur Remplacer ou Remplacer tout. De plus, quand l'utilisateur clique sur Remplacer, l'indicateur frReplace est positionné (et l'indicateur frReplaceAll est réinitialisé) dans Options. Quand l'utilisateur clique sur Remplacer tout, l'indicateur frReplaceAll est positionné (et l'indicateur frReplace est réinitialisé) dans Options.

En fait je pensais bêtement qu'en plaçant par exemple l'indicateur frReplaceAll à True, là était la solution, mais c'est pô ça .

Merci de votre lumière, car je patine sec !

6 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
9 avril 2004 à 22:34
Regarde le code ci-dessous, utilisé avec un composant TMemo.
Le texte sélectionné est le texte à rechercher
procedure TForm1.btnSearchClick(Sender: TObject);
begin
  if Memo1.SelLength > 0 then
    ReplaceDialog1.FindText := Memo1.SelText;
  ReplaceDialog1.Execute;
end;


Dans l'évènement OnReplace du composant TReplaceDialog
procedure TForm1.ReplaceDialog1Replace(Sender: TObject);
begin
  with Sender as TReplaceDialog do
    if frReplace in Options then
      DoReplace(FindText, ReplaceText)
    else
      if frReplaceAll in Options then
        DoReplaceAll(FindText, ReplaceText);

end;


J'ai créé deux méthode dans la déclaration de la fiche TForm1 dont les noms sont évocateurs :
procedure TForm1.DoReplace(OldText, NewText: string);
var
  SelPos: integer;
begin
  { Exécute une recherche globale en tenant compte des majuscules/minuscules pour FindText dans Memo1 }
    SelPos := Pos(OldText, Memo1.Lines.Text);
    if SelPos > 0 then
    begin
      Memo1.SelStart := SelPos - 1;
      Memo1.SelLength := Length(OldText);
      { Remplace le texte sélectionné par ReplaceText }
      Memo1.SelText := ReplaceDialog1.ReplaceText;
    end
    else
      MessageDlg(Concat('Impossible de trouver "', ReplaceDialog1.FindText, '" dans Memo1.'), mtError, [mbOk], 0);
end;

procedure TForm1.DoReplaceAll(OldText, NewText: string);
var
  SelPos: integer;
  SelCount: integer;
begin
  SelPos := Pos(OldText, Memo1.Lines.Text);
  SelCount := 0;
  while SelPos > 0 do
  begin
    DoReplace(OldText, NewText);
    SelPos := Pos(OldText, Memo1.Lines.Text);
    inc(SelCount);
  end;
  ShowMessageFmt('%d occurence(s) remplacée(s) pour %s', [SelCount, OldText]);
end;


Enfin, pour suivre la progression des recherches et remplacements, dans l'évènement OnFind du TReplaceDialog :
procedure TForm1.ReplaceDialog1Find(Sender: TObject);
begin
  Memo1.SetFocus;
  Memo1.SelStart := Pos(ReplaceDialog1.FindText, Memo1.Lines.Text) - 1;
  Memo1.SelLength := Length(ReplaceDialog1.FindText);
end;


Là, ça doit marcher.
Bonne chance pour la suite.
May Delphi be with you
0
cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010
9 avril 2004 à 23:40
Bonsoir,

SUPER !

Merci Delphiprog, exactement ce que je désirais depuis longtemps, par exemple en fin de remplacement, la boîte de dialogue qui donne le compte d'occurences remplacées, je vais en rêver cette nuit.

J'admire ta gentillesse et ton efficacité.

J'étais complétement à côté de la plaque alors en pensant qu'il me manquait seulement le "truc" qui me permette de TOUT remplacer d'un seul coup.

Ton site est super instructif, très riche en diverses ressources, bon courage et bonne continuation ! 8-)

@+

============================================
Je suis un tout débutant en Delphi, merci de ne pôô vous môôquer.
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
10 avril 2004 à 08:03
Merci, tes compliments me vont droit au coeur. :blush)

Je n'ai pas pris en compte les critères de recherche En avant/En arrière, tenir compte ou pas de la casse, etc.
Si cela t'intéresse, fais le savoir.
May Delphi be with you
0
cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010
10 avril 2004 à 11:49
Bonjour,

Delphiprog disait :
Je n'ai pas pris en compte les critères de recherche En avant/En arrière, tenir compte ou pas de la casse, etc.


Oupsssss, le rêve serait qu'en fin de recherche, une boîte de dialogue oui/non demande :

"Fin du fichier atteinte, désirez-vous poursuivre la recherche au début du fichier ?"

Mais je sais j'abuse héhontément :shy)

Bonnes fêtes de Pâques à Tous !

Merci pour tout !
============================================
Je suis un tout débutant en Delphi, merci de ne pôô vous môôquer.
0

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

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
10 avril 2004 à 14:13
Demandé si aimablement, on ne saurait refuser !
A suivre bientôt. ;)
May Delphi be with you
0
cs_Jean-Pierre Messages postés 82 Date d'inscription jeudi 25 septembre 2003 Statut Membre Dernière intervention 20 avril 2010
17 avril 2004 à 16:33
Bonjour à Tous,

Oui Delphiprog à bientôt :)

Je me suis amusé à adapter un peu ton super code et j'ai mis du temps à comprendre le "pourquoi" d'un bug... hihihiihi !

En effet j'ai échangé les messageDld "Error" en "Information", aussi ajouté un petit beep bitonal, etc.

Alors en cours de tests je me suis demandé pour quelle raison des fois ça fonctionnait impec, et d'autres = plantage (par multiplication à l'infini de copiageeeeeeeeeeeeeeeee lors de remplacement de texte).

Je me suis demandé quelles c******es j'avais encore faits.

J'ai enfin trouvé après... plusieurs heures - honte aux débutants hihihi ! - voici le fruit de cette chasse au gros vilain bug :

Exemple, tu places dans ton mémo la lettre "d", ensuite tu fais la recherche sur ce même "d" avec en remplacement le mot "radis" et là tu vas voir hihiihi !

Prépare bien vite ton Ctrl + Alt + Suppr !

L'art de la bouche infinie ;-)

Au plaisir de te lire et bon we.
=============================================
Je suis un tout débutant en Delphi, merci de ne pôô vous môôquer.
0
Rejoignez-nous