Problème de "récupération du clavier" sans fichier nib
Kirol
Membre
Bonjour, je me suis lancé dans l'écriture de ma première application cocoa.
C'est un tout petit programme qui ouvre une fenêtre pour saisir un mot de passe et qui après validation le renvois sur la sortie standard. Il est destiné a être utilisé dans mes scripts bash (exécuté dans un contexte hors terminal) notamment pour la command "sudo" via les commandes :
Donc dans un premier temps j'ai écris mon petit programme à l'aide de l'interface builder et tout et tout, qui fonctionne correctement, et dans un deuxième temps je l'ai modifié afin de pouvoir sortir le "binaire" du package de l'application et le rendre autonome comme une application ligne de commande classique.
Voici donc le Main modifié :
et la class pwdboxAppDelegate gérant le protocole NSApplicationDelegate :
Mais voila le probléme : je sors le "binaire pwdbox" de son package et le colle sur le bureau, le lance, une fenêtre terminal s'ouvre et ma fenêtre de saisie s'affiche mais ...
1: la fenêtre n'est pas active alors que la commande suivante presente dans le main était censée corriger ce probléme:
2: Qd j'active la fenêtre et tape du texte, le texte s'affiche dans la fenêtre du terminal et non dans le TextField ma fenêtre /crybaby.gif' class='bbc_emoticon' alt=' ' />
Je ne m'en sors pas, une bonne âme pourrait il jeter un coup d'oeil et m'indiquer ce que j'ai oublié de faire ?
Merci d'avoir pris le temps de me lire.
C'est un tout petit programme qui ouvre une fenêtre pour saisir un mot de passe et qui après validation le renvois sur la sortie standard. Il est destiné a être utilisé dans mes scripts bash (exécuté dans un contexte hors terminal) notamment pour la command "sudo" via les commandes :
<br />
[color=#808080]#!/bin/bash[/color]<br />
export SUDO_ASKPASS=$(dirname "$0")"/[color=#ff0000]pwdbox[/color]"<br />
SUDO="sudo -A"<br />
$SUDO ifconfig ........<br />
Donc dans un premier temps j'ai écris mon petit programme à l'aide de l'interface builder et tout et tout, qui fonctionne correctement, et dans un deuxième temps je l'ai modifié afin de pouvoir sortir le "binaire" du package de l'application et le rendre autonome comme une application ligne de commande classique.
Voici donc le Main modifié :
<br />
[color=#808080]//<br />
// main.m<br />
// pwdbox<br />
//<br />
// Created by Kirol on 01/02/12.<br />
// Copyright 2012 __MyCompanyName__. All rights reserved.<br />
//[/color]<br />
#import <Cocoa/Cocoa.h><br />
#import "pwdboxAppDelegate.h"<br />
<br />
int [color=#0000cd]MainNoBundle[/color](int argc, const char *argv[])<br />
{<br />
pwdboxAppDelegate *delegate = [[[color=#ff0000]pwdboxAppDelegate[/color] alloc] [color=#ff0000]initNoBundle:TRUE[/color]];<br />
NSApplication *app = [NSApplication sharedApplication];<br />
[color=#808080]//MyNoBundleApp *app = [[MyNoBundleApp alloc ] init];<br />
<br />
//[app activateIgnoringOtherApps:YES];[/color]<br />
<br />
[app setDelegate:delegate];<br />
<br />
[color=#808080] //NSLog( @"Mode No Bundle" );[/color]<br />
<br />
[app run];<br />
<br />
[delegate release];<br />
return( 0 );<br />
}<br />
int main(int argc, char *argv[])<br />
{<br />
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];<br />
NSFileManager *fileManager = [[NSFileManager alloc] init];<br />
BOOL bExist = TRUE;<br />
BOOL bDirectory;<br />
NSString *bundlePath;<br />
NSString *executablePath;<br />
NSString *plistPath;<br />
int iRet;<br />
<br />
[color=#0000cd] [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];[/color]<br />
<br />
bundlePath = [[NSBundle mainBundle] bundlePath];<br />
executablePath = [[NSBundle mainBundle] executablePath];<br />
plistPath = [NSString stringWithFormat:@"%@/Contents/Info.plist", bundlePath ];;<br />
<br />
[color=#808080]//NSLog( @"bundlePath:%@", bundlePath );<br />
//NSLog( @"executablePath:%@", executablePath );<br />
//NSLog( @"plistPath:%@", plistPath );[/color]<br />
<br />
<br />
bExist = [fileManager fileExistsAtPath:plistPath isDirectory:&bDirectory];<br />
<br />
[fileManager release];<br />
[bundlePath release];<br />
[executablePath release];<br />
[plistPath release];<br />
<br />
if( bExist )<br />
iRet = NSApplicationMain(argc, (const char **) argv);<br />
else<br />
iRet = [color=#0000cd]MainNoBundle[/color](argc, (const char **) argv);<br />
<br />
[pool drain];<br />
<br />
return iRet;<br />
}<br />
et la class pwdboxAppDelegate gérant le protocole NSApplicationDelegate :
<br />
[color=#808080]//<br />
// pwdboxAppDelegate.m<br />
// pwdbox<br />
//<br />
// Created by Kirol on 01/02/12.<br />
// Copyright 2012 __MyCompanyName__. All rights reserved.<br />
//[/color]<br />
#import "pwdboxAppDelegate.h"<br />
@implementation pwdboxAppDelegate<br />
@synthesize window;<br />
@synthesize btnPasswd;<br />
@synthesize txtPasswd;<br />
- (id)init {<br />
return [self initNoBundle:FALSE];<br />
}<br />
- (id)initNoBundle:(BOOL)bNoBundle {<br />
<br />
bModeNoBundle = bNoBundle;<br />
<br />
return [super init];<br />
}<br />
- (void)initUI {<br />
<br />
CGFloat iHeight = 60;<br />
CGFloat iWidth = 340;<br />
<br />
<br />
[color=#808080] //NSLog( @"Init UI" );[/color]<br />
if( !self.window ) {<br />
<br />
self.window = [[NSWindow alloc] init];<br />
}<br />
<br />
if( self.window ) {<br />
<br />
//NSApplication *app = [NSApplication sharedApplication];<br />
<br />
self.window.title = @"Authentification";<br />
[self.window setStyleMask:NSTitledWindowMask | NSClosableWindowMask];<br />
[color=#808080] //Taille de la fenetre[/color]<br />
[self.window.contentView setFrame:NSMakeRect(0,0,iWidth,iHeight)];<br />
[color=#808080]//déplacer et changer la taille de la fenêtre principale[/color]<br />
[self.window setFrame:NSMakeRect(0,0,iWidth,iHeight) display:YES animate:YES];<br />
[self.window center];<br />
<br />
<br />
<br />
NSTextField *lblPasswd = [[NSTextField alloc] initWithFrame: NSMakeRect(10, 8, 100, 20)];<br />
lblPasswd.stringValue = @"Mot de passe : ";<br />
[lblPasswd setSelectable:NO];<br />
[lblPasswd setEditable:NO];<br />
[lblPasswd setBordered:NO];<br />
[lblPasswd setDrawsBackground:NO];<br />
[lblPasswd setBezeled:NO];<br />
[self.window.contentView addSubview: lblPasswd];<br />
<br />
<br />
self.txtPasswd = [[NSSecureTextField alloc] initWithFrame: NSMakeRect(105, 10, 150, 20)];<br />
self.txtPasswd.stringValue = @"";<br />
[self.window.contentView addSubview: self.txtPasswd];<br />
<br />
<br />
self.btnPasswd = [[NSButton alloc] initWithFrame: NSMakeRect(260, 0, 75, 35)];<br />
self.btnPasswd.bezelStyle = NSRoundedBezelStyle;<br />
self.btnPasswd.title = @"Valider";<br />
[self.window.contentView addSubview: self.btnPasswd];<br />
<br />
// ACTION:<br />
[color=#808080] //delegate sur cette class afin de gerer la fermeture de la fenetre (voir - windowShouldClose plus bas)[/color]<br />
[self.window setDelegate:self];<br />
<br />
[color=#808080]//delegate sur cette class afin de gerer les touche ESC/RETURN (voir - control plus bas)[/color]<br />
[self.txtPasswd setDelegate:self];<br />
<br />
self.btnPasswd.target = self;<br />
self.btnPasswd.action = @selector(validerPasswd:);<br />
<br />
<br />
[color=#808080]//Gestion du Focus<br />
//[self.window makeFirstResponder:nil];<br />
<br />
//[self.window becomeMainWindow];<br />
//[self.window becomeKeyWindow];[/color]<br />
[color=#ff0000] [self.window makeFirstResponder:self.txtPasswd];<br />
[self.window setInitialFirstResponder:self.txtPasswd];[/color]<br />
}<br />
<br />
}<br />
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {<br />
[color=#808080]// Insert code here to initialize your application[/color]<br />
<br />
<br />
[color=#ff0000]if( bModeNoBundle ) {<br />
[self initUI];<br />
}[/color]<br />
<br />
[color=#808080]// Fenetre En Topmost[/color]<br />
if( self.window ){<br />
[self.window setLevel: NSMainMenuWindowLevel];<br />
[self.window makeKeyAndOrderFront:self];<br />
}<br />
<br />
}<br />
Mais voila le probléme : je sors le "binaire pwdbox" de son package et le colle sur le bureau, le lance, une fenêtre terminal s'ouvre et ma fenêtre de saisie s'affiche mais ...
1: la fenêtre n'est pas active alors que la commande suivante presente dans le main était censée corriger ce probléme:
<br />
[color=#0000cd][[NSApplication sharedApplication] activateIgnoringOtherApps:YES];[/color]<br />
2: Qd j'active la fenêtre et tape du texte, le texte s'affiche dans la fenêtre du terminal et non dans le TextField ma fenêtre /crybaby.gif' class='bbc_emoticon' alt=' ' />
Je ne m'en sors pas, une bonne âme pourrait il jeter un coup d'oeil et m'indiquer ce que j'ai oublié de faire ?
Merci d'avoir pris le temps de me lire.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Information trouvé sur ce site http://cocoawithlove...rogramming.html
Je vous remets le code complet du programme qui pourra peut être servir a un newbie comme moi
Main.m:
pwdboxAppDelegate.h:
pwdbosAppDelegate.m:
Pour la construction de la fenêtre tu te complique la vie.
Utilise la méthode :
Il faut mieux utiliser la méthode d'initialisation préconiser par la classe.