Bouton copier

CeetixCeetix Membre
10:42 modifié dans API AppKit #1
Bonsoir, bonsoir !

J'ai créé une action copier et j'aimerai qu'en cliquant sur mon bouton le texte qui est dans un NSTextField soit copié, (comme un Pomme + C) .

J'ai cherché dans la doc et j'ai pas trouvé...
Merci :)

Réponses

  • CéroceCéroce Membre, Modérateur
    10:42 modifié #2
    hum...

    Essaie

    [nil copy:self];
    

    Si ça marche, je t'expliquerai pourquoi  :P
  • CeetixCeetix Membre
    10:42 modifié #3
    Eh bien tu n'auras pas besoin de m'expliquer lol.

  • CéroceCéroce Membre, Modérateur
    10:42 modifié #4
    Bon alors essaie:

    [NSApp sendAction:@selector(copy:) to:(id)nil from:self];
    
  • CeetixCeetix Membre
    10:42 modifié #5
    Tu peux me dire comment tu t'en sers? J'ai genre :

    <br />-(IBAction)copy:(id)sender<br />{<br />	NSString *string = [[NSString alloc]init];<br />	string = @&quot;Hello!&quot;;<br />	<br />	 //[NSApp sendAction:@selector(copy:) to:(id)nil from:self];<br />	<br />}<br />
    


    Je voudrai donc qu'ne cliquant le texte Hello! soit copié.
  • CéroceCéroce Membre, Modérateur
    10:42 modifié #6
    Ah oui, mais là , c'est plus ta question de départ!
    Je t'ai donné le code pour simuler l'action du menu Copier.

    Mais ce que tu veux faire, c'est mettre une chaà®ne dans le presse-papier:

    [[NSPasteboard generalPasteboard] setString:@&quot;Hello&quot; forType:NSStringPboardType];
    


    ça devrait marcher. (Je ne crois pas qu'il faille déclarer les types ici).
  • AliGatorAliGator Membre, Modérateur
    novembre 2008 modifié #7
    Mmmmh je vois l'idée ceetix, envoyer le message à  nil c'est pour que ça soit envoyé au FirstResponder puis à  la responderChain et donc que ça copie bien le texte en cours ?
    Mais heu elle existe cette méthode "copy" de NSTextField pour copier le contenu dans le presse-papiers ? Je la vois pas moi...

    Pour moi il faut passer par NSPasteBoard
    NSString* strToCopy = [monTextField stringValue];<br />[[NSPasteboard generalPasteboard] setString:strToCopy forType: NSStringPboardType];
    
  • CeetixCeetix Membre
    10:42 modifié #8
    MErci ali mais il me dit n pas connaitre NSPasteBoard :(
  • CeetixCeetix Membre
    10:42 modifié #9
    Bizar avec la ligne de Céros et en remplaçant par ma variable de NSStrng le compilateur accepte .. mais ca ne marche pas quand meme ... :(
  • CeetixCeetix Membre
    10:42 modifié #10
    Bon après une recherche sur le NSPasteBoard j'ai trouvé mon bonheur ^^.
    Voici pour vous :)

    <br /><br />NSString *string = [[NSString alloc]init];<br />NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];<br />string = @&quot;Hello&quot;;<br />[pasteBoard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:nil];<br />[pasteBoard setString:result forType:NSStringPboardType];<br />
    


    Tout marche :)
  • 10:42 modifié #11
    oula je te conseille de faire plutôt :
    <br />NSString* string = @&quot;hello&quot;;<br />
    
  • CeetixCeetix Membre
    10:42 modifié #12
    Eu oui en effet c'est juste que dans mon vrai cas je recupere le text d'un NSTextField  ^^.
  • AliGatorAliGator Membre, Modérateur
    10:42 modifié #13
    Ouaip désolé j'ai mis une majuscule en trop, le B est en minuscule ;) J'avais pas testé mon code :P

    Sinon en effet comme le dit Louka il y a une fuite mémoire flagrante dans ton extrait de code, tu alloues de la mémoire pour une chaà®ne que tu n'utilises pas, puisque peu après tu affectes une toute autre valeur (une NSString littérale @Hello) à  la variable string, donc la valeur précédemment contenue dans la variable "string" (ta NSString que tu as alloc+init) est perdue (tu n'as plus aucune variable qui pointe dessus) mais n'a pas été relâchée (release)... Enfin bon le temps que j'écrive ces lignes, à  priori tu dis que c'est juste une petite erreur au moment de poster donc bon ça va :P


    Par contre si tu veux copier/récupérer la chaà®ne du FirstResponder (élément qui a le focus et récupère les événements claviers) quel qu'il soit et non pas un NSTextField en particulier (même si ce n'est pas le field actuellement édité), là  j'imagine qu'il faut faire envoyer le message "stringValue" à  NSApp qui va le relayer au FirstResponder... mais ce que je me demande si on part dans ce cas d'utilisation là , c'est si au moment où l'on clique sur le Bouton, est-ce que ce n'est pas le bouton qui risque de devenir FirstResponder et non plus l'hypothétique NSTextField qu'on était en train d'éditer juste avant le clic ??
  • 10:42 modifié #14
    Voici le code que m'avait filé Ali il y a un moment (il me semble bien que c'était toi) :

    <br />NSPasteboard *pb = [NSPasteboard pasteboardWithName:NSGeneralPboard];<br />	[pb declareTypes: [NSArray arrayWithObjects:@&quot;public.url&quot;,<br />												@&quot;public.url-name&quot;,<br />													nil]<br />		owner:self];<br />	<br />	[pb setString:@&quot;Objective-Cocoa&quot; forType:@&quot;public.url-name&quot;];<br />	[pb setString:@&quot;http://www.objective-cocoa.org&quot; forType:@&quot;public.url&quot;];<br />
    


    En gros on cache une URL dans un texte.. ce qu'on appelle donc "Hyperlien".

    Bon ça a peut-être aucun rapport avec ce que tu veux faire, mais c'est juste pour te montrer les autres possibilités :)
  • Philippe49Philippe49 Membre
    10:42 modifié #15
    dans 1227900852:

    Bon après une recherche sur le NSPasteBoard j'ai trouvé mon bonheur ^^.
    Voici pour vous :)

    <br /><br />NSString *string = [[NSString alloc]init];<br />NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];<br />string = @&quot;Hello&quot;;<br />[pasteBoard declareTypes:[NSArray arrayWithObjects:NSStringPboardType, nil] owner:nil];<br />[pasteBoard setString:result forType:NSStringPboardType];<br />
    


    Tout marche :)


    dans 1227901018:

    oula je te conseille de faire plutôt :
    <br />NSString* string = @&quot;hello&quot;;<br />
    



    Oui, sinon l'instruction NSString *string = [[NSString alloc]init]; alloue une chaà®ne, la retient, et elle n'est jamais détruite (released), d'où une fuite mémoire.
  • CeetixCeetix Membre
    10:42 modifié #16
    Merci pour vos messages.

    Pour mon allocation mémoire de chaine
    je fais : NSString *machaine = [[NSString alloc]init];
    machaine = string = [textField stringValue];


    Son usage est donc justifié non?
    Sinon je dois faire mes release dans quelle partie?

    Et j'ai une autre question qui n'a rien à  voir avec ce poste (mais pas trop envie de poster pleins de sujets). J'ai envie d'afficher une image quand on exécute mon application, style photoshop ou office, une image simple dans le vide et hop après mon programme. Il y a moyen de faire ca? C'est un projet pour mon école et j'ai envie de me la péter ^
  • Philippe49Philippe49 Membre
    novembre 2008 modifié #17
    dans 1227959081:

    Merci pour vos messages.

    Pour mon allocation mémoire de chaine
    je fais : NSString *machaine = [[NSString alloc]init];
    machaine = string = [textField stringValue];
    Son usage est donc justifié non?

    Non le  [[NSString alloc]init] crée une chaà®ne, appelons-la ch1, en mode retain, dont la référence sera perdue. En effet machaine pointe  à  la ligne suivante sur une autre chaà®ne. Tu ne pourras plus atteindre ch1 puisque tu en as perdu l'adresse, et aucun release ne sera possible.
    Il est suffisant de faire 
    NSString *machaine ;
    machaine = string = [textField stringValue];


    ou

    [string release];
    string = [textField stringValue];
    [string retain];

    J'ai supprimé machaine car je ne vois pas l'intérêt d'avoir deux variables, mais à  toi de voir
  • Philippe49Philippe49 Membre
    10:42 modifié #18
    dans 1227959081:

    Et j'ai une autre question qui n'a rien à  voir avec ce poste (mais pas trop envie de poster pleins de sujets). J'ai envie d'afficher une image quand on exécute mon application, style photoshop ou office, une image simple dans le vide et hop après mon programme. Il y a moyen de faire ca? C'est un projet pour mon école et j'ai envie de me la péter ^


    Tu crées une fenêtre transparente, et sans bordure -- > Doc de NSWindow
    Tu y installes programmatiquement une NSImageView
  • CeetixCeetix Membre
    10:42 modifié #19
    Ok merci pour les String ! J'ai fait ta seconde méthode.
    Pour la réponse à  ma deuxieme question ,je nage un peu ^^
  • Philippe49Philippe49 Membre
    10:42 modifié #20
    NSWindow* window=[[NSWindow alloc] initWithContentRect:NSMakeRect(100.,100.,500.,800.)
    styleMask: NSBorderlessWindowMask
    backing:NSBackingStoreBuffered
    defer:NO];
    [window setAlphaValue:0.2];
    [window makeKeyAndOrderFront:self];

  • CeetixCeetix Membre
    10:42 modifié #21
    Hum ok et apres ca tu crées ton NSImageView ?
    Mais tu implemantes ça où ? Dans ton main() ? Car j'ai plusieur classe pour mes vue mais c'es tout. Je vois pas où mettre ca...
    Il faut un timer aussi? pour lui dire de rester tant de temps à  l'écran.
  • Philippe49Philippe49 Membre
    10:42 modifié #22
    dans 1227964766:

    Mais tu implemantes ça où ? Dans ton main() ? Car j'ai plusieur classe pour mes vue mais c'es tout. Je vois pas où mettre ca...
    Il faut un timer aussi? pour lui dire de rester tant de temps à  l'écran.

    Tu déclares une classe AppDelegate héritant de NSObject.
    Tu l'instancies dans le nib.
    Tu lui attribues le rôle de delegate de l'application (toujours dans le nib) et (peut-être ?) de la Window
    Tu lui attribues la Window comme IBOutlet

    Après tu dois pouvoir te débrouiller avec les notifications applicationWillFinishLaunching ou celles de la window pour orchestrer la mise en scène.
  • CeetixCeetix Membre
    10:42 modifié #23
    Ok !!
    Merci beaucoup :)
Connectez-vous ou Inscrivez-vous pour répondre.