Você está na página 1de 73

CA-CLIPPER + FIVEWIN

Curso de Iniciação
A documentação entregue neste curso é propriedade de Ortiz de Zíñiga, S.L. Nenhuma parte deste documento pode ser reproduzida ou transmitida de nenhuma forma, nem por nenhum meio, seja eletrônico ou mecânico, com nenhum propósito, sem a previa autorização por escrito de Ortiz de Zíñiga, S.L. © 1997 Ortiz de Zíñiga, S.L. Reservados todos os direitos Tradução para o português do Brasil por Maurício Ventura Faria Janeiro de 2001

INTRODUÇÃO.....................................................................................................................1

O QUE É FIVEWIN?....................................................................................................................1COMPILAR ..................................................................................................................................2LINKAR.... ..................................................................................................................................2ARQUITET URA.............................................................................................................................2UTILITÁ RIOS NECESSÁRIOS............................................................................................3COMO
ORGANIZAR SEU TRABALHO COM

WINDOWS............................................................................3INSTALAÇÃO DO FIVEWIN.............................................................................................................4COMPATIBILIDADE
COM

FIVEWIN..................................................................................................5EXERCÍCIOS.................. ...............................................................................................................5 ELEMENTOS FUNDAMENTAIS DE UMA APLICAÇÃO DE GESTÃO EM WINDOWS............................................................................................................................6 JANELA PRINCIPAL.......................................................................................................................6MENUS. .....................................................................................................................................9BARRA DE BOTÕES.....................................................................................................................10BARRA DE MENSAGENS:..............................................................................................................11CAIXAS DE DIÁLOGO..................................................................................................................11NOSSO
PRIMEIRO PROGRAMA COM

FIVEWIN..................................................................................12EXERCÍCIOS................................ ...............................................................................................13 CONTROLES DO WINDOWS.........................................................................................14 O QUE SÃO OS CONTROLES..........................................................................................................14 TIPOS DE CONTROLES..................................................................................................................17 Botões...............................................................................................................................17B arras de rolagem...........................................................................................................17List boxes..........................................................................................................................18Group boxes.....................................................................................................................18Gets (Edit text).................................................................................................................18Says (Text)........................................................................................................................18Boxes.. ..............................................................................................................................19Radio buttons...................................................................................................................19Check boxes......................................................................................................................19Combo boxes....................................................................................................................19 CONTROLES AVANÇADOS............................................................................................................20 Browses............................................................................................................................20M eters...............................................................................................................................22Bit map (Control)..............................................................................................................23Botão Bar (Button bar)....................................................................................................23Uso de BWCC.DLL..........................................................................................................24 EXERCÍCIOS...............................................................................................................................25 RECURSOS DO WINDOWS............................................................................................26

O
RECURSOS

QUE

SÃO

OS

?.........................................................................................................26RCO U DLL?..........................................................................................................................27TIPOS DE RECURSOS....................................................................................................................28 Diálogos...........................................................................................................................28M enus...............................................................................................................................28Atal hos.............................................................................................................................28Matriz es de Cadeias de Caracteres (String Tables)........................................................28Bitmaps............................................................ .................................................................28Ícones.................................................................. .............................................................29 Cursores...........................................................................................................................29 Fontes...............................................................................................................................30 RESOURCE WORKSHOP...............................................................................................................30 Caixas de Diálogo............................................................................................................32Trabalhando com controles.............................................................................................32Tab Stop...........................................................................................................................32Agrup ando controles........................................................................................................32Ordem dos controles........................................................................................................33Ferramentas de alinhamento e ajuste de tamanho..........................................................33Experimentando uma caixa de diálogo............................................................................33Controles criados pelo usuário........................................................................................33Bitmaps, Ícones e cursores...............................................................................................34 EXERCÍCIOS...............................................................................................................................34 IMPRESSÃO EM FIVEWIN.............................................................................................35 IMPRESSÃO EM MICROSOFT WINDOWS..........................................................................................35O GERADOR DE RELATÓRIOS........................................................................................................36EXERCÍCIOS...... .........................................................................................................................40 MANIPULAÇÃO DE BASES DE DADOS......................................................................41 MUDANÇAS NA PROGRAMAÇÃO....................................................................................................41OO BJ ETO DATABASE.................................................................................................................41EXERCÍCIO S...............................................................................................................................42 O DEBUGGER DO FIVEWIN..........................................................................................43 UTILIZAÇÃO DO DEBUGGER..........................................................................................................43 EXERCÍCIOS...............................................................................................................................43 PROGRAMAÇÃO AVANÇADA......................................................................................44 REFRESH DO SISTEMA.................................................................................................................44MANIPULAÇÃ O DE JANELAS MDI................................................................................................44MENUS FLUTUANTES..................................................................................................................46OS BRUSHES.............................................................................................................................47O CLIPBOARD...........................................................................................................................47A
RQUIVOS

INI..........................................................................................................................48TIMERS..... ...............................................................................................................................48MULTIMÍDI A.............................................................................................................................49CONTROLE
S

VBX.....................................................................................................................49ODBC....... .............................................................................................................................51MANIPULAÇÃ

DE DLLS...........................................................................................................53DYNAMIC DATA EXCHANGE (DDE)............................................................................................54MANIPULAÇÃO DE ARQUIVOS O DE

HELP..........................................................................................55EXERCÍCIOS............................. ..................................................................................................56 OBJECTS: MECANISMO OOPS DO FIVEWIN...........................................................57 HIERARQUIA DE CLASSES.............................................................................................................57A CESSO AOS DADOS E MÉTODOS...................................................................................................58CRIAÇÃO DE
NOVAS CLASSES.......................................................................................................59EXERCÍCIOS............

...................................................................................................................60 CONECÇÃO COM A API DO WINDOWS....................................................................61 COMO CONECTAR?....................................................................................................................61 UM PROGRAMA EM C.................................................................................................................62 EXERCÍCIOS...............................................................................................................................62

Curso CA-Clipper + FiveWin

INTRODUÇÃO

O Que é FiveWin?
FiveWin é uma biblioteca para CA-Clipper que permite a execução de programas sobWindows. Dentro do pacote existe muito mais do que pode-se imaginar a primeira vista, jáque FiveWin proporciona ao CA-Clipper um autêntico ambiente orientado a objetos comcriação de novas classes, herança, polimorfismo, etc. FiveWin utiliza este potencial OOPS para criar suas próprias classes e acessar toda a APIdo Windows sem que o programador tenha necessidade de se comunicar com a mesma,além disso, devido ao fato que o FiveWin incorpora no pacote todos os fontes dessasclasses é realmente simples modificar ou subclassificar qualquer delas para atender nossasnecessidades. Ademais o uso de todas as classes pode ser feito utilizandose comandos aomais puro estilo Dbase, pelo que a utilização do FiveWin é realmente simples. FiveWin nos dá acesso a quase a totalidade de recursos do Windows como por exemplo:
• • • • • • • • •

Ambiente MDI (Multiple Document Interface) Menus pop-up Barras de Botões Bitmaps (Imagens) Fontes True Type Cu rs o res Íco n es Caixas de diálogo Acesso a DLL

1 1 Curso CA-Clipper + FiveWin Compilar Para compilar uma aplicação produzida com FiveWin compile como fazia normalmente: CLIPPER Teste /n/w Quase todas as aplicações escritas com FiveWin necessitam que se inclua a seguinte linha: #include "FiveWin.nul. . Ortiz de Zíñiga. Clipper501_520.. FiveWin WinApi .\include\FiveWin.def Sintaxe . o qual não é fornecido com o CA-Clipperpelo que deverá adquiri-lo a parte...3 ou posterior.É necessário um linker para aplicações Windows. Sintaxe para Microsoft LINK: Link //se:700 //NOE <Aplicação>. L L I I B B 5 0 1 _ 5 2 0 A LIB 501_502 só é necessária se for utilizar Microsoft LINK.0 ou posterior sendo este último o mais recomendado.EXE versão5. S. Pode-se utilizar o linker da Microsoft LINK. MID) Vídeo (AVI) ODB C Ademais FiveWin incorpora a classe TWBrowse para poder produzir browse sob Windows e a classe TReport para produzir qualquer relatório.ch" Linkar FiveWin consiste das seguintes LIBs: • • • F W i i v n e A W p i i n .• • • • • • • • • • Controles VBX Cl i p b o ard Enlaces DDE Arquivos INI M et afi l es M et ers B ru s h es Som (Arquivos WAV.L. ou Blinker 3.

S. As Classes incorporadas ao FiveWin para o desenvolvimento de aplicações Windows fazcom que não seja necessário em quase nenhum caso ter que se aprofundar até o último nívelda API do Windows. se o desejar poderá acessá-lo sem problemas. porém graças ao preprocessador do CAClipper o uso dos mesmos está disfarçado em forma de comandos cuja sintaxe é mais Ortiz de Zíñiga. assim sendo é possível acessar diretamente as classes sem necessidade de utilizar os comandos xBase.L. por exemplo. porém. tenha em mente que quanto mais baixo nível mais controle porém diminui suaprodutividade. Também é recomendado mas não imprescindível a obtenção de um compilador de ‘Helps’se desejar produzir ‘Helps’ sob Windows e documentação sobre a API do Windows emformato Help da Microsoft para sua consulta quando queiramos acessar a API.lnk vem incorporado ao FiveWin. porém. são recursos as imagens. Arquitetura A arquitetura do FiveWin está baseada nos seguintes níveis: 1 C o m a n d o s x B a s e 2 C l a s s e s e o b j e t o s 3 F u n ç õ e s 4 W i n d o w s A P I Utilizando os comandos xBase poderemos rapidamente produzir nossos primeirosprogramas. FiveWin faz um uso extensivo de novos objetos. O compilador de recursos permitirá incluir em seu executável final recursos gerados atravésdo Resource Workshop.para Blinker 3.lnk O arquivo Fivewin. 2 2 Curso CA-Clipper + FiveWin natural. Por exemplo o ícone que possuem todas as aplicações Windows quando se minimizam éum recurso que normalmente se guarda em um arquivo com extensão ICO. os ícones que se encontramem quase todos os programas para Windows.0: Blinker fi Aplicação @FiveWin. . Quando necessitar um pouco mais de controle terá que descer um pouco maisde nível. UTILITÁRIOS NECESSÁRIOS Além do FiveWin e CA-Clipper serão necessárias uma série de utilitários: • • l c e G e i o c e c n m u r u k p r a r e i s d s r l o o o a s r s p d a o r r a d W e i n d o w s r • v ( i R s e u s a o l u r d c e e r W o r k s h o p d a B o r l a n d ) O linker de recursos é necessário já que o fornecido com o CA-Clipper não é capaz de produzir executáveis para Windows.

S.EXE para incluílodefinitivamente no executável. e de fato pode seguir utilizando omesmo de sempre. porém a maioria das ferramentas que vai utilizar são tipo DOS. o linker Blinker 3.0 e provavelmente seu editor de programaçãofavorito. Para juntar este ícone ao executável deverá ser criado umarquivo RC com o Resource WorkShop e utilizar a ferramenta RC. como ocompilador do CA-Clipper. 3 3 .comoveremos em capítulos posteriores pode-se encontrar em um arquivo de extensão RC ouincluso dentro de uma DLL. Ortiz de Zíñiga.L. • Execute seu editor a partir de uma janela DOS para isso deverá carregar oeditor através de um arquivo PIF indicando no mesmo que será executado emuma janela DOS. Não é necessário adquirir nenhum editor para Windows. recomendamos que organize seu ambiente de programação da seguintemaneira: • Crie um grupo novo no Gerenciador de programas no qual incluirá todas as aplicações que esteja desenvolvendo. Como organizar seu trabalho com Windows Os programas que você vai produzir com FiveWin serão autênticos executáveis tipoWindows.

.

.

De qualquer maneira. para desenvolver comodamente a partir do Windows é praticamente necessário um computador 486 com 4Mb de RAM. Instalação do FiveWin FiveWin se instala automaticamente em seu computador sob a seguinte estrutura:   C:\Clipper5 Fwxxx Onde xxx é a versão do FiveWin  Bitmaps algumas imagens para incluir em suas próprias aplicações  Cursors alguns cursores para incluir em suas próprias aplicações  Dll DLL vazia p/ utilizar como armazenador de seus recursos  .Curso CA-Clipper + FiveWin • Se não puder executar o compilador e o linker a partir de seu editor crieum novo ícone de programa no gerenciador de programas para executar ocompilador e o linker a partir do Windows.

para que uma LIB seja compatível comWindows tem que rodar em modo protegido e além disso não deve acessar o hardwarediretamente nem deve utilizar o vídeo já que é domínio exclusivo do Windows e para tantodeve-se utilizar os serviços que o Windows proporciona para acessar estes recursos. Antesde registrar-se certifique-se de que tem somente uma versão do Fivewin.E xe que funciona realmente em Windows. a principio se uma LIB é compatível comWindows também é compatível com FiveWin. paraisso deverá pedir a seu distribuidor que proporcione uma chave de registro. • Se a instalação realizou-se corretamente vá ao diretórioSam pl es e tente criar sua primeira aplicação realizando a seguinte instrução: SAMPLES\Build Tutor01 • Será criado um programa de nomeTu t or01. S. e experimente a nova versão antes de destruir a já existente. • É preferível que cada vez que instale FiveWin o faça em um diretório diferente. Ortiz de Zíñiga. • Se você possui a versão protegida por contra-senha (como é o caso daversão existente na Espanha) será necessário registrar sua versão do FiveWin.lib que é aque quer registrar.L. Vá ao Windows e tente executá-lo. 4 4 Curso CA-Clipper + FiveWin Compatibilidade com FiveWin Quando falamos de compatibilidade temos que distinguir entre compatibilidade comFiveWin e compatibilidade com Windows.bat para acomoda-lo aos ‘paths’ e ‘sets’ de seu computador.txt para conhecer asúltimas melhorias produzidas no FiveWin assim como os possíveis erroscorrigidos. • Leia a informação contida no arquivoWh atsn ew .Icons alguns ícones para incluir em suas próprias aplicações  Ide Ambiente IDE do FiveWin (no operativo pelo momento)  Include Arquivos de Cabeçalho tanto para CA-Clipper como para C  Lib LIBs do FiveWin  Manual Guia Norton  Samples Tutoriais e exemplos  Source Fontes  Classes Classes  Function Funções  Tools Utilitários  Winapi Conecção CA-Clipper e Windows API Por padrão FiveWin é instalado no diretório do CA-Clipper. . • É possível que seja necessário modificar o arquivoS amples\B uild. porém pode-se modifica-lo se o desejar.

num programa para editar arquivos DBF genérico épreferível produzi-lo com um projetoMDI. sempre e quando não se utilize as classes que vemincorporadas na LIB Funcky II. 5 5 Curso CA-Clipper + FiveWin ELEMENTOS FUNDAMENTAIS DEUMA APLICAÇÃO DE GESTÃO EMWINDOWS Janela Principal Toda aplicação Windows deve ter uma janela principal. Geralmente esta janela terá umtítulo ou ‘Caption’.L. como veremos mais adiante. ou seja. como por exemplo LIBs gráficas. um menu. no resto dos casos recomendamos um projeto SDI. não é necessária a existência de todosestes componentes.Devido ao FiveWin incorporar seu próprio mecanismo OOPS é incompatível com outrosmecanismos OOPS existentes como Class(y).B at para o seguinte ambiente: CA-Clipper em diretório D:\CLP 3. nos quais podeseobservar que existe uma janela principal e dentro da mesma existem outras janelas ‘filhas’. que são: • Janela SDI • Janela MDI SDI significa Single document interface. Prepare seu ambiente de programação sob Windows. Exemplos de janelas MDI são ogerenciador de programas e o gerenciador de arquivos ( Windows 3.Quando começar a programar sob Windows se dará conta que grande quantidade das LIBsque estava usando já não são necessárias porque o próprio Windows lhe dá suporte paraproduzir o mesmo . Ademais descobrirá novas formas de LIBs como o são os controles VBX e asDLLs os quais se podem utilizar perfeitamente a partir do FiveWin e sem nenhumalimitação. Six 2. ou seja. Exercícios 1. Que flags são necessários e quais são recomendáveis para o uso do compilador do CA-Clipper com FiveWin? 2. uma barra de botões e uma barra de mensagens em sua parteinferior. ModificarBu i l d. que é utilizado por algumas LIBs comerciais. Ortiz de Zíñiga.No caso do Gerenciador de programas cada janela filha corresponde a um grupo dogerenciador de programas. pode-se usarperfeitamente com FiveWin.logo FiveWin é incompatível com Class(y) e com todas aquelas funções de outras LIBs queutilizem um run-time Class(y). O projetoMDI é mais apropriado quando o programa deve abrir múltiplas instâncias domesmo tipo de documento. etc. por exemplo a LIB Funcky II o utiliza. São compatíveis com FiveWin as LIBs Comix. porém. um único documento ou janela para toda a aplicação eMDI que significa Multiple document interface.0 e parte de Funcky entre outras. entretanto. S. no qual existem múltiplosdocumentos ou janelas dentro da janela principal. que é mais simples de manter e de compreender por parte do usuário. Existem dois tipos diferentes de janela principal. envio defaxes. Ao criar uma aplicação é importante ter em mente que ela será utilizada por um usuário que muitas vezesdesconhece a interface do Windows e a complexidade da aplicação em sua .x ). de acesso a redes locais.

que significa quepossui as seguintes características: • • C M a e p n t u i o d n e o s u i s T t í e t m u a l o .. nDireita . FiveWin permiteindicar.porém o habitual é abrir caixas de diálogo que na realidade são janelas que possuemcaracterísticas especiais que as diferenciam do resto das janelas. que quando ativada abre-se em modo maximizado. Podemos aplicar uma grande variedade de estilos a uma janela. nEsquerda TO nAbaixo. simulamos as coordenadas tipo texto que utilizamos normalmente comCAClipper de linha e coluna. que se possa ser redimensionada. não janelas. por exemplo pressionando um botão de‘Aceitar’ na caixa de diálogo. como por exemplo uma que tenhatítulo. será difícil ousuário aprender a utilizar sua aplicação. Também pode-se construir caixas de diálogonão modais. Nota:Para mais informação sobre a diferença entre janela em estado normal ou maximizado consulte o tutorial do Microsoft Windows. simplesmenteintroduza a cláusula PIXELS no comando. As características das caixas de diálogo serão vistas com mais detalhes num capítulo separado. Se desejar colocar a janela numa posição predefinida: . • • As caixas de diálogo não podem ser redimensionadas As caixas de diálogo não podem conter menus. utilizando um menu. ocupando todo o vídeo.. com coordenadas e estilo prefixados. As janelas podem ter vários estilos ou propriedades. • • As caixas de diálogo podem ser definidas em recursos externos. FROM nAcima. abrir novas janelas. na criação da janela.. A partir de nossa janela principal poderemos. A sintaxe para criar uma janela no FiveWin é a seguinte: #include “Fivewin. S.L.totalidade.ch” Static oWnd Function Main() DEFINE WINDOW oWnd TITLE "Meu programa" ACTIVATE WINDOW oWnd MAXIMIZED return nil Neste exemplo estamos gerando a janela mais comum. que possa ser movida. como o Microsoft Windows faz. Desta forma. Por padrão. não é possível voltar à janela principal atéque a caixa de diálogo seja fechada. 6 6 Curso CA-Clipper + FiveWin • Sua execução é modal.assim sendo. que são: Ortiz de Zíñiga. porém não é o habitual. etc. a janela possuio estilo definido na API do Windows como OVERLAPPED-WINDOW. já que Microsoft Windows utiliza coordenadas em pixels. o estilo que a mesma deve ter. ou seja. Sedesejar utilizar coordenadas em pixels. Os construtores visuais de recursos só manipulam caixas de diálogo. • Todos os ‘controles’ do Microsoft Windows podem ser colocados em caixas de diálogo e quase nunca em janelas. se permitir múltiplas janelas abertas.. cada uma delas diferente..

STYLE nOr( WS_BORDER.. atribuídos quando a janela é ativada.....L.ch que éautomaticamente carregado pelo FiveWin quando se carregaF ivew in . ON LEFT CLICK . S.. ON UP .. ou seja. . ..’ ACTIVATE WINDOW oWnd . ON RIGHT ..ch ou também nohelp on-line da API do Windows que pode ser encontrada em vários produtos comerciais deprogramação Windows ou na internet. ON PAINT . Para isso devemos incluir a cláusula VSCROLL para barras verticais e HSCROLL para as horizontais. VSCROLL HSCROLL Ao colocar barras de rolagem também será possível interceptar as mensagens ou eventos que elas recebem da mesma forma que o resto das cláusulas ‘ON . Também podemos incluir barras de rolagem na janela.. Cada uma das cláusulas que podemos controlar é o que chamaremos um‘E ven to’.. ON DOWN .. Se desejar que a janela principal seja uma janelaMDI simplesmente especifique a cláusula ao criar a janela:DEFINE WINDOW oWnd TITLE "A MDI environment" MDI O FiveWin controla automaticamente todas as mensagens que a janela principal recebe evocê só deve processar aquelas que lhe interessem utilizando uma linguagem de comandossimples que sempre começa pela cláusula‘O N’.... ON RESIZE .• • R B e o d t i õ m e e s n d s e i o n m i á v n i e l m i z a r e m a x i m i z a r Se desejar especificar outros estilos o FiveWin oferece as seguintes cláusulas: • • • • N N N N O O O O S C I Z Y A C O S P O O M T N M E I I N O Z U N E Ortiz de Zíñiga.. DEFINE WINDOW oWnd . ) Os diferentes estilos possíveis podem ser encontrados no arquivoIn cl u de\ Win api .... mas quando tiver mais experiência com FiveWin é possível que sejam de grande utilidade. A princípio não será necessário manipular quase nenhum evento... VSCROLL oDEFINE WINDOW oWnd . ON LEFT ... . 7 7 Curso CA-Clipper + FiveWin Também podemos especificar qualquer combinação delas utilizando diretamente os flags da API do Windows e utilizando a função nOr() do FiveWin: . WS_MAXIMIZE.. ACTIVATE WINDOW oWnd . HSCROLL o as dos DEFINE WINDOW oWnd .quando se produz o evento de pressionamento do botão esquerdo do mouse e este seencontre dentro de nossa janela se executará o código que especificarmos na cláusula ‘ONLEFT CLICK’.. . ....

T. ON PAGEDOWN .. Com o FiveWin não é necessário a seqüência típica ‘DO CASE’ para controlar que opçãofoi selecionada. Menus A estrutura típica de um programa Windows é criar uma janela principal e associar um menu à mesma a partir do qual acessaremos todas as opções da aplicação. então a instrução indicada será avaliada e seretornar . a janela terminará mas não se retornar . pelo contrario.. Se não se especifica nenhuma ação entãonada ocorrerá quando da escolha desse elemento do menu a não ser de que haja umsubmenu que se encarregue desta opção. 8 8 Curso CA-Clipper + FiveWin oWnd:End() Esta instrução indica ao objeto janela que ele deve finalizar. Para finalizar a execução da janela utilize o método‘E nd ’. MENU oMenu MENUITEM <cItem> MESSAGE <cMessage> ACTION <uActio n> MENUITEM <cItem> MESSAGE <cMessage> MENU MENUITEM <cItem> MESSAGE <cMessage> ACTION <uAction> ENDMENU .F. .. se especifica diretamente a açãoque será produzida quando da escolha.. se pressionar “Sim” a função devolverá . para cria-lo só deverá aninhar dentro de uma estrutura MENU . Nosso objeto janela oWnd terá por sua vez definidos os objetos Scrollbar que serão: oWnd:oVScroll e oWnd:oHScroll Assim será possível manipular diretamente os eventos cada um desses objetos recebe.. Podemos especificar todos os submenus que desejarmos e com o aninhamento que sejanecessário.ON PAGEUP . o mais simples possível e criando submenus para englobar opções do mesmotipo.. Ortiz de Zíñiga. e a janela no seráfechada. quando um elemento do menu é definido.F.. Se for especificada a cláusulaVALID quando a janela for ativada. ENDMENUuma nova estrutura MENU ... S.L. se pressionar “Não” a função devolverá . e a janela seráfechada. ENDMENU . A partir do menu o usuário pode acessar todos os processos do programa. SEPARATOR MENUITEM <cItem> MESSAGE <cMessage> ACTION <uAction> ENDMENU ‘MESSAGE e ACTION’ são cláusulas opcionais. VALID MsgYesNo( "Deseja Terminar?" ) Quando tentar fechar a janela a partir do menu de sistema ou pressionando Alt+F4 oprograma mostrará uma caixa de diálogo na qual haverá dois botões “Sim” e “Não” com amensagem “Deseja terminar?”. Por exemplo: ACTIVATE WINDOW oWnd . Deve-se tentar produzir previamente um projeto de seu menu sem faze-lo demasiadocomplicado..T.

[ <_3d: 3D.. Normalmente a barra de botões deve estar na parte superior da janela abaixo do menu. ENDMENU MENUITEM <cItem> MESSAGE <cMessage> ACTION <uAction> Ortiz de Zíñiga.. WINDOW.. Uma barra de botões bem projetada ajuda enormemente no aprendizado e uso de qualqueraplicação. Para incluir uma barra de botões em qualquer janela se utiliza o seguinte comando: #xcommand DEFINE BUTTONBAR [ <oBar> ] .L.. FLOAT> ] . BUTTONSIZE.porém. [ <mode: TOP.. LEFT. [ <wnd: OF... Não utilize imagens sem sentido. Existe a possibilidade de selecionar um aspecto 3D à barra de botões simplesmente adicionando a cláusula 3D na criação da mesma. RIGHT. tente utilizar imagens que deuma forma intuitiva indiquem a ação a produzir quando seja pressionada com o mouse. O propósito desta barra não é outro que oferecer um acesso rápido às opções mais utilizadas de sua aplicação. 3DLOOK> ] .. A barra de botões é uma área da janela na qual se vão alojar uma serie de botões comimagens em seu interior. SIZEBUTTON > <nWidth>. [ <size: SIZE. S. o FiveWin tem a habilidade de colocar a barra de botões onde se desejasimplesmente pressionando o botão direito do mouse. Ortiz de Zíñiga. 9 9 Curso CA-Clipper + FiveWin Para ativar o menu dever-se-á primeiro associa-lo a uma janela.. pelo contrario. . MENU BuildMenu() . A forma mais simples de faze-lo é: DEFINE WINDOW <oWnd> <otherClauses> . Function BuildMenu() local oMenu MENU oMenu MENUITEM <cItem> MESSAGE <cMessage>. Todas as janelas possuem um objeto:oB tnB ar que é onde se guarda a referencia à barra de botões. BOTTOM. DIALOG> <oWnd> ] . 10 10 . <nHeight> ] . S. . As ações que estes botões realizam podem ser opções duplicadasjá existentes em opções de menu visto que a as barras de botões não pode ser acessada apartir do teclado. [ CURSOR <oCursor> ] . ENDMENU return oMenu SET MENU OF <oWnd> TO <oMenu> ou podemos produzi-lo quando a janela esteja criada com o comando: Barra de botões A barra de botões se tornou um padrão dentro dos componentes que podemos encontrar em quase todas as aplicações para Windows.L.MENUITEM <cItem> MESSAGE <cMessage> MENU MENUITEM <cItem> MESSAGE <cMessage> ACTION <uAction> ..

11 11 Curso CA-Clipper + FiveWin . Atualmente em fase Beta e provavelmente disponível quando estiver lendo este documento. FiveWin suporta dois métodos de utilização de caixas de diálogo: • Construídas com código fonte • A partir de recursos gerados com um editor de recursos para Windows O segundo método é o mais aconselhável já que permite definir as caixasvisualmente de uma forma muito rápida e intuitiva. FiveWin mostra a barra de botões com efeito 3D sem necessidade de ter que especifica-lo e opcionalmente lhe permite colocar as mensagens centralizadas na barra de mensagens. com o botão sobre o qual se encontre o cursor do mouse. Uma caixa de diálogo é um objeto e para cria-la utilizaremos a sintaxe típica também utilizada na criação de janelas porém com algumas variações: DEFINE DIALOG oDlg . As caixas de diálogo são janelas especializadas em recolherinformação através de controles padrão do Windows.L. As caixas de diálogo não modais permitem ao usuário fazeroutras coisas enquanto estão ativas.a barra de botões implementará a possibilidade de ter múltiplas colunas com informação detempo. <nLeft> TO <nBottom>.Curso CA-Clipper + FiveWin Barra de mensagens: A barra de mensagens também é um padrão que podemos encontrar em quase todas as aplicações para Windows . A principio e até que esteja um pouco maisfamiliarizado com o Windows utilize unicamente caixas modais já que temos quesaber muito bem o que se está fazendo quando se utilizam caixas não modais. Não é uma prática recomendável utilizar a janela principal de uma aplicação para recolher dados. Ortiz de Zíñiga. [ NAME <cName> ] . No Windows as caixas de diálogo podem ser de duas categorias: • Modais • Não modais As modais são aquelas que não permitem ao usuário produzir nenhuma ação atéque se feche esta caixa de diálogo. setas. para utilizar este método seránecessário um editor de recursos como o Resource WorkShop da Borland. [ FROM <nTop>. <nRight> ] . Caixas de Diálogo Em Windows a introdução de qualquer dado por parte do usuário em uma aplicação se fazatravés das caixas de diálogo. Uma barra de mensagens é um controle que se coloca na parte inferior da janela que mostrainformação relacionada com o elemento de menu que este atualmente selecionado ou. em MSDOS sempre utilizamos caixas dediálogo modais. etc. estado do teclado. S. ouAppStudio da Microsoft ou o Resource Studio da Symantec. nocaso de uma barra de botões.

desta forma o controle saberá a quem ele pertence (seu armazenador). Para ativar a caixa de diálogo utilize o comando ‘Activate’ ACTIVATE DIALOG oDlg Nosso primeiro programa com FiveWin Vamos produzir nosso primeiro programa com FiveWin que terá as seguintes características: • J D M p a B o A e a I e ç n a s n e l a p r i n c i p a l t i p o S • n ã e r t m u o l r r e r a a a n o c d o e m f e u c m h a a r ú n a i c a o j • d n s d d a e o g a e m n m j a e o n s t n e s s í l a o p a g e n n o a “ s m n M c e o e o u m m • i c c p n t r i m e i r o p r o g r a m a FiveWin” • Validação de abandono da aplicação mediante a caixa de diálogo predefinida ‘MsgYesNo’ O código fonte deste pequeno programa pode ser encontrado no disquete com o nome: tutor2\exemplo1. para isso deverá utilizar o comando REDEFINE ID .L. 12 12 . Ortiz de Zíñiga. OF oDlg que será explicado em profundidade mais adiante. Se esta criando a caixa de diálogo a partir de recursos é possível que necessite redefinir algum controle.ch” STATIC oWnd FUNCTION Main() DEFINE WINDOW oWnd TITLE “Meu primeiro programa FiveWin” .. @ <nRow>. pelo contrario se criada com um editor derecursos os controles já estarão criados e só será necessáriored efin i-os para modificaralguma característica dos mesmos se assim o desejar.prg. Será reproduzido aqui por comodidade... S. Depois se está desenhando diretamente a partir de código fonte deverá associar todos oscontroles que esta caixa de diálogo vai ter.A cláusula ‘NAME’ indica o nome desse diálogo se criado através de um editor de recursos.. OF oDlg Lembre-se de especificar sempre ‘OF oDlg’ . <nCol> . Se esta criando a caixa de diálogo diretamente a sintaxe é muito parecida à dos comandos do CA-Clipper. #include “FiveWin.

Os controles devem ser incorporados apenas nas caixas de diálogo. Cada controle do Windows está implementado no FiveWincom uma nova classe para fazer com que seu uso seja realmente simples. Tente adicionar ao programa de exemplo uma barra de botões estilo 3D. mas o importante a se levar em conta é que são objetos e que muitasde suas características são herança da classe genérica janela. 13 13 Curso CA-Clipper + FiveWin CONTROLES do Windows O que são os controles Os controles na realidade são janelas com características especiais para facilitar a entradade dados e a comunicação da aplicação com o usuário. CA-Clipper (sob MSDOS) só possui dois tipos decontroles que seriam o controle GET e o controle SAY que em Windows se chamam EDITTEXT e TEXT.L. . O Windows inclui mais controles que melhoram substancialmente a interface com o usuário. Dizemos que são janelas já quetodos eles são objetos herdados da classe Janela (tWindow) mesmo que à primeira vista separecem muito pouco. 2. Você não temporque saber a princípio como é a hierarquia de classes do FiveWin porém é recomendávelque desde o principio vá adquirindo a sensação de compreender como realmente é FiveWinpor dentro.Curso CA-Clipper + FiveWin MENU BuildMenu() SET MESSAGE OF oWnd TO “Meu nome” CENTERED ACTIVATE WINDOW oWnd VALID MsgYesNO(“Deseja sair?”) return nil //-----------------------------------------------------// Function BuildMenu() local oMenu MENU oMenu MENUITEM “Fim” ACTION oWnd:End() ENDMENU Return oMenu Exercícios 1. Faça um programa no qual cada vez que se pressionar o botão esquerdo do mouse soe um bip. porém. Faça um programa com uma opção de menu em sua janela principal que aoexecutar-se abra uma caixa de diálogo com o título “Minha primeira caixa dediálogo”. já que isso permitirá explora-lo ao máximo. Todos os controles herdam suas propriedades da classe tControl que por sua vez é umaclasse herdada de tWindow. Ortiz de Zíñiga. também podemser incluídos nas janelas se necessário. 3. S.

14 14 Curso CA-Clipper + FiveWin a tecla ‘TAB’ com o que se passa o foco para o controle seguinte até que cheguemos aocontrole desejado. assim. Para obter maior informação sobre cadaum destes controles utilize o guia Norton que acompanha a LIB FiveWin. a primeira consiste em pressionar Ortiz de Zíñiga.L. o segundo método consiste em pressionar oatalho desse controle. é o caso de um Say ou Text. porém isso é possível. Neste capítulo se faz uma relação dos controles padrão e os mais importantes que se podemutilizar com FiveWin indicando as características de cada um deles. porém não se dá uma explicação exaustiva sobre asdistintas cláusulas de criação de cada um deles com comandos xBase. simplesmentetenha em mente que um recurso é um arquivo externo onde se guarda parte do programaexecutável que são osd ad os. no caso de um Get poderá observar o cursor do teclado e no casode um botão observará um retângulo fino ao redor do título do mesmo e uma marca maisescura que no resto dos botões. por exemplo. como por exemplo um botão: pressionadoou não pressionado. quando um controle tem focoé facilmente reconhecível.Ha botões que podem receber foco porém não tem nenhum título ou caption. Todos os controles tem um número identificador do mesmopelo qual podemos acessar quando utilizamos controles criados através de um editor derecursos. Em uma caixa de diálogo onde se encontrem vários controles somente um deles recebeinformação do usuário. etc. pressionando ‘TAB’ avançamos até o controle seguinte e com‘Alt+TAB’ retrocedemos ao controle anterior. No próximo capítuloquando se estudar o Editor de Recursos será possível observar com maior clareza ofuncionamento. Um atalho é um pressionamento de teclado que diretamente nos leva ao controle desejado.Para criar um atalho temos que definir no título ou caption do controle o símbolo ‘&’ dianteda letra que queremos que atue como atalho e pressionando a tecla ‘Alt’ mais a letraindicada saltaremos diretamente ao controle. Neste capítulo encontraremos muitas alusões à possibilidade de criar controles a partir de“recursos” que possivelmente não compreenda como funcionam realmente.Os controles devem estar contidos sempre em uma janela ou caixa de diálogo e não podemter nenhum menu associado. a definição de uma caixa . um checbox: verdadeiro ou falso.O truque consiste em colocar o atalho no controle SAY que pode existir bem encima ou aolado e indicar que esse controle SAY tem a propriedade de grupo. podem ter seu estadomodificado pressionando-se o controle com o botão esquerdo do mouse ou tambémpressionando a tecla de espaço quando esse controle tiver foco. no primeiro casopoderemos dar foco a esse controle com o mouse ou pressionando o tabuladorsucessivamente até chegar ao mesmo e no segundo caso o controle será mostradonormalmente em uma cor gris para indicar que não está disponível. se ele o tiver. com o teclado há duas formas de acessar. se diz que esse controle tem‘Focu s’.. não sepreocupe por que no próximo capítulo serão estudados em profundidade. pelo que aprincipio não é possível estabelecer nenhum atalho para os mesmos. Nem todos os controles podem ter foco por não fazersentido. No caso dos controles botões quandopressionarmos o atalho se produzirá o pressionamento do mesmo. sua funcionalidade ealguns conselhos para sua utilização. nem tampouco umarelação de todos os métodos e dados dos mesmos. S. Para acessar um controle só temos que posicionar o mouse encima dele e fazer um click do botão esquerdo. Aqueles controles que podem ter vários estados. Deve-se ter a precauçãode não definir o mesmo atalho a dois controles já que sempre se saltará ao primeiro deles. Um controle pode estar habilitado (Enabled) ou desabilitado (Disabled).

. Se utilizarcoordenadas tipo texto tenha em mente que é possível introduzir valores decimais na linha ena coluna. se o controle foi criado com recursos (explicar-se-a a forma de faze-lo no capítuloseguinte) é possível que não necessite fazer nada com o controle como por exemplo umcontrole SAY com o qual não existe muito mais a fazer que apresenta-lo dentro da caixa dediálogo.. todo controle tem umidentificador e graças a ele podemos acessar o mesmo. WHEN.. OF oDlg . a sintaxe é a seguinte: REDEFINE CONTROL oControl ID. nestes caso é necessário atualizar a informação contidanesses controles e. por exemplo. Como comentado antes. A diferença de outras linguagens é que elasconstantemente subclassificam qualquer classe quando necessitam modificar qualquer dadoou comportamento da mesma. É importante que ao criar os controles.... por exemplo. FiveWin utiliza a técnica de ‘redefinir’ que acreditamosque em muitos casos é mais adequada e rápida. etc... oupor outro controle ou. ou também pode-se introduzir as coordenadasdiretamente em pixels incluindo a cláusula PIXELS ao criar o controle. É possível que o dado representado por um determinado controle varie durante a edição. por ser o campo de uma base de dados e o ponteiro denavegação do mesmo foi movido. PICTURE “... guardar o resultado de sua edição na variável cData faríamos o seguinte: REDEFINE GET oGet VAR cData ID 101 PICTURE “!!!!!!” OF oDlg Lembre-se bem o que acaba de ler porque esta é uma das bases do FiveWin e uma de suas características mais poderosas. . se utiliza um método genérico do FiveWin implementado naclasse base tWindow que é ‘refresh’. . porém pode ser que seja necessário modificar o comportamento desse controlepara acomodá-lo a suas necessidades. Porém. 15 15 Curso CA-Clipper + FiveWin não só obter uma referencia ao controle desenhado via recursos como também modificarseu comportamento e aparência. OF oDlg Por exemplo.. VALID. S. Com este comando podemos Ortiz de Zíñiga. Os controles podem ser criados diretamente ou também a partir de recursos. esta linha e coluna pode ser oequivalente a coordenadas tipo texto. indique sempre a que diálogo ou janela eles pertencem com a cláusula OF: . para isso. se for um campo Get devemos teralguma forma de saber que valor tem esse campo uma vez terminada a edição do mesmo..diálogo comtodos os controles que incorpore podem ser definidos em um recurso e nosso arquivoexecutável não tem por que produzir a criação dos mesmos. @ <nRow>. <nCol> GET oGet VAR uVAr . para todos esses casos se utiliza o comando ‘REDEFINE’ que existe para todos os controles do FiveWin.. . além disso.L. para modificar a máscara de um Get e. igual às janelas ou aos diálogos. OF oDlg Ao criar controles diretamente a partir de código fonte deverá indicar a linha e coluna ondedeseja que apareçam. a idéia fundamental que deveassimilar é que qualquer controle pode ser criado diretamente a partir de programa outambém redefinido a partir de um recurso externo criado com um editor de recursos. ..” .. texto.. CONTROL ... no primeirocaso devemos criar o controle utilizando comandos estilo xBase e indicando ascaracterísticas principais do mesmo como o são coordenadas..ou utilizar uma determinada mascara de edição.

nCol CHECKBOX oChk VAR lData . na realidade. FiveWin inicializa para você os code-blocks maisusuais dependendo do tipo de controle.L. os seguintes controles: Botões Os botões do Windows permitem estabelecer determinadas operações que são executadasquando estes são pressionados. S. OF oDlg . faríamos o seguinte: oControl:bGotFocus := {|| tone(100. ‘bGotFocus’ é um DADO da classe tControl que se for diferente deNIL é avaliado quando o controle recebe foco. isto é uma característica do FiveWin que não é padrão do Windows. Por exemplo. Logicamente. se queremos que soe um bipquando um controle recebe foco. a partir de a versão 3. Tipos de controles O Windows implementa de maneira padrão.podemos atualizar todos os controles com esta cláusula simplesmente mandando o métodoUpdate a seu diálogo armazenador. o que o FiveWin faz via preprocessador é associar ao dado‘bClicked’ da classe tCheckbox a instrução que você introduziu no comando. só deve haver um botão com esta cláusula em uma mesma caixade diálogo. umabase .2)} Assim como o dado ‘bGotFocus’ existem outros dados da classe para manipular o resto doseventos que podem ser produzidos.0.oGet:Refresh() Uma técnica pouco usada pela maioria dos programadores FiveWin. Quando incluímos esta cláusula. sua funcionalidade é muito parecida às opções de menu nosentido de que tem uma cláusula ‘ACTION’ na qual se indica a instrução a ser executadaquando o botão é pressionado. se em um check box queremoscontrolar quando seu estado é alterado. Se o botão é criado a partir de código fonte é possível indicar uma imagem ou arquivo bitmap. por exemplo. Por exemplo. ON CLICK MinhaFuncao() Se não fosse utilizada a cláusula ON CLICK poderíamos fazer o seguinte: oChk:bClicked := {|| MiFuncion()} e o resultado seria o mesmo. porém muito prática. existe uma cláusula na criação do mesmo que é ‘ONCLICK’. podem servir-nos para navegar por um arquivo de texto. 16 16 Curso CA-Clipper + FiveWin nRow. quando um controle recupera foco você pode indicar aexecução de certa instrução simplesmente inicializando o dado ‘bGotFocus’ que é um code-block desse controle. Por exemplo. é utilizar a cláusula UPDATE ao criar o controle. oDlg:Update() É possível controlar a dinâmica da introdução de dados através dos eventos produzidos emcada controle. a não ser que esse controle não tenha foco nessemomento. Ortiz de Zíñiga. Barras de rolagem As barras de rolagem o ‘scrollbars’ são controles que podem ser usados numa infinidadede ocasiões. Um botão pode levar a cláusula DEFAULT que indica que a ação desse botão se executaráquando se pressionar a tecla Enter.

Quando vários radio buttons estão contidos em um group box somenteum deles pode estar ON simulando efetivamente os botões dos antigos rádios.de dados ou uma imagem bitmap que não caiba em sua totalidade em uma caixa dediálogo. As barras de rolagem podem ser horizontais ou verticais. Uma vez criado o listbox. este é o caso dos Radio buttons que são controles que mostram doisestados: ON|OFF . eliminar os elementos do mesmo utilizando os métodos que o FiveWin proporciona para a manipulação desta classe. Um listbox tem associado a si uma matriz com todos os elementos da lista e sempre ha um elemento que é o ativo. 17 17 Curso CA-Clipper + FiveWin Ao criar uma barra de rolagem deve-se indicar valores máximos e mínimos para amesma.L. modificar. Gets (Edit text) . Group boxes Um Group box é um controle que simplesmente engloba outros controles ou para que suaapresentação seja mais intuitiva. estas são as principais: • • • • • O O O O n n n n u d p p p o a a w g g n e e u d p o w n O n T h u m b p o s Os eventos ‘Up’ e ‘Down’ são produzidos quando se pressiona com o mouse osbotões superior e inferior da barra de rolagem. pode-se adicionar. S. assim como o incremento que se produzirá no valor quando um eventotipo ‘Page up’ o ‘Page down’ é produzido. ‘Page up’ e ‘Page down’ sãoproduzidos quando se pressiona com o mouse no interior da barra de rolagemacima do botão-indicador ou por baixo do mesmo. Na última versão do FiveWin foi incorporada a possibilidade de incluir algum bitmap ou imagem a cada um dos elementos. ou também por que os controles agregados atuam comoum único controle. a não ser que a matriz esteja vazia. Ortiz de Zíñiga. O evento ‘Thumbpos’ éproduzido quando realizamos um ‘drag’ do botão indicador. List boxes Um listbox é um controle que manipula listas que logicamente estão implementadas sob FiveWin como matrizes. A característica principal das barras de rolagem são as instruções que podem ser executadas ao produzir determinadas operações com as mesmas (eventos).

Says (Text) Ortiz de Zíñiga. quando um deles estiver selecionadoo resto deverá estar em OFF. Realmente são três controles que atuam como um só. dando um efeito 3D quando o comando a seguir é utilizado no inicio do programa SET 3D LOOK ON Para que esse efeito seja efetivo deve existir a LIBCt rl 3d. porém. Esse get multi-line pode ter barras de scroll tantoverticais como horizontais. Se definido a partir de código fonte então se . se utilizarmos a variável nCartao para armazenar o possível cartão a utilizar. cada uma das opções estariarepresentada por um radio button porém. centralizado o direita.Um Edit text é o equivalente a um Get do CA-Clipper. 18 18 O controle Say ou Text é um texto fixo que pode ser ou não multi-linha e que pode estar justificado à esquerda. Boxes Os boxes são retângulos que permitem melhorar a apresentação de caixas de diálogo. no diretório Windows\System de seu computador.L. para efeitos práticos.FiveWin implementa os gets utilizando um objeto Get genuíno do CA-Clipper. Um dos feitos do FiveWin foi a implementação das cláusulas VALID e WHEN típicas do CA-Clipper. Curso CA-Clipper + FiveWin Sua funcionalidade é muito parecida ao Say do CA-Clipper com a diferença de que por tratar-se de um objeto agora pode ser manipulado. logicamente. isto significa que se alguma vezvocê manipulou diretamente a classe Get original do CA-Clipper pode seguir fazendo-ocom a simples precaução de atualizar o controle para que as modificações sejamvisualizadas. etc. Quando definido via recursos não se deve esquecerde incluí-os em um group box. 2 Americam Express e 3 Dinners. quando váriosradio buttons estão contidos em um group box somente um deles pode estar ON simulandoefetivamente os botões dos rádios antigos. A diferença é que o CA-Clipper não é capaz de mostrarum campo memo como um get múltiplo. Por este motivo.1 poderia ser Visa. já que estas duas cláusulas não estão implementadas no Windows.dll . alterado seu texto. Radio buttons Os Radio buttons são controles que mostram dois estados: ON|OFF. A edição de um campo memo é realizada através de um Get multi-line já que para oWindows o controle é o mesmo. S. talvez seja ocontrole mais complicado de utilizar. As diferenças do CA-Clipper é que se podem definir a justificação do texto: esquerda.Por exemplo. incluídocomo dado dentro do objeto tGet. São utilizados quando se deseja umi nput de um número compreendido entre vários valores. Devido ao fato do Edit text padrãodo Windows não manipular nenhum tipo de máscara ou picture ao estilo CA-Clipper. centralizado ou à direita. se possível.

quando recebe foco. da mesma forma. ID 101.”Dinners” .comportacomo um único controle e.103 . e portanto se utiliza uma variável lógica para recuperar seu valor. A criação de um radiobutton a partir de código fonte seria: PROMPT “Visa”. O ‘redefine’ de um radiobutton a partir de recursos seria: REDEFINE RADIO oRadioCart VAR nCartao . é um listbox que quando não tem foco nosmostra o elemento ativo.L. ou seja. porém. nCol RADIO oRadioCart VAR nCartao . 19 19 . Combo boxes Um combo box é um listbox drop down. S. OF oDlg Row.102. Ortiz de Zíñiga. ao estabelecermos o ‘REDEFINE’ paraFiveWin passam a ser um único controle. se abre como se se tratasse de ummenu tipo persiana. OF oDlg Check boxes Um check box é um controle que pode ter dois estados: verdadeiro ou falso.”Americam Express”. É muito recomendável seu uso em vez dos típicos Gets que se faz com CA-Clipper de “Sim”/”Não”.

.

Curso CA-Clipper + FiveWin

A vantagem fundamental deste tipo de controle é que o mesmo necessita muito menosespaço que o listbox, porém, só podemos ver todas as opções possíveis quando acessamos omesmo. Sua operação é exatamente igual ao listbox.

Controles Avançados
Os controles avançados são todos aqueles que não são padrão do Windows. FiveWin implementa diretamente alguns controles que não existem no Windows, como ocontrole tWbrowse que permite manipular bases de dados, ou o controle tMeter que éutilizado para mostrar barras de progresso de, por exemplo, uma reindexação. A Borland através de seu editor de Recursos permite também utilizar os já famosos BWCC(Borland Window Common Control) para isso temos que utilizar em nossos programas aLIB da Borland BWCC.DLL. FiveWin permite também utilizar controles criados por outros fabricantes como o são os controles VBX.

Browses
Os browses são controles especializados na edição de bases de dados, seu funcionamento éparecido ao browse original do CA-Clipper, porém, sua implementação é distinta já que adiferença deste é que os browses do FiveWin não contém por sua vez objetos colunas, oque é uma das limitações do FiveWin, e é o motivo pelo qual com a ultima versão seintroduziu um novo browse com objetos colunas porém manteve-se o original. Recomendamos utilizar o original do FiveWin sempre que possível já que é muito mais

rápido. A sintaxe é muito parecida à do controle List box com a diferença de que se utiliza a cláusula FIELDS para indicar que campos de uma base de dados serão editados:
Ortiz de Zíñiga, S.L. 20

Barra de rolagem Barra de rolagem Botão Radio button Combo box List box Say (Text) Retângulo (box) Menu do sistema
20

Curso CA-Clipper + FiveWin

nCol> LISTBOX [ <oBrw> ] ; FIELDS <cFields,...> ; [ FIELDSIZES <aColSizes,...> ] ; [ HEAD | HEADER | HEADERS <aHeaders,...> ] ; [ ID <nId> ] ; [ SIZE <nWidth>, <nHeigth> ] ; [ ON CHANGE | ON CLICK <uChange> ] ; [ ON RIGHT CLICK <uRClick> ] ; [ ON LEFT DBLCLICK <uLDblClick> ] ; [ OF | DIALOG <oDlg> ]

A cláusula HEADERS permite indicar o cabeçalho de cada uma das colunas. A cláusula SIZE permite indicar o tamanho que terá o controle, é opcional e se não for introduzida será calculada automaticamente. A cláusula FIELDSIZES permite indicar a largura de cada coluna em pixels, se omitidaesta cláusula o controle se ajustará automaticamente, mas nem sempre de forma corretaporque como o Windows utiliza fontes ou tipos de letra proporcionais, um campo de 20caracteres nem sempre ocupa o mesmo em vídeo já que o “i” por exemplo ocupa muitomenos que o “M”, o controle browse calcula a largura de coluna baseando-se no tamanhodo campo multiplicado pela largura da letra “B”, é possível que ao mostrar campos todosem maiúsculas não seja possível observar em algum campo a descrição completa, por outrolado, em campos muito compridos com letras minúsculas parecerá que se desperdiça umagrande quantidade de espaço. Uma solução para este problema seria examinar todos osregistros da base de dados para ver qual é o mais largo porém isto levaria uma grandequantidade de tempo, de qualquer maneira, este problema não é tão grave já que pode-semodificar a largura de qualquer coluna em tempo de execução simplesmente fazendo um drag com o mouse. A partir do comando podemos manipular os eventos mais típicos que um controle Browsepode ter como ‘ON CHANGE’ que é quando fazemos um clique sobre o objeto browse ealteramos o elemento ativo e portanto o ponteiro da base de dados, ‘ON RIGHT CLICK’quando pressionamos o botão direito do mouse ou o ‘ON LEFT DBLCLICK’ que é quandorealizamos um clique duplo com o botão esquerdo do mouse. É habitual, sobretudo em ambientes MDI, fazer com que um browse ocupe toda a superfíciede uma janela filha (Child), e que quando redimensionamos esta janela se redimensione ocontrole Browse, para isso FiveWin implementa um método na classe tMdiChild, que é ométodo :SetControl().
oChildWnd:SetControl(oBrowse)

A manipulação de janelas MDI será explicado no capítulo de programação avançada.

. Um método muito utilizado da browse é o método ‘lEditCol’ que permite editaron. o total em uma reindexação seriam o número de registros e onúmero atual seria o Recno. As características fundamentais de um Meter são o total que vai representar e o númeroatual representado. [ BARCOLOR <nClrBar>.. [ OF | WINDOW | DIALOG <oDlg> ] Ortiz de Zíñiga. [ ON DBLCLICK <uDblClick> ] . ou seja... cálculo complexo sobre uma base de dados. porém. [ HEAD | HEADER | HEADERS <aHeaders. [ COLOR | COLORS <nClrPane>. FIELDS [ <cFields. [ PROMPT <cPrompt> ] . [ UPDATE ] .Também podemos criar browses a partir de recursos. local nRecno := Recno() . [ NOPERCENTAGE ] .. porém uma vezrealizado.L. <nClrBText> ] nCol> METER [ <oMeter> VAR ] <nAtual> . Por exemplo. devido a esse controle não serum controle padrão nem do Windows nem do Resource Workshop.. [ OF <oWnd> ] . Meters O controle Meter é utilizado para mostrar barras de progresso e sua utilização pode sermuito variada: um processo de reindexação.. [ FONT <oFont> ] . nCol. nTotal := LastRec() . oBrowse:lEditCol(nCol. <nClrText> ] . [ SIZE <nWidth>.. No próximocapítulo será mostrado como produzi-lo a partir do Resource Workshop. 21 21 Curso CA-Clipper + FiveWin O browse tem uma série de métodos específicos para bases de dados.. para implementa-lo em nosso programa faríamos: REDEFINE LISTBOX [ <oBrw> ] ..li ne ocampo onde se encontre o cursor... [ ID <nId> ] .etc. Outro método muito utilizado da classe Browse é o método :Report() que nos permite produzir um relatório impresso do browse. se desejarmos editar o campo quando umclique duplo é feito: oBrowse:blDblClick := {|nRow.> ] . etc. <nHeight> ]. FiveWin torna realmente simples o uso de barras de progresso sendo sua sintaxe a seguinte: [ TOTAL <nTotal> ] .. [ PIXO ] .>] . [ ON RIGHT CLICK <uRClick> ] . nFlags| . como a possibilidadede estabelecer um filtro na mesma..> ] . a possibilidade de utilizar umarray em vez de uma basede dados. temos que indicar aoWorkShop que queremos criar um controle de usuário (custom control). é realmente prático para pequenos relatórios.) Consulte o guia Norton para obter maior informação sobre seu uso. ou seja. [ ON CHANGE | ON CLICK <uChange> ] . [ FIELDSIZES <aColSizes. S.

<nClrText> ] . 22 22 NE METER [ <oMeter> VAR ] <nAtual> . [ FILE | FILENAME | DISK <cBmpFile> ] . [ ADJUST ] . [ COLOR | COLORS <nClrPane>. S. [ NOBORDER | NO BORDER ] . A imagem pode ser carregada a partir de um arquivo ou também de recursos. O controle Bitmap nos permite ajustar o bitmap às dimensões que desejamos utilizando ométodo Stretch ou a cláusula Adjust no comando. da mesma forma se o bitmap é maior quenosso controle podemos incluir barras de rolagem simplesmente adicionando a cláusulaScroll. [ SCROLL ] . [ NOPERCENTAGE ] . [ CURSOR <oCursor> ] . <nHeight> ] . <nClrBText> ] . <nCol> BITMAP [ <oBmp> ] . Bitmap (Control) O controle bitmap tem como missão a manipulação de imagens em formato “bitmap”. [ PROMPT <cPrompt> ] . . [ ON CLICK | ON LEFT CLICK <uLClick> ] . [ ON RIGHT CLICK <uRClick> ] . Sua sintaxe é a seguinte: [ NAME | RESNAME | RESOURCE <cResName> ] . a sintaxe de ‘REDEFINE’ é a seguinte: [ TOTAL <nTotal> ] . Ortiz de Zíñiga. estecontrole nos permite colocar em uma caixa de diálogo qualquer imagem bitmap e dequalquer resolução e número de cores. [ SIZE <nWidth>. TOTAL nTotal . [ FONT <oFont> ] . Curso CA-Clipper + FiveWin [ UPDATE ] . OF oDlg Quando desejarmos atualizar o meter fazemos os seguinte: nRecno += 1 oMeter:Refresh() ou oMeter:Set(nRecno+1) Também podemos criar o Meter a partir de recursos.L.nCol> METER oMeter VAR nRecno . [ OF <oWnd> ]. [ BARCOLOR <nClrBar>. [ ID <nId> ] . w>. [ OF | WINDOW | DIALOG <oWnd> ] .

[ FILE | FILENAME | DISK <cBmpFile1>.[ PIXO ] . a sintaxe de ‘REDEFINE’ é a seguinte: . [ WHEN <WhenFunc> ] Botão Bar (Button bar) O botão Bar permite mostrar botões com uma imagem em seu interior dentro das barras debotões que se implementam com a classe Button Bar que como recordará servem paracolocar uma barra de botões em uma janela para ter um acesso mais rápido às opções demenu mais usadas. [. [ ACTION | EXEC <uAction> ] . Também podemos criar o controle a partir de recursos. [ ON ClICK | ON LEFT CLICK <uLClick> ] . [ NAME | RESNAME | RESOURCE <cResName> ] . Sua sintaxe é a seguinte: [ OF | BUTTONBAR <oBar> ] . [ UPDATE ] . [ MESSAGE <cMsg> ] . [ CURSOR <oCursor> ] . [ ON RIGHT CLICK <uRClick> ] . [ GROUP ] . [ WHEN <WhenFunc> ] Também podemos criar o controle a partir de recursos. Se inclusa a cláusula GROUP será criado um separador entre o botão definidoanteriormente e o atual. [ FILE | FILENAME | DISK <cBmpFile> ] . [ UPDATE ] . [ ID <nId> ] . [ OF | WINDOW | DIALOG <oWnd> ] . [ NAME | RESNAME | RESOURCE <cResName1>.<cBmpFile2>] ] . [ TOOLTIP <cToolTip> ] NE BUTTON [<oBtn>] . [ WHEN <uWhen> ] .<cResName2>] ] .L. [ ADJUST ] . [ ADJUST ] . S. da mesma forma se inclusa a cláusula TOOLTIP “mensagem” seráapresentada uma mensagem em uma janela flutuante logo abaixo do botão quando o cursorfor posicionado encima do mesmo. a sintaxe de ‘REDEFINE’ é a seguinte: BITMAP [ <oBmp> ] . 23 23 Curso CA-Clipper + FiveWin A imagem pode ser carregada a partir de um arquivo bitmap ou a partir de recursos. [ SCROLL ] . [. [ MESSAGE <cMsg> ] . [ MESSAGE <cMsg> ] . Ortiz de Zíñiga.

[ UPDATE <lUpdate> ] Não faz muito sentido redefinir este controle já que não é possível criá-lo a partir derecursos visto que as barras de botões ainda que possam ser colocadas em diálogos não éhabitual (só em janelas). Seu funcionamento é exatamente igual ao de seu controle padrão correspondente e a únicaprecaução que temos que ter é a de carregar a LIBB w cc. [ WHEN <uWhen> ] . Faça um programa que contenha três Gets e um botão de Aceitar. 3. ou seja existe um ‘Borland RadiobuttonSytle’ por exemplo. [ OF | BUTTONBAR <oBar> ] . 24 24 Curso CA-Clipper + FiveWin Exercícios 1. style’sendo os pontos o equivalente controle padrão. LoadLibrary( "BWCC. o do FiveWin é mais potente. este redefine pode ser usado para colocar um bitmap emum botão convencional do Windows que de outra forma não seria possível senão usando oscontroles avançados da Borland (Bwcc.<cBmpFile2>] ] . também existem outros controles que não tem seu controle padrãocorrespondente como é o controle Bitmap que nada tem que ver com o do FiveWin porémque de certo modo tem a mesma funcionalidade. Ortiz de Zíñiga. [ ACTION | EXEC <uAction> ] .dll" ) Por suposição.. Faça um programa que inicie com uma caixa de diálogo com dois botões. um para iniciar uma segunda caixa de diálogo e outro para abandonar a aplicação. o programa deverá dar um bip e dar foco ao primeiro controle que estejaem branco.dll quando executarmos aaplicação. da mesma formase se edita o Get e se modifica o aluno que a alteração também se reflita no listbox.REDEFINE BUTTON [<oBtn>] . 2. caso contrario deverá fechar o diálogo e mostrar uma mensagem comos diálogos predefinidos abaixo das funções ‘Msg’ indicando que o processoterminou corretamente.<cResName2>] ] .DLL No Resource Workshop da Borland podemos observar que além disso dos controlesstandard do Windows existem outros adicionais que se autodenominam ‘Borland . quandopressionar o botão verificar que nenhum dos Gets esteja em branco e se algumestiver.dll) explicados na continuação. [ ID <nId> ] . [ ADJUST ] . porém. [ MESSAGE <cMsg> ] . Faça um programa que inicie com uma caixa de diálogo que contenha um listboxcom os nomes de todos os alunos e que quando selecionar um deles o conteúdo deoutro controle tipo Get seja atualizado com o aluno selecionado. S. . porém. esta LIB deve encontrar-se no diretório onde se executa a aplicação ou nos diretórios\ Win dow s ouWi n dow s\ S yst em . [ NAME | RESNAME | RESOURCE <cResName1> [..L. [ FILE | FILENAME | DISK <cBmpFile1> [. Uso de BWCC.

. Graças a esta tecnologia podemos produzir autênticos programas ‘Data-Driven’. Faça um programa que contenha um controle Browse para editar a base de dados Alunos. qualquer programa consta de uma lógica implementadaatravés de processos e dados que nos permitem dar corpo a toda a aplicação. porém..fora do programa. S. quepermite desenhar todos os dados que uma aplicação vai manipular visualmente para depoisinclui-os em nossa aplicação final. para isso temos que ativa-lo posteriormente com ocomando ACTIVATE. ID . nCol GET. porém você necessita modificar oudefinir seu comportamento... A parte de dados de qualquer aplicação pode ser armazenada completamente ou em parteem uma LIB de carga dinâmica (DLL) ou inclusa dentro do executável. 2.. 3.: Neste caso estamos utilizando recursos... O mais importante deste processo é compreender como podemos criar um objeto a partir de um recurso e como definir o redefinir seu comportamento.: Este é o método original do CA-Clipper que criaum objeto e imediatamente o mostra em vídeo. Podemosdefinir os recursos como o conjunto de dados que complementam qualquer aplicação paraseu funcionamento correto.L.. DEFINE <ObjectClass> <ObjectName>: Este segundo método é oprincipal para criar objetos no FiveWin. @ nRow. o objetoestá criado com antecedência. ou seja. A separação entre código e dados é o que permitiu o começo da “Programação visual”. 25 25 Curso CA-Clipper + FiveWin RECURSOS DO WINDOWS O que são os recursos ? Os Recursos são uma das partes mais importantes na programação Windows. Ortiz de Zíñiga. FiveWin está projetada para fazer uso extensivo dos recursos do Windows pelo que o usode um editor de recursos é essencial na programação com FiveWin porém não éabsolutamente necessário (lembre-se do comando REDEFINE). Existem três métodos para criar um objeto com FiveWin: 1.Dbf e além disso permita a edição on-line de qualquer de seus campos. 26 26 Curso CA-Clipper + FiveWin comportamento o objeto pode ser ativado utilizando o comando ACTIVATE. Este sistema também não está baseado emrecursos... é por exemplo o casode @ nRow.. Uma vez que tenha redefinido seu Ortiz de Zíñiga. o quesignifica que podemos modificar os dados do programa sem necessidade de voltar acompilar ou relinkar a aplicação.4. S. REDEFINE. Neste caso é o CA-Clipper que cria o objeto enão está baseado em recursos. nCol . esse objeto não éapresentado. Se deseja utilizar recursos em suas aplicações este é o processo a segui: . estes dados sãotambém chamados recursos os quais podem ser manipulados e modificados externamente.L.

27 27 .. porém existem diferenças importantes entre eles: • A principal vantagem de usar arquivo . • Comece a desenhar as caixas de diálogo de sua aplicação com o editor de recursos. • O único inconveniente do arquivo . • A principal vantagem de guardar recursos em uma DLL é que é possível produzir autênticas aplicações “Data-driven” e que uma mesma DLL pode ser compartilhada por varias aplicações. pode criar um arquivo . esse nome permitirá selecioná-las a partir doprograma. ele deverá ser compilado com um compilador de recursos (RC. porém este processo é muito rápido.L.. • Outra vantagem é que não é necessário utilizar o comando: SET RESOURCES TO .Exe RC ou DLL? Os dois sistemas são válidos para guardar recursos. BorlandC++ ou Turbo Pascal. como Turbo C++.DLL> • Se os recursos forem criados em um arquivo RC.RC é que podemos utilizar DEFINES para renomear aos identificadores dos controles. Este editor de recursos pode ser encontrado com quase todos oscompiladores da Borland para Windows. Os recursos desenhados podem ser guardados dentro deuma DLL ou em um arquivo RC (os arquivos RC são arquivos ASCIIque podem ser compilados e agregados ao executável). ou seja. o quesignifica que não temos necessidade de memorizar os identificadoresde todos os controles existentes. S. • Ao desenhar suas caixas de diálogo deverá fornecer um nome distinto a cada uma delas.• Consiga um editor de recursos como o Borland Resource Workshop.CHcom os DEFINES necessários e indicar ao arquivo . Cada controle incluso em suas caixas de diálogo deverá terum identificador único para esse diálogo e será também através desseidentificador que poderá redefinir cada um dos controles • Se os recursos forem criados numa DLL deverá indicar ao programa que vai utilizá-la com o seguinte comando: SET RESOURCES TO <Arquivo. Uma vez criado o executável realize o seguinte: RC -K Programa.RC que tambémutilize esse arquivo. Ortiz de Zíñiga. • O principal inconveniente das DLL é que não é possível usar DEFINES para identificar cada controle. No diretório \FiveWin\dll existe uma DLL vazia que pode ser utilizada para guardar recursos (faça uma copia da DLL vazia para cada projeto).RC é que terá que compilar os recursos cada vez que o executável é gerado.EXE) e incluído no executável.

etc. quandovocê abre uma caixa de diálogo e clica em um botão para produzir uma determinada tarefaem seu programa. mensagens de erro.Curso CA-Clipper + FiveWin Tipos de recursos Os recursos são dados que definem a parte visível de um programa. [ OF | WINDOW | DIALOG <oWnd> ] . Diálogos Um diálogo é uma janela que comunica informação ao usuário e permite ao mesmoselecionar uma dentre varias opções. A principal vantagem de utilizar string tables é que é possíveltraduzir facilmente a aplicação para outro idioma por exemplo. Atalhos Os atalhos são combinações de teclado que o usuário pressiona para produzir determinadastarefas. quase todos os programas doWindows incorporam uma opção de menu Arquivo que inclui comandos para criar ou abrirum arquivo existente. Por exemplo. <nCol> BITMAP [ <oBmp> ] . Recomendamos produzir os menus diretamente a partir de código já que é muito mais rápido. buscar umtexto. O Windows utiliza grandequantidade de bitmaps. FiveWin incorpora a classe tBitmap para facilitar a manipulação dos mesmos. são bitmaps as imagens típicas de qualquer janelacomo as barras de rolagem. Matrizes de Cadeias de Caracteres (String Tables) Os string tables contém textos. Por exemplo a combinação de teclado “Alt+F4” é um atalho para fechar a janelaou diálogo ativo. Por exemplo. . cursores. 28 28 . Cada elemento de menu pode por sua vez incluir outro submenu. o símbolo do menu de controle ou os botões de minimizar oumaximizar.L. Por exemplo. Menus Os programas Windows podem incorporar uma barra de menu. etc. permitindo ao usuário acessar estas funções de uma forma mais rápida. bitmaps (imagens). perguntas. S. <nHeight> ] . [ SIZE <nWidth>. menus e atalhos deteclado. como descrições. como abrir um arquivo. Bitmaps Um bitmap é uma representação binaria de uma imagem gráfica. Além das caixas de diálogo ebotões seu programa pode incluir ícones. Para introduzir um bitmap o mais prático é utilizar o comando BITMAP: [ NAME | RESNAME | RESOURCE <cResName> ] . Ortiz de Zíñiga. que sãomostradas nos programas. selecionar um cor. [ NOBORDER | NO BORDER ] . você esta utilizando na realidade recursos. [ FILE | FILENAME | DISK <cBmpFile> ] . Em geral os programadores Windows utilizam os atalhos para duplicar funções de menu.

utilizados para representar as aplicações quando estão minimizadas. também a partir de recursos ou criando-o diretamente a partir do FiveWin. [ WHEN <WhenFunc> ] Como podemos observar. [ <resource: NAME.RC. DEFINE ICON oIcon RESOURCE "Meu_Icone" DEFINE WINDOW oWnd ICON oIcon Se é o ícone da janela principal. RESOURCE. [ WHEN <uWhen> ] . RESNAME> <cResName> ] . geralmente de 32x32 pixels de tamanho. [ ON CLICK <uClick> ] . [ <file: FILE. [ SCROLL ] . DISK> <cIcoFile> ] . [ ON CLICK <uClick> ] . [ <of: OF. no comando a cláusula RESOURCE permite indicar o nome queo bitmap tem no arquivo de recursos. [ <of: OF. este deverá necessariamente ser criado a partir de recursose com um arquivo . DISK> <cIcoFile> ] . FILENAME. logicamente. [ <update: UPDATE> ] . [ <border:BORDER> ] . Ícones Os ícones são pequenos bitmaps. [ ADJUST ] . DIALOG> <oWnd> ] .ICO.Curso CA-Clipper + FiveWin [ ON CLICK | ON LEFT CLICK <uLClick> ] . e a cláusula FILE permite indicar o nome doarquivo . Também pode-se incluir um ícone na sessão de controle em qualquer caixa de diálogo. A partir de código: @ <nRow>. A partir de recursos: REDEFINE ICON <oIcon> . RESOURCE. [ WHEN <uWhen> ] . [ CURSOR <oCursor> ] . [ UPDATE ] . RESNAME> <cResName> ] . [ ID <nId> ] . Toda janela que possa ser minimizada nos mostrará seu ícone se o mesmo estiverincorporado ao executável. [ ON RIGHT CLICK <uRClick> ] . Para indicar que uma janela tem um determinado ícone issodeverá ser feito quando ela é definida.BMP. [ <file: FILE. [ PIXO ] . [ MESSAGE <cMsg> ] . WINDOW. No resto dos casos o ícone pode ser criado a partir de um arquivo. <nCol> ICON [ <oIcon> ] . deve-se utilizar uma ou outra cláusula. FILENAME. FiveWin implementa um comando para criar o objeto tIcon e deve-se utilizar o jáconhecido comando DEFINE WINDOW para criar a janela e associar o ícone recémcriado. WINDOW. [ <resource: NAME. [ <update: UPDATE> ] . DIALOG> <oWnd> ] .

desta maneira Microsoft Windows se encarrega deproporcionar a largura para altura dada. System. DEFINE CURSOR oCurosr RESOURCE "Meu_Cursor" DEFINE WINDOW oWnd CURSOR oCursor Os cursores só podem ser utilizados a partir de recursos. 29 29 Um cursor é um pequeno bitmap de 32x32 pixels de tamanho que representa a posição do mouse no vídeo. Toda janela pode ter seu próprio cursor. Exemplos típicos de cursores são a flecha. o tamanho e estilo do texto a utilizar. • SIZE: O tamanho da fonte indicando largura e altura.10 Pode-se especificar varias cláusulas ao criar uma fonte como: • NAME: O nome da fonte. etc. o relógio de areia ou o Hi-Beam de edição. Os programas Windows utilizam os cursores para indicar o tipo de tarefa Curso CA-Clipper + FiveWin que está sendo executada em cada momento. S.. • B o I o U e u F t l a O n T n N s b R i á l t L e D : e I e C S m : m L r h U a S d l t a e a . Times. Recomendamos que sempre indique um 0 para a largura e um número negativo para aaltura.L. Fontes Os programas Windows utilizam fontes para definir o tipo de letra. ou seja. Para criar uma fonte utilize o seguinte comando: DEFINE FONT oFont NAME “ARIAL” SIZE 10.Cursores Ortiz de Zíñiga. I a d e n S i N t E f a E R e a s e e d g e r s i e t j o s c e e o a r a f • A t D e l O i L e E j i M z s o a n e á : o n l d i S t e e j a r a f • R d s • : s t c f S a r a e u c d a u f u n i r a á ç ã d o e . Da mesma maneira quase todos os controles tem a possibilidade de ter um objetotCursor associado. FiveWin utiliza a classe tFont para fazer seu uso mais prático. que será mostrado quando colocarmos o cursor domouse em seu interior. diálogos e controles também podem ter seu própriocursor já que também são janelas. Arial. Tenha em mente que quando nos referimos a janela o estamosfazendo em sentido amplo. FiveWin implementa um comando para criar o objeto tCursor e deverá ser utilizado o jáconhecido comando DEFINE WINDOW para criar a janela e associar o cursor recémcriado.

CH. quando se trata de arquivos RC.BMP. DEFINE FONT oFont NAME “ARIAL” SIZE 0.-12 @ 2. sobretudo o capítulo dedicadoà criação de caixas de diálogo. 30 30 Curso CA-Clipper + FiveWin seus possibilidades. mas também pode-se abrir simplesmente um arquivo bitmap. osnúmeros não são muito descritivos e por isso se utilizam diretivas ‘#DEFINE’ para associara cada número uma definição simbólica. só se guarda adescrição de parte dos recursos que uma aplicação vai utilizar. Vocêutiliza estes números em seus programas para acessar cada um dos recursos. assim. Como se comentou anteriormente os recursos podem ser guardados em uma DLL outambém em um arquivo RC. Os programas sob Windows utilizam números para identificar cada um dos recursos. Se desejar mais informação sobre este programa recomendamos queleia em profundidade o manual que acompanha o Workshop.EXE) resolver todas as referencias a identificadores e os possíveis estilos de qualquer recurso ou controle.h que se encontra no diretório\ In clu de de seu compilador C que acompanha o Resource Workshop. um diálogo eum controle também podem ter sua própria fonte já que também são janelas para isso pode-se especificar a cláusula FONT na criação dos mesmos. . porém. É importante que cada vez que crie um projeto novo inclua em seu arquivo . ou seja. nesse caso o compilador de recursos avisará dizendo que não conhece umdeterminado identificador como por exemplo o identificador BBS_BITMAP que identificaum controle como do tipo ‘Borland Bitmap Style’. Em Winapi.ch" Esta instrução permite ao compilador de recursos (RC. os ícones em arquivos . as imagenssão guardadas em arquivos . 2 GET cText OF oWnd FONT oFont Resource Workshop Neste ponto será feita uma breve discussão sobre o Resource Workshop da Borlandobjetivando unicamente que o aluno se encontre confortável o quanto antes possível comesta potentíssima ferramenta e portanto não tem intenção de mostrar todas e cada uma de Ortiz de Zíñiga. porém.forma iterativa mostrando-se ao usuário uma caixa de diálogo com todas as possibilidades de criação da fonte. Normalmente sob CA-Clipper se guardam asdiretivas DEFINE dentro de um arquivo com extensão .RC ouatravés de uma DLL. Toda janela pode ter sua própria fonte para todos os textos que mostre. S. tenha em mente quequando nos referimos a janela o estamos fazendo em sentido amplo.chestão inclusos quase todos os possíveis estilos de cada um dos controles.ch não existe nenhum define que identifique BBS_BITMAP com nenhumnúmero pelo que deve-se incluir no arquivo .CUR. assim sendo. no primeiro caso a descrição de cada um dos recursos éguardada no próprio arquivo DLL.L. A partir deste editor de programas poderemos criar todos os recursos anteriormente enunciados através de um ambiente visual de uso muito fácil.RC a seguinte instrução: #include "winapi. mas é possível quealgum não esteja.RC manualmente a definição desseidentificador da seguinte maneira: #define BBS_BITMAP 0x8000L Para encontrar este número deverá busca-lo no arquivo de nomeWi n dow s. quando isto ocorrer quer dizer que noarquivo Winapi. simplesmente para editá-lo. por exemplo. A partir do Resource WorkShop pode-se abrir um projeto criado com um arquivo . o conteúdo decertos recursos estarão guardados em arquivos separados.ICO e os cursores em arquivos. umícone o um cursor.

não se assuste com a quantidade deestilos possíveis já que não necessita conhecer mais que alguns deles. dependendo do controle. Ortiz de Zíñiga. sendo que omesmo pode ser alterado se o desejar.Recomendamos que não utilizem o Resource Workshop para criar seus menus e atalhos já que é muito mais prático criá-los diretamente a partir do FiveWin. Inclusive. Trabalhando com controles Os controles se incluem dentro das caixas de diálogo para passar e acessar informação aosusuários. Para isso deverá carregar o ResourceWorkshop varias vezes. . um texto fixo não tem sentido quetenha este estilo. É muito fácil copiar recursos entre projetos. Por exemplo. Para introduzir controles deverá selecionar primeiro o controle que deseja com o mousedentro da janela de controles disponíveis e na seqüência clicar na área da caixa de diálogoonde deseja colocar o controle. dará o estilo ‘Tab Stop’ ao controle. abrir um projeto distinto em cada um deles e utilizar as opções deCopiar e Colar para ir copiando recursos de um projeto para outro. Cada um dos controles tem por sua vez estilos que podem ser mostrados realizando um double-click em cada um deles. a maioria deles são muito intuitivos. que permitem de uma maneira simples e intuitiva a inclusão de qualquercontrole na caixa de diálogo nas coordenadas e com as dimensões que desejarmos. Uma vez criado o diálogo. S. A melhor forma de aprender a utilizar o editor de recursos é praticando e quando tiver alguma dúvida consulte o help On-line que acompanha o programa. alguns dos estilos não são manipulados pelo FiveWin pelo que não faz sentido utilizá-los. Tab Stop Uma vez introduzidos todos os controles em nossa caixa de diálogo poderemos identificarquais receberão foco quando se pressionar o tabulador e quais não. Para obter informações sobre cada um dos estilos consulte o help On-line.L. por padrão o ResourceWorkshop. 31 31 Curso CA-Clipper + FiveWin Caixas de Diálogo Para criar uma caixa de diálogo deverá ser utilizada somente a opção novo recurso. pelo menos noprincipio e. diálogo e na continuação introduzir todos os controles que sua nova caixa vai ter. poderá modificar seu tamanho ou move-lo com o mouse. Paramodificar o estilo do dialogo realize um double-click em qualquer parte da caixa de diálogoe será mostrada a janela de estilos da caixa de diálogo. além disso. Se desejar obter mais informação a respeito dos controles consulte o capítuloanterior deste Curso. No Resource Workshop existe uma paleta de controles. disponível sempre que editamoscaixas de diálogo.

porexemplo. o primeiro controle clicado seconverterá no controle número 1. Ferramentas de alinhamento e ajuste de tamanho O Resource Workshop inclui algumas ferramentas para alinhamento ou ajuste de tamanhode controles.Para estabelecer este estilo em cada controle pode-se acessar a janela de estilo de cada umdos controles ou também utilizar a ferramenta incorporada ao Resource Workshop na paletade ferramentas a qual simplifica tremendamente o trabalho. Quando seestabelece um agrupamento de controles. utilize a ferramenta de ordenação que se encontra na paleta deferramentas representada por um botão com os número “1. é por exemplo. então. ao pressionar esse botão oResource Workshop mostrará o número de ordem de cada controle. se associa um atalho ao Say e se dá a propriedadeao Say do primeiro membro de grupo. Para cada grupo que queira definir. A ordem éespecialmente importante quando estão definidos grupos com os controles. se estabelece umgrupo entre esse Get e o Say associado. clique no primeiro membro de cada um deles de tal forma que seja marcado por um retângulo. Para estabelecer a ordem. 2. Esta técnica de grupo também é utilizada quando se quer proporcionar um atalho a umcontrole que não tem título. Se for necessário mova os controles até que se encontrem todos juntos. Não é necessário que se identifique o último membro de um grupo. o usuário pode ficar muito confuso com a utilização doprograma. o caso dos radio buttons. o Get deve ser o controle seguinte depoisdo Say na ordem em que se acessa. ocursor se converterá em um “G” e cada um dos controles que é oprimeiro membro de um grupo será marcado com um retângulo. Agrupando controles O agrupamento de controles é uma técnica que permite ao usuário mover-se entre um grupode controles com as setas de cursor. 3.2”. esta ferramenta é muito simples e economiza trabalho já que permite. Clique sobre a paleta de ferramentas que mostra um “G”. além disso. apenas o primeiro controle do grupo deverá ter oestilo ‘Tab Stop’. como por exemplo um Get. Para definir um grupo de controles. e cada novo clique aumentará sucessivamente o contadorde ordenação até que todos os controles sejam clicados. forçar que vários controles tenham a mesma altura. a mesma . 32 32 1.L. simplesmente cliquesobre cada controle para estabelecer a nova ordem. Neste caso. Ortiz de Zíñiga. Se os controlesnão são ordenados perfeitamente. Curso CA-Clipper + FiveWin Ordem dos controles Com esta ferramenta podemos modificar a ordem em que se acessa os controles. S.

estejamseparados vertical ou horizontalmente no mesmo espaçamento. Faça um programa com uma caixa de diálogo que contenha todos os tipos de controles disponíveis no Resource Workshop através de um arquivo . retângulos. 4. Experimentando uma caixa de diálogo Não é necessário que compile e linque seu programa para observar como funciona suacaixa de diálogo recém criada já que o Resource Workshop proporciona uma ferramentapara testa-la. Controles criados pelo usuário É possível indicar ao Resource Workshop que vamos utilizar controles que a princípio nãoestão disponíveis no editor de recursos.L. 3. Para isso. S. círculos. Faça um programa com uma caixa de diálogo com um controle browse para acessar à base de dadosAl un os.RC e o mesmo programa acessando o diálogo através de uma DLL. Faça um programa que acesse uma caixa de diálogo mediante um arquivo .L. S. Durante o curso será mostrado como produzir todas estas operações. Ortiz de Zíñiga. poderemos produzir todo tipode figuras geométricas como linhas. etc. é que sob Microsoft Windows se manipula a impressora de forma gráfica. para incluir um controlebrowse do FiveWin o nome de classe seria‘tWb rows e’ e o estilo: Ortiz de Zíñiga. etc.dbf. temos que pressionar o botão CustomControl representado por uma chave na paleta de ferramentas e indicar o nome de classeque vai ter o novo controle. 34 34 Curso CA-Clipper + FiveWin IMPRESSÃO EM FIVEWIN Impressão em Microsoft Windows A principal diferença existente entre Microsoft Windows e MSDOS no que diz respeito àimpressão. Simplesmente pressione o botão ‘Test’ da paleta de ferramentas.RC. Exercícios 1. Faça um programa com uma janela principal que ao ser minimizada mostre umícone criado em uma DLL e.largura. quando o cursor se encontrar dentro da janela seconverta no símbolo “+”. estejam centralizadosvertical ou horizontalmente na caixa de diálogo. Ícones e cursores A criação de bitmaps. faça umdouble-click para indicar o estilo do mesmo. 2. ícones e cursores é realmente intuitiva e se parece muito ao PaintBrush do Windows pelo que acreditamos que não vale a pena nos expendermos nisso. . Issosignifica que podemos utilizar fontes de tamanhos distintos. 33 33 Curso CA-Clipper + FiveWin 0|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_VSCROLL|WS_HSCROLL Bitmaps. Por exemplo. Uma vez introduzido um controle customizado. e inclusive incluir bitmaps(imagens) dentro de nossos relatórios.

dependendo da resolução da impressora. • Se desejar gerar um relatório de um browse execute o método :Report() desta classe. Ortiz de Zíñiga. e. Se esta cláusula não forincluída. o FiveWin incorpora técnicas para criar algunsrelatórios rapidamente sem necessidade de programar. Para criar um objeto tPrinter simplesmente utilize os seguintes comandos xBase: PRINT oPrn NAME “Meu primeiro relatório” PREVIEW PAGE . • Se quer produzir uma impressão de qualquer controle.. S. tenha em mente que os parâmetros de linha e coluna que recebe o métodoSay temos que dá-los em pixels e.L. nCol. etc. A cláusula PREVIEW permite ver em vídeo cada uma das páginas a imprimir.. ENDPAGE E dentro das mesmas fará chamadas ao método Say da classe tPrinter para imprimir o textoque se deseja. a partir desse momento.. oPrn:Say(nRow. ou sefor utilizada a função PrinterSetup() aquela que for definida.FiveWin automatiza todo o processo oferecendo o máximo de potência e flexibilidade e a mínima complexidade possível. diálogo ou janela. dimensão de página. Normalmente criará varias páginas com as seqüências PAGE . porém somente para a aplicação atual. . já se pode manipular a impressão que os métodos e dados desta classe oferecem. Podemos incluir a cláusula FROM USER que mostra uma caixa de diálogo com todas asimpressoras disponíveis para que o usuário escolha a que deseja. ou seja. execute o método :HardCopy(nZoom) do objeto. FiveWin implementa a impressão através de um objeto tPrinter o que faz com que a tarefaseja realmente simples. cText. a impressora selecionada será a definida como padrão no painel de controle.. não segravarão as alterações realizadas. . Além disso.....) . ENDPAGE ENDPRINT O comando PRINT cria um objeto tPrinter... os resultadosserão distintos. como por exemplo: • Para gerar um relatório da base de dados ativa simplesmente faça uma chamada à função Report(). 35 35 Curso CA-Clipper + FiveWin A função PrinterSetup() permite selecionar uma impressora com todas as suas opções deresolução. podendo-se fazer Zoom de qualquer delas e imprimir as que se desejar. Se desejar produzir tarefas mais sofisticadas deverá utilizar diretamente o objeto tPrinter ou utilizar o gerador de Relatórios que acompanha o FiveWin. Esta mesma função é usada por uma multiplicidade deprogramas como por exemplo o Notepad na opção “Especificar impressora”. por este motivo a classe tPrinter oferece vários métodos para resolver esteproblema: • • • • :nVertSize() devolve a altura da página em milímetros :nHorizSize() devolve a largura da página em milímetros :nVertRes() devolve a resolução vertical da página em milímetros ..

para isso o FiveWin inclui no comando de criação da fonte a cláusula ‘OF’. COLUMN . [ PEN <oPen. Primeiramente deve-se fornecer toda a informação geral do relatório como o título. [ < TO PRINTER > ] ... A sintaxe para criar qualquer relatório é a seguinte: REPORT.> [< LEFT | CENTER | CENTERED | RIGHT > ] ]. PRINTER oPrinter DEFINE FONT oFont NAME “ARIAL” SIZE 0... . etc. O problema das resoluções distintas de cada impressora também nos afetarão com as fontes já que quanto maior a resolução da impressora menores elas serão impressas. rodapé... [ FOOTER <bFoot. porém... . Lembre-se de destruir a fonte uma vez terminada a impressão com o método End() oFont:End() O RELEASE FONT oFont O gerador de relatórios O gerador de relatórios do FiveWin permite produzir quase qualquer relatório de umaforma muito simples. nCol): que transforma coordenadas em centímetros em coordenadas em pixels • :Inch2Pix(nRow. ] ENDREPORT ACTIVATE REPORT . COLUMN . cabeçalho. [ TITLE <bTitle. [ < NAME | RESNAME | RESOURCE > <cResName> ] ..:nHorizRes() devolve a resolução horizontal da página em milímetros • :nLogPixelY() devolve a resolução por polegada vertical (por exemplo 300 ppp típico das laser) • • :nLogPixelX() devolve a resolução por polegada horizontal :Cmtr2Pix(nRow..> [< LEFT | CENTER | CENTERED | RIGHT > ] ]. [ < FILE | FILENAME | DISK > <cRptFile> ] .> [< LEFT | CENTER | CENTERED | RIGHT > ] ]. 36 36 Curso CA-Clipper + FiveWin O gerador de relatórios faz um uso muito extensivo de classes.. S... entendendo por relatório qualquer lista baseada em colunas deinformação. nCol): que transforma coordenadas em polegadas em coordenadas em pixels Na realidade... fontes que serão utilizadas. [ < SUMMARY > ] .> ] . . [ FONT <oFont. ..L. REPORT [ <oReport> ] .. . graças aos comandos seu uso é realmente simples.> ] ..-10 OF oPrinter Se depois disso verificarmos aos valores nHeight e nWidth do objeto tPrinter dar-se-á conta que são valores muito superiores por terem sido redimensionados automaticamente... . os mais usados serão estes dois últimos.. [ HEADER <bHead. Ortiz de Zíñiga. [ GROUP .

somente ainformação dos grupos. O próximo passo será indicar as colunas desse relatório com o comando: COLUMN [ <oRptCol> ] . não é necessário incluir a cláusula OF oPrinter ao criar a fontejá que o próprio gerador de relatórios se encarrega de redimensionar as fontes dependendoda resolução da impressora. GRID PEN 1 A cláusula SUMMARY permite imprimir só um sumario do relatório. todos os objetos Fontes queserão utilizados no Report.. cabeçalho ou rodapé de página é convertido em codeblocks. ou seja.> ] .. A cláusula TO PRINTER permite mandar diretamente o relatório à impressora. TITLE. A cláusula FONT permite indicar. o cabeçalho ou o relatório e.. [ DATA <bData. todos os objetos PEN utilizados noReport. desta formaé possível indicar por exemplo que o rodapé de página é oReport:nPage e cada vez que seimprima o rodapé de página oReport:nPage será avaliado e portanto indicará perfeitamenteo número de página do relatório. [ TITLE <bTitle. separados por vírgulas. Logicamente não faz sentido utilizar esta cláusula se não houvernenhum grupo criado.> ] . separados por vírgulas.. a expressão será avaliada.. Pode-se utilizar qualquer expressão que devolva uma cadeia de caracteres para definir otítulo. ou seja. As cláusulas HEADER e FOOTER têm o mesmo funcionamento da cláusula TITLE e servem para especificar o cabeçalho e o rodapé do relatório. Como verá mais adiante é possível Ortiz de Zíñiga. um PEN é um objeto que permite identificar a espessura e cor de uma linha. [ AT <nCol> ] . A cláusula PEN permite indicar... A cláusula CAPTION permite indicar o título do relatório que será mostrado na janela de pré-visualização e a partir do administrador de impressão (Spooler). [ CAPTION <cName> ] A cláusula TITLE indicará o título do relatório sendo que pode-se incluir vários títulosseparados por vírgulas. para quepossam ser avaliados cada vez que o mesmo é impresso. é o equivalente a uma caneta. o texto que você introduzir comodescritor do título.[ < PREVIEW > ] . Se o objeto tPrinter sobre o qual se vai produzir o relatório já tiver sidocriado podemos indicá-lo utilizando a cláusula TO DEVICE oPrinter.. . Para criar um PEN utilize o seguinte comando: DEFINE PEN oPen WIDTH 2 Lembre-se que deve-se destruir os Pens quando terminar o relatório. . TITLE.. S. Uma vez indicadas as fontes para indicar por exemplo queuma coluna utilizará a primeira fonte da lista. [ TO DEVICE <oDevice> ] .L. círculoou retângulo. por padrão o título se mostrarácentralizado. 37 37 Curso CA-Clipper + FiveWin indicar ao gerador de relatórios que imprima linhas verticais de margem de colunas. PREVIEWnos mostra primeiramente o relatório no vídeo e TO FILE exporta o relatório para umarquivo ASCII. . CENTER o RIGHT... [ TO FILE <toFile> ] . simplesmente temos que fazer: COLUMN DATA. além dissopode-se incluir a cláusula LEFT. Em última análise. Assim como no caso dos fontes se queremos que uma coluna tenha traços de margem deverá utilizar a cláusula GRID indicando o número de PEN a utilizar COLUMN DATA. FONT 1 Lembre-se de que deve-se destruir as fontes quando terminar o relatório. o que permite que o título ocupe mais de uma linha.. a cada impressão.

[ FOOTER <bFoot> ] .L. Se necessário. [ < TOTAL > [ FOR <bTotalExpr> ] ] . indicamos a fonte utilizada na impressão da quebra.poderíamos fazer os seguinte: COLUMN TITLE. é possível incluir um condição de totalização. que pode ocupar varias linhas. . [ HEADER <bHead> ] . A cláusula FONT funciona exatamente igual as colunas. S.000 e com a fonte 2 quando for superior. Esta largura não é em pixels e simem caracteres. Para isso devemos utilizar o comando: GROUP [ <oRptGrp> ] . dentre todas as indicadas quando se criou o Report.. Por exemplo: COLUMN TITLE. A cláusula DATA é utilizada para indicar os dados a serem impressos. separando-as por vírgulas. Não é necessárioque sejam convertidos em cadeias de caracteres e podemos utilizar qualquer expressão.. TOTAL FOR NOME=“INACIO” A cláusula LEFT|CENTER|RIGHT permite indicar como se visualizará o texto tanto do título como dos dados. podemos fornecer umaexpressão que devolva um número em vez do número diretamente. Por exemplo.. [ < LEFT | CENTER | CENTERED | RIGHT > ] . pode ocupar varias linhas.. A cláusula SIZE permite indicar a largura da coluna. ou seja. DATA. a expressão seria: GROUP ON Empregado->Idade As cláusulas HEADER e FOOTER permitem indicar um cabeçalho e um rodapé por cada grupo (só uma linha)..[ SIZE <nSize> ] . [ ON <bGroup> ] . [ < EJECT > ] Lembre-se que podemos incluir tantos grupos quantos forem necessários. . A cláusula SHADOW faz com que o fundo da coluna seja impresso em uma cor cinza claro e a cláusula GRID permite colocar linhas de borda na coluna. DATA. [ FONT <uFont> ] . A cláusula FONT permite indicar que número de fonte deve ser utilizada para a coluna....1.2) Ortiz de Zíñiga. [ FONT <uFont> ] . [ < GRID > [ <nPen> ] ] A cláusula TITLE permite indicar o título da coluna. FONT iif(Salario>100000. Émuito importante que se utilize a cláusula Picture para os campos numéricos que queiratotalizar em vez de fazer um Transform() do dado. GROUP ON Empregado->Idade A cláusula ON permite indicar a expressão de quebra . além disso.> ] . Com elas. [ < SHADOW > ] .. podemos estabelecer grupos de quebra para imprimir totais parciais das colunas com totais. Não é necessário introduzir este valor já que o gerador de relatórios ocalcula para você.Assim como o título.. A cláusula TOTAL permite especificar se desejamos totais desta coluna e. A cláusula PICTURE permite estabelecer uma máscara a ser utilizada para os dados. Aqui. se queremos uma quebra quando mudar a idade. 38 38 Curso CA-Clipper + FiveWin desta forma o dado seria impresso com a fonte 1 quando o salário for menor ou igual a 100. [ PICTURE <cPicture.

Tente incluir nesse relatório um bitmap no canto superior esquerdo.L. Exercícios 1. A melhor forma de aprender a utilizar o gerador de relatórios é executar e analisar em profundidade o tutorial que acompanha a FiveWin. o cabeçalho ou o rodapé de página. 2. Para começar a impressão devemos utilizar o comando ACTIVATE REPORT que podeincluir uma série de cláusulas que permitem especificar condições de impressão e modificaro relatório enquanto esta sendo gerado. Faça um programa que imprime uma ficha completa de um aluno manipulando diretamente a classe tPrinter.L.L. Por último. poderá produzir absolutamente qualquer relatório. Faça um programa que contenha um browse com o arquivo Alunos. A classe tRLine é utilizada para todas as impressões feitas horizontalmente em todo o corpo do relatório. e em concreto por Ignacio Ortiz de Zúnhiga. Gere um relatório com o gerador de relatórios de todos os campos do arquivo Alunos. É nas cláusulas ON onde se encontra o verdadeiro poder do gerador de relatórios e quando tiver experiência no uso delas. como por exemplo o título. a classe tRGroup engloba todas as definições de grupo inseridas no relatório. A classe tRColumn armazena toda a informação de cada uma das colunas do relatório. 4. Ortiz de Zíñiga. 3. O gerador de relatórios foi criado em sua totalidade por Ortiz de Zúnhiga.dbf ordenando-o por nome e estabelecendo um grupo no campo sexo. S. 40 40 Curso CA-Clipper + FiveWin MANIPULAÇÃO DE BASES DE DADOS . Aclasse tReport tem um dado de nome ::aColumns no qual se guardam todos os objetostRColumn.A cláusula EJECT permite produzir um salto de página a cada quebra. S. O gerador de relatórios utiliza 4 classes para produzir seu conteúdo: • • • • C C C C l l l l a a a a s s s s s s s s e e e e t t t t R R R R e L C G p i o r o n l o r e u u t m p n Ortiz de Zíñiga. 39 39 Curso CA-Clipper + FiveWin A classe tReport contém toda a informação geral de relatório e é armazenador do resto das classes.dbf e um botão para imprimir a base de dados utilizando o método que a classe browse incorpora. S.

deverá programar como se fosse um ambiente de rede. ou seja. Para conseguir abrir mais arquivos devemos utilizar a funçãoSetHandleCount() que pertence ao FiveWin e que recebe como únicoparâmetro o número de arquivos que desejamos abrir e devolve os querealmente o Windows pôde oferecer. • FiveWin incorpora uma poderosa classe DataBase que pode lhe economizar muito tempo de programação. ou seja. O objeto Database O objeto database foi desenhado com o único propósito de tornar mais fácil a manipulaçãodos arquivos DBF. O objeto DataBase não tem como objetivo substituir completamente a forma normal de se acessar os arquivos DBF. Além disso. já que muitas vezes é inclusive aconselhável seu uso. Local oDbf USE “Alunos” DATABASE oDbf O objeto oDBF terá como dados todos os campos desse arquivo. o Windows permite um máximo de 20 arquivos abertos poraplicação. só necessita utilizar o comando DATABASE depois de abrir a base de dados. Quando for necessário que o objeto database carregue novos valores deveremos utilizar ométodo :Load().para Windows 3.1será necessário carregar o programa SHARE. . podemos continuar trabalhando da mesmaforma que em MSDOS. Se estiver utilizando Windows 3. Um objeto DataBase é essencialmente um buffer em onde você manipula os dados do arquivo e que posteriormente grava no arquivo fisicamente. 41 41 Curso CA-Clipper + FiveWin Para criá-lo. De qualquer maneira recomendamos que utilize o driver Comix ouSix os quais são excelentes.Mudanças na programação FiveWin não impõe nenhum tipo de restrição ou alteração no projeto habitual de bases dedados a partir do CA-Clipper e.2d poderá ter sérios problemas com alguns RDDs. • Se estiver trabalhando com versões do CA-Clipper anteriores à versão5. Ortiz de Zíñiga. • Se desejar mostrar uma base de dados em duas janelas distintas isso sóserá possível abrindo-a duas vezes com ‘Alias’ diferentes.11 (trabalho em grupo) ou Windows 9x não é necessário. Podemos então modificar qualquer campo utilizando os dados do objeto egravar as alterações com o método :Save(). S. se a base de dadostiver um campo de nome CODIGO existirá também no arquivo DBF um campo com omesmo nome. não poderáabrir as bases de dados em modo exclusivo e deverá bloquear os registros cadavez que realizar uma operação sobre eles. sobretudo com o driverDbfCdx. Porém há certos pontos que devem ser levados em consideração: • Por padrão.L. porém. assim sendo. O número máximo de arquivos abertos é255. Tradicionalmente qualquer programador CA-Clipper necessitava criar variáveis locais queatuam como buffer para armazenar cada um dos valores de cada campo. recomendamos que indique a quantidade que sua aplicaçãorealmente necessita. reduzindo consideravelmente a quantidade de código necessário parasua manipulação.EXE antes de carregar Windows.

dll. o depurador do FiveWin não é de muita utilidade já que lhe faltamuita operacionalidade. Faça um programa que abra duas janelas de uma vez. Exercícios . já que não será mais necessáriocriar variáveis locais para cada campo. Ortiz de Zíñiga. 42 42 Curso CA-Clipper + FiveWin O DEBUGGER DO FIVEWIN Utilização do debugger FiveWin oferece seu próprio debugger ou depurador. 3. um arquivo de nomeE rro. cada vez que movemos o mouse o Windows manda mensagens a aplicaçãoindicando o movimento e a aplicação deve processar estas mensagens. já que internamente o CA-Clipper coloca uma imposiçãosob qualquer dado de classe e estes não podem ter mais de 10 caracteres de comprimento. só temos que incluir oflag /b ao compilar os programas e ao executar a aplicação o debugger apareceráautomaticamente no vídeo. só será necessário criar uma única variável localpara guardar o objeto database.De qualquer maneira. Cada vez que um erro é produzido no FiveWin. Para usa-lo.l og é gerado. #define CODIGO aDbf[1] #define NOME aDbf[2] O objeto database resolve completamente este problema.dbf e um botãopara editar o registro atual utilizando um objeto database. cujos nomes mais usados devido aimplementação em FoxPro são Scatter() e Gather(). Faça um programa que contenha um browse do arquivo Alunos. no qual se mostra uma grande quantidade de informação. uma com o browse e outracom os dados do registro atual e que ao mover o browse automaticamente sejaatualizada a janela de registro. Outra alternativa era utilizar uma matrizcomo buffer e utilizar funções para carregar e gravar. Porexemplo. O inconveniente de usar matrizes éque não podemos usar os nomes de campos diretamente e portanto temos que produzirDEFINES indicando que campo corresponde a cada elemento do array. Infelizmente o objeto database tem uma limitação que é não poder manipular nomes decampo com mais de 9 caracteres. O debugger requer uma DLL para seu funcionamento chamadaF w dbf. (utilizar um objeto database para a janela deregistro) . já que éimpossível parar a atividade que o Windows realiza para interagir com o usuário. Modifique o programa anterior para que funcione em rede local.principalmentequando se programa em ambientes de rede. recomendamos utilizar a função MsgInfo() nas partesdo programa onde seja necessário um “Watch-point”. De qualquer maneira. ao terminar a edição obrowse deverá refletir as alterações efetuadas.L. Esta solução é muito válida. Exercícios 1. não é uma limitação muito importante. É muito mais difícil depurar uma aplicação sob Windows que sob MSDOS. S. 2. já queo processo compilar-linkar do FiveWin com Blinker é muito rápido. Por isso.

iconizadas. Se tivéssemos que desenhar pessoalmente o ambiente MDI seria realmente um trabalho enorme..L.. execute um break-point ao fechar a janela.redimensionadas. seexistisse um relógio no vídeo.L. se uma janela filha tem um arquivo de texto e outraum arquivo DBF quando selecionarmos a opção imprimir que possa existir no . além disso. SKIP ENDDO Manipulação de janelas MDI Uma janela MDI é aquela que por sua vez contém outras janelas em seu interior... Ortiz de Zíñiga. Para entender como funciona uma janela MDI temos que saber que na realidade existe umajanela invisível que é a janela cliente. Por exemplo. • Janela cliente: tMdiClient que é a janela que realmente manipula as janelas filhas. em um ambiente MDI existem três classes dejanelas: • Janela principal: tMdiFrame que é a janela armazenadora da janelas filhas e é a que por exemplo contém a barra de menu. o realmente complicado é levar emconta que nos encontramos em um ambiente não-modal puro e portanto devemos manipula-lo com muita precaução. Para resolver este problema. destruídas e criadas. podem ser movidas.. 43 43 Curso CA-Clipper + FiveWin PROGRAMAÇÃO AVANÇADA Refresh do sistema Ao realizar processos que ocupem uma grande quantidade de tempo. S.1. ou seja. o Windows nos oferece tudo o necessário para produzi-lo. É uma janela invisível. SysRefresh() . Por exemplo. • Janelas filhas: tMdiChild que são as janelas filhas da janela MDI. como por exemplorastrear uma informação em uma grande base de dados. porém. devemos levar em conta que oWindows não poderá atualizar todo o sistema até que o processo termine. uma janela MDI é como o ambiente do Windows. Faça um programa com o debugger e inspecione o objeto janela alterando seus títulos e. porém. S. porém para a sua aplicação. 44 44 Curso CA-Clipper + FiveWin Criar janelas MDI é realmente uma trabalho simples. o FiveWin incorpora uma função “SysRefresh()” que pode serchamada tantas vezes quantas forem necessárias e que permitirá atualizar o sistema aoexecutar processos longos: DO WHILE !Eof() . Asjanelas filhas nunca podem sair do escopo da janela mãe. Na realidade. este ficaria completamente parado até que a buscaterminasse. Ortiz de Zíñiga.

Para criar cada uma das janelas filhas temos que adicionar a cláusula MDICHILD e indicar qual é sua janela armazenadora com a instrução OF: DEFINE WINDOW [<oWnd>] . FiveWin permite indicar um menu diferente para cada janela filha criada. <nLeft> TO <nBottom>. A única diferença ao criar uma janela MDI é que deverá incluir a cláusula MDI ao utilizar o comando de criação da janela. Por todo isso recomendamos que só sejamproduzidos ambientes MDI quando todas as janelas filhas que serão abertas sejam domesmo tipo. um ambiente MDI supõe maistrabalho para o programador para controlar todas as possíveis situações que podem serproduzidas num ambiente não-modal. Porém. iconizá-las ou selecionar uma delas a partir de menu. <nRight> ] . [ CURSOR <oCursor> ] . Em um ambiente MDI podesedisparar uma determinada opção com uma caixa de diálogo e não uma janela filha. o que pode ser umgrande trabalho. [ COLOR | COLORS <nClrFore> [. [ ICON <oIcon> ] . [ MENU <oMenu> ] . Normalmente todasas janelas MDI devem ter incorporado como opção de menu a possibilidade de colocar asjanelas em cascada. [ MDI ] . de tratamento de textos. deverá criar um menu paraquando no haja nenhuma janela filha e outro menu quando elas existirem. Enfim.<nClrBack>] ] . [ FROM <nTop>. [ MENUINFO <nMenuInfo> ] . [ HSCROLL | HORIZONTAL SCROLL ] . . lado a lado. [ STYLE <nStyle> ] . [ BRUSH <oBrush> ] . <nLeft> TO <nBottom>. se quer fazer um bom projeto. [ OF <oParent> ] Uma cláusula que só as janelas MDI (frame) possuem é MENUINFO. [ TITLE <cTitle> ] . [ OF <oParent> ] . o menu deverá ser atualizado. Da mesma forma. a opção de menu selecionadarefletirá as alterações. Tenha emmente que ao alternar de janela filha. [ NONE | SINGLE ] . [ TITLE <cTitle> ] . [ BRUSH <oBrush> ] . aopção de menu imprimir deveria estar desabilitada. A medida que as janelas vão abrindo ou fechando. [ VSCROLL | VERTICAL SCROLL ] . os atalhos de menu deixam de funcionar enquanto hajaalgum duplicado. porém.menuprincipal nosso programa deverá saber qual janela é a que está ativa quando se seleciona aação de menu e atuar de acordo. DEFINE WINDOW <oWnd> . [ MDICHILD ] .sinceramente não recomendamos que o faça já que consome uma grande quantidade derecursos do Windows e. se não existe nenhuma janela filha. [ ICON <oIco> ] . como por exemplo. [ FROM <nTop>. além disso. Recomendamos que não comece a utilizar janelas MDI até que se encontre realmente prático com o FiveWin. <nRight> ] . [ MENU <oMenu> ] . Comesta cláusula indicaremos em qual número do menu principal queremos adicionar as novasopções.

..0 LISTBOX oControl BROWSE . OF oWndChild oWndChild:SetControl( oControl ) Menus flutuantes Como seu nome indica um menu flutuante é um menu que pode aparecer em qualquer lugar de uma janela. aCoors) .. temos que fazer umapequena conversão de coordenadas de janela para coordenadas de vídeo: local aCoors := {nRow.. Function PopupMenu() local oMenu MENU oMenu POPUP MENUITEM . nCol seriam as coordenadas do mouse ao se pressionar obotão direito.. Static oWnd Function Main() DEFINE WINDOW oWnd. podem ter uma barra de botões. ACTIVATE WINDOW oWnd ON RIGHT CLICK PopuMenu(nRow.... ENDMENU ACTIVATE POPUP oMenu OF oDlg AT nRow. ClientToScreen(::oWnd:hWnd. além disso. Uma janela filha poderá ter um browse ou um get multi-line e. 46 46 ....L. [ PIXO ] As janelas filhas não podem ter um menu próprio. S. Para isso existe ummétodo na classe tMdiChild que é :SetControl() @ 0. Para criar um menu flutuante temos que indicar a cláusula POPUP da seguinte forma MENU oMenu POPUPMENUITEM ...MENUITEM .. queremos que se redimensione o browse ou o get.. [ HSCROLL ] . ENDMENU ACTIVATE POPUP oMenu OF oWnd AT nRow. porém.assim sendo. ACTIVATE POPUP oMenu OF oWnd AT aCoors[1]. MEMO OF oWndChild o @ 0..nCol) .Ortiz de Zíñiga.0 GET oControl. 45 45 Curso CA-Clipper + FiveWin [ VSCROLL ] . nCol} ..<nClrBack>] ] .... nCol Return NIL Isso não funciona porque nRow e nCol tem as coordenadas relativas à janela e o menu pop-up utiliza as coordenadas do vídeo (Windows desktop) . S..L. [ COLOR | COLORS <nClrFore> [. aCoors[2] Ortiz de Zíñiga. MENUITEM . ao serredimensionada. nCol Normalmente menus pop-up são utilizados ao se pressionar o botão direito do mouse eportanto as coordenadas nRow.

Curso CA-Clipper + FiveWin Os Brushes Os brushes são objetos gráficos que automaticamente preenchem a superfície de outro objeto. que são: • o i o a C m C n l p l d p a p a : r : r C l o e a c r l a o ( i t s ) p a b ( a p o ) o a a r r p a d a r a l • S e d t a D d m . [ RESOURCE | NAME | RESNAME <cBmpRes> ] . com um estilo que corresponda a uma textura já definida e. DEFINE BRUSH <oBrush> .. Uma das limitações do FiveWin é que ele só é capaz de manipular informação de tipo texto. [ COLOR <nRGBColor> ] . [ FILE | FILENAME | DISK <cBmpFile> ]. FiveWin tem uma classe para acessar ao Clipboard que facilita bastante o seu uso. Podemos criar brushes de uma determinada cor. O primeiro passo é definir o objeto clipboard e ativa-lo DEFINE CLIPBOARD oClp OF oWnd ACTIVATE CLIPBOARD oClp Uma vez definido poderemos utilizar os métodos desta classe para produzir todas as operações necessárias. [ STYLE <Style> ] .. inclusive com base em um arquivo bitmap. Seu uso consiste em primeiro defini-lo e depois inclui-lo na definição da janela ou diálogo. DEFINE WINDOW oWnd BRUSH oBrush Existe uma grande variedade de estilos predefinidos com os quais pode-se experimentar: • • • • • • • • • • D H V F B C D B T B i o e d d r i o i r a r r i i o a r l i g i t a a s g l e c o z i g g s c a d k n o c o o a n a n n l l t a l a a l l r n o d s s s O Clipboard O clipboard é um buffer onde se guarda informação que pode ser acessada por todas as aplicações do Windows .

INI [Intl] sLanguage=por Neste exemplo a seção Internacional de nome abreviado “Intl” tem uma chave que é “sLanguage” cujo valor atual é “por”. DEFAULT "Título da janela" SET SECTION "Principal" . 47 47 Curso CA-Clipper + FiveWin Arquivos INI Os arquivos INI são arquivos de texto que o Windows utiliza como arquivos deconfiguração de forma extensiva e que. esta linha do arquivo Win. se não for indicado nenhum nome é que quer acessardiretamente oWi n . // Arquivo WIN. ENTRY "Título" . o que evita ter que fazer alguma transformação nos dados. OF oIni .ini" GET cTitulo . Os arquivos INI estão divididos em seções e dentro de cada seção se incluem chaves seguidas pelo sinal de igual e pelo dado que deve ser guardado nesta chave. permite que qualquer aplicação crieseus próprios arquivos INI ou modifique os próprios do Windows. Ortiz de Zíñiga. Na continuação fazemos todas as operações que desejarmos e porúltimo fechamos o arquivo. Primeiramentedeverá abrir o arquivo desejado. FiveWin tem implementada uma classe tIni para manipular estes arquivos. uma data ou um valor lógico. Como certamente deve saber. além disso.Ini esta indicando o idioma selecionado na configuração do painel de controle para a representação de números e datas.I ni . OF oIni .In i que se encontra no diretório do Windows. INI oIni FILE "Arquivo. o Windows utiliza um arquivo INI para guardar sua configuração que é o arquivoWi n . S. Como pode-se imaginar. Os arquivos INI podem ser de grande utilidade para guardar parâmetros de seu programa.c • l o e i C c p l u b p p o : e a G r r e a d t r D d a a t a d ( o ) s p d a o r a r c l i p b o a r d No esqueça de fechar o clipboard uma vez que tenha terminado de usa-lo.L. TO cTitulo DEFAULT A cláusula GET pode indicar um valor padrão se o desejar. Podemos observar que todo o trabalho que pode-se produzir com arquivos INI é carregar ou gravar um determinado valor em uma chave dentro de uma seção específica. ENTRY "Título" . Timers . SECTION "Principal" . Outra característica fundamental é que o dado pode ser uma cadeia. um número.

0 BUTTON “Play” OF oWnd ACTION oVideo:Play(1) Para reproduzir sons e vídeo é necessário que o computador tenha capacidades multimídia.. não parece que esse diaesteja muito perto já que novos controles VBX continuam sendo criados por muitascompanhias.. De qualquer maneira. [ INTERVAL <nInterval> ] . se se destrói a janela se destrói o timer. Para reproduzir um arquivo de som de extensão WAV se utiliza a função SndPlaySound() com o nome do arquivo que se quer reproduzir.Os timers são temporizadores que permitem executar uma instrução cada certo tempo. Porém. Controles VBX Os controles VBX são controles específicos de Visual Basic especializados na realização de determinadas tarefas. FiveWin e quase todas as outras linguagens. [ ACTION <uAction> ] . Para criar um timer temos primeiro que defini-lo e posteriormente ativa-lo. Estes controles se tornaram muito populares já que atualmente existem controles paraproduzir um grande número de tarefas de uma forma muito prática. os dias dos controles VBX estão contados já que serão substituídos por novoscontroles de nome OCX que só funcionarão em sistemas de 32 bits e serão baseados nautilização de OLE de forma extensiva. Ha três níveis de controles VBX devido ao fato que ha três versões de Visual Basic nomercado. ACTIVATE TIMER <oTimer> . Multimídia FiveWin incorpora algumas capacidades multimídia como a possibilidade de reproduzir arquivos de som e de vídeo. ou seja. DEACTIVATE TIMER <oTimer> RELEASE TIMER <oTimer> O intervalo dos timers se refere sempre em milésimos de segundo. Para reproduzir um arquivo de vídeo de extensão AVI FiveWin possui uma classe que é tVideo com seus correspondentes comandos @ 0. 48 48 Curso CA-Clipper + FiveWin Um timer é sempre associado a uma janela. outro para produzir círculos. etc.L.avi” SIZE 200.. [ OF | WINDOW | DIALOG <oWnd> ] . Pode-se desativa-lo com o comando Deactivate ou destrui-lo com o comando Release DEFINE TIMER <oTimer> . se indicado que o intervalo é 1000 se produzirá a instrução indicada na cláusula ACTION a cada segundo. Por exemplo VisualBasic tem um controle para visualizar bitmaps.0 VIDEO oVideo FILE “MeuVideo. Ortiz de Zíñiga. S. inclusive o Visual C++ da . ou seja.200 OF oWnd @ 2.. Nãoé aconselhável o uso indiscriminado dos mesmos e as tarefas que executam devem sermuito rápidas e curtas. Estapopularidade fez com que quase todas as linguagens de programação Windows tenhamsuporte para sua utilização.

FILENAME.L. informação que deve ser proporcionada pelo fabricante do controle.Por exemplo é muito provável que seu novo controle responda àcláusula ‘ON CLICK’. <nCol> VBX [<oVbx>] . 50 50 . <nHeight> ] . FiveWin se apoia no arquivoB iV bx. [ SIZE <nWidth>. • As cláusulas ON permitem qualquer verbo. pelo que ao comprar um controle VBX assegure-se que é de Ortiz de Zíñiga. FiveWin incorpora um pequeno utilitário para inspecionar os controles VBX.Microsoftsó suportam o primeiro nível. Esse programa se encontra em código fonte que deverá ser compilado e linkado. Seu nome é VbxClass. Grande quantidade dos controles Visual Basic já estão implementados diretamente pelo FiveWin pelo que não será necessário usá-los. [ ON <cClause1> <uAction1> .prg e se encontra no diretório \fw\Samples. Esse arquivo se encontra nos últimos compiladores da Borland paraWindows e não é fornecido com FiveWin. se não conhecer o nome não inclua esta cláusula jáque é opcional. Antes de trabalhar com qualquer VBX é importante que tenha a documentação do mesmo já que se não a tiver. Para criar um controle VBX a partir de código: @ <nRow>. S.L. Pode coincidir ou não como nome do arquivo.DLL da Borland para implementar o acesso aoscontroles VBX. A última versão do Resource Workshop da Borland permite também trabalhar comcontroles VBX e para isso incorpora uma opção para adicionar estes controles. ou seja. DISK> <cVbxFile> ] . • Deve especificar a classe do controle. é possívelque tenha que indicar o nome de classe. você pode incluir no comando a cláusula ‘ON LUNES’ porém possivelmente nãoservirá para nada. S. é muito provável que seja incapaz de faze-lo funcionar corretamente. FiveWinpermite usar controles VBX tanto a partir de código como a partir de recursos. Se seu controle não executa corretamente. Os controles VBX são armazenados em arquivos com a mesma extensão e para poderutilizá-los em nossos programas é necessário entregar estes arquivos ao futuro usuário egravá-los em seu diretório\Wi n dow s\ S yst em. [ ON <cClauseN> <uActionN> ] ] Como pode observar sua sintaxe é muito parecida à de qualquer controle porém com uma serie de diferenças: • Deve especificar o arquivo VBX a usar. 49 49 Curso CA-Clipper + FiveWin nível 1. Ortiz de Zíñiga. Temos que nos concentrar nos eventos que ocontrole possui pois são eles que devem ser incluídos na cláusula ON. [ <file: FILE. [ CLASS <cVbxClass> ] . Quase todos os fabricantes de controles intentam ser de nível 1 já que assim seu mercado potencial de venda é muito maior. Sua funcionamento é muito parecida ao de qualquer outro controle porém dependendo desua funcionalidade é muito possível que tenham propriedades e eventos muito específicosque não existam em nenhum outro controle visto antes. [ OF <oWnd> ] .

CA-Clipper RDD é uma arquitetura aberta para utilizar uma multiplicidade de drivers queacessam bases de dados. Paradox) oprocesso de aprendizagem pode ser acentuado já que deverá aprender SQL. Em qualquer outro caso utilizeos RDD do CA-Clipper. Só temos que comparar a rapidez de qualquer driver RDD doCAClipper com o driver de manipulação de arquivos DBF proporcionado pela Microsoftem Visual Basic ou Access. Sempre que utilizar um controle VBX em uma caixa de diálogo utilize um editorde recursos porque isso evitará uma grande quantidade de problemas. Realmente as diferenças são tremendas. o Windows possui seu próprio mecanismo cujo nome éOdbc. [ ID <nId> ] . não obstante estáclaro que ODBC é o futuro e que com o tempo os drivers para ODBC serão melhores e asmáquinas mais potentes. Para criar (redefinir) um controle VBX a partir de recursos: REDEFINE VBX [<oControl>] . De a mesma maneira que CA-Clipper tem um mecanismo interno para a manipulação dosRDD. já que da mesma forma que seu programa é capaz deacessar dados locais com um driver ODBC para arquivos Dbase.dl l o qual permite quequalquer driver ODBC se comunique com ele. ODBC é uma arquitetura aberta para utilizar em todas asaplicações Windows. Seestá familiarizado com linguagens SQL não será muito difícil. ODBC ODBC é o padrão proposto pela Microsoft para acessar bases de dados a partir de aplicações Windows. o mesmo código independentemente do sistema de arquivos quese utilize.L. ODBC é para o Windows o que o RDD é para o CA-Clipper. 51 51 Curso CA-Clipper + FiveWin . [ ON <cClause1> <uAction1> . [ OF <oDlg> ] . ODBC impõe suas próprias regras de utilização pelo que terá que ajustar-se às mesmas. [ COLOR <nClrFore> [.recomendamos que comece já a desenvolver sob ODBC. dBase. porém. Ortiz de Zíñiga.<nClrBack>] ] . Se os sistemas que você vai desenvolver vão ser utilizados em empresas médias ou grandes. só temos que modificar odriver para indicar que agora os dados serão encontrados em um servidor UNIX com ummecanismo SQL de Oracle por exemplo. [ ON <cClauseN> <uActionN> ] ] como podemos observar a sintaxe é muito parecida à de qualquer controle. se só tiverexperi6encia programando com bases de dados navegacionais (Cobol. FiveWin + ODBC permite fazer algo que até agora era impossível que é acessar servidoresSQL sob ambiente cliente-servidor. FiveWin utiliza uma classe para acessar qualquer base de dados via ODBC que é a classetDbOdbc na qual estão implementados comandos principalmente um para criar umaconecção ODBC e outro para estabelecer as consultas.Curso CA-Clipper + FiveWin Alguns controles não funcionam bem dentro de uma janela e só funcionam em caixas dediálogo. ODBC não é a panacéia. ou seja. fazendo que para o programador só existaum único driver. S. inclusive acesso a dados através de servidores SQL.

Uma vez estabelecida a conecção pode-se utilizar o método :Execute() para produzirqualquer consulta. FiveWinimplementou a classe ODBC de forma que prossigamos utilizando o mesmo esquemadBase para acessar os dados. pelo que deve-seconfigura-lo em cada uma das máquinas. podemos verificar com o dado :nRetCode do objeto oDbc que terá um valor diferente de zero. Estenovo objeto se encarrega de estabelecer a conecção física com o driver ODBC da seguinteforma: oStmt := OdbcStmt:New(oDbc) Ortiz de Zíñiga. A cláusula NAME é o nome da base de dados a utilizar e que corresponde com o nome queconsta na configuração do ODBC e não com o nome de nenhum arquivo DBF. [ FROM USER ] oDbc é a variável que carrega o objeto recém criado.Para fazer uma transição mais simples a partir de arquivos Dbase para ODBC. Uma vez estabelecida a conecção. Como podemos observar no comando é permitido selecionar a conecção ODBC de forma interativa. As cláusulas User e Password são utilizadas em algumas conexões ODBC e nem sempre são necessárias. 52 52 Curso CA-Clipper + FiveWin da mesma forma deveremos verificar o dado oSmt:nRetcode para ver se a conecção foi correta. Um cursor em SQL é um handle a uma tabela temporária . quando configuramosODBC devemos indicar que arquivos serão acessados através de um determinado NAME. Se ocorrer algum erro na conecção.Prg a instrução #include “sql. Uma únicaconecção ODBC pode acessar múltiplos arquivos DBF.ch” e utilizaremos o seguinte comando: DEFINE ODBC <oDbc> . como por exemplo: ODBDC oDbc EXECUTE “SELECT * FROM CLIENTES” Temos notado que este comando não funciona ao menos na última versão do FiveWin eque foi implementada uma classe nova de nome OdbcStmt que se encarrega de fazer asconexões físicas e manter a informação de cada consulta que se faça ao objeto oDbc. [ CONNECT <cConnect> ] . [ PASSWORD <cPassword> ] .L. [ USER <cUser> ] . [ NAME <cName> ] . Para estabelecer uma conecção ODBC deveremos incluir no arquivo . S. poderemos produzir qualquer consulta com o comando ODBC oDbc EXECUTE cCommand O cCommand é uma cadeia com qualquer instrução SQL que seja suportada pelo driver utilizado. A cláusula CONNECT é utilizada no caso de uma conecção a um mecanismo SQL e temos que introduzir o ‘Data Source Name’ que pode ser por exemplo “Oracle-Serv1”. No caso de uma instrução ‘SELECT’ o objeto oStmt terá toda ainformação do Cursor. Para utilizar ODBC a partir de qualquer aplicação Windows deve-se assegurar que todos osusuários que vão utilizar a aplicação tenham carregado em seu computador o driver ODBCe que além disso este esteja configurado corretamente. assim sendo. ODBC necessita saber a priori quebases de dados serão utilizadas via ODBC e que drivers vão utilizar.

AS <return> [PASCAL] LIB <DllName> LL [STATIC] FUNCTION <FunName>( . Por último. 2 ) n ( t 1 o H b ) a y b y t e d • o n m o r m o n t d e l s e .L. P c • u 8 y t e s d e c o m p r i m e n t o ) Return indica o tipo de dado que a função devolverá. h i . recorde que não pode ter mais de 10 caracteres. m . este comando deverá ser incluído no princípio ou final de seu . d e L p s t r .criadaatravés da instrução SELECT. Recomendamos que analise em profundidade o programa de exemploOdbc1. com a instrução Fetch obtemos em SQL todas as colunas databela temporária. Se sua aplicação faz uso extensivo de funções que se encontrem em uma DLL é preferívelproduzir um pequeno módulo em C para acessar as mesmas já que a velocidade aumentaconsideravelmente. a cláusulaPascal indica se a função acessada utiliza convenção Pascal o não. A cláusulaLi b indica o nome da LIB a ser utilizada. 4 i l m e m p c r B D e S b e h i o C n t y n ( a m o r e l ( t o i e t o b n s ) . Manipulação de DLLs A partir do FiveWin podemos acessar qualquer biblioteca de ligação dinâmica para utilizala em seus próprios programas. Uma das melhorias introduzidas na última versão do FiveWin é a possibilidade de passar ponteiros a estas funções. Para mais informação consulte qualquer livro sobre SQL. (quando emC uma função é definida como tipo Pascal ela não distingue entre maiúsculas nemminúsculas e além disso não coloca o underscore no princípio da função). 53 53 .normalmente todas as funções da API do Windows utilizam convenção Pascal.prg no qual se mostra a atual forma de utilizar ODBC. FunName é o nome da função. d e h c • n r t g . Para isso só temos que passar o parâmetro por referência. Ortiz de Zíñiga. Para poder utilizar qualquer função que se encontre em uma DLL devemos primeiramente defini-la com o seguinte comando [ <Param1> AS <Type> ] . Os valores podem ser os mesmos que o tipo. No capítulo de conecção com a API será mostrada a forma de faze-lo. [ <ParamN> AS <Type> ] ) . Paramx indica o nome dos parâmetros que a função receberá etyp e indica o tipo destes parâmetros que pode ser: • B e W W o L t o D y t c e o r d p d . r g ( p r b .Prg e nunca dentro de uma função o procedimento. S.

Para estabelecer a conecção utilizamos o seguinte comando DEFINE <dde:DDE.não terá como fazê-lo senão através de uma ligação DDE. FiveWin pode atuar tanto como cliente ou como servidor DDE. Para poder estabelecer umacomunicação entre duas aplicações é necessário que uma delas seja DDE cliente e a outraDDE servidor ou vice-versa. FiveWin incorpora uma classe e um conjunto de comandos para produzir ligações DDE. Por exemplo. nStatus != 16 MsgStop(“Erro ..Curso CA-Clipper + FiveWin Dynamic Data Exchange (DDE) DDE é um sistema de comunicação entre aplicações. devemos ter a precaução de que esta aplicação esteja carregada utilizando a função WinExec() #DEFINE SW_MINNOACTIVE 7 . a documentação queacompanha o SDK do Windows só oferece informação DDE do gerenciador de programas(Progman.LINK> <oDde> . Report Smith.SW_MINNOACTIVE) IF nStatus < 32 .Exe”. [ SERVICE <cService> ] .exe). R&R. Os passos necessários em qualquer ligação DDE são os seguintes: • E o e A P o é F s n r t r m t i t e v i o u o n a c i v d n d a b ç d a u i o l e ã o r z c l o r e c c D e o D c a r m E o n a o c s • • a i a E r ç x a r ã e e c ç ã o c m • o c a u c t o e m ( ) o i z c o n e c ç ã o . [ TOPIC <cTopic> ] . Se deseja utilizar a partir do FiveWin qualquer ferramenta de geração de relatóriosproduzido por outro fabricante como CA-Ret. Para poder estabelecer a comunicação com um servidor DDE é necessário conhecer todosos verbos que esse servidor admite e embora pareça mentira muito poucos fabricantes desoftware fornecem informação exaustiva sobre DDE. Tenha em mente que DDE tem limitações e exige que ambas aplicações estejam carregadas na memória. Crystal Reports. A sintaxe dessas ações ou verbos dependerão doservidor DDE. nStatus := WinExec(“Server. O DDE cliente é o que iniciará a conversação e pedirá aoservidor que execute uma série de ações.exe”) QUIT ENDIF ..não foi possível disparar Server.and. [ VALID <uEnd> ] A cláusulaS ervice indica a aplicação que vai atuar como DDE server. [ ITEM <cItem> ] . etc.

1656) o qual tem um ambiente visual muito atrativo. as mais importantes são as seguintes: • HelpIndex() que ativa o help mostrando o índice do mesmo.L.pelo que só terá que fazer um INCLUDE desse arquivo em seus arquivos . irá ascendendo a sua classe mãe até encontrar umidentificador diferente de zero. Ortiz de Zíñiga.PRG e ao indicaro identificador de help não utilize o número e sim o símbolo descritor do mesmo no arquivo. dos quais sepodem destacar dois deles. em nenhum caso se explicará como confeccioná-lo. no princípio de sua aplicação deverá designar qual é seu arquivo de help com a instrução SET HELP TO “Ajuda. • HelpTopic(nTopic) que permite ativar em um determinado tópico.hlp” Uma vez realizada esta instrução poderá utilizar uma série de funções para invocá-lo. do resto o FiveWin seencarrega. 54 54 Curso CA-Clipper + FiveWin Manipulação de arquivos de Help Neste capítulo se dará informação de como acessar um arquivo de help para Windows. 55 55 . • HelpSearch(cTexto) que ativa o help e busca a cadeia cTexto. o programa solicitará ao operador. melhorou substancialmente seu sistema de help. e o segundo é o Quickand dirty help de Phil Allen software.Atualmente só é necessário estabelecer o arquivo de help a utilizar.poderá indicar. Quando o usuário pressionar F1 em qualquer parte daaplicação o FiveWin buscará o identificador do help na janela ou controle que tenha foco.hhh. Se não encontrar nenhum identificador diferente de zeromostrará o índice do help.HHH que é o mesmo utilizado com a ferramenta de geração de helps. FiveWin incorpora uma série de funções para acessar helps do Windows.(CIS: 70272. Existem no mercado produtos muito bons para desenhar arquivos de help. Se não for introduzido nenhum texto.L. Se deseja incluir um botão de help para um diálogo na cláusula ACTION desse botão ponha só oDlg:HelpTopic() Também é possível associar um identificador de help a cada opção de menu. Ambos produtos são shareware e podem serencontrados em vários BBS e CD-Roms. O sistema funciona da seguinte maneira. um número para identificar o tópico correspondente de seuhelp (oWnd:nHelpId) e quase todos os controles e janelas tem a possibilidade de associá-lodiretamente com seu comando. ao criar uma janela. A cláusulaVal id é utilizada para produzir qualquer operação ao finalizar a conecção DDE. se o identificador for zero. Existem produtos mais profissionais porémcremos que para a maioria dos programadores são excessivamente complexos e de umadificuldade desnecessária. Quase todos os programas que implementam ‘Helps’ para Windows criam um arquivo decabeçalho com os defines de todos os tópicos existentes cuja extensão costuma ser .As cláusulasTop i c eI tem são opcionais e seu uso depende do servidor DDE o requerer.e. S. S. O FiveWin. se o desejar. um diálogo ou um controle. Ortiz de Zíñiga. em sua última versão. o primeiro e mais espetacular é Visual Help da WinWare Inc. Pode-se invocar HelpIndex() a partir de uma opção de menu HelpConteúdo.

TDDE Dynamic Data Exchange Tfont Font Class Twindow Window base Class Tdialog Dialog Boxes Tbar . herdar das já existentes e inclusive modificar as atuais já que FiveWin oferecetodos os fontes das classes que utiliza.L. dois e três 3. Ortiz de Zíñiga. Coloque um brush qualquer no programa produzido anteriormente 4. um para fazer um copy do dado do Get ao Clipboard e outro que faça um “Paste” do clipboard ao Get. 6. Porém seria uma lástima não aproveitarem benefício próprio as possibilidades que a OOPS nos oferece.V bx. Quando tiver práticacom a programação orientada a objetos se perguntará como alguma vez pôde programarsem ela. Faça uma janela que quando pressionar o botão direito mostre um menu Pop-up com as opções Um. S. Como pode-se observar até agora temos utilizado uma vasta gama de objetos novos que não existem normalmente em CA-Clipper e que logicamente foram criados pelo FiveWin. Do resto das classes. 2. quase nenhumatem classe superior. Faça uma caixa de dialogo com um get e dois botões. 8. Crie uma caixa de diálogo na qual se utilize o controleSw i t ch . Faça um programa que abra uma base de dados qualquer com um browse sob um ambiente MDI com uma opção de menu para imprimi-la. Faça um programa que guarde em um arquivo INI o Título da janela e suas coordenadas ao abandonar a aplicação. você pode criar suas própriasclasses. A grande vantagem que o FiveWin oferece é que. o FiveWin utiliza uma classe base tWindowque é herdada pelo resto das janelas e diálogos e uma classe intermediária de nome tControlque por sua vez é herdada por todos os controles.bat”. Hierarquia de classes No que concerne à manipulação de janelas. Faça um programa que crie um novo grupo no gerenciador de programas de nome Prova e com um elemento que execute o Notepad com o arquivo “Autoexec. Faça um janela que mostre a hora atual utilizando um timer 7. além disso. 5. 56 56 Curso CA-Clipper + FiveWin OBJECTS: MECANISMO OOPS DO FIVEWIN O FiveWin incorpora ao CA-Clipper um mecanismo para programação orientada a objetos de nome OBJECTS.Curso CA-Clipper + FiveWin Exercícios 1. Até o momento não construímos nenhuma classe nova nem modificamos nenhum dado oumétodo de nenhuma já que não foi necessário.

S. . já que foi construído com aintenção de oferecer a máxima flexibilidade possível.L. podemos fazê-lo. 57 57 Curso CA-Clipper + FiveWin TMultiGet Gets for Memo editing Tradio Radio controls TScrollBar ScrollBars controls TVbX Visual Basic controls TWBrowse Browse controls Tmenu Menu Class TMenuItem Menu MenuItems Tblock FiveWin disk-storable codeblocks TMCI Media Control interface Tvideo AVI Video controls TRadMenu Radio Controls Menu Tprinter Printer Class Treport Report engine TrColumn Report engine TrGroup Report engine TrLine Report engine Ttimer Timer Class Acesso aos dados e métodos Podemos acessar qualquer dado ou método de uma classe desde que não esteja protegido erealmente no FiveWin ha muito poucos dados protegidos. porém devemos saber muito bem o que estamos fazendo. Se for necessário modificar um dado de uma classe.Button bar TMdiFrame MDI support TMdiClient MDI support TMdiChild MDI support TMsgBar Messages bar Tcontrol Base Class for controls Tbitmap Pictures in Bitmaps Tbutton PushButtons TCheckBox Logical checkboxes TComboBox Get + ListBox functionality Tget Typical Clipper GET Ticon Icons as controls TListBox ListBox selection list Tmeter Meter controls Ortiz de Zíñiga.

..podemos criar um objeto janela herdado da classe tWindow que só verifique se a tecla F4foi pressionada e. . Por exemplo. a classe Listboxtem um dado que são os itens desse listbox que são guardados em uma matriz.. Observecomo. Por exemplo. e o mesmo ocorrerá com os métodos. Seu nome não pode exceder 10 caracteres. NomeDadox é o nome de cada um dos dados que a classe vai Ter..> ] ) . logicamentedeverá ser utilizado para adicionar novos elementos. Pode-se colocar tantos métodos quantos forem necessários com várias sentenças METHOD. [ CONSTRUCTOR | SETGET | VIRTUAL | BLOCK ] ENDCLASS NovaClasse é o nome da nova classe que vamos criar. Paramx é uma lista de possíveis parâmetros que o método pode receber. se desejarmos modificar ovalor de um controle Get deveremos utilizar o método cText() desta classe.ch" ou #include “Fivewin. 58 58 Curso CA-Clipper + FiveWin Criação de novas classes Pode-se criar todas as classes que se desejar. Para criar uma nova classe esta é a sintaxe que deve utilizar: #include "Objects.ch” CLASS <NovaClasse> [ FROM <ClasseMãe> ] DATA <NomeDado1> DATA <NomeDado2> . só uma por . Porém há dados que sem dúvida teremos que modificarquando começarmos a programar com FiveWin.. NomeMetodox é o nome de cada um dos métodos que a classe vai ter.PRG.seu arquitetura é muito simples e em pouco tempo será capaz de tirar o máximo proveitodo FiveWin acessando diretamente os métodos e dados de cada classe. separando-os por vírgulas ou colocando várias sentenças DATA.> ] ) .L.. porém.O FiveWin utiliza os comandos para ocultarprecisamente a complexidade de algumas construções de objetos que recebem uma grandequantidade de parâmetros.. podemosmodificar os dados e a seguir utilizar o método Refresh() porém recomendamos que antesde modificar qualquer dado de uma classe certifique-se de que não há nenhum método paraproduzir esta tarefa já que possivelmente ao alterar o dado seja feito algo mais quepossivelmente você não tenha percebido ou desconheça. ClasseMãe é o nome da classe superior à que pertence se é uma classe herdada. podemos fazer que a partir do método da classe filha seexecute também o método da classe mãe como veremos mais adiante. METHOD <NomeMetodo1>( [ <params. que seja sua classe superior a que processa opressionamento de teclado. Ortiz de Zíñiga. Quando ummétodo de uma classe coincidir com outro de sua classe superior sempre tem precedência ométodo da classe filha. Quando uma classe é herdada de outra superior esta classe tem seus próprios dados e alémdisso os de suas classes superiores. S. Por exemplo. caso contrario. além disso. [ CONSTRUCTOR | SETGET | VIRTUAL | BLOCK ] METHOD <NomeMetodo2>( [ <params. É importante que analise todos os dados e métodos de cada classe que queira manipular. Você podeadicionar elementos à matriz porém possivelmente produza um erro de execução. a classe Listbox possui um método de nome AddItem() que. Pode-se colocar tantos nomes quantos forem necessários. porém..

É caracterizado por devolver uma referência de si mesmo.. ENDIF RETURN Super:KeyDown(nKey) Exercícios 1. S. 59 59 Curso CA-Clipper + FiveWin para que ao terminar de executar seu próprio método se execute o de sua classe mãe faríamos: METHOD KeyDown(nKey) CLASS Janela ... Se desejar acessar um dado ou método de sua classe superior utilize a variável“Parent(NomeMãe)”. • Inline é um método definido na mesma linha de definição... Faça um programa que mostre numa janela constantemente a posição do cursor do mouse... 60 60 Curso CA-Clipper + FiveWin Conecção com a API do Windows Como Conectar? . ouseja. porém. Virtual que é um método que não faz nada. IF nKey == KEY_F4 RETURN .. se uma classe tem um método do mesmo nome que sua classe mãe principal Ortiz de Zíñiga. Os métodos que não são em linha devem ser codificados na seqüência da definição da classe..Os métodos podem receber varias cláusulas: • Constructor que indica o método utilizado para construir uma instância • da classe.. Crie uma nova classe de nome retângulo com os dados largura e altura e com o método constructor New e o método área 3.L.Por exemplo.L. . se desejar acessar a sua classe mãe principal deverá utilizar “Super”. Crie um método para a classe Get de forma que inverta o sentido de suas letras..>] ) CLASS <Classe> . Ortiz de Zíñiga. é muito útil para herança ou quando se está criando e experimentando um classe.. 2. Por exemplo. ou seja. o objeto.. para acessar um dado de nome nOrdem faríamos:Self:nOrdem. por comodidade OBJECTS permite substituir a palavra “Self:” por “::” peloque ficaria ::nOrdem. return Dentro de qualquer método podemos acessar qualquer dado da classe simplesmenteutilizando a variável Self. Para codificá-los se utiliza a seguinte sintaxe: METHOD <NomeMetodo>( [<params. se no Get há ao valor “123” ao executar o método :Inverter() passará a valer“321”. S.

só é necessário um pequeno conhecimento de programação em C. A primeira coisa que deve-se Ter em mente é que o CA-Clipper utiliza seu próprio sistemade Stack para as variáveis e portanto não pode-se passar parâmetros diretamente a partir doCA-Clipper a uma função em C e tampouco poderá esta função em C devolver parâmetrosao CA-Clipper. } FiveWin incorpora todos os fontes de conecção com a API onde poderá observar o quão simples é.. este é o motivo pelo qual o FiveWin renomeou todas asfunções da API de menos de 10 caracteres colocando um underscore no começo delas.wav seria da seguinte forma: #include <WinTen. 61 61 Curso CA-Clipper + FiveWin Um programa em C Por exemplo a função que nos permite reproduzir um arquivo .L.. Não tem implementadas todas.. Sesua função tem menos de 10 caracteres lembre-se de redefini-la com um underscore noarquivo Wi nt en . que consiste em funções _par.h> #include <Windows. <nModo> )--> <lExito> { _retl( sndPlaySound( _parc( 1 ). para isso seutilizam por exemplo a partir da Borland C++ os flags: -c -ml Todos seus programa em C deverão começar pelos seguintes includes: #include <Winten. porém como veráem seguida. Conectar com a API do Windows a partir de sua aplicação é uma tarefa muito simples... mas não demasiado. Ortiz de Zíñiga.. Para resolver este problema o CA-Clipper proporciona o que eles chamam“Extended system of CA-Clipper”.h> #include <Windows.h.. Assim sendo.() para devolver valores apartir de C para o CA-Clipper. é muito fácil implementar aquelas que necessite.A princípio..() para recuperar a partirde C parâmetros passados a partir do CA-Clipper e funções _ret.h> #include <MMSystem.h que é aonde está a função SndPlaySound() prototipada • . }//--------------------------------------------------------// Observe os detalhes de nossa função: • Colocamos o include de MMSystem. o FiveWin incorpora uma série de funções para conectar com a API que vocêpode utilizar dentro de seus programas.h> Como cabeçalho de funções se utiliza a palavra ‘CLIPPER’ CLIPPER Funcao(params) {. S.h> #include <ClipApi..h> #include <Clipapi. _parni( 2 ) ) ). O CA-Clipper utiliza símbolos PASCAL com um máximo de 10 caracteres. Para compilar sua pequena função em C pode utilizar qualquer compilador porém deveráutilizar o modelo largo de memória e indicar ao compilador que não linque.se vai utilizar identificadores do Windows com menos de 10 caracteres é possível queobtenha símbolos duplicados.h> //--------------------------------------------------------// CLIPPER SNDPLAYSOU() // ND( <cArquivo>.

além disso.Manual Em Portugus Baixar este documento gratuitamenteImprimirCelularColeçõesDenunciar documento Informar sobre este documento? Diga-nos a(s) razão(ões) para denunciar este documento Parte superior do formulário bc6876949a15de doc Spam ou lixo eletrônico Conteúdo pornográfico adulto Detestável ou ofensivo If you are the copyright owner of this document and want to report it. Faça uma função em C que devolva o diretório do Windows. Relatório Cancelar Parte inferior do formulário Este documento é particular. e _parn(2)é o segundo parâmetro que é de tipo numérico. dos parâmetros que vaimanipular e o que vai retornar • Como pode-se observar _parc( 1 ) é uma função que recolhe oprimeiro parâmetro passado à função que é de tipo caracter. Ortiz de Zíñiga. Classificação: .Utilizamos a cadeia CLIPPER no começo da função. • • Utilizamos até 10 caracteres para a definição da função É um bom costume colocar como comentário os possíveiscaracteres a partir do 10 e. 62 62 FiveWin . • A função devolve um valor lógico através da função _retl() Se desejar obter mais informação recomendamos que analise todos os fontes queacompanham o FiveWin no diretório\F w \S ou rce\Win api e consultar a documentaçãooferecida pelo CA-Clipper sobre seu “Extended System”. please follow these directions to submit a copyright infringement notice.L.092 Carregado: 08/25/2010 Categoria: Não classificado. S. Informações e classificação Leituras: 1. Exercícios 1.

p. . 2.0 5 false false 0 Copyright: Atribuição não comercial Seguir DaviREv Compartilhar e integrar Documentos relacionados AnteriorPróximo 1. p. p. p.

p.p. . p. 3. Mais coisas deste usuário AnteriorPróximo 1. p. p.

Readcasters recentes Adicionar comentário Parte superior do formulário bc6876949a15de . 2. 66 p. 418 p.7 p. 13 p. 7 p.

and select print from the file menu (PDF reader required).Enviar Caracteres: 400 document_comme 4gen Parte inferior do formulário Imprimir este documento Alta qualidade Open the downloaded document.logged_in 36418169 dow nload Parte inferior do formulário Registre-se Não tenho conta no Facebook Parte superior do formulário .logged_in http://pt.co 36418169 Scribd.co dow nload Scribd.scribd. Baixar e imprimir You Must be Logged in to Download a Document Use seu registro do Facebook e veja o que seus amigos estão lendo e compartilhando.scribd. Outras opções de registro Login with Facebook Parte superior do formulário http://pt.

Essas notificações podem ser gerenciadas nas configurações da conta. Já tem uma conta Scribd? Parte superior do formulário bc6876949a15de 36418169 dow nload Scribd. Parte inferior do formulário Por que se inscrever? Descubra e se conecte com pessoas de interesses semelhantes.logged_in endereço de email (obrigatório) criar nome de usuário (obrigatório) senha (obrigatória) Quero receber a Newsletter Scribd e eventuais comunicados sobre a conta. . Publique seus documentos rápida e facilmente.bc6876949a15de 36418169 dow nload Scribd.. Registre-sePolítica de privacidade Você receberá notificações por email sobre a atividade da sua conta. Prometemos respeitar sua privacidade.. Compartilhe seus interesses em leitura no Scribd e em sites sociais.logged_in endereço de email ou nome de usuário senha Logon Está com problema para se conectar? Parte inferior do formulário O logon teve êxito Trazendo você de volta.

« Voltar para o logon Redefina sua senha Insira seu endereço de email abaixo para redefinir sua senha.com/scribd twitter. Enviaremos um email para você com instruções sobre como continuar. Parte superior do formulário bc6876949a15de Endereço de email: Você também precisa criar um logon para esta conta.com/scribd Sobre Imprensa Blog Parceiros Scribd 101 Material da web Loja Scribd Suporte Perguntas frequentes Desenvolvedores/API Vagas Termos Copyright Privacidade . Logon: Enviar Parte inferior do formulário Carregar um documento Parte superior do formulário Pesquisar Documentos Parte inferior do formulário • • • • • • • • • • • • • • • • • • Siga-nos! scribd.com/scribd facebook.

com/p?c1=2&c2=9304646&cv=2. scribd.com/pixel/p-13DPpb-yg8ofc.scorecardresearch.com/p-13DPpb-yg8ofc" target="_blank"><img src="http://pixel. scribd.0&cj=1" /> .quantcast. scribd.Copyright © 2011 Scribd Inc. scribd. scribd. scribd.gif" style="display: none. Idioma: Português (Brasil) Escolha o idioma com o qual quer usar o Scribd: • • • English Español Português (Brasil) scribd. scribd. scribd. scribd.quantserve." border="0" height="1" width="1" alt="Quantcast" /></a> <img src="http://b. <a href="http://www.