Le richTextEdit de ma form ne semble pas accessible depuis ma classe !

Signaler
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020
-
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
-
Bonjour à tous !

Je voudrais pouvoir gérer le RichTextEdit que je viens de placer sur ma Form, depuis une classe que je viens de créer !

Je pensais qu'il suffisait de rajouter  : NomDeLaClasse dans le fichier CS , exemple :

class

CDirectory :
Form1{

Mais apparemment, cela ne suffit pas !

Je suis conscient que cette question est surement très bête, mais je reste bloqué :(

Merci à tous

Cordialement

Nixeus'

16 réponses

Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
C'est parce que ton richTextBox à une visibilité private dans ta classe Form1.
Soit tu lui donne une visibilité public ou alors tu créer une méthode d'encapsulation pour ce dernier:
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Bonjour,

Merci de ta réponse !

J'avais déja mis "modifiers" à public , et ca ne change rien !

Nixeus'
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
Chez moi, ce code marche:
public
partial
class
Form1 :
Form
{

   private
RichTextBox richTextBox1;

   public
RichTextBox RichTextBox1
   {

      get {
return richTextBox1; }

      set { richTextBox1 =
value; }
   }

   public Form1()
   {
      InitializeComponent();
      t
his.richTextBox1 =
new
RichTextBox() { Location =
new
Point(10, 10), Size =
new
Size(300, 200) };

      this.Controls.Add(
this.richTextBox1);
   }
}

Et le Form2:
public

partial
class
Form2 :
Form1
{

   public Form2()
   {
      InitializeComponent();

      this.RichTextBox1.Text =
"salut";
   }
}
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

:(

C'est compliqué dis donc, il n'y a pas plus simple ? Surtout en c# !
En fait ce qui est bizarre c'est que dans la classe ou je veux controler mon RichTexteBox, quand je tappe le début de son nom, elle apparait, ca voudrais donc dire que j'y ai accès !

Par contre si j'éssaye d'écrire dedans, ca ne fais rien ! :(

Nixeus'
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
"Ca ne fais rien!".
Ca signifie quoi?

Donne ton code, ce sera plus facile de voir ou sa coince.
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Aucun texte ne s'affiche dans la RichTextBox !

Voici mon Source

http://dl.free.fr/q01rcAGL7/WMtranslater.rar

Tout le problème se déroule dans le classe CDirectory !

Pour débugger, met des valeurs dans chaque champs ( en haut)
Puis met deux chemin dans chaque path !

Je voudrais en fait, que, lors de la copie du dossier, je vois son "avancement" dans ma RichTextBox !
Quelquechose du genre : " copie de..."
                                       " copie de.."

Et ainsi de suite !

Merci à toi en tout cas !

Nixeus'
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
Pourquoi est-ce que tu as la class CDirectory qui hérite de Form1?

Le but de ton programme, c'est de copier et renomer dans C:\ le répertoire sélectionné?
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
...et de remplacer dans le nom des fichiers toutes les occurences de "traduire de langue... vers ..."
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Oui,

C'est exact !
J'ai hérité de form1, car je oensait que c'était nécéssaire pour avoir accès à mon contole !

Nixeus'
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
Non ce n'est pas du tout necessaire.
En faite ton problème, c'est que depuis CDirectory, tu veux pouvoir mettre à jour l'avancement.


Ok, alors ce que tu fais, tu supprime l'héritage de Form1 sur CDirectory.


Dans ta classe CDirectory, tu créer un object Form1, par exemple ownerForm1. Tu l'encapsule a la limite.
Ensuite dans form1, quand tu instancie CDirectory, fait comme ca:


CDirectory c =
new
CDirectory { OwnerForm1 =
this };

Maintenant, dans CDirectory, si tu veux atteindre ProcessingBox, tu fais


this.ownerForm1.ProcessingBox. ...

Tu aura encore un autre problème, c'est que les lignes que tu vas ajouter durant le traitement ne s'afficheront pas avant la fin du traitement (a cause que tu utilise pas un thread ).

Aussi, la méthode CopyAll, fais attention: elle est récursive alros si tu copie un dossier avec plein de dossier à l'intérieur, etc tu aura un stackOverFlowException. Regarde si tu peux pas trouver une meilleures méthode.

Comme ca a vu d'oeil, documente toi encore un peu sur les objects: la différence entre une classe et une instance.
Et pour prendre un peu d'avance, regarde aussi les threads, et les delegates.

Redis nous si tu as besoin d'aide.

Au faite, ne fait pas plusieurs poste pour le meme problème, ca sert a rien mise à part que deux personnes vont t'aider sur des fronts différents, et toi t'es au milieu et tu perds la tête
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Merci infiniment pour ton aide,

Je vais voir à cela demain !

Donc si tu penses que je dois passer par un thread pour afficher mon "avancement" dans ma RichEditBox, je ferai cela ! :)

Je dois aussi me concentrer sur ma méthode Rename qui est très crade et "bourrin"

Encore merci :)

Nixeus'
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Bonjour,

Je suis entrain d'éssayer ta méthode, tu me dit donc de créer créer un object Form1, par exemple ownerForm1.

Je créer donc cette objet, avec un deuxième constrcuteur avec un paramètre :

class
CDirectory{

      object ownerForm1;    <----------------

      public CDirectory()
// Constructeur vide      {

      }

      public CDirectory(
object obj)
// Constructeur pas vide      {

         ownerForm1 = obj;

      }

}

