Vídeo: Visual Basic Editor (VBA) Updates for Excel for Mac 2016 2024
Por Karl G. Kowalski
O desenvolvimento de aplicativos para Macintosh requer criatividade, habilidades de programação Objetivo-C, alguma paciência e uma boa ajuda de persistência para implementar, refinar, e entregue seu aplicativo Macintosh em boas condições de funcionamento para seus usuários. No seu caminho para esse destino, você encontrará alguns desafios que testarão suas habilidades de programação e resolução de problemas. Você deve abordar (entre outras coisas) usando delegados para implementar callbacks do aplicativo; usando estruturas não objetivas-C da Apple; e incorporando código C ++ em seus aplicativos.
Implementando retornos de chamada em aplicativos Macintosh
O desenvolvimento de aplicativos Macintosh usa retorno de chamada para permitir que o Mac OS X execute o código em seu aplicativo para operações específicas. Se você estiver criando uma aplicação padrão de janela de Macintosh ou de documento, o primeiro código que o OS X executará é um dos seguintes métodos de retorno de chamada que você deve criar para o seu aplicativo, dependendo do design do aplicativo:
-
Aplicativos baseados na janela: (void) applicationDidFinishLaunching: (NSNotification *) aNotification
-
Aplicativos baseados em documentos: (void) windowControllerDidLoadNib: (NSWindowController *) windowController
Uma chamada de retorno é simplesmente uma método que o sistema operacional eventualmente executa enquanto está tentando fornecer ou recuperar informações de seu aplicativo. O código do seu aplicativo executará um método para uma classe Cocoa onde seu aplicativo terá a oportunidade de fornecer o nome de um método de uma das suas classes, para ser chamado em um objeto dessa classe, seu aplicativo também terá que fornecer.
Um delegado é um objeto auxiliar, que uma classe Cocoa usa para ampliar a funcionalidade da classe, permitindo que você implemente o código que a classe Cocoa executará em determinadas circunstâncias. Uma classe Cocoa verifica seu objeto delegado (se alguém foi designado) se o delegado fornece uma implementação de um método específico. Se o delegado tiver esse método, a classe Cocoa executa esse método; se o delegado não implementar esse método específico, a classe Cocoa usa um método padrão próprio ou registra um erro. A maioria dos delegados deve incorporar um determinado protocolo que determina quais métodos eles podem implementar; os delegados do seu código devem usar os métodos implementados a partir do protocolo específico que o delegado espera.
Aqui estão alguns dos objetos Cocoa que podem usar delegados para executar seu código:
-
NSTableView.O NSTableView aceita um delegado que obedece ao protocolo NSTableViewDelegate. Isso inclui 20 a 30 métodos que o objeto delegado da sua aplicação pode implementar para suportar a necessidade do seu aplicativo de saber o que o NSTableView está fazendo. Existem métodos que serão chamados no seu aplicativo quando precisar conhecer e reagir a uma ação, como quando um usuário faz uma seleção na tabela ou quando uma coluna é redimensionada.
-
NSApplication. Você pode atribuir um NSApplicationDelegate para lidar com alguns dos métodos que uma instância NSApplication (seu aplicativo) receberá. Esses métodos podem ser chamados imediatamente antes ou logo após o seu aplicativo executar outro método, para que seu aplicativo possa ser preparado.
-
NSWindow. Um NSWindowDelegate atribuído a uma das janelas do seu aplicativo dará ao seu aplicativo a chance de responder a um usuário redimensionando, movendo ou outros eventos de janela.
-
NSMenu. Você implementa um NSMenuDelegate para suportar eventos que acontecem quando um usuário interage com menus em seu aplicativo.
Estruturas não objetivas-C em aplicativos Macintosh
A Apple fornece muitas estruturas de desenvolvimento de aplicativos para Macintosh (bibliotecas de códigos) que seu aplicativo pode chamar para executar as milhares de operações no OS X. Muitas dessas estruturas, como o PDF Kit, são compostos de classes Objective-C, das quais seu aplicativo pode criar e usar objetos dentro de seus aplicativos. No entanto, algumas destas estruturas são apenas bibliotecas de funções que seu aplicativo pode executar.
Por exemplo, a estrutura da rede CFN é um conjunto de funções que seu aplicativo pode usar para executar conexões de rede ajustadas. A classe NSURL fornece um bom conjunto de operações de rede básicas que são ótimas para recuperar dados usando um URL. Se o seu aplicativo requer mais controle sobre as comunicações de rede iniciadas, você terá que usar a estrutura da rede CFN e suas funções. Você poderia usar o seguinte código para preparar uma solicitação HTTP para transmissão para um URL específico:
CFStringRef httpBody = CFSTR ("); CFStringRef headerFieldName = CFSTR (" Cookie "); // adiciona cookie específico à solicitação HTTP CFStringRef headerFieldValue = CFSTR ("loginID = my_user_name; senha = my_password;"); CFStringRef url = CFSTR ("www. Diabeticpad. Com"); CFURLRef urlRef = CFURLCreateWithStrign (kCFAllocatorDefault, url, NULL); CFStringRef requestMethod = CFSTR ("GET"); pedido CFHTTPMessageRef = CFHTTPMessageCreateRequest (kCFAllocatorDefault, RequestMethod, url, kCFHTTPVersion1_1); CFHTTPMessageSetBody (request, httpBody); // adicione o CFHTTPMessageSetHeaderFieldValue cookie (pedido, headerFieldName, headerFieldValue); CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage (request);
Uma vez que seu código tem a solicitação serializada, sua aplicação pode então abrir um fluxo de gravação para entregar a solicitação ao seu destino.
Todos os frameworks Apple baseados em C oferecem um conjunto de funções para executar esse tipo de programação de nível inferior. Seu código ficará mais complicado, mas a Apple não fornece classes Objective-C para todos os seus frameworks.Se você realmente exige a funcionalidade disponível em uma dessas estruturas, esta é a única maneira de alcançar os objetivos do seu aplicativo. Os seguintes frameworks não fornecem classes Objective-C:
-
Caixa de ferramentas de áudio
-
Rede CF
-
Core MIDI
-
Core Text
-
Serviço de diretório (como LDAP e Open Directory)
-
Segurança > Se você quiser criar aplicativos que possam tirar o máximo proveito dos recursos do OS X, você precisa estar pronto para suportar o uso de bibliotecas de códigos que não sejam do Objetivo-C.
C ++ Code em Objective-C Aplicações Macintosh
Objective-C fornece recursos orientados a objetos para desenvolvimento de aplicativos Macintosh, como herança e polimorfismo. O idioma é baseado na linguagem de programação C; portanto, você pode usar seu conhecimento de programação C para codificar dentro do Objective-C. O Objective-C ++ é um mecanismo de ponte que permite que módulos de origem Objective-C funcionem com classes Objective-C ++, que podem compilar e vincular com bibliotecas de código C ++.
O exemplo simples a seguir de uma matriz quadrada mostra o conteúdo de um arquivo de cabeçalho C ++ para uma classe Matrix. A classe Matrix vem com o construtor e o destruidor padrão para uma classe C ++ e os métodos são o que você esperaria para um objeto de matriz quadrada base:
class Matrix {public: Matrix (int inSize); virtual ~ Matrix (); int getSize (void); int getDeterminant (void); vazio setElement (int inRow, int inCol, int inValue); int getElement (int inRow, int inCol); Operador de matriz + (const Matrix & inAddend); privado: int m_size; int [] [] m_elements;};
Para usar o Objective-C ++, seus módulos de classe Objective-C ++ devem usar a extensão do arquivo. milímetros. Isso diz ao compilador do Xcode que a classe deve ser compilada usando Objective-C ++, o que permitirá que sua classe use palavras-chave de linguagem C ++. Usando o Objective-C ++, seu aplicativo pode criar um objeto Matrix para executar operações básicas, como adicionar dois objetos Matrix juntos. Isso pressupõe que o módulo de Origem Objective-C ++ tenha importado a Matriz C ++. arquivo h:
- (void) addTwoMatrices {Matriz matrixOne (3); // Matriz 3x3 Matriz matrixTwo (3); // outra int rowIndex = 0; int colIndex = 0; para (rowIndex = 0; rowIndex <3; ++ rowIndex) {para (colIndex = 0; colIndex <3; ++ colIndex) {// definir os elementos da matriz um para seus valores matrixOne. setElement (rowIndex, colIndex, XXX); // configura os elementos da matriz dois em alguns outros valores matrixTwo. setElement (rowIndex, colIndex, YYY);}} Matriz matrixSum = matrixOne + matrixTwo;
Com o Objective-C ++, seus aplicativos podem tirar proveito de todas as bibliotecas de terceiros disponíveis escritas para C ++.