Quelqu'un peut-il me donner un code simple qui me donnerait la possibilité de rechercher une chaîne simple dans un mémo et de le mettre en surbrillance dans le mémo après avoir été trouvé?Rechercher par un mémo dans Delphi?
Répondre
function TForm1.FindText(const aPatternToFind: String):Boolean;
var
p: Integer;
begin
p := pos(aPatternToFind, Memo1.Text);
Result := (p > 0);
if Result then
begin
Memo1.SelStart := p;
Memo1.SelLength := Length(aPatternToFind);
Memo1.SetFocus; // necessary so highlight is visible
end;
end;
Ceci ne recherche PAS entre les lignes si WordWrap est vrai.
Cette recherche permet l'insertion de documents, la recherche sensible à la casse et la recherche à partir de la position du curseur.
type
TSearchOption = (soIgnoreCase, soFromStart, soWrap);
TSearchOptions = set of TSearchOption;
function SearchText(
Control: TCustomEdit;
Search: string;
SearchOptions: TSearchOptions): Boolean;
var
Text: string;
Index: Integer;
begin
if soIgnoreCase in SearchOptions then
begin
Search := UpperCase(Search);
Text := UpperCase(Control.Text);
end
else
Text := Control.Text;
Index := 0;
if not (soFromStart in SearchOptions) then
Index := PosEx(Search, Text,
Control.SelStart + Control.SelLength + 1);
if (Index = 0) and
((soFromStart in SearchOptions) or
(soWrap in SearchOptions)) then
Index := PosEx(Search, Text, 1);
Result := Index > 0;
if Result then
begin
Control.SelStart := Index - 1;
Control.SelLength := Length(Search);
end;
end;
Vous pouvez définir HideSelection = False sur la note de service pour afficher la sélection même si la note ne se concentre pas.
Utilisez comme ceci:
SearchText(Memo1, Edit1.Text, []);
Permet la recherche des modifications aussi bien.
L'utilisation de UpperCase peut ne pas vous donner les résultats souhaités, par ex. en français, les caractères majuscules ne peuvent pas avoir d'accent, alors que les caractères minuscules peuvent en avoir un (c'est différent du français canadien, je crois, où les caractères majuscules peuvent aussi être accentués). Donc, dans ce cas, l'utilisation de LowerCase donnerait de meilleurs résultats. – dummzeuch
Eh bien, la lettre accentuée et la lettre non accentuée sont deux lettres différentes, n'est-ce pas? Un mot français, lorsqu'il est converti en UpperCase, apparaîtra comme PRIVé, en minuscule il sera privé. D'un autre côté, la lettre majuscule É n'est pas non plus convertie en é, donc je ne vois pas comment cela affectera les résultats de la recherche. Bien que je dois admettre que je suis en train de tester cela dans Delphi 7. Si unicode ou l'utilisation possible des paramètres régionaux dans votre Delphi donne de meilleurs résultats lors de l'utilisation de LowerCase, s'il vous plaît faire. – GolezTrol
GolezTrol: Merci pour l'astuce HideSelection! – RobertFrank
- 1. mémo autoscrolling dans delphi
- 2. Comment améliorer le contrôle mémo par défaut dans Delphi avec la possibilité de souligner le texte
- 3. La boîte mémo Delphi ne capture pas Retour clé
- 4. Convertir un mémo en texte
- 5. Delphi Rechercher Modifier le composant
- 6. Rechercher hachage dans un tableau par valeur
- 7. Rechercher un objet par étiquette
- 8. Mémo au texte
- 9. C#: Comment ajouter une ligne à un mémo?
- 10. Gestionnaire de mémo
- 11. rechercher et remplacer les fichiers dans usind langage Delphi
- 12. C# Rechercher un courrier par courrier électronique
- 13. rechercher dans un tableau
- 14. Rechercher un problème UITable soutenu par UITable?
- 15. Rechercher un enfant par index jQuery
- 16. comment rechercher par programme un jqgrid
- 17. Rechercher par catégorie_id
- 18. Rechercher dans un ListBox
- 19. comment rechercher un fichier multimédia dans notre système par C#?
- 20. Comment rechercher et remplacer une valeur d'étiquette dans un fichier XML en utilisant Delphi?
- 21. Rechercher nœuds par nom dans XmlDocument
- 22. valeur du paramètre par défaut pour un TSomething dans Delphi
- 23. Valeur booléenne par défaut dans un tableau d'enregistrement - Delphi
- 24. UDP Connexion par proxy dans Delphi
- 25. MySQL Rechercher (Sort par Pertinence)
- 26. Accès: Texte, Mémo ou VarChar? Lequel utiliser?
- 27. Algorithme pow() récursif en queue avec mémo?
- 28. Un cache efficace dans Delphi
- 29. Rechercher un élément dans un segment
- 30. Ruby: comment décorer une méthode avec mémo?
La recherche dans 'TStrings.Text' plutôt que dans' TStrings.Strings' coûte très cher. 2 × N dans le fait. –
@ user205376 - Pourquoi dites-vous cela? TStrings.Text est une chaîne unique sur laquelle je pense que pos() serait rapide. La recherche, comme vous le suggérez, TStrings.Strings impliquerait des indices pour accéder à chaque chaîne. Cela, IMO, opinion, serait plus lent et ne fournirait aucune fonctionnalité supplémentaire que le pos() ne fait pas. (Et, il faudrait un code délicat pour mettre en évidence le motif trouvé) Pourquoi pensez-vous pas? – RobertFrank
Un peu en retard au jeu, mais pour ce qui précède, cela dépend de l'implémentation. Après tout, TStrings est abstrait. Memo.Lines.Text (= TMemoStrings.Text) obtient le texte du mémo en utilisant un seul appel d'API, tandis qu'un TStringList stocke une chaîne distincte et TStringList.Text les combine en une seule chaîne sur chaque requête (qui est souvent encore plus rapide que l'appel l'API, btw). La réponse utilise Memo1.Text qui, je pense, contourne tout descendant de TStrings et appelle directement une API de GetText sur la poignée du mémo. – GolezTrol