importer une variable d'une autre class

Bonjour



Je débute sous cocoa et je bloque sur un pbl. j'ai une class MyDocument et une class MaClass (je sais, pas trop originale !!). Suite à  des futurs calculs réalisés dans MaClass, je veux les importer dans MyDocument pour les afficher.



Dans MyDocument.m, j'ai fait :



-(IBAction) visuTest image/sad.png' class='bbc_emoticon' alt=':(' />id)sender

{



int i = 1;

i=/color]essaiMaClass[color=#000000] [/color][color=#31595d]getEssaiTest[/color][color=#000000;






[valTest setIntValue:i];


}





et dans MaClass.m j'ai fait



-(int) getEssaiTest

{

return 10;




}



Mais bien sûr, ça ne marche pas.



sachant également que j'ai fait dans MyDocument.h





#import "MaClass.h"




@interface MyDocument : NSDocument

{



MaClass *essaiMaClass;




}



Que dois je faire image/huh.gif' class='bbc_emoticon' alt='???' />



Merci d'avance
«1

Réponses

  • AliGatorAliGator Membre, Modérateur
    Hello !


    'Fred20' a écrit:


    Que dois je faire image/huh.gif' class='bbc_emoticon' alt='???' />


    1) Aller te présenter dans la section dédiée du forum, pour ton premier post, et pour aussi qu'on ait une idée de ton niveau, ton bagage, etc

    2) Editer ton message et utiliser la balise CODE autour du code que tu as mis dans ton message, pour le formatter correctement et qu'il puisse être lisible

    3) Instancier ta classe pour pas qu'elle soit nil quand tu lui envoies le message.
  • Merci AliGator

    Donc vola, c'est fait, je me suis présenté sur le forum et bien sûr je penserai à  utiliser les balises.

    Pour le 3e point, tu dis qu'il faut instancier ma classe ... en d'autres termes, ça veut dire quoi ? et du coup, on fait ça comment image/huh.gif' class='bbc_emoticon' alt='???' /> !!



    merci de me donner ce coup de pouce.
  • Coup de pouce: image/thumbsup.gif' class='bbc_emoticon' alt='' />



    Bon plus sérieusement:

    http://www.cocoalab.com/BecomeAnXcoder.pdf
  • Merci pour ce lien



    Bon l'anglais n'est pas mon fort même si j'ai bien compris que la majeure partie des réponses sont en anglais mais je vais fouiner
  • AliGatorAliGator Membre, Modérateur
    Oui, pour faire simple, si le terme "instancier ta classe" ça ne te parle pas, c'est qu'il te manque les bases de POO (Programmation Orienté Objet), car les classes, les instances de classes, et l'instantiation d'un objet sont des concept génériques à  tous les langages orientés objets (et pas qu'à  Objective-C).



    Je te conseille donc de bien prendre ton temps pour lire un bon bouquin (papier ou PDF) qui explique les bases de la POO et d'Objective-C pour avoir des bases solides avant d'avancer, sans ça beaucoup de termes comme "instancier une classe" ne vont pas te parler et tu vas être frustré à  ne pas pouvoir avancer. Une fois ces concepts de base bien compris et maà®trisés, cela te sera alors bien plus facile pour la suite.
  • si si, j'ai bien compris la notion de POO , ce ne sont que les termes qui me posent problèmes !!
  • 'ldesroziers' a écrit:


    Coup de pouce: image/thumbsup.gif' class='bbc_emoticon' alt='' />



    Bon plus sérieusement:

    http://www.cocoalab....omeAnXcoder.pdf




    Le même en français si tu préfères; http://www.cocoalab.com/?q=BecomeAnXcoder-Francais



    Je ne sais pas s'ils ont tous été traduits, mais les livres d'Aaron Hillegass sont vraiment excellents pour comprendre l'objective-C et Cocoa.
  • Fred20Fred20 Membre
    juillet 2012 modifié #9
    Merci MonsieurPaul pour ce lien en français. Du reste, je suis après... et j'ai déjà  beaucoup avancé ds le livre de Aaron Hillegass
  • Bonjour à  tous



    j'ai donc suivi vos conseil à  propos d'instancier ma classe. En effet, il me semble que j'avais oublié le alloc. Donc voici ma correction mais ça ne marche pas non plus. Petit rappel, je cherche simplement pour l'instant à  faire varier le contenu d'un objet de MyDocument ( ici valTest) à  partir de MaClass afin de récupérer cet objet modifier dans MyDocument par la suite. En fait, je chercherai par la suite à  récupérer la position d'un clic souris (à  partir de MaVue) et l'afficher grâce à  MyDocument .



    Ceci étant, lorsque je lance j'obtiens ce message (anormal!) :



    Loading 37448 strack frames ... (2%)



    voici MaCLass. h et .m :



    Ma classe MaClasse.h :
    <br />
    //<br />
    //  MaClass.h<br />
    <br />
    #import &lt;Cocoa/Cocoa.h&gt;<br />
    #import &quot;MyDocument.h&quot;<br />
    @class MyDocument;<br />
    @interface MaClass : NSObject {<br />
    NSCalendarDate *entryDate;<br />
    int firstNumber;<br />
    int secondNumber;<br />
    <br />
    int test;<br />
    <br />
    MyDocument *monDocument;<br />
    }<br />
    -(void) setEntryDate : (NSCalendarDate *) date;<br />
    -(NSCalendarDate *)entryDate;<br />
    @property (readonly) int firstNumber;<br />
    @property (readonly) int secondNumber;<br />
    @property (readonly) int test;<br />
    //=================================<br />
    -(int) getEssaiTest;<br />
    -(MyDocument *)getMonDoc;<br />
    -(void) setMonDoc;<br />
    //-(int)firstNumber;<br />
    //-(int)secondNumber;<br />
    @end<br />
    




    ma Classe MaClass.m


    <br />
    //<br />
    //  MaClass.m<br />
    <br />
    #import &quot;MaClass.h&quot;<br />
    #import &quot;MyDocument.h&quot;<br />
    @class MyDocument;<br />
    @implementation MaClass<br />
    <br />
    @synthesize firstNumber;<br />
    @synthesize secondNumber;<br />
    @synthesize test;<br />
    <br />
    -(id) init;<br />
    {<br />
    [super init];<br />
    <br />
    firstNumber = random()%100+1;<br />
    secondNumber = random()%100+1;<br />
    <br />
    monDocument = [[MyDocument alloc]init];<br />
    return self;<br />
    }<br />
    <br />
    -(void) dealloc<br />
    {<br />
    [monDocument release];<br />
    [super dealloc];<br />
    }<br />
    <br />
    -(MyDocument *)getMonDoc<br />
    {<br />
    [[monDocument valTest] setIntValue : 100];<br />
    return monDocument;<br />
    }<br />
    -(void) setMonDoc<br />
    {<br />
    <br />
    NSLog(@&quot;self monDocument de valTest = %@&quot;,[monDocument valTest]);<br />
    <br />
    [[monDocument valTest] setIntValue:100];<br />
    NSLog(@&quot;self monDocument de valTest 2 = %@&quot;,[monDocument valTest]);<br />
    }<br />
    <br />
    






    J'ai du ratter un truc ! Mais quoi image/huh.gif' class='bbc_emoticon' alt='???' />?



    Merci d'avance
  • AliGatorAliGator Membre, Modérateur
    Ton "init" n'est pas conforme aux conventions de codage d'une méthode d'init.

    Il faut appeler le init parent ([super init])... qui te retourne, comme tout "init", potentiellement un nouvel objet.

    Il faut donc écrire :
    <br />
    -(id)init {<br />
      self = [super init]; // penser à  affecter à  self<br />
      if (self) {<br />
        // tes initialisations ici, genre tes 2 random et ton alloc/init de MyDocument dans ton cas<br />
      }<br />
      return self;<br />
    }
    




    Je sais pas si c'est ce qui fait que tu as une boucle infinie dans tes appels (car c'est bien ça qui se passe vu qu'il te dit quand tu debug qu'il charge un nombre colossal de "stack frames" ce qui veut dire que tu as une pile d'appels colossale, (méthode 1 qui appelle méthode 2 qui appelle méthode 3... qui appelle méthode 7000, qui appelle méthode 7001...) ce qui en général est dû à  des appels récursifs (méthode A appelle méthode A... qui donc rappelle méthode A... de façon infinie), mais bon dans tous les cas il faut mieux au moins corriger cette méthode d'init.
  • merci



    je regarde et te tiens au courant
  • Je subodore un alloc de MaClass dans l'init de MyDocument, et donc une cascade d'allocs ...
  • Fred20Fred20 Membre
    juillet 2012 modifié #14
    c'est exact, j'ai bien une boucle sans fin. Bon ça veut dire qu'il faut que je fasse autrement. Le but est donc de récupérer les valeurs de x et y de la souris en instantanée traitées ds MaClasse qui dépend d'un NSVue pour MyDocument qui dépend de NSDocument.

    Je sais récupérer ces valeurs à  la condition que je clique sur un bouton. En revanche, comment faut il faire pour les récupérer automatiquement, c'est à  dire que chaque fois que ma souris bouge, les nouvelles coordonnées sont envoyées



    Merci d'avance
  • mpergandmpergand Membre
    juillet 2012 modifié #15
    'Fred20' a écrit:


    c'est exact, j'ai bien une boucle sans fin. Bon ça veut dire qu'il faut que je fasse autrement. Le but est donc de récupérer les valeurs de x et y de la souris en instantanée traitées ds MaClasse




    On peut récupérer la position de la souris à  tout moment avec:

    [font=courier new,courier,monospace]NSPoint mousePoint=[NSEvent mouseLocation]; // screen coordinates[/font]

    ou encore

    [font=courier new,courier,monospace]NSPoint mousePoint=[[maVue window] mouseLocationOutsideOfEventStream]; // window coordinates[/font]



    Mais la vraie question est: pourquoi faire ?
  • Merci mperand mais mousePoint se fonctionne que sous NSView (enfin il me semble) et l'idée de base est de faire une classe à  part pour traiter la souris (MaClass)
  • mpergandmpergand Membre
    juillet 2012 modifié #17
    'Fred20' a écrit:


    l'idée de base est de faire une classe à  part pour traiter la souris (MaClass)




    Oui mais pour faire quoi ? (bis)



    car je soupçonne que c'est une sous classe de NSView qu'il faut créer ...
  • MickMick Membre
    juillet 2012 modifié #18
    Bonjour,



    Je soupçonne quand même qu'il te manque des bases de la POO.



    Voici comment je m'y prendrais à  peu près :

    Pour respecter le paradigme MVC (Model - View - Controller), je te propose de créer une classe MyDatas (Model) et une classe MyView (la view qui répondra aux clics). Le controller sera l'instance de MyDocument.



    Voici MyDatas
    <br />
    [color=#008324]<br />
    //[/color][color=#008324]<br />
    //  MyDatas.h[/color][color=#008324]<br />
    //  Test[/color]<br />
    <br />
    [color=#d62c24]<br />
    [color=#7a482f]#import [/color]&lt;Cocoa/Cocoa.h&gt;[/color]<br />
    <br />
    <br />
    [color=#c02d9d]@interface[/color] MyDatas : NSObject &lt;NSCoding&gt; {<br />
    [color=#743fa4]NSPoint[/color] lePoint;<br />
    }<br />
    <br />
    [color=#c02d9d]@property[/color] NSPoint lePoint;<br />
    [color=#c02d9d]<br />
    @end[/color]<br />
    <br />
    <br />
    //<br />
    //  MyDatas.m<br />
    //  Test<br />
    <br />
    <br />
    #import &quot;MyDatas.h&quot;<br />
    <br />
    <br />
    @implementation MyDatas<br />
    <br />
    <br />
    - (id)initWithCoder:(NSCoder *)aDecoder {<br />
    	if (self=[super init]) {<br />
    		lePoint=[aDecoder decodePointForKey:@&quot;lePoint&quot;];<br />
    	}<br />
    	return self;<br />
    }<br />
    - (void)encodeWithCoder:(NSCoder *)aCoder {<br />
    	[aCoder encodePoint:lePoint forKey:@&quot;lePoint&quot;];<br />
    }<br />
    - (id) init<br />
    {<br />
    	self = [super init];<br />
    	if (self &#33;= nil) {<br />
    		lePoint=NSZeroPoint;<br />
    	}<br />
    	return self;<br />
    }<br />
    <br />
    @synthesize lePoint;<br />
    <br />
    @end<br />
    <br />
    <br />
    




    Comme tu l'as compris, une instance de MyData devra être créée : soit on créée un nouveau fichier et elle est allouée et initialisée par défaut (méthode init appelée), soit il s'agit d'un fichier que l'on ouvre, et il faut désarchiver via la méthode initWithCoder: (Ce n'est pas toi qui l'appelle directement cette méthode). Il faut aussi évidemment pouvoir archiver les données d'où la méthode encodeWithCoder:



    Ensuite, il faut créer la sous-classe de NSView "MyView" qui répondra à  l'événement mouseDown:
    <br />
    <br />
    [color=#008324]//[/color]<br />
    [color=#008324]//  MyView.h[/color]<br />
    [color=#008324]//  Test[/color]<br />
    [color=#008324]//[/color]<br />
    <br />
    [color=#d62c24][color=#7a482f]#import [/color]&lt;Cocoa/Cocoa.h&gt;[/color]<br />
    [color=#4b8186][color=#c02d9d]@class[/color][color=#000000] [/color]MyDocument[color=#000000];[/color][/color]<br />
    <br />
    [color=#c02d9d]@interface[/color] MyView : NSView {<br />
    [color=#4b8186]MyDocument[color=#000000] *[/color]leDoc[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    [color=#c02d9d]@property[/color] ([color=#c02d9d]assign[/color]) [color=#c02d9d]IBOutlet[/color] MyDocument *leDoc;<br />
    <br />
    [color=#c02d9d]@end[/color]<br />
    <br />
    <br />
    [color=#008324]//[/color]<br />
    [color=#008324]//  MyView.m[/color]<br />
    [color=#008324]//  Test[/color]<br />
    <br />
    <br />
    [color=#d62c24][color=#7a482f]#import [/color]&quot;MyView.h&quot;[/color]<br />
    [color=#d62c24][color=#7a482f]#import [/color]&quot;MyDocument.h&quot;[/color]<br />
    <br />
    [color=#c02d9d]@implementation[color=#000000] MyView[/color][/color]<br />
    <br />
    [color=#c02d9d]@synthesize[color=#000000] leDoc;[/color][/color]<br />
    <br />
    - ([color=#c02d9d]id[/color])initWithFrame:([color=#743fa4]NSRect[/color])frame {<br />
    	[color=#c02d9d]self[/color] = [[color=#c02d9d]super[/color] [color=#40207c]initWithFrame[/color]:frame];<br />
    	[color=#c02d9d]if[/color] ([color=#c02d9d]self[/color]) {<br />
    [color=#008324][color=#000000]		[/color]// Initialization code here.[/color]<br />
    	}<br />
    [color=#c02d9d][color=#000000]	[/color]return[color=#000000] [/color]self[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    - ([color=#c02d9d]void[/color])drawRect:([color=#743fa4]NSRect[/color])dirtyRect {<br />
    [color=#008324][color=#000000]	[/color]// Drawing code here.[/color]<br />
    }<br />
    - ([color=#c02d9d]void[/color])mouseDown:([color=#743fa4]NSEvent[/color] *)theEvent {<br />
    [color=#40207c][color=#743fa4]NSPoint[/color][color=#000000] location=[[/color][color=#c02d9d]self[/color][color=#000000] [/color]convertPoint[color=#000000]:[theEvent [/color]locationInWindow[color=#000000]][/color][/color]<br />
    [color=#40207c]fromView[/color]:[color=#c02d9d]nil[/color]];<br />
    [color=#2e595d][color=#000000][[/color][color=#4b8186]leDoc[/color][color=#000000] [/color]laVueViensDEtreCliquee[color=#000000]:location];[/color][/color]<br />
    }<br />
    [color=#c02d9d]@end[/color]<br />
    <br />
    




    La vue a un outlet qui permet de maintenir un pointeur vers l'instance de MyDocument. (Ne pas oublier de le connecter dans IB...). La méthode mouseDown: a été implémentée de manière à  récupérer le point et d'informer MyDocument de l'événement avec le point en paramètre.



    Voici enfin MyDocument :
    <br />
    <br />
    [color=#008324]//[/color]<br />
    [color=#008324]//  MyDocument.h[/color]<br />
    [color=#008324]//  Test[/color]<br />
    <br />
    <br />
    <br />
    [color=#d62c24][color=#7a482f]#import [/color]&lt;Cocoa/Cocoa.h&gt;[/color]<br />
    [color=#4b8186][color=#c02d9d]@class[/color][color=#000000] [/color]MyDatas[color=#000000];[/color][/color]<br />
    [color=#c02d9d]@class[color=#000000] [/color][color=#4b8186]MyView[/color][color=#000000];[/color][/color]<br />
    <br />
    [color=#c02d9d]@interface[/color] MyDocument : NSDocument<br />
    {<br />
    [color=#4b8186]MyDatas[color=#000000] *[/color]lesDonnees[color=#000000];[/color][/color]<br />
    [color=#4b8186]MyView[color=#000000] *[/color]laVue[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    [color=#c02d9d]@property[color=#000000] ([/color]assign[color=#000000]) [/color]IBOutlet[color=#000000] MyView *laVue;[/color][/color]<br />
    [color=#c02d9d]@property[color=#000000] [/color]float[color=#000000] x;[/color][/color]<br />
    [color=#c02d9d]@property[color=#000000] [/color]float[color=#000000] y;[/color][/color]<br />
    <br />
    - ([color=#c02d9d]void[/color])laVueViensDEtreCliquee:([color=#743fa4]NSPoint[/color])SurCePoint;<br />
    <br />
    [color=#c02d9d]@end[/color]<br />
    <br />
    <br />
    [color=#008324]//[/color]<br />
    [color=#008324]//  MyDocument.m[/color]<br />
    [color=#008324]//  Test[/color]<br />
    [color=#008324]//[/color]<br />
    <br />
    [color=#d62c24][color=#7a482f]#import [/color]&quot;MyDocument.h&quot;[/color]<br />
    [color=#d62c24][color=#7a482f]#import [/color]&quot;MyDatas.h&quot;[/color]<br />
    [color=#c02d9d]@implementation[color=#000000] MyDocument[/color][/color]<br />
    <br />
    [color=#c02d9d]@synthesize[color=#000000] laVue;[/color][/color]<br />
    [color=#c02d9d]@synthesize[color=#000000] x;[/color][/color]<br />
    [color=#c02d9d]@synthesize[color=#000000] y;[/color][/color]<br />
    <br />
    - ([color=#c02d9d]id[/color])init<br />
    {<br />
    	[color=#c02d9d]self[/color] = [[color=#c02d9d]super[/color] [color=#40207c]init[/color]];<br />
    	[color=#c02d9d]if[/color] ([color=#c02d9d]self[/color]) {<br />
    [color=#4b8186]lesDonnees[color=#000000]=[[[/color]MyDatas[color=#000000] [/color][color=#40207c]alloc[/color][color=#000000]] [/color][color=#40207c]init[/color][color=#000000]];[/color][/color]<br />
    	}<br />
    [color=#c02d9d][color=#000000]	[/color]return[color=#000000] [/color]self[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    - ([color=#743fa4]NSString[/color] *)windowNibName<br />
    {<br />
    [color=#d62c24][color=#000000]	   [/color][color=#c02d9d]return[/color][color=#000000] [/color]@&quot;MyDocument&quot;[color=#000000];[/color][/color]<br />
    }<br />
    <br />
    - ([color=#c02d9d]void[/color])windowControllerDidLoadNib:([color=#743fa4]NSWindowController[/color] *) aController<br />
    {<br />
    [color=#40207c][color=#000000]	[[/color][color=#c02d9d]super[/color][color=#000000] [/color]windowControllerDidLoadNib[color=#000000]:aController];[/color][/color]<br />
    }<br />
    <br />
    - ([color=#743fa4]NSData[/color] *)dataOfType:([color=#743fa4]NSString[/color] *)typeName error:([color=#743fa4]NSError[/color] **)outError<br />
    {<br />
    	[color=#c02d9d]if[/color] ( outError &#33;= [color=#c02d9d]NULL[/color] ) {<br />
    [color=#40207c][color=#000000]*outError = [[/color][color=#743fa4]NSError[/color][color=#000000] [/color]errorWithDomain[color=#000000]:[/color][color=#743fa4]NSOSStatusErrorDomain[/color][color=#000000] [/color]code[color=#000000]:[/color]unimpErr[color=#000000] [/color]userInfo[color=#000000]:[/color][color=#c02d9d]NULL[/color][color=#000000]];[/color][/color]<br />
    }<br />
    [color=#743fa4]NSData[/color] *lesDonneesASauver=[[color=#743fa4]NSKeyedArchiver[/color] [color=#40207c]archivedDataWithRootObject[/color]:[color=#4b8186]lesDonnees[/color]];<br />
    [color=#c02d9d]return[/color] lesDonneesASauver;<br />
    }<br />
    <br />
    - ([color=#c02d9d]BOOL[/color])readFromData:([color=#743fa4]NSData[/color] *)data ofType:([color=#743fa4]NSString[/color] *)typeName error:([color=#743fa4]NSError[/color] **)outError<br />
    {<br />
    	[color=#c02d9d]if[/color] ( outError &#33;= [color=#c02d9d]NULL[/color] ) {<br />
    [color=#40207c][color=#000000]*outError = [[/color][color=#743fa4]NSError[/color][color=#000000] [/color]errorWithDomain[color=#000000]:[/color][color=#743fa4]NSOSStatusErrorDomain[/color][color=#000000] [/color]code[color=#000000]:[/color]unimpErr[color=#000000] [/color]userInfo[color=#000000]:[/color][color=#c02d9d]NULL[/color][color=#000000]];[/color][/color]<br />
    }<br />
    [color=#40207c][color=#000000]	[/color][color=#4b8186]lesDonnees[/color][color=#000000]=[[[/color][color=#743fa4]NSKeyedUnarchiver[/color][color=#000000] [/color]unarchiveObjectWithData[color=#000000]:data] [/color]retain[color=#000000]];[/color][/color]<br />
    [color=#c02d9d]return[color=#000000] [/color]YES[color=#000000];[/color][/color]<br />
    }<br />
    - ([color=#c02d9d]void[/color]) dealloc<br />
    {<br />
    [color=#4b8186][color=#000000][[/color]lesDonnees[color=#000000] [/color][color=#40207c]release[/color][color=#000000]], [/color]lesDonnees[color=#000000]=[/color][color=#c02d9d]nil[/color][color=#000000];[/color][/color]<br />
    [color=#40207c][color=#000000][[/color][color=#c02d9d]super[/color][color=#000000] [/color]dealloc[color=#000000]];[/color][/color]<br />
    }<br />
    - ([color=#c02d9d]void[/color])laVueViensDEtreCliquee:([color=#743fa4]NSPoint[/color])SurCePoint {<br />
    [color=#40207c][color=#000000][[/color][color=#c02d9d]self[/color][color=#000000] [/color]willChangeValueForKey[color=#000000]:[/color][color=#d62c24]@&quot;x&quot;[/color][color=#000000]];[/color][/color]<br />
    [color=#40207c][color=#000000][[/color][color=#c02d9d]self[/color][color=#000000] [/color]willChangeValueForKey[color=#000000]:[/color][color=#d62c24]@&quot;y&quot;[/color][color=#000000]];[/color][/color]<br />
    [color=#008324][color=#4b8186]lesDonnees[/color][color=#000000].[/color][color=#4b8186]lePoint[/color][color=#000000]=SurCePoint; [/color]//Le modele est mis à  jour ici.[/color]<br />
    [color=#40207c][color=#000000][[/color][color=#c02d9d]self[/color][color=#000000] [/color]didChangeValueForKey[color=#000000]:[/color][color=#d62c24]@&quot;x&quot;[/color][color=#000000]];[/color][/color]<br />
    [color=#40207c][color=#000000][[/color][color=#c02d9d]self[/color][color=#000000] [/color]didChangeValueForKey[color=#000000]:[/color][color=#d62c24]@&quot;y&quot;[/color][color=#000000]];[/color][/color]<br />
    }<br />
    - ([color=#c02d9d]float[/color])x {<br />
    [color=#4b8186][color=#c02d9d]return[/color][color=#000000] [/color]lesDonnees[color=#000000].[/color]lePoint[color=#000000].[/color][color=#743fa4]x[/color][color=#000000];[/color][/color]<br />
    }<br />
    - ([color=#c02d9d]float[/color])y {<br />
    [color=#4b8186][color=#c02d9d]return[/color][color=#000000] [/color]lesDonnees[color=#000000].[/color]lePoint[color=#000000].[/color][color=#743fa4]y[/color][color=#000000];[/color][/color]<br />
    }<br />
    [color=#c02d9d]@end[/color]<br />
    <br />
    




    les propriétés x et y ont été créées pour permettre à  2 textView d'afficher la valeur des coordonnées.

    Il faut informer des changement de x et y lors de l'accès aux données d'où les willChangeValue et didChangeValue pour que les textView soient mise à  jour. (On aurait aussi pu créer 2 outlets et envoyer le message setFloatValue aux textView ).



    Dans IB (MyDocument) , tu as évidemment compris que tu glisses une NSView, tu indiques dans l'inspecteur que la classe est MyView, tu connectes l'outlet de la Vue à  File's owner (MyDocument)

    Tu glisses 2 textView, accompagnées de leur numberFormatter, et tu "bind" value à  MyDocument , keyPath "x" pour l'un et keyPath "y" pour l'autre.



    Normalement, lorsque tu compiles et lances le projet, tu dois pouvoir cliquer sur la vue => les textView indiquent les coordonnées à  chaque clic. Tu dois pouvoir enregistrer un fichier et l'ouvrir.



    J'espère que ceci te sera utile.
  • Fred20Fred20 Membre
    juillet 2012 modifié #19
    En fait, je cherche à  cliquer sur une image et sur des points précis afin de travailler ensuite sur ces coordonnées. Donc ma classe MyDocument gère les boutons, importe des images et bien sur la fenëtre. Puisque la souris ne peut être gérée que par un NSView , les clicks et leurs coordonnées sont gérées par ma classe Mavue. Il faut donc que je récupère les NSPoint ds MyDocument pour les traiter. Cependant, dans la fenêtre de MyDocument s'affiche les coordonnées de ma souris au fur et à  mesure qu'elle se déplace.

    Mon problème est donc : comment ,lorsque je clique sur ma souris, repérer le click et récupérer mon NSPoint dans MyDocument.



    Voila mon objectif et donc mon problème ...



    Merci de votre aide
  • Merci Mick pour ton aide. Je vais tester cela et te tiendrai au courant
  • Fred20Fred20 Membre
    juillet 2012 modifié #22
    Je viens d'étudier l'exemple de Mick. J'ai bien compris que pour être correct, il faudrait fonctionner en MVC. Sous Qt, ce n'est pas un pbl pour moi. Cependant, ça me parait moins évident en cocoa. J'ai donc tenté de faire quelque chose du plus simple mais qui marche encore partiellement puisque je n'arrive pas à  faire apparaitre le résultat ds ma fenetre et si je clique sur le bouton pour lire mes données, tout est remis à  0 alors que ça fonctionnait bien avant. '

    Donc ma 1ere question est : pourquoi lorsque je clique sur mon bouton, mes x et y sont remis à  zéro alors que lorsque je clique sur mon carré tout fonctionne ?(selon la console)'

    2e question (une fois la première résolue) comment afficher directement mes résultat ?



    Mon exemple n'utilise pas les @property, je ne les maitrise pas encore assez !!



    Voici les codes :


    <br />
    //<br />
    //  MyDocument.h<br />
    //  TestSouris<br />
    <br />
    #import &lt;Cocoa/Cocoa.h&gt;<br />
    <br />
    @interface MyDocument : NSDocument<br />
    {<br />
    IBOutlet NSTextField *pointX;<br />
    IBOutlet NSTextField *pointY;<br />
    }<br />
    -(NSTextField *) getPointX;<br />
    -(void) setPointX:(float)ptX;<br />
    -(NSTextField *) getPointY;<br />
    -(void) setPointY:(float)ptY;<br />
    -(IBAction) afficheXY: (id)sender;<br />
    <br />
    @end<br />
    <br />
    <br />
    //<br />
    //  MyDocument.m<br />
    //  TestSouris<br />
    <br />
    #import &quot;MyDocument.h&quot;<br />
    <br />
    @implementation MyDocument<br />
    -(NSTextField *) getPointX<br />
    {<br />
    NSLog(@&quot;getPointX = %i&quot;,[pointX intValue]);<br />
    return pointX;<br />
    }<br />
    -(void) setPointX:(float)ptX;<br />
    {<br />
    [pointX setIntValue: ptX];<br />
    }<br />
    -(NSTextField *) getPointY<br />
    {<br />
    return pointY;<br />
    }<br />
    -(void) setPointY:(float)ptY;<br />
    {<br />
    [pointY setIntValue: ptY];<br />
    }<br />
    - (id)init<br />
    {<br />
        self = [super init];<br />
        if (self) {<br />
     <br />
      pointX = [[NSTextField alloc]init];<br />
      pointY = [[NSTextField alloc]init];<br />
     <br />
      NSLog(@&quot;init ptX = %i et ptY = %i&quot;,[pointX intValue],[pointY intValue]);<br />
    	    // Add your subclass-specific initialization here.<br />
    	    // If an error occurs here, send a [self release] message and return nil.<br />
     <br />
       <br />
        }<br />
        return self;<br />
    }<br />
    <br />
    -(void) dealloc<br />
    {<br />
    [pointX release];<br />
    [pointY release];<br />
    NSLog(@&quot;passé ds dealloc MyDocument&quot;);<br />
    [super dealloc];<br />
    }<br />
    <br />
    - (NSString *)windowNibName<br />
    {<br />
        // Override returning the nib file name of the document<br />
        // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this method and override -makeWindowControllers instead.<br />
        return @&quot;MyDocument&quot;;<br />
    }<br />
    - (void)windowControllerDidLoadNib:(NSWindowController *) aController<br />
    {<br />
        [super windowControllerDidLoadNib:aController];<br />
     <br />
    NSLog(@&quot;windowControllerDidLoadNib ptX = %i et ptY = %i&quot;,[pointX intValue],[pointY intValue]);<br />
    <br />
    <br />
        // Add any code here that needs to be executed once the windowController has loaded the document&#39;s window.<br />
    }<br />
    - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError<br />
    {<br />
        // Insert code here to write your document to data of the specified type. If the given outError &#33;= NULL, ensure that you set *outError when returning nil.<br />
        // You can also choose to override -fileWrapperOfType:error:, -writeToURL:ofType:error:, or -writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.<br />
        // For applications targeted for Panther or earlier systems, you should use the deprecated API -dataRepresentationOfType:. In this case you can also choose to override -fileWrapperRepresentationOfType: or -writeToFile:ofType: instead.<br />
        if ( outError &#33;= NULL ) {<br />
      *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];<br />
    }<br />
    return nil;<br />
    }<br />
    - (BOOL)readFromData:(NSData *)data ofType:(NSString *)typeName error:(NSError **)outError<br />
    {<br />
        // Insert code here to read your document from the given data of the specified type.  If the given outError &#33;= NULL, ensure that you set *outError when returning NO.<br />
        // You can also choose to override -readFromFileWrapper:ofType:error: or -readFromURL:ofType:error: instead.<br />
       <br />
        // For applications targeted for Panther or earlier systems, you should use the deprecated API -loadDataRepresentation:ofType. In this case you can also choose to override -readFromFile:ofType: or -loadFileWrapperRepresentation:ofType: instead.<br />
       <br />
        if ( outError &#33;= NULL ) {<br />
      *outError = [NSError errorWithDomain:NSOSStatusErrorDomain code:unimpErr userInfo:NULL];<br />
    }<br />
        return YES;<br />
    }<br />
    <br />
    -(IBAction) afficheXY:(id)sender<br />
    {<br />
    NSLog(@&quot;afficheXY ptX = %i et ptY = %i&quot;,[pointX intValue],[pointY intValue]);<br />
    NSLog(@&quot;afficheXY via getPoint X et YptX = %i et ptY = %i&quot;,[[self getPointX] intValue],[[self getPointY] intValue]);<br />
    }<br />
    @end<br />
    <br />
    






    et




    <br />
    //<br />
    //  GestionSouris.h<br />
    //  TestSouris<br />
    //<br />
    <br />
    #import &lt;Cocoa/Cocoa.h&gt;<br />
    #import &quot;MyDocument.h&quot;<br />
    <br />
    @interface GestionSouris : NSView {<br />
    MyDocument *monDocument;<br />
    }<br />
    @end<br />
    <br />
    <br />
    //<br />
    //  GestionSouris.m<br />
    //  TestSouris<br />
    //<br />
    <br />
    #import &quot;GestionSouris.h&quot;<br />
    #import &quot;MyDocument.h&quot;<br />
    <br />
    @implementation GestionSouris<br />
    - (id)initWithFrame:(NSRect)frame {<br />
        self = [super initWithFrame:frame];<br />
        if (self) {<br />
     <br />
      monDocument = [[MyDocument alloc]init];<br />
     <br />
     <br />
    	    // Initialization code here.<br />
        }<br />
        return self;<br />
    }<br />
    -(void) dealloc<br />
    {<br />
    [monDocument release];<br />
    [super dealloc];<br />
    }<br />
    <br />
    - (void)drawRect:(NSRect)dirtyRect {<br />
        // Drawing code here.<br />
    }<br />
    <br />
    -(void) mouseDown:(NSEvent*)event<br />
    {<br />
    NSTextField *TFx = [monDocument getPointX];<br />
    NSTextField *TFy = [monDocument getPointY];<br />
    NSLog(@&quot;mouseDown ptX = %i et ptY = %i&quot;,[TFx intValue],[TFy intValue]);<br />
    NSPoint coordonnesEcran = [NSEvent mouseLocation];<br />
    NSPoint coordonneesFenetres = [[self window] convertScreenToBase:coordonnesEcran];<br />
    NSPoint coordonneesVue = [self convertPoint:coordonneesFenetres fromView:nil];<br />
    <br />
    NSLog(@&quot;coordonnesEcran = %@,&#092;n&quot;<br />
        &quot;coordonneesFenetres = %@,&#092;n&quot;<br />
        &quot;coordonneesVue = %@&quot;,<br />
        NSStringFromPoint(coordonnesEcran),<br />
        NSStringFromPoint(coordonneesFenetres),<br />
        NSStringFromPoint(coordonneesVue));<br />
    <br />
    [monDocument setPointX:coordonneesVue.x];<br />
    [monDocument setPointY:coordonneesVue.y];<br />
    <br />
    NSLog(@&quot;mouseDown changé TFX = %i et TFY = %i&quot;,[TFx intValue],[TFy intValue]);<br />
    NSLog(@&quot;mouseDown changé ptX = %i et ptY = %i&quot;,[[monDocument getPointX] intValue],[[monDocument getPointY] intValue]);<br />
    }<br />
    <br />
    @end<br />
    <br />
    




    merci d'avance
  • mpergandmpergand Membre
    juillet 2012 modifié #23
    Bon, j'ai pas tout lu, car c'est un sac de noe“uds !


    <br />
    - (id)initWithFrame:(NSRect)frame {<br />
    	self = [super initWithFrame:frame];<br />
    	if (self) {<br />
    <br />
      monDocument = [[MyDocument alloc]init];<br />
    <br />
    <br />
    




    un NSDocument créé dans une vue image/crazy.gif' class='bbc_emoticon' alt=' B) ' />



    Faut partir sur des bases saines: dans Xcode créér un projet Document based !
  • Merci Mpegrand pour cet éclairage simple. Juste un petit souci : Comment lies tu la box et à  quoi. J'ai bien vu que le NSTextField était lié à  la box, mais la box elle même ? (sachant que tu as crée un IBOutlet NSBox* box)



    Merci encore
  • mpergandmpergand Membre
    juillet 2012 modifié #25
    En fait l'outlet est relié à  rien, vu que je ne m'en sers pas ...

    A toi de faire ce lien dans IB si tu le souhaites.
  • Ok, j'ai refait le projet en décortiquant l'exemple de mpergand. Je pense maintenant avoir compris. Bon, juste un petit souci, la box n'apparait pas. J'ai pourtant demandé un contour de couleur dans l'inspecteur-> border line mais lorsque je lance l'application, la box n'apparait pas ? J'ai même essayé de la mettre au 1er plan , en rien ? Que c'est il passé ??



    Merci
  • MickMick Membre
    juillet 2012 modifié #27
    Bonjour,



    Le code que tu as posté est comme qui dirait ... bordélique ! Je pense qu'avant toute ligne de code écrite, tu devrais prendre un papier et un crayon pour structurer le projet : de quels genre d'objets ai-je besoin ? qui doit causer avec qui (donc qui doit maintenir un pointeur vers quel autre objet ?) quelles variables d'instances ? quelles méthodes ?...



    Une fois ceci fait, alors on peut allumer le mac et lancer xcode car on sait où on va.



    La POO c'est du design en fait !



    Je te mets le projet test que je t'ai proposé en pj.
  • Merci Mick.Je suis bien d'accord avec toi, mon code est bordelique, mais je ne sais pas encore par ou m'y prendre (d'ou la feuille de papier !!!)

    Bon, j'ai quelques questions sur ton code :



    - Dans MyDocument :

    - tu fais un @property (floa)t x sans déclarer au préalable x. C'est possible ça ??

    - peux tu m'expliquer la méthode "laVueViensDEtreCliquee" : j'ai compris que tu fais passer les valeur du click mais à  quoi servent willChangeValueForKey et didChangeValueForKey et également à  quoi sert [laVue setNeedsDisplay:YES] ??

    - tu fais un alloc init de "lesDonnées" mais pas de "laVue" ??



    - Dans MaVue :

    - tu ne fais pas d'alloc init de monDocument : pourquoi ?? si je comprends bien MyDocument *monDocument sert simplement à  récupérer les méthodes de monDocument ??



    - Dans MyData :

    - peux tu m'expliquer "encodeWithCoder" , "decodePointForKey" et "encodePoint" image/huh.gif' class='bbc_emoticon' alt='???' />



    Je sais ça fait beaucoup de question, mais tu m'envois un truc génial d'un coup !!!



    merci d'avance
  • mpergandmpergand Membre
    juillet 2012 modifié #29
    Le code Mick est sûrement très bien, mais trop complexe pour toi, la preuve tu n'y comprends rien (le KVO, les bindings, les encoders, on verra plus tard)



    Moi, la question que je te pose est pourquoi aurais-tu besoin de récupérer les coordonnées de la souris dans ton NSDocument ?
  • - tu fais un @property (floa)t x sans déclarer au préalable x. C'est possible ça ??


    Tu as raison, c'est mal. Ne déclare que les accesseurs -(float)x et -(float)y, mais pas la propriété. (en debug, ça marche avec la propriété mais pas en release...)
    - peux tu m'expliquer la méthode "laVueViensDEtreCliquee" : j'ai compris que tu fais passer les valeur du click mais à  quoi servent willChangeValueForKey et didChangeValueForKey et également à  quoi sert [laVue setNeedsDisplay:YES] ??


    Et bien, dans cette méthode, appelée par la NSView lorsqu'elle traite l'événement "mouseDown:", j'obtiens le point cliqué, dans les coordonnées de la vue. De ce fait, je dois changer le modèle de données pour que "lesDonnees.lePoint" devienne le nouveau point. J'informe le mécanisme "key value coding" que x et y ont été modifiés (willChange, didChange) cf Key-Value-Coding dans la doc (de c fait, les textView vont être informées du changement car elles sont "bindées" aux clefs x et y de MyDocument : elles vont donc aller rechercher les nouvelles valeurs). le setNeedsDisplay sert à  informer que la vue doit être redessinée. (ici, la vue dessine un cercle centré sur le point).
    - tu fais un alloc init de "lesDonnées" mais pas de "laVue" ??


    NON : La vue sera instanciée lorsque le fichier créé dans IB (MyDocument) sera désarchivé !

    J'aurai pu aussi créer une instance de MyDatas dans IB, je ne l'aurais alors pas instancié dans l'init de MyDocument.

    J'aurai pu ne pas "glisser" une View dans IB, et créer par le code la Vue : je l'aurais alors instanciée avec un alloc initWithFrame:(rectangle).
    tu ne fais pas d'alloc init de monDocument : pourquoi ??


    Parce que je ne veux pas créer une nouvelle instance de MyDocument, j'en ai déjà  une ! je veux juste connaà®tre l'adresse mémoire de cette objet. Je veux donc un pointeur vers cet objet. l'IBOutlet me permet de l'obtenir.
    si je comprends bien MyDocument *monDocument sert simplement à  récupérer les méthodes de monDocument ??


    hein ? leDoc est un pointeur vers l'instance de MyDocument, point ! donc par là  même, permet d'acceder à  ses propriétés et ses méthodes.
    peux tu m'expliquer "encodeWithCoder" , "decodePointForKey" et "encodePoint"


    Pour un document-based application, les classes de la couche "Model" doivent implémenter ces méthodes pour être NSCoding compliant. cf doc pour ce protocole. De cette manière, lors de l'encodage pour archivage du document du "rootObject" ici "lesDonnees", on indique ce qui doit être archivé pour chaque objet, en l'occurence ici, un unique NSPoint. on indique donc dans ces méthodes qu'il faut encoder un point (encodePointForKey) . voir la doc sur l'archivage.



    Je pense qu'il faut que tu lises bien la doc. Si tu es nul en anglais ... euh .. bien .. bon courage !!
  • super sympa pour ces explications. J'essaye de les mettre en place ....
Connectez-vous ou Inscrivez-vous pour répondre.