Après dans mon autre classe ( FORM1), j'ai  fais cela à l'instanciation :

CDirectory c =
new
CDirectory ( 
this );

Mon problème est que, lorsque je saisie dans ma classe CDirectory:

this.ownerForm1. je n'ai pas accès à "ProcessingBox", qui est ma RichTextBox !

Je ne vois pas mon problème, je continue de chercher cependant !

Merci :)

Nixeus'
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Oups le boulet :(

J'ai cru que tu me disais de créer une variable de type "object"

J'ai remplacé donc

object OwnerForm1 par Form1 OwnerForm1, et ca compile :)

Je teste cela, merci !

Nixeus'
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Yesss, ca marche !!

Maintenant, je vais me rencarder sur les threads, j'en avais déja utilisé un peu ne BTS avec les MFC :)
Je vais voir à cela et surtout comment "agencer" ca avec ma copie !

Merci en tout cas !

Nixeus'
Messages postés
192
Date d'inscription
jeudi 18 janvier 2007
Statut
Membre
Dernière intervention
19 octobre 2020

Au fait, pourquois parles tu de thread pour affiche l'affichage de ma ListBox ?
Car je viens de tester, et tout s'affiche en temps réel, elle est bien rafrachie !

Par contre, oui, le reste du programme misère sec !!!!

Voici comment j'ai fais dans ma méthode CopyAll :

public
void CopyAll(
DirectoryInfo source,
DirectoryInfo target){

      

if (
Directory.Exists(target.FullName) ==
false)      {

            Directory.CreateDirectory(target.FullName);

            string MaString=
"Copie du r‚pertoire"+source.ToString()+
" vers "+target.FullName.ToString()+
"\n";

            this.ownerForm1.ProcessingBox.AppendText (MaString);

             this.ownerForm1.ProcessingBox.ScrollToCaret();        }

      foreach (
FileInfo fi
in source.GetFiles())      {

               fi.CopyTo(

Path.Combine(target.ToString(), fi.Name),
true);

               string MaString =
"Copie de " + fi.ToString() +
" vers " + target.ToString() +
"\n";

               this.ownerForm1.ProcessingBox.AppendText(MaString);

               this.ownerForm1.ProcessingBox.ScrollToCaret();         }

         foreach (
DirectoryInfo diSourceSubDir
in source.GetDirectories())         {

                  DirectoryInfo nextTargetSubDir =                  target.CreateSubdirectory(diSourceSubDir.Name);

                  CopyAll(diSourceSubDir, nextTargetSubDir);

            }

}

Nixeus'
Messages postés
128
Date d'inscription
mardi 18 décembre 2007
Statut
Membre
Dernière intervention
2 août 2009
5
L'idée du deuxième thread, c'est de s'occupé uniquement de la méthode CopyAll (la méthode de calcule/recherche).
Si ton control se rafraichi et que tu as pas mis de thread/backGroundWorker(Classe pour justement faire des tâches en arrière plans), c'est bien mais c'est pas dit que ca dur.
Si tu veux faire propre, créer un thread qui exécutera ta méthode CopyAll. Créer aussi des delegate pour mettre à jours tes controls dans le thread principal.