2010-08-25 18 views
1

J'ai écrit un contrôle personnalisé en C# qui hérite de RichTextBox. Le but de ce contrôle est de contenir toutes les améliorations et modifications, telles que la modification de la numérotation des lignes et le fait que le contrôle ne se répète que lorsqu'il le devrait.Comment remplacer une propriété héritée de RichTextBox?

Hier, j'ai remarqué des pics de mémoire (et souvent, des exceptions de MOO) lors de l'accès à la propriété Lines de ce contrôle (il y a parfois plus de 600 000 lignes dans le contrôle). J'ai codé des solutions de contournement qui ne l'impliquent plus, mais j'aimerais quand même l'enlever complètement pour que les personnes qui utilisent mon contrôle à l'avenir ne l'utilisent pas.

La propriété Lines est System.Windows.Forms.TextBoxBase.Lines. Idéalement, j'aimerais que la chaîne [] pour cette propriété ne soit jamais touchée; quand je charge du texte dans le contrôle, je ne veux pas que le contrôle fasse quoi que ce soit pour remplir cette propriété de lignes (parce que c'est complètement inutile et qu'il consomme du temps et des ressources).

Vous avez des idées?

EDIT: J'ai essayé

 
     public override string[] Lines 
     { 
      get { return null; } 
      set { ; } // do nothing 
     } 

Mais VS dit « ne peut pas passer outre System.Windows.Forms.TextBoxBase.Lines.get membre hérité parce qu'il est pas marqué virtuel, abstrait, ou override

. Donc, il semble que je ne peux pas le contourner ou le supprimer Je pense que la RichTextBox est en train de définir la propriété car elle est remplie après le changement du texte Y at-il un moyen de capturer et de traiter ce message?

Répondre

3

Hmya, il ne va ralentir un programmeur décent pour plus de 5 minutes:

string[] lines = ((RichTextBox)myEditor1).Lines; 

, qui soufflera tout aussi difficile. Il n'y a pas grand intérêt à essayer d'empêcher l'utilisation de votre classe qui peut être utilisée de toute façon. La propriété Lines devrait être utile à tous ceux qui utilisent votre éditeur, elle couvre le besoin fondamental de pouvoir récupérer le texte qui a été édité. Ne jetez pas le bébé avec l'eau du bain.

Le vrai problème ici est que le RTB utilise tellement de mémoire non gérée pour stocker le texte, laissant peu de gauche pour le tas collecté par le garbage. Cela devient vraiment lent aussi une fois que vous y pompez des milliers de lignes. Aucun composant ne devrait jamais être autorisé à engloutir la moitié de toute la mémoire disponible. Limitez le nombre de lignes que vous autorisez à éditer ou utilisez un meilleur éditeur, comme ScintillaNET.

Il est également important d'être un programmeur pragmatique. Au-delà de cacher une propriété inutilement. 600 000 lignes dans une zone de texte est un nombre énorme. Il y a 3/4 millions de mots dans la Bible, vous affichez 6 copies de la Bible dans votre boîte de texte. Aucun humain sain d'esprit ne lira jamais cela, ils ne vont pas aimer votre programme intensément. Non seulement parce qu'il est impossible d'utiliser efficacement, mais aussi parce que c'est un seau de crash.

+0

+1 a supprimé ma réponse upvoted, je pense que c'est une bien meilleure réponse. – GenericTypeTea

+0

"La propriété Lines devrait être utile à tous ceux qui utilisent votre éditeur, elle couvre le besoin fondamental de pouvoir récupérer le texte qui a été édité." Eh bien, généralement, l'utilisateur ne modifiera pas le texte. Le contrôle est conçu principalement pour la visualisation avec un tas de petites fonctionnalités (mise en forme de certains textes, etc). Chaque fois que le programme a besoin de la ligne en cours, j'utilise une variable temp commençant au SelectionStart et revenant à la ligne précédente.Je concatène ensuite les chaînes jusqu'au prochain saut de ligne. C'est plus rapide que d'appeler editor.Lines [GetLineFromCharIndex (editor.SelectionStart)]. – Kizaru

+0

En outre, l'utilisation de la mémoire ne crache pas lors de ma solution de contournement. J'ai passé des semaines il y a quelques mois à essayer de trouver un meilleur éditeur, mais ils avaient tous d'énormes problèmes. Le seul problème de ScintillaNET était une fuite de mémoire (qui a conduit à OOM) lors de la modification du texte. Bien que ce projet soit fait et considéré comme plus que satisfaisant, j'aimerais toujours trouver des façons de l'améliorer :) – Kizaru

0

Avez-vous essayé pour ombrager la propriété?

public new string[] Lines 
{ 
    get { throw new Exception("Not supported"); } 
    set { throw new Exception("Not supported"); } 
}