Você está na página 1de 43

Curso de FiveWin

DESCRIO TCNICA DO CLIPPER PARA WINDOWS -FIVEWINRequisitos de Hardware: Para programar uma aplicao (Requisitos mnimos): Computador 80386SX. 04 Mb RAM. HD com espao disponvel de 04 Mb. Monitor VGA monocromtico. Para executar uma aplicao: Computador 80386SX, 04 Mb RAM. 04 Mb RAM. Monitor VGA monocromtico. Requisitos de Software: Windows 3.1. CA-Clipper 5.2d. FiveWin 1.9.2 Borland Resource WorkShop 4.0. Blinker 3.2. Caractersticas tcnicas: Roda em um equipamento 80386SX com 04 Mb RAM, trabalha perfeitamente em Windows 3.10, Windows 3.11, Windows'95, Windows NT. Vantagens comparativas - cinco vezes mais rpido que o Visual Basic (Trabalha quase a velocidade de CA-Clipper DOS), - Se programa at 20-30% menos de cdigo que com uma ferramenta visual atual. - Utiliza muito poucos recursos do sistema (04 Mb RAM, 80386SX, at sem disco rgido). - Trabalha em redes (Novell, NT). - Altamente orientado a objetos. Permite a criao de classes. - a forma mais fcil de migrar uma aplicao de DOS a Windows.

INTRODUZINDO-SE AO CA-CLIPPER COM FIVEWIN Introduo.

Filosofia do CA-Clipper para Windows. Requisitos de Hardware e Software. Escrevendo meu primeiro programa em Windows! Compilao e linkedio. Janelas em Windows- O que so. CONTROLES EM WINDOWS Definio Say Get Combobox Radiobutton Pushbutton Listbox Browses Spinner Checkbox Meters Cursores Timers Bitmaps Folders Scroll Bars Tool-Tips Qualquer Controle! PROGRAMAO VISUAL O que uma DLL? O Resource WorkShop, a forma de programao visual em CA-Clipper. Menus - Nunca mais fcil! PROGRAMAO ORIENTADA A OBJETOS Destruindo um mito. Os arquivos .INI - Dando inteligncia ao programa. Manipulao de arquivos. APROVEITANDO AS CARACTERSTICAS PRPRIAS DO WINDOWS O Clipboard do Windows De pais e filhos - Janelas MDI Janelas Modais e no modais Linkedio a um DDE. Instalao de sistemas. Relatrios - A magia do relatrio em CA-Clipper e Windows . Utilizando controles VBX em CA-Clipper. Que Drag&Drop? Fazendo ajudas em Windows. O arquivo de linkedio. OLE!

MULTIMIDIA Multimdia: colocando som e/ou vdeo em nossos sistemas. MANEJO DE ERROS O Debugger em CA-Clipper. Manipulao de erros. EPLOGO Truques sujos em CA-Clipper. RAD em CA-Clipper Windows. Todo o que fica no armrio... E agora o que?

INTRODUZINDO-SE AO CA-CLIPPER COM FIVEWIN Introduo.

Muitos de Vocs (devo assumir), so programadores em CA-Clipper. Conhecem quase perfeio o modo de programar em DOS quase qualquer aplicao, e se sentem satisfeitos com seu trabalho. Mas uma pequena inquietude se vai fazendo cada vez mais grande em ns: Windows. Alguns tem pensado em trocar sua ferramenta de trabalho, e vem tentando entre o Visual Basic, Visual Fox, Delphi e/ou o PowerBuilder. Sem dvida, estas ferramentas so as ferramentas do futuro, mas o presente o que se nos mostra incerto. Devemos pedir a nossos usurios para trocar seus computadores (80386, talvez, com sorte 80486) para equipamentos Pentium, e adquirir um gerenciador de arquivos cliente-servidor? muito custoso. Mas, que o que acontecer aos usurios que nos pedem sistemas em Windows, interfaces em Windows, relatrios WYSIWYG com grficos, TUDO em Windows? No podemos dizer "Ho sinto senhor, mas eu s trabalho em DOS (!)". Pois uma nova luz surge em nosso horizonte. Uma ferramenta que nos permitir trabalhar tranqilos no que sabemos e prepararmos para o futuro (em uns cinco anos, talvez) , enquanto vivemos em o presente. Bem-vindos ao CA-Clipper e FiveWin. Filosofa do CA-Clipper para Windows. Programar em CA-Clipper para Windows muito fcil, e a filosofia se rege por uma s regra: Isolar os procedimentos que no mostram dados em tela dos que sim, saem tela *. Ou seja, as "caixas negras", ou rotinas de processos (leia-se gerao do livro dirio, clculo de as vendas do dia, etc.) NO MUDAM. As apresentaes na tela (nossos famosos @ ... say), SIM MUDAM. Mas, afortunadamente para ns, estas trocas se fazem em modo visual. Deste modo, a curva de aprendizagem ser mnima. Evidentemente, e graas orientao a objetos do CA-Clipper, podemos melhorar nossos sistemas tambm nas "caixas negras", e nestas linhas mostraremos todas as tcnicas existentes. Sinta-se livre de utilizar s as que necessite para seus propsitos. *Vejamos um exemplo: function limpar()** if dado->(flock()) @ 3,3 say "Realocando campos" while dado->(!eof()) dado->dado:=0 dado->(dbskip(1)) enddo endif dado->(dbunlock()) return(nil) *O @ 3,3 say "Realocando campos" deveria ser chamado numa funo DOS mostralimpa(), desse modo a "caixa negra" no mostrar dados na tela. Se em fizermos nosso fonte uma funo equivalente WINmostralimpa(), as caixas negras sero exatamente iguais, independentemente do ambiente operacional.

**Podem apreciar minha alta tendncia a utilizar funes (em vez de comandos) e ponteiros (para no trocar os alias ativos). Requisitos de Hardware e Software. Hardware: (Programao e execuo): 80386SX, 16 Mhz, 04 Mb RAM, monitor VGA Monocromtico, espao em HD de 04 Mb (requisitos mnimos, mas suficientes). Software: CA-Clipper 5.2, biblioteca FiveWin 1.9.2, linkeditor Blinker 3.2, Resource WorkShop 4.0 de Borland. Escrevendo meu primeiro programa em Windows! Sim, j entendi a mensagem: Basta de palavras e mais ao!. Pois ento vamos: Primeiro, entre no Windows. Uma vez nele, crie uma sesso DOS (selecione o cone MSDOS e pressione dos vezes o boto esquerdo do mouse.). Crie o diretrio \demo e entre nele. Chame seu editor de textos favorito e escreva o programa x.prg: #include "FiveWin.ch" function main() local ow define window ow from 0,0 to 10,80 title "CA-Clipper" @ 1,1 say "Estou programando em Windows!" activate window ow return(nil) Agora escreva o programa bli.lnk: BLINKER CLIPPER SYMBOL OFF fi x out meumome.exe PACKCODE PACKDATA DEFBEGIN name MeuNome description 'este meu programa' exetype Windows 3.1 code moveable discardable preload data preload moveable stacksize 10000 heapsize 1024 segment 'PLANKTON_TEXT' nondiscardable segment 'EXTEND_TEXT' nondiscardable segment 'OM_TEXT' nondiscardable segment 'OSMEM_TEXT' nondiscardable segment 'SORTOF_TEXT' nondiscardable segment 'STACK_TEXT' nondiscardable DEFEND NOBELL sear Five, FiveC, Objects

sear WinApi, Clipper, Extend, DbfNtx, Terminal Compilao e linkedio. Clipper x /n blinker @bli Se esto instalados os programas corretamente, Voc ter o programa x.exe. Ao execut-lo no DOS, o programa lhe dir algo como "this program requires Microsoft Windows" (Este programa requer Microsoft Windows), o correto, pois um programa feito em Windows. Agora, se o chama do gerenciador de programas de Windows (Arquivo / Executar c:\demo\x.exe), Ver em tela seu primeiro programa em Clipper para Windows! (Se o programa invocado no Windows 95, a sesso DOS invocar ao Windows e o executar). Demasiadamente simples (o programa), dir voc. Pois tenhamos pacincia por agora, que j melhoremos. NOTA: No que se diz respeito ao arquivo bli.lnk, este um arquivo de linkedio, que contm informao tcnica a qual no deve nos preocupar, pois mais adiante o veremos com detalhe. S basta saber pelo momento que o mesmo arquivo nos servir para todos os programas que escrevermos a seguir para Windows. Janelas em Windows - O que so : Antes de aprofundar mais no tema, entendamos bem um conceito bsico ao programar em Windows. Quando se programava em DOS, tinha toda a tela para mostrar seu programa, e s preocupava de restaurar a tela quando era necessrio. Em Windows, (que um sistema operacional, tal como o DOS), se pode trabalhar ,numa s tela, ou em muitas telas pequenas. Cada tela conhecida como janela (da o nome -Windows-), e cada uma manipulada pelo sistema operacional (Imaginemos que temos um monto de monitores dentro de nosso monitor DOS, esta mais ou menos a idia. Uma vantagem disto que vez de utilizar o restscreen, simplesmente eliminamos a janela). Cada janela tem caractersticas, (Pode criar, mudar de lugar, de tamanho, elimin-las, etc.), e no necessitamos programar nada disso. (Insisto em a analogia com o DOS, s que o DOS manipula UMA s tela). Basta armazenar a janela numa varivel para administr-la. Para criar uma janela em FiveWin, a sintaxe : DEFINE WINDOW <VARIVEL> ; [ FROM <EJEX1>, <EJEY1> TO <EJEX2>, <EJEY2> ] ; [ PIXEL ] ; [ TITLE <TTULO> ] ; [ COLOR | COLORS <COLOR> [,<COLOR>] ]; [ OF <VARIVEL2> ] ; [ BRUSH <FUNDO> ] ; [ CURSOR <CURSOR> ] ; [ ICON <CONE> ] ; [ MENU <MENU> ] ; [ STYLE <ESTILO> ] ; [ BORDER [ NONE | SINGLE ] ] ; [ NOSYSMENU | NO SYSMENU ] ; [ NOCAPTION | NO CAPTION | NO TITLE ] ; [ NOICONIZE | NOMINIMIZE ] ; [ NOZOOM | NO ZOOM | NOMAXIMIZE | NO MAXIMIZE ] ;

[ VSCROLL | VERTICAL SCROLL ] ; [ HSCROLL | HORIZONTAL SCROLL ] Onde: VARIVEL EJEX1,EJEY1 EJEX2,EJEY2 TTULO COLOR VARIVEL2 FUNDO CURSOR CONE MENU Varivel com a qual manipularemos a janela. Coordenadas iniciais. Coordenadas finais. Ttulo da janela. Color da janela. Varivel da janela que contm esta janela Fundo a pr na janela Cursor a mostrar na janela cone a mostrar na janela Menu que mostrar a janela

ACTIVATE WINDOW <VARIVEL> ; [ VALID <FVALID> ] ; [ <show: ICONIZED , NORMAL , MAXIMIZED> ] [ ON [ LEFT ] CLICK <FLClick> ] ; [ ON LBUTTONUP <FLButtonUp> ] ; [ ON RIGHT CLICK <FRClick> ] ; [ ON MOVE <FMove> ] ; [ ON RESIZE <FResize> ] ; [ ON PAINT <FPaint> ] ; [ ON KEYDOWN <FKeyDown> ] ; [ ON INIT <FInit> ] ; [ ON UP <FUp> ] ; [ ON DOWN <FDown> ] ; [ ON PAGEUP <FPgUp> ] ; [ ON PAGEDOWN <FPgDn> ] ; [ ON LEFT <FLeft> ] ; [ ON RIGHT <FRight> ] ; [ ON PAGELEFT <FPgLeft> ] ; [ ON PAGERIGHT <FPgRight> ] ; [ ON DROPFILES <FDropFiles> ] Onde: VARIVEL FVALID FLClick FLButtonUp FRClick mouse. FMove FResize FPaint FKeyDown Nome da Janela Funo de validao ao fechar-se a janela. Dever retornar .t. para fech-la. Funo que se executa ao clicar-se sobre a janela com o mouse. Funo que se executa ao soltar o mouse. Funo que se executa ao clicar-se com o boto direito sobre a janela com o Funo que se executa ao mudar-se de lugar a janela. Funo que se executa ao trocar a janela de tamanho. Funo que se executa ao pintar-se a janela. Funo que se executa ao pressionar uma tecla sobre a janela.

FInit FUp FDown FPgUp FPgDn FLeft FRight FPgLeft FPgRight FDropFiles

Funo que se executa ao iniciar-se a janela. Funo que se executa ao pressionar flecha acima. Funo que se executa ao pressionar flecha abaixo. Funo que se executa ao pressionar Page Up. Funo que se executa ao pressionar Page Down. Funo que se executa ao pressionar Flecha esquerda. Funo que se executa ao pressionar Flecha direita. Funo que se executa ao pressionar left. Funo que se executa ao pressionar right. Funo que se executa ao soltar informao sobre a janela.

As coordenadas simulam as coordenadas DOS, Com 30 linhas e 80 colunas. (Em DOS, por default, so 25 linhas e 80 colunas), salvo que se indique a clusula pixel, que nos permitir defini-la em nmeros de pixels (640x480, 800x600, etc.). O COLOR manipulado numa forma especial: Em Windows temos uma paleta de cores que varia cada um em seus tons na base RGB (Vermelho, Verde, Azul), de 0 at 255. Ou seja, o vermelho mais intenso nos dar a combinao 255,0,0. A cor da janela se define com uma funo que administra estas cores, que , para o exemplo: rgb(255,255,255), rgb(128,0,0) ...o que em DOS seria ("W+/R")

logo, definir uma janela de tela completa na cor azul mdio seria: define window ow from 0,0 to 30,80 title "meu ttulo" color ; rgb(255,255,255),rgb(0,0,128) Note que esta linha de cdigo criou a varivel ow. Mas, para poder utiliz-la (que se veja na tela), utilizamos a linha: activate window ow. VARIVEL2 implica que esta janela "filha" de uma janela anteriormente criada. Desse modo, a janela filha se mostra dentro da janela me. Se fecharmos a janela me, esta fechar a filha. Veremos isto em profundidade no captulo de janelas MDI.

Vemos eventualmente janelas que no tem cor, mas sim um padro de desenhos (Ladrilhos, por exemplo). Estas janelas tem um FUNDO definido (FiveWin trs alguns j predeterminados que aproveitaremos). Assim mesmo, vemos alguma vez que, ao passar por uma janela, o cursor (ponteiro do mouse) troca de forma. tambm vemos que ao minimizar uma janela esta mostra um cone que a representa. E, por suposto, vemos que algumas janelas tem menu. Finalmente, vemos algumas janelas com formas especiais (Ao entrar no Word for Windows, vemos o bitmap de apresentao, que uma janela sem ttulo) Para definir um FUNDO, a sintaxe :

DEFINE BRUSH <oBrush> ; [ STYLE <Style> ] ; [ COLOR <nRGBColor> ] ; [ FILE | FILENAME | DISK <cBmpFile> ]; [ RESOURCE | NAME | RESNAME <cBmpRes> ] Note que o FUNDO pode ser um arquivo .BMP Os modos predeterminados para aplicar fundos so: BORLAND, TILED, BRICKS, DIAGONAL, HORIZONTAL, VERTICAL, FDIAGONAL, BDIAGONAL, CROSS, DIAGCROSS Para liber-lo da memria: RELEASE BRUSH <oBrush> Para definir um cone: DEFINE ICON <oIcon> ; [ NAME | RESOURCE | RESNAME <cResName> ] ; [ FILE | FILENAME | DISK <cIcoFile> ] (tanto no brush como no cone, temos uma sintaxe RESOURCE, que ser a que utilizaremos oficialmente, uma vez que chegamos ao captulo de recursos.) Vejamos um breve exemplo de como fazer uma janela, com uns atributos adicionais: local ob,ow,oi define brush ob style BORLAND define icon oi file "c:\meucone.ico" define window ow from 0,0 to 30,80 title "meu ttulo" brush ob icon oi activate window ow maximized on init tone(1000,10) release brush ob Esta janela ter o cone meuicone e ao iniciar-se emitir um beep. (Substitua c:\meucone.ico com qualquer cone que tenha em seu PC.) Aqui temos trs variveis: ob,oi,ow. Cada uma destas um Objeto, que encerra dentro dele todas as caractersticas definveis possveis (Que podemos manipular) . Isto significa que temos muito mais para aproveitar deles. Ao chegar ao captulo de objetos entenderemos plenamente este conceito e suas vantagens. Pelo momento, pensemos neles como variveis muito importantes para nossos sistemas. NOTA: Existem uma grande quantidade de opes/alternativas ao definir nossas janelas. Ns usaremos normalmente umas poucas delas, e concentraremos grande parte de nossa ateno em outro tipo de janelas, conhecidas como dilogos. Estes "modelos" de janelas tem uma grande vantagem sobre as janelas normais: Permitem conectar recursos a elas (Como na programao visual, onde se "coloca" um get em um local com o mouse, e o programa o interpreta, no necessitamos mais pr @ x,y ... ). RESUMO DE SINTAXE ABORDADAS:

JANELAS: SINTAXE DE CRIAO JANELAS: SINTAXE DE ATIVAO FUNDOS: SINTAXE CONES:SINTAXE P.D.: Imagino que uma grande quantidade de vocs j queriam j estar vendo (na prtica) temas mais avanados. Recordemos que a inteno deste curso a de ensinar a todos o uso do FiveWin. Isto implica que devemos assumir que alguns no conhecem absolutamente nada do FiveWin. E, por outro lado, por avanar muito rpido, os que j o conhecem podem passar por cima algum aspecto terico importante dos que descrevemos (estou quase seguro que, at os usurios avanados, no tem utilizado todas as clusulas sintticas das janelas). Espero, pacincia, que de uma outra maneira chegaremos ao final do programa de estdios. Agradeo. Na seguinte jornada veremos: - Exemplos particulares de janelas. - Dilogos: Sintaxe. - Um enfoque prtico: Dilogo ou Janelas? - Fim da Parte I

EXEMPLOS PARTICULARES DE JANELAS *CRIANDO UMA JANELA FORA DO MONITOR local ow define window ow from -2,-2 to -1,-1 activate window ow on init (tone(1000,10),ow:end()) *CRIANDO UMA JANELA TRANSPARENTE local ow,ob define brush ob style NULL define window ow from 0,0 to 30,80 brush ob activate window ow release brush ob *TROCANDO O TAMANHO DE UMA JANELA local ow

define window ow from 0,0 to 30,80 activate window ow ; on init (tone(1000,30),ow:aminmaxinfo({10,10,20,20,30,30,40,40}),tone(1000,30),o w:end()) *TROCANDO DE LUGAR UMA JANELA local ow define window ow from 0,0 to 5,10 activate window ow on init (tone(1000,30),ow:move(200,200),tone(1000,30),ow:end()) *JANELA SEMPRE FRENTE (VISVEL) local ow define window ow from 10,10 to 30,30 activate window ow on init setwindowpos(ow:hwnd,-1,0,0,0,0,3) Nota: Todas as sadas em telas de Windows so janelas. Ou seja, um get uma janela, um say uma janela, etc. todas estas pequenas janelas esto "grudadas" janela sobre as quais desenhamos. Logo, ao ver um dado sobre uma janela, o que estamos vendo realmente uma janela sobre uma janela. Nos damos ento que em Windows existem "n" janelas, e que cada uma delas um objeto, com suas propriedades e atributos (Por exemplo, o array de aminmaxinfo, que define os tamanhos possveis de uma janela). Grande parte do manejo delas esta sob responsabilidade do Windows e do FiveWin. No nos devemos preocupar com elas, mas se podemos manipul-las. Agora, como cada uma delas uma janela com seus prprios atributos, podemos definir a cada uma cor distinto, um tipo de letra distinto. mais, podemos troc-las de lugar, faz-las invisveis, etc. Assim, que fcil fazer "magia" em Windows! Por outro lado, cada janela tem em Windows um ponteiro que a menciona. Este ponteiro (que um valor numrico, nico para cada janela) pode ser referenciado como ow:hwnd. Este ponteiro nos servir mais adiante, para efetuar aes que o FiveWin de maneira "natural" no faz, mas que com suas ferramentas podemos fazer (J vimos o exemplo de uma janela sempre visvel). DIALOGOS, SINTAXE: DEFINE DIALOG <od> ; [ NAME | RESNAME | RESOURCE <recurso> ] ; [ TITLE <ttulo> ] ; [ FROM <x1>, <y1t> TO <x2>, <y2> ] ; [ LIBRARY | DLL <punterorecurso> ] ; [ STYLE <estilo> ] ; [ COLOR | COLORS <color1> [,<color2>] ]; [ BRUSH <fundo> ] ; [ WINDOW | DIALOG | OF <janela> ] ; [ ICON <cone> ] ; [ FONT <fonte> ] ; [ HELP | HELPID <idayuda> ]

[ PIXEL ] ; [ VBX ] ; ACTIVATE DIALOG <od> ; [ VALID <fvalid> ] ; [ WHEN <fcuando> ] ; [ ON [ LEFT ] CLICK <fclick> ] ; [ ON INIT <finicio> ] ; [ ON MOVE <fmover> ] ; [ ON PAINT <fpintar> ] ; [ ON RIGHT CLICK <frclick> ] ; [ CENTER | CENTERED ] ; [ NOWAIT | NOMODAL ] od : varivel que armazenar o objeto dilogo recurso : recurso externo* ttulo : ttulo do dilogo x1,y1,x2,y2 : coordenadas ponteirorecurso: ponteiro que aponta ao recurso carregado estilo : estilo do dilogo color1,color2 : cores do dilogo fundo : fundo do dilogo janela : janela me cone : cone do dilogo fonte : fonte do dilogo idayuda : ponteiro de ajuda NOWAIT : O programa no se detm nesta linha, e segue executando fvalid : funo que ps-valida fcuando : funo que pr-valida fclick : funo que se executa ao clicar com o mouse sobre o dilogo finicio : funo que se executa ao iniciar o dilogo fmover : funo que se executa ao mover o dilogo fpintar : funo que se executa ao pintar frclick : funo que se executa ao clicar com o boto direito *Os sistemas em Windows tendem a ser "data-driven". Isto , manipuladores de dados. Este esquema (data-driven) prope isolar os dados (variveis, processos) dum sistema de sua interface grfica (janelas, grficos). A soluo que se da a este paradigma a gerao de recursos (Originalmente, se cria o esquema data-driven para fazer ao cdigo do sistema independente da plataforma, seja Mac, PC, UNIX, etc. Isto, na prtica, no se conseguiu at ento. Se bem que existem ferramentas e linguagens -Java- que se aproximam). Um recurso um arquivo, que contm imagens de janelas, com ponteiros (quando l ponteiros, o programador de "C" se arrepiam os pelos (Digo por experincia pessoal, pois programei em C durante dos anos, antes de entrar para o Clipper). No se preocupem. Em FiveWin, entenderemos um ponteiro como um nmero, e no nos dever interessar mais que isso. Faremos com alguma ferramenta (WorkShop) o arquivo recurso, e "conectaremos" os ponteiros ao programa e estaremos prontos para trabalhar. Deste modo, o cdigo fonte e o

tempo de desenvolvimento diminuem em 50% (No programamos, pintamos, e fora de nosso cdigo fonte). O.k. Um dilogo tem praticamente a mesma sintaxe bsica de uma janela. Existem algumas diferenas substanciais: a. Permite recursos (Que usaremos extensivamente) b. Tem validao c. Tem menos parmetros que uma janela. Dado a sintaxe dos dilogos aparece o rubro fonte, definiremos de uma vez a sua sintaxe: FONTES: SINTAXE: DEFINE FONT <of> ; [ NAME <nome> ] ; [ SIZE <ancho>, <largo> ] ; [ FROM USER ]; [ BOLD ] ; [ ITALIC ] ; [ UNDERLINE ] ; [ WEIGHT <ancho> ] ; [ OF <depsito> ] ; [ NESCAPEMENT <tipodeescape> ] ; ACTIVATE FONT <of> DEACTIVATE FONT <of> RELEASE FONT <of> of Nome largo, ancho depsito tipodeescape : varivel que conter o objeto fonte : nome da fonte : largura e altura da fonte : depsito (janela destino) : tipo de escape

As FONTES nos permitem definir os tipos de letras que utilizaremos em nossas telas. Podemos utilizar inclusive, uma para cada controle, para cada janela, etc. Mais adiante ampliaremos o conceito, incluindo casos prticos. Tal qual dito anteriormente: Todo o que se mostrar em Windows uma janela, e um dilogo no escapa a isto. Tambm uma janela, mas com CARACTERSTICAS particulares. Antes de dar exemplos de como utilizar dilogos, entremos em uma discusso das janelas e dilogos, e seu efeito prtico dentro de nossos sistemas. UM ENFOQUE PRTICO - DIALOGOS OU JANELAS?

A grosso modo, um programa que faamos pode mostrar sua informao numa janela ou num dilogo (um dos dois). Qualquer um dos seguintes programas valido: function main() local ow define window ow from 0,0 to 20,50 activate window ow return(nil)

function main() local od define dialog od from 0,0 to 20,50 activate dialog od return(nil) Embora, exista uma grande diferena: Numa janela podemos ativar um MDI/timer, num dilogo no. Quase todos os sistemas que criaremos utilizaram timers/MDI, e esta uma razo prtica para ter (quando menos) uma janela sempre em nossos sistemas. Salvo nos casos em que o programa seja uma rotina fcil, em onde possvel o uso de um ou dois dilogos (Por exemplo, um processo batch). Mas, e tal como temos visto, numa janela no podemos definir recursos. Ento vem mente fazer ambas coisas, uma janela e um dilogo, e fazer que a janela fora do monitor (Veja o primeiro exemplo de janelas particulares). A soluo ser algo mais ou menos assim: function main() local ow,oi define icon oi file "c:\micon.ico" define window ow from -2,-2 to -1,-1 title "Janela de trabalho" icon oi activate window ow on init ativadialogo(ow) return(nil) function ativadialogo() local od,of define font of name "times new roman" size 4,10 define dialog od resource "mirecurso" ttulo "FLOJO!" && Este dilogo esta na forma && visual! od:setfont(of) && classe dilogo lhe troca o font, e com ele todos os controles do recurso! activate dialog od centered release font of ow:end() return(nil) Se bem que no muito heterodoxo, a utilizao, e com muito bons resultados. A janela no aparece em minha tela (o cliente nem sabe que existe), o dilogo o vejo tal qual o desenhei, e ao trocar de tarefas me aparece o nome e cone da janela principal, pense a que

o ttulo do dilogo outro (assim eu o desejo). Finalmente, minha sugesto ento a seguinte: Se se vai utilizar uma tela : Pode ser uma janela ou um dilogo. At 5 telas : Uma janela fora de tela, e dilogos mais de 6 telas : MDI (Tcnica que descreveremos mais adiante) Com isto estamos terminando a Parte I, que a definio de as janelas em Windows. RESUMO DE SINTAXE ABORDADAS DIALOGOS: SINTAXE DE CRIAO DIALOGOS:SINTAXE DE ATIVAO FONTES:SINTAXE Fim da parte I

Na seguinte jornada veremos: - Controles em Windows. Definio - Say - Get - Combobox - Rdiobutton - Pushbutton - Listbox - Browses - Spinner - Checkbox - Meters - Cursores - Timers - Bitmaps - Folders - Scroll Bars - Tool-Tips - Qualquer controle!

Controles em Windows: DEFINIO: Em Windows, a interao com um usurio implica permiti-lo entrar informao pela tela. Ao nascer este ambiente grfico, se fez especial nfase em que o ambiente de trabalho fosse agradvel vista e fcil em seu uso, considerando que o usurio utilizaria tanto o teclado como o mouse como ferramentas para a entrada de informao. Para ele, se criaram os objetos tpicos a usar-se: um que permitiria entrar texto, outro para selecionar entre duas opes, outro para mais de duas opes, outro para indicar aes, etc. Estes so os controles do Windows, que conheceremos em esta lio. Nota Importante: Para todos os controles, existem dos tipos de sintaxe: Uma com os clssicos @ x,y, e a outra com os redefines. Aqui me concentrarei nos que usam os redefines, que significa que tem sido desenhados, e postos em uma janela na forma visual. Ou tentar coloc-los com coordenadas um trabalho cansativo em Windows. Por outro lado, muito mais fcil fazlo em forma visual com o WorkShop, que veremos na edio seguinte. Obviamente, esto livres de optar por qualquer tcnica, se bem que sugiro MUITO a utilizar esta tcnica, que economiza tempo e esforo, e que adicionalmente nos prepara para pensar numa forma mais, digamos, visual. Por outro lado, no caso das clusulas com @ x,y :a exceo feita de as coordenadas e o tamanho (Na realidade quatro coordenadas) a sintaxe praticamente a mesma. Assim que de todos modos este texto uma boa referencia. Mas, insisto: Utilizem o WorkShop. Notas Tcnicas: 1.- Cada controle que definimos dever estar com sua varivel que a define.

2.- Os controles comuns mantenha-os em um array. 3.- A varivel VAR de uso interno do FiveWin ( parte de comandos). No a utilizem, ou tero problemas. 4.- Existe uma funo: SYSREFRESH(), que fora a que se faam os trabalhos pendentes antes de continuar com o programa. 5.- Todos os controles so "janelas filhas" (Child). Isto significa que se movem paralelamente ao dilogo que as contm (Ou seja, esto "grudadas" ao dilogo). No devemos preocupar com eles. 6.- Todos os controles em FiveWin so objetos. Se deseja v-los em seu forma nativa, compile (com o parmetro /P) pequenos programas que contenham a sintaxe a analisar (Criar arquivo de pr-compilado). E se surpreender ao ver o que o @ say! Tenha em mente uma coisa: Tudo no Clipper so funes. (Se bem que, o Fox, Visual Basic, etc. fazem o mesmo. Toda linguagem desenvolvida em C faz o mesmo!) *Imaginemos o Windows como uma mquina de fatiar salsichas. Na parte de acima, teremos a salsicha por fatiar, ao centro o processo de fatiar, e na parte debaixo as fatias da salsicha. A parte por fatiar so as funes que mandamos, que so processadas ao centro e retiradas do processador na parte inferior da analogia. Quando h muito trabalho, o Windows mantm na parte de cima as funes pedidas, que se executaram em algum momento, quando se desocupam as funes que se executam nesse momento. Ou seja, as funes que invocamos NO se invocam nesse momento. Esta funo diz ao Windows: OK, espero que termine de fatiar para continuar. OK? Daqui duas concluses: 1.- Windows processa em batch nossos requerimentos. No o faz em linha. 2.- Estou faminto.

CONTROLES : SINTAXE: **************************************************************** REDEFINE GET [ <og> VAR ] <mVar> ; [ ID <Id> ] ; [ <dlg: OF, WINDOW, DIALOG> <od> ] ; [ <help:HELPID, HELP ID> <idhelp> ] ; [ VALID <fvalid> ] ; [ PICTURE <picture> ] ; [ <color:COLOR,COLORS> <color1> [,<color2>] ] ; [ FONT <fonte> ] ; [ CURSOR <cursor> ] ; [ MESSAGE <mensagem> ] ; [ <update: UPDATE> ] ; [ WHEN <when> ] ;

[ ON CHANGE <troca> ] ; [ <readonly: READONLY, NO MODIFY> ] ; [memo] O get, igual ao get do Clipper DOS, nos permite editar variveis de tipo alfanumrico. Todos os atributos do get DOS so validos, mas com o enriquecimento de se utilizar FONTES distintas (FONTES grficas). og mvar id od idhelp fvalid picture color1,color2 fonte cursor mensagem when troca memo : varivel que conter o objeto get. : varivel com que se iniciar o get. : Nmero definido no Resource WorkShop (O famoso ponteiro!). : varivel do Dilogo que a contm : Nmero associado ao Help : Funo de validao! : Picture do get. Igual ao DOS : Cores possveis (Segundo o critrio RGB descrito anteriormente) : Tipo de letra que utilizada neste get : Cursor que mostrar este get ao passar sobre o mesmo : mensagem que mostrar na janela (MDI) : funo pr-validao : funo que se ativa ao trocar o contedo do get! : se o get um campo memo!

Um exemplo tpico de gets, seria ento: local od local og:=array(5),of local mvar:={cliente->cliente,cliente->nome,cliente->direccion,cliente->dist rito,cliente->telefono} define dialog od resource "mirecurso" define font of name "times new roman" size 10,20 redefine get og[01] var mvar[01] id 101 of od color (rgb(255,255,000),rgb(128,128,000)) redefine get og[02] var mvar[02] id 102 of od font of redefine get og[03] var mvar[03] id 103 of od on change tone (1000,1) redefine get og[04] var mvar[04] id 104 of od valid (tone(1000,1),.t.) redefine get og[05] var mvar[05] id 105 of od memo activate dialog od centered Pra l de fcil! ***************************************************************** REDEFINE BUTTON [<ob>] ; [ ID <Id> ] ; [ <bar: OF, BUTTONBAR > <obar> ] ; [ <resource: NAME, RESNAME, RESOURCE> <recurso1> [,<recurso2>] [ <file: FILE, FILENAME, DISK> <bmp1> [,<bmp2>] ] ;

[ <action:ACTION,EXEC> <faccion> ] ; [ MESSAGE <mensagem> ] ; [ <adjust: ADJUST > ] ; [ WHEN <fcuando> ] ; [ UPDATE <update> ] ; [ TOOLTIP <ctooltip> ] ; O boto nos permite um controle que se ativar cada vez que se marque o mesmo. Na tela, aparece como um quadro que simula um boto retangular com um grfico. um "switch" de ativao de uma funo (conhecida como evento nas linguagens visuais). Note que, por sua natureza, este controle no armazena variveis . Veremos a detalhe no captulo de janelas MDI. ob : varivel do objeto button id : Nmero definido no Resource WorkShop (O famoso ponteiro!). obar : Se o boto pertence a uma barra de funes (MDI) recurso1,recurso2: Grficos que mostra o boto (por default e ao pressionar-se). bmp1, bmp2 : Grficos que mostra o boto (por default e ao pressionar-se). od : Dilogo em que se pe o boto faccion : ao (leia-se funo) que executa quando : funo de pr-validao fvalid : funo que valida Um exemplo tpico de botes, seria ento: local od,ob,obu define window ow from 0,0 to 30,80 define buttonbar obu of ow redefine button ob id 101 of obu action tone(1000,1) file ("c:\um.bmp"),("c:\dois.bmp") activate dialog od centered ************************************************************************ REDEFINE BUTTON [ <ob> ] ; [ ID <Id> <of:OF, WINDOW, DIALOG> <od> ] ; [ ACTION <accion.> ] ; [ <help:HELP, HELPID, HELP ID> <idhelp> ] ; [ MESSAGE <mensagem> ] ; [ <update: UPDATE> ] ; [ WHEN <fcuando> ] ; [ VALID <fvalid> ] ; [ PROMPT <prompt> ] ; [ <lCancel: CANCEL> ] ; O boto nos permite um controle que se ativar cada vez que se marque o mesmo. Em tela, aparece como um quadro que simula um boto retangular com texto. um "switch" de ativao de uma funo (conhecida como evento nas linguagens visuais). Note que, por sua natureza, este controle no armazena variveis .

ob od accion id idhelp mensagem fcuando fvalid prompt

: varivel do objeto button : Dilogo em que se pe o boto : ao (leia-se funo) que executa : Nmero definido no Resource WorkShop (O famoso ponteiro!). : Nmero associado ao Help : mensagem que mostrar na janela (MDI) : funo de pr-validao : funo que valida : texto do boto

Um exemplo tpico de botes, seria ento: local od,ob:=array(2) define dialog od resource "mirecurso" redefine button ob[1] id 101 of od action tone(1000,1) redefine button ob[2] id 102 of od action od:end() activate dialog od centered ******************************************************************* REDEFINE CHECKBOX [ <oc> VAR ] <mvar> ; [ ID <id> ] ; [ OF | WINDOW | DIALOG <od> ] ; [ HELPID | HELP ID <helpId> ] ; [ ON CLICK <fclick> ]; [ VALID <fvalid> ]; [ COLOR | COLORS <color1>; [,<color2>] ] ; [ MESSAGE <mensagem> ] ; [ UPDATE ] ; [ WHEN <fcuando> ] ; O checkbox um controle que nos permite ativar/desativar uma opo. Normalmente, em sistemas DOS, quando desejamos selecionar o sexo de uma pessoa, escrevamos marque "S" o "N". Este Checkbox marcar com uma "X" o quadro se ativa. Daqui podemos deduzir que, por seus estados, a varivel inicial lgica. Para saber o estado do objeto, existe uma varivel dentro, que um codeblock, chamada bsetget. Logo, para saber o valor do mesmo, faremos eval(oc:bsetget) (.t. marcado, .f. sem marcar). oc : varivel que contm o objeto Checkbox mvar : valor inicial do Checkbox id : Nmero definido no Resource WorkShop (O famoso ponteiro!). od : Dilogo que contm ao Checkbox helpid : Nmero associado ao help fclick : funo que se avalia ao clicar com o mouse sobre o controle fvalid : funo que valida color1,color2 : cores do Checkbox

mensagem fcuando

: mensagem (em janela MDI) : funo que pr-valida

Um exemplo tpico de um Checkbox, seria ento: local od,oc:={},mvar:={.t.} define dialog od resource "mirecurso" redefine Checkbox oc[1] var mvar[1] id 101 of od on click tone(1000,1) activate dialog od centered ************************************************************************ REDEFINE COMBOBOX [ <oc> VAR ] <mvar> ; [ ITEMS <aitems> ] ; [ ID <id> ] ; [ OF | WINDOW | DIALOG <od> ] ; [ HELPID | HELP ID <helpid> ] ; [ ON CHANGE <fcambio> ] ; [ VALID <fvalid> ] ; [ COLOR | COLORS <color1>; [,<color2>] ] ; [ UPDATE ] ; [ MESSAGE <mensagem> ] ; [ WHEN <fcuando> ] ; O controle Combobox um get com uma variante: Nos permite desdobrar uma janela (debaixo do get) com uma srie de opes (Que evidentemente esto em um array). Um caso tpico vemos ao selecionar uma unidade de disco em um dilogo. Existem por sua vez variantes do combobox, aquelas que nos permitem escolher uma varivel de um array, ou aquelas que permitem introduzir um valor no get. Para saber o estado do combo qualquer momento, existe uma varivel dentro do objeto, chamada bsetget. Para avali-la, faremos : eval(oc:bgetset). Isto nos indicar o item atual. Mais adiante veremos isto a detalhe. oc mvar aitems id od helpid fcambio fvalid color1,color2 mensagem fcuando : varivel que contm o objeto combobox : varivel inicial do combobox : array de itens. : ponteiro ao recurso. : Nome da varivel que contm o dilogo : Nmero associado ao help : Funo que se avalia quando h uma seleo no combo : Funo que valida : Cores do combobox : Mensagem que aparece em a janela MDI : Funo de pr-validao

Um exemplo tpico de um combobox, seria ento: local od,oc:={},mvar:={"Um"},arritem:={"Um","Dois","Trs"} define dialog od resource "mirecurso"

redefine combobox oc[1] items arritem var mvar[1] id 101 of od on change tone(1000,1) activate dialog od centered ************************************************************* REDEFINE METER [ <om> VAR ] <atual> ; [ TOTAL <total> ] ; [ ID <Id> ] ; [ OF <od> ]; [ UPDATE ] ; [ FONT <fonte> ] ; [ PROMPT <prompt> ] ; [ NOPERCENTAGE ] ; [ COLOR | COLORS <color1>, <color2> ] ; [ BARCOLOR <color3>, <color4t> ] ; O meter um controle que nos mostrar uma barra horizontal marcada que se desloca da esquerda a direita. Ou seja, uma barra de deslocamento. Um caso tpico o avano de um processo. No armazena variveis, mas apresenta graficamente o trabalho que realiza. om : varivel que contm o objeto colocar atual : valor atual (de inicio) total : valor total id : ponteiro associado ao dilogo od : dilogo sobre o qual se mostra fonte : tipo de letra a utilizar para mostrar processo prompt : texto a mostrar na barra de deslocamento color1,color2 : cores do texto da barra color3,color4 : cores de a barra. Um exemplo tpico de um meter, seria ento: local od,om, mactual:=1,mtotal:=mifile->(reccount()),contador:=1 define dialog od resource "mirecurso" redefine meter om var mactual total mtotal activate dialog od centered nowait && NOWAIT: O && sistema continua com nosso cdigo!!! set dele off && No importam &&deletados para total do meter mifile->(dbgotop()) while mifile->(!eof()) om:set(contador++) sysrefresh() && Obrigo a pintar-se a tela if mifile->(!deleted()) ...MIACCION endif mifile->(dbskip(1)) enddo set dele on

od:end() *********************************************************** REDEFINE LISTBOX [ <ol> VAR ] <mvar> ; [ <items: ITEMS, PROMPTS> <arritems> ] ; [ <files: FILES, FILESPEC> <cFileSpec> ] ; [ ID <id> ] ; [ ON CHANGE <fcambio> ] ; [ ON [ LEFT ] DBLCLICK <fdocleclick> ] ; [ <of: OF, WINDOW, DIALOG > <od> ] ; [ <help:HELPID, HELP ID> <idhelp> ] ; [ VALID <fvalid> ] ; [ <color: COLOR,COLORS> <color1> [,<color2>] ] ; [ MESSAGE <mensagem> ] ; [ <update: UPDATE> ] ; [ WHEN <fcuando> ] ; [ BITMAPS <arrbitmaps> ] ; [ ON DRAWITEM <ubmpelegido> ] ; O listbox de array um controle que nos permite selecionar de uma lista que se mostra em tela um/uns elementos de um array. A diferena com um combobox que o primeiro desdobra uma janela e permite um get, e neste caso a janela sempre esta desdobrada e no h get. Adicionalmente, esta opo permite selecionar mais de um elemento, e permite apresentar grficos acompanhando os elementos do array, o que ideal para definir series (P.E.: Uma srie de discos de rede, local, disquetes, cada um com seu BMP descritivo). ol mvar arritems cFileSpec id fcambio fdobleclick od idhelp fvalid color1,color2 mensagem fcuando arrbitmaps ubmpelegido : Varivel que contm o objeto listbox : Valor inicial do listbox : Array de elementos mostrados no listbox : Se o que se mostram so arquivos, mscara de arquivo ("*.dbf") : Nmero do ponteiro do recurso : Funo que se executa ao trocar de elemento : Funo que se executa ao fazer duplo click sobre o listbox : Dilogo que contm ao listbox : Nmero que se relaciona ajuda : Funo que valida o listbox : Cores do listbox : Mensagem que mostra o listbox (Janelas MDI) : Funo que pr-valida : Array de bitmaps a mostrar-se em o listbox : Bitmap mostrado ao ser escolhido um elemento.

Um exemplo de um listbox seria: local ol,od,mvar:="" define dialog resource "mirecurso" redefine listbox ol var mvar id 101 of od items {"Disco A","HD","Disco Rede"} ;

bitmaps {"c:\a.bmp","c:\b.bmp","c:\c.bmp"} activate dialog od ************************************************************* REDEFINE LISTBOX [ <ob> ] ; FIELDS [ <campo1,campo2,...>] ; [ FIELDSIZES <arrtamanos> ] ; [ HEAD | HEADER | HEADERS <arrencabezados> ] ; [ ID <id> ] ; [ ON CHANGE | ON CLICK <fcambio> ] ; [ ON RIGHT CLICK <frclick> ] ; [ ON DBLCLICK <fdobleclick> ] ; [ OF | WINDOW | DIALOG <od> ]; [ <color: COLOR,COLORS> <nClrFore> [,<nClrBack>] ] ; Este listbox o que conhecemos em DOS como Browse/Tbrowse/DBedit, etc. Com ele podemos a informao tabulada que faz to popular e amigveis nas linguagens xBase. Por sua natureza, este controle no armazena variveis. O listbox do Windows tem uma srie de vantagens, que posteriormente poderemos apreciar. (Registros de cores distintas, filtros, bitmaps em campos , etc.). ob : Varivel que armazena o objeto listbox de arquivos. campo1,campo2 : Campos a mostrar no Browse. arrtamanos : Array de tamanhos ao iniciar o Browse arrencabezados : Array de cabealhos id : Nmero de ponteiro no recurso fcambio : Funo que se ativa ao trocar de registro frclick : Funo que se avalia ao clicar com o boto direito do mouse. fdobleclick : Funo que se avalia ao fazer duplo click com o mouse. od : Dilogo que contm ao Browse. color1,color2 : Cores do Listbox Um exemplo tpico de um listbox de arquivos, seria ento: local od,ob define dialog od resource "mirecurso" use cliente redefine listbox fields cliente->codigo,cliente->nome headers "CODIGO","NOME" id 101 of od activate dialog od centered ******************************************************************* REDEFINE RDIO [ <or> VAR ] <mvar> ; [ ID <id1,id2,id3...> ] ; [ OF | WINDOW | DIALOG <od> ] ; [ HELPID | HELP ID <helpid> ] ; [ ON CLICK | ON CHANGE <fcambio> ]

O Checkbox nos permite selecionar entre dois estados. O rdio nos permite selecionar entre uma srie de estados. Por exemplo, se desejamos mostrar um ndice ativo, o rdio ideal para escolher UMA opo das mostradas. Aparece na tela como um crculo branco, e em cor negro o vigente. O modo de determinar qual o rdio vigente acessando a varivel codeblock do objeto do seguinte modo: eval(or:bgetset). Isto devolver o nmero do rdio vigente. or mvar id1,id2,id3... od helpid fcambio : varivel que armazena o objeto rdio : Valor inicial do objeto : cada recurso rdio criado (Se criam individualmente) : Dilogo que contm o rdio : Nmero que se relaciona ajuda : Funo que se avalia ao trocar de rdio vigente

local od,or,mvar:=1 define dialog od resource "mirecurso" redefine rdio or var mvar id 101,102,103 of od on change tone(1000,1) activate dialog od centered ******************************************************************* REDEFINE SCROLLBAR [ <os> ] ; [ ID <id> ] ; [ RANGE <minimo>, <maximo> ] ; [ PAGESTEP <step> ] ; [ UP | ON UP <faccionup> ] ; [ DOWN | ON DOWN <facciondown> ] ; [ PAGEUP | ON PAGEUP <faccionpgup> ] ; [ PAGEDOWN | ON PAGEDOWN <faccionpgdn> ] ; [ ON THUMBPOS <fpos> ] ; [ OF | WINDOW | DIALOG <od> ] O Scrollbar nos permite criar sobre nossa janela uma barra de deslocamento que se contm uma varivel, e pode ser alterada pelo usurio. Este controle serve para selecionar visualmente um valor numrico dentro de uma faixa. Este controle, anexado a um get, o que conhecemos como Spinner, que ao pressionar a flecha para cima o get aumenta o valor numrico do mesmo, e a flecha para baixo o faz decrescer. Um Scrollbar pode ser horizontal ou vertical. Para determinar a varivel que contm o Scroll basta utilizar a funo do objeto: os:getpos()

os : Varivel que contm o objeto scrollbar id : Nmero de recurso definido minimo,maximo : valores mnimo e mximo que pode adotar a varivel step : De quanto em quanto aumenta/decresce o scrollbar faccionup : Funo que se executa ao pressionar a flecha acima/direita facciondown : Funo que se executa ao pressionar a flecha abaixo/esquerda

faccionpgup : Funo que se executa ao pressionar entre a flecha abaixo/esquerda e o boto de deslocamento faccionpgdn :Funo que se executa ao pressionar entre a flecha abaixo/esquerda e o boto de deslocamento fpos : Funo que se executa ao arrastar o boto de deslocamento od : dilogo que contm ao Scrollbar Um exemplo disto seria: local od,os define dialog od resource "midialogo" redefine scrollbar os id 101 of od range 0,255 on up tone(1000,1) on down os:setpos(os:getpos()-1) activate dialog od ************************************************************** REDEFINE SAY [<os>] ; [ <label: PROMPT, VAR> <texto> ] ; [ PICTURE <picture> ] ; [ ID <Id> ] ; [ <dlg: OF,WINDOW,DIALOG > <od> ] ; [ <color: COLOR,COLORS > <color1> [,<color2> ] ] ; [ <update: UPDATE > ] ; [ FONT <fonte> ] ; O say isso: o mesmo say do DOS, mas que pode ter uma fonte grfica que o defina. Recordemos que todo o apresentado em Windows uma janela, com seus atributos. Pois este tambm uma janela. os texto picture id od color1,color2 font : varivel que contm o objeto say : texto a pr em o dilogo : forma de mostrar o texto : nmero do recurso : nome do dilogo que o contm : cores do texto : fonte do texto

Um exemplo tpico de says, seria ento: local od local os,of define dialog od resource "mirecurso" define font of name "times new roman" size 10,20 redefine say os prompt "Meu nome" id 101 of od color (rgb(255,255,000),rgb(128,128,000)) font of activate dialog od centered

DEFINE TIMER <ot> ; [ INTERVAL <intervalo> ] ; [ ACTION <faccion> ] ; [ OF | WINDOW | DIALOG <od> ] ACTIVATE TIMER <ot> DEACTIVATE TIMER <ot> RELEASE TIMER <ot> O timer uma utilidade (no propriamente um controle) que nos permite ativar um processo a cada determinado tempo. Esta de grande utilidade, pois nos permite fazer um processo periodicamente, programando-o uma s vez. ot intervalo faccion od : Varivel que contm o objeto timer. : O tempo se efetuar a funo (centsimos de segundo). : Funo que se avalia. : Janela que contm ao timer.

Um exemplo tpico pode ser: local ow,ot define window ow from 0,0 to 30,80 title "Meu ttulo" define timer ot interval 1000 action tone(1000,1) of ow activate window ow on init (ot:activate()) ot:desactivate() ot:release() return(nil) ********************************************** REDEFINE BITMAP [ <ob> ] ; [ ID <id> ] ; [ OF | WINDOW | DIALOG <od> ] ; [ NAME | RESNAME | RESOURCE <recurso> ] ; [ FILE | FILENAME | DISK <bitmap> ] ; [ ON ClICK | ON LEFT CLICK <fclick> ] ; [ ON RIGHT CLICK <frclick> ] ; [ SCROLL ] ; [ ADJUST ] ; [ CURSOR <cursor> ] ; [ MESSAGE <mensagem> ] ; [ UPDATE ] ; [ WHEN <fcuando> ] ; Um bitmap um grfico que podemos colocar em nossos dilogos. Desde o logotipo de uma empresa, at a informao grfica de um produto. Incluindo, podemos criar um marco

para visualizar parte do grfico, e podemos deslocarmos para ver uma poro do mesmo. Podemos fazer Zoom do grfico, etc. ob id od recurso bitmap fclick frclick cursor mensagem fcuando : varivel que contm o objeto bitmap : Nmero de ponteiro do recurso : Nome do dilogo que contm ao bitmap : Nome do recurso mostrado (Se o grfico esta dentro do recurso) : Nome do arquivo bitmap : Funo a avaliar ao clicar com o mouse : Funo a avaliar ao clicar com o boto direito do mouse : Cursor a mostrar ao passar sobre o bitmap : Mensagem a mostrar na janela MDI : Funo de pr-validao

Desse modo, um exemplo seria: local od,ob define dialog od resource "mirecurso" redefine bitmap ob id 101 of od resource 1102 scroll (Posso ver um segmento do grfico no quadro nomeado) activate dialog od centered ********************************************** REDEFINE FOLDER [of] ; [ID <id>]; [ OF | WINDOW | DIALOG <od> ] ; [PROMPT "index1","index2"]; [DIALOGS "od1,"od2"] O folder um grande avano na operao de janelas. Nos permite ativar vrias janelas, mostrando s uma e escondendo as demais, mas permitindo acess-las com uma orelha. Um caso tpico encontraremos quando desejamos entrar uma grande quantidade de informao, que no cabem numa tela, mas que deve aparecer. (Por exemplo, a configurao do Word Windows 6.0 / superior). Por sua caracterstica, no contm variveis a armazenar. Isso se, uma varivel importante a utilizar internamente no sistema ser o array de dilogos que esto contedos dentro do folder. of id od: index1,index2 od1,od2 : Varivel que contm o objeto folder : Nmero de ponteiro associado ao recurso : Nome do dilogo que contm ao folder. : Nome dos dilogos (cada orelha do folder) : Nmero de ponteiro associado a cada dilogo/recurso

Um exemplo tipo seria: local od,ofo,ob1,ob2 define dialog od resource "mirecurso" redefine folder ofo id 101 of od prompt "Primeiro","Segundo" dialogs 101,102 redefine button ob1 id 101 of ofo:adialogs[1] action od:end()

redefine button ob2 id 101 of ofo:adialogs[2] action tone(1000,1) activate dialog od return(nil) ********************************************** TOOL-TIP: (Erratas: O tool-tip no um controle. uma propriedade de um controle) O tool-tip nos permite pr uma "etiqueta" num controle. Cada vez que passarmos sobre esse controle e deixamos uns segundos sobre o mouse, mostrar a etiqueta. A forma de defini-lo, definindo essa propriedade no objeto controle que se deseja: (Todos os controles que tem Tool-Tips, tem o mtodo "ctooltip"). local od,oc:={},mvar:={"Um"},arritem:={"Um","Dois","Trs"} define dialog od resource "mirecurso" redefine combobox oc[1] items arritem var mvar[1] id 101 of od on change tone(1000,1) oc[1]:ctoooltip:="Combo-Box" activate dialog od centered ********************************************** QUALQUER CONTROLE Uma vez que tenhamos estas definies, fazendo combinaes entre elas podemos fazer qualquer coisa das que vimos at agora em Windows, com a mesma presena de qualquer ferramenta visual. Agora, eventualmente desejaremos usar um controle que no temos (Um exemplo disto seriam os grficos estatsticos). O FiveWin nos permite utilizar arquivos VBX (Sim, os mesmos que usa o Visual Basic!) para expandir nossa capacidade de utilizar controles. Usando VBX, o FiveWin est aberto para se usar com qualquer controle que exista no mercado. Pronto veremos o uso dos VBX, com o que podemos utilizar qualquer controle. Assim mesmo, recordemos que o FiveWin tem em sua biblioteca uma ferramenta para criar classes, com o qual podemos criar nossas prprias classes, removendo limites a esta ferramenta, e fazendo-a mais potente que outras linguagens de programao visuais. ********************************************** RESUMO DE AS SINTAXE ABORDADAS: GET BUTTON BUTTON CHECKBOX COMBOBOX COLOCAR LISTBOX LISTBOX RDIO SCROLLBAR SAY TIMER BITMAP FOLDER

TOOL-TIP Fim da parte II--------------------------------. P.D.: - Para a seguinte jornada, ser indispensvel ter o Workshop (Borland) ou o Appstudio (O editor de recursos de Microsoft). O WorkShop muito superior, por o menos a verso de Appstudio que tenho. - No foi provado todas as sintaxe, mas sim todos os controles que menciono, com a parte de as sintaxes que foi necessitado. - Assim mesmo, ouso enviar-lhes minha biblioteca de trabalho pessoal em pouco tempo (Uns 70 Kb). No so UAU! NOSSA!! IAAAA!, mas podem servir para algo. (No pior dos casos, para que tratem de entender como penso... pobre de Vocs.!) Na seguinte jornada veremos: - O que uma DLL - O Resource WorkShop, a forma de programao visual em CA-Clipper. - Menus - Nunca mais fcil!

O que uma DLL?

Pouco antes mencionei que a filosofia de a programao em Windows propunha fazer os sistemas "data-driven". Para conseguir isto, se faz necessrio isolar do programa os seguintes recursos do sistema: - Grficos (Bitmaps) - Telas - Constantes (Arrays, menus) - cones - Funes comuns Deixando o manejo de variveis e procedimentos dentro do sistema. Para pr todos estes recursos num depsito comum, se criou o arquivo .DLL, que um arquivo capaz de armazenar em seu interior toda esta informao (Estamos na poca em que C era a nica linguagem de programao para Windows!). Agora, para poder manipul-la se criaram uma srie de utilidades, dependendo da empresa: Microsoft lanou junto ao Visual C o AppStudio, um aplicativo para manipular DLLs. Borland lanou para seu Turbo C e seu Borland C o WorkShop. Muito depois nasce a programao Visual, que armazena automaticamente esta informao em arquivos DLL e RC. (RC como uma DLL, mas em ASCII, que armazena a informao binria como endereos, como c:\raiz.bmp). O arquivo DLL binrio, e armazena em seu interior todos os arquivos. conhecendo o WorkShop e o Appstudio, devo recomendar, e por muito, o WorkShop. muito mais completo e "visual". Voltando ao tema, ento ns nos preocuparemos por escrever um recurso no WorkShop, e em nosso programa faremos referencia ao mesmo. Tal como o vimos no captulo anterior: set resources to "recurso.dll" redefine dialog od resource "midialogo". Em nosso arquivo DLL teremos um dilogo de nome "midialogo", com as caractersticas necessrias. O comando "set resources" nos permite abrir o arquivo, e relacion-lo com nosso executvel. Da em adiante estaro a nossa disposio os dados contedos em este recurso. O Borland Resource WorkShop Ao entrar neste programa, e logo na janela inicial da apresentao, nos aparecer uma janela MDI (v se familiarizando com os termos), com um menu de opes: Arquivo Novo Projeto: Nos permite criar um novo recurso. Notemos como, o manipulador de recursos, no nos permite criar uma nova DLL! Mas no preocupante: o que sucede que o WorkShop para funcionar vem com arquivos DLL, e bastava copiar um para utiliz-lo. Ns, utilizaremos um dos que vem nos exemplos do FiveWin. Abrir Projeto: Nos permite abrir um arquivo que contenha recursos. No menciono somente DLLs, pois em Windows os recursos que podemos gravar em uma srie de componentes (Entre eles, o mesmo executvel!. Isto desvirtua o princpio do data-driven,

mas...) Ao selecionar a opo, podemos definir o nome do arquivo (em um get), e/ou o tipo do arquivo (em um combobox). Se expandir o combo vero todos os tipos de arquivos que podem armazenar DLLs. Os sete primeros so recursos propriamente, e logo seguem os executveis (Drivers, exes, vbxs, etc.). Antes de editar um executvel, estejam seguros de ter uma cpia de backup do mesmo. Pelo momento, nesta lio lhes foi enviado uma DLL. Procederemos a abri-lo. Gravar projeto: Nos permite armazenar o projeto. Utilize esta opo com certa freqncia quando trabalha, pois no criados backups automaticamente, e em alguma oportunidade podero perder o trabalho, por uma falha do Windows. Gravar como: Isto nos permite gravar o projeto com um nome distinto ao original Anexar ao projeto: Esta opo permite anexar um recurso que esteja gravado fisicamente em disco (Por exemplo, um BMP que desejamos colocar em um DLL). Remover do projeto: Esta opo permite retirar do projeto algum recurso no usado. Preferncias: Configurao do WorkShop Instalar biblioteca de controle: O WorkShop permite instalar algumas bibliotecas de controle. Basicamente um VBX ou uma DLL que desejamos utilizar em nossos aplicativos. Uma vez que chamemos a uma, esta aparecer na sesso de ferramentas do gerador de controles. Remover biblioteca de controle: Permite retirar as bibliotecas de controle carregadas com a opo anterior. Sair: Sair do WorkShop Editar Undo: Permite desfazer a ltima ao efetuada. Redo: Permite refazer o ltimo "undo" feito Cortar: Permite retirar um dado, armazenando-o em memria. Copia: Permite copiar em memria um dado. Colar: Permite "puxar" da memria o dado previamente armazenado. Deletar: Apaga um dado. Deletar item: retira um dado. Duplicar: Duplica um dado. Selecionar todo: Permite selecionar todos os dados em o recurso ativo. Note que ao referimos a um dado, o fazemos de forma global. Um dado pode ser, segundo o recurso em que estamos trabalhando, um bitmap, um controle, texto, etc. Recurso Novo: Permite definir um novo tipo de recurso. Uma vez que selecionamos a opo, apareceram os tipos de recurso que podemos definir.

Editar: Permite editar um recurso. (tal qual se pressionarmos enter). Editar como texto: Cada recurso se pode armazenar como um dado binrio (DLL), ou como uma cadeia de texto (RC). Ver: Permite ver o recurso. Gravar recurso como: Permite gravar o recurso como um arquivo. Recordemos que uma DLL contm distintos tipos de arquivos, pelo que tambm pode gravar distintos tipos de arquivos. Renomear: permite trocar de nome ao recurso com o que estamos trabalhando. Opes de memria: Modo de carregar/descarregar de memria um recurso. No tocar. linguagem:* Mover:* Identificadores:* * No foram usado, pelo qual no posso fazer uma adequada referencia a eles. Ver Por tipo: Permite ver os recursos por tipo (Bitmaps, Dilogos, etc) Por arquivo: Permite ver os recursos segundo o arquivo que os contm. Mostrar item: Mostrar os detalhes de cada recurso. Mostrar tipos sem usar: Mostra todos os tipos de recursos, at os que no se estejam usando Prevista vertical: Permite dividir ver em forma vertical a tela, uma com a prevista. Prevista Horizontal: Permite dividir ver em forma vertical a tela, uma com a prevista. No mostrar Prevista: No mostra uma prevista Janela Lado a lado: Permite ver as janelas uma do lado das outras (ajustando-as) na tela. Cascada: Permite ver as janelas uma detrs da outra, em forma de cascada. Ajuda ... Agora, faamos um training bsico do uso do WorkShop: Entre no WorkShop [Alt-V][V] (View Vertical do menu View) Ver prevista em forma vertical [Alt-F][O] (Open do menu file) Abrir arquivo DEMO.DLL Utilize as flechas para cima/baixo para ver os recursos dentro de este DLL [Alt-F][S] (Gravar) Acostume-se a gravar a esmo! Sobre tudo porque est desenvolvendo em Windows, e provvel que Voc faa algo que instabilize o sistema operacional! Editar um Bitmap Coloque-se sobre o Bitmap (No exemplo: Nmero 1305: Esse o ponteiro!) Pressione Enter. Faa lhe alguma manchinha (qualquer troca) e pressione [Ctrl][F4] para gravar a troca. Se Voc est acostumado a utilizar outro utilitrio, desde dentro do recurso:

[Alt-E][S][Alt-E][C ]Seleciona e copia ao clipboard o bitmap. Pegue-o e retoque-o na outra ferramenta, e passe-o a DLL com a mesma tcnica. [Alt-E][P] pegar. [Alt-F][S] Grave o recurso. Editar um dilogo Coloque-se sobre o dilogo que aparece com o nome demo, e pressione Enter. Lhe aparecer na tela o dilogo. Pressionando TAB ou clicando poder posicionar-se sobre qualquer controle existente. Se fizer duplo clique sobre a parte superior da janela de dilogo (o ttulo), poder definir o tipo de janela com a qual est trabalhando (Mais adiante veremos como tirar proveito dele). Pelo momento, o que pode voc fazer selecionar o tipo de "font" (letra) do dilogo. Aqui uma observao importante: As FONTES que esto em sua mquina que aparecem para seleo, NO SO NECESSARIAMENTE AS MESMAS QUE SEU CLIENTE TEM! (O coloquei em maisculas, mas no significa que estou gritando, mas se algum aprende a gritos, isso foi um grito!) caption o nome do dilogo, e menu o menu de este dilogo (Se desejarmos que tenha algum). A classe nos permite definir como se ver o dilogo na tela. Por default temos 2 ( mais fcil no definir classes de dilogos, ao ajustar logo os controles). Pressionemos OK e retornaremos ao dilogo em si. Veremos agora os controles. O primeiro o boto grfico . Veja na parte inferior de sua tela o ID: 305 (recorde o bitmap 1305. Este boto tem o nmero 305. ou seja, se lhe somamos 1000 veremos o bitmap que mostra o grfico. Somando 3000 e 5000 veremos quando esta selecionado e quando esta pressionado, respectivamente. Concluso: Crie os bitmaps do 1201 ao 1800 (Os primeiros 1000-1100 sero controles que o WorkShop cria por default. Quando criamos um controle se cria este se enumera do nmero 101 em diante. Seria muito trabalhoso criar o bitmap 1109 e que logo nos demos conta que se cruza com o get 109 do WorkShop). Pressionando Enter veremos suas caractersticas, que pelo momento no afetaremos. Pressione ESC. O segundo controle o Browse. Na realidade, devemos definir os controles em 2 grupos: os normais (que o WorkShop trs dentro de seu executvel, e que podemos ver no menu Controle) e os "redefinidos" por ns, que so controles que apontaram s classes que manipulamos em nossos programas! Isto , o controle Browse (Pressionem Enter) tem uma classe definida, chamada "twbrowse". Esta a classe que temos no FiveWin. Normalmente, trabalharemos com os controles que vemos neste dilogo demonstrativo. mas se desejarmos trabalhar com uma classe (por exemplo, folder) deveremos criar no menu controle uma classe custom, a qual lhe definiremos com o nome "tfolder". A desvantagem deste tipo de controles que, como no pertence ao WorkShop, no podemos fazer uma simulao de seu comportamento (pressionando na barra de ferramentas o boto Test). O boto "1,2" nos permite definir em que ordem desejamos que se mostrem nossos controles. Daqui podemos, copiando e pegando, criar praticamente qualquer controle. Com o mouse, clicando sobre um controle, podemos manipul-lo: O mouse posicionado no canto de um controle permite definir o tamanho de um controle, a tecla del o elimina. O boto direito permite duplicar o controle (podem tambm trocar o tamanho e posio, mas arrastando-o com o mouse mais fcil). Ao duplicar, definiremos a quantidade de vezes que desejamos multiplicar o controle, e a distncia entre eles, tanto na forma vertical como na forma horizontal. Recordem de pressionar [Ctrl-F4] para gravar e retornar tela anterior. Criar um cursor:

Coloque-se sobre o cursor (No exemplo: Nmero cursor: Esse o ponteiro!) Pressione Enter. Faa lhe alguma manchinha (qualquer troca) e pressione [Ctrl][F4] para gravar a troca. Note que no caso dos cursores, estes s suportam duas cores, e a opo de mostrar regies "transparentes". Igualmente, no menu Cursor/"Set Hot Spot", podemos definir qual a "ponta da flecha do ponteiro", ou a zona exata a onde aponta o ponteiro do mouse. Igualmente, em Cursor/Test, podemos provar o resultado de nosso cursor em tela. Editar um cone Coloque-se sobre o cone (No exemplo: cone: Esse o ponteiro!) Pressione Enter. Faa lhe alguma manchinha (qualquer troca) e pressione [Ctrl][F4] para gravar a troca. Se voc est acostumado a utilizar outro utilitrio, dentro do recurso: [Alt-E][S][Alt-E][C] Seleciona e copia para o clipboard o bitmap. Pegue-o e retoque-o em outra ferramenta, e passe-o a DLL com a mesma tcnica. [Alt-E][P] pegar. Note que os cones podem ser de distintos tamanhos e dimenses (Icon/"Size and atributes"): Utilize de 32 x 32 pixels, com 16 colores, que o padro. (Os de 256 colores em SVGA impressionam, mas em VGA decepcionam). [Alt-F][S] Grave o recurso. Editar um array de constantes Coloque-se no array (stringtable) e pressione Enter. Pressione INS para anexar um novo item ao array, [Ctrl-Del] para retirar um elemento do array. Sugerimos pelo momento no manipular estes arrays (No inclu-los em seus programas), depois veremos como faz-lo num modo mais conveniente. Se bem que este pargrafo, ter resumiu (creio eu) a funcionalidade do WorkShop. Um pouco de prtica, alguma dvida solucionada, e j estamos na capacidade de programar em FiveWin. No seguinte nmero veremos outros comandos do WorkShop. E adiante nos concentraremos j no no modo de programar, mas sim no modo de aproveitar o FiveWin. Como prova disto, tentem fazer este exerccio:

Escrever o programa X.PRG: ************ #include "FiveWin.ch" function main() local ow,oi set resources to "demo.dll" loadlibrary("bwcc.dll")

define icon oi resource "cone" define window from -2,-2 to -1,-1 title "Primeiro exerccio" icon oi activate window ow on init (midialogo(ow)) freelibrary("bwcc.dll") set resources to return(nil) static function midialogo(ow) local od,og:=array(1),mvar:={space(20)},ob:=array(2) define dialog od resource "mirecurso" redefine get og[1] var mvar[1] id 101 of od picture "@!" color rgb(255,255,255),rgb(000,000,128) redefine button ob[1] id 102 of od action tone(1000,1) redefine button ob[2] id 103 of od action (od:end(),ow:end()) og[1]:ctooltip:="Este o Tool-Tips do get!" activate dialog od centered return(nil) ********* Escrever o bli.lnk: ************** BLINKER CLIPPER SYMBOL OFF fi x out x.exe PACKCODE PACKDATA DEFBEGIN name Meuprograma description 'Meuprograma' exetype Windows 3.1 code moveable discardable preload data preload moveable stacksize 10000 heapsize 1024 segment 'PLANKTON_TEXT' nondiscardable segment 'EXTEND_TEXT' nondiscardable segment 'OM_TEXT' nondiscardable segment 'OSMEM_TEXT' nondiscardable segment 'SORTOF_TEXT' nondiscardable segment 'STACK_TEXT' nondiscardable DEFEND NOBELL

LIB Five, FiveC, Objects LIB WinApi, Clipper, Extend, DbfNtx, Terminal ************** Compilar com clipper x /n Linkeditar com Blinker @bli No WorkShop, duplique o recurso dilogo e lhe d o nome "mirecurso". Entrar nele, apagar todos os controles, a excesso do get e o boto texto. Duplicar o boto texto. Selecionar o controle get, pressionar Enter e trocar o nmero para 101. Fazer o mesmo com os botes (nmeros 102 e 103), da barra de ferramentas "1,2" pr a ordem desejada. [Ctrl-F4] grava o recurso e [Alt-F][S] grava a DLL. Qualquer problema escreva-me. (O DLL e o executvel deveram estar no mesmo diretrio). O CTL3DV2.DLL dever estar em \windows\system* O BWCC.DLL dever estar em \Windows* *Estes controles so pblicos. Qualquer programa de Borland os contm, se no que j esto em seus mquinas atualmente. S em caso que o programa no funcione, confirme-o. RESUMO: Resource WorkShop Bsico. No seguinte nmero veremos: Menus - Nunca mais fcil! Programao orientada a objetos.

Programao Orientada a Objetos: Destruindo um mito Nota: No pretendo com isto dar uma lio de anlise/desenho/programao orientado a objetos: A minha inteno mostrar minha apreciao pessoal ao tema. Qualquer um poder discordar de minhas opinies (algumas talvez muito srdidas) mas que de outro modo no permitiriam a facilidade do entendimento. Logo depois de ter lido trs livros sobre o assunto, at h coisas as quais no encontro uma explicao adequada, que permita a TODOS entender o que OOP Introduo. Uma nova filosofia. H algum tempo temos ouvido falar de uma frase nova em o dicionrio de informtica, "Orientado a Objetos". Temos perguntado a amigos e nos tem falado de linguagens de programao, de ambientes, polimorfismo, reutilizao, anlise e desenho, etc. Ao final, provavelmente no entendemos nada e o "deixamos por isso mesmo".

De fato, "Orientado a Objetos" no um linguagem de programao, nem ambientes, nem palavras estranhas. to s uma forma nova de executar nosso trabalho, uma nova filosofia de trabalho, que nos permitir apreciar as coisas que fazemos de forma natural. Pelo momento, ouviremos o que a programao orientada a Objetos, e concentraremos nossa ateno em OOP: O que OOP? Q Que um objeto? Entendamos um objeto como um grupo de procedimentos escritos, com relao entre s. Para um programador, poderamos afirmar que um objeto um array, que contm variveis e funes que podem ser avaliadas. Como um array, podemos alterar suas variveis e mant-las existentes enquanto exista esta varivel array. Ou seja, imaginem que podemos fazer algo assim como: objeto:={ halla_idade_do_cliente(codigo_do_cliente), momedocliente:="Jose", troca_saldo_do_cliente(novo_saldo), saldo_do_cliente:=1000 ... } Mais adiante invocamos uma frmula do array, trocamos uma varivel, etc. A vantagem? Podemos criar um array (objeto) com as caractersticas de cada entidade que conforme nosso sistema. A vantagem? Ordem A vantagem? Cdigo limpo, fcil de manter. Pseudocdigo de um objeto. criar classe usurio variveis internas: *S so trocadas por uma funo dentro desta classe chaveusuario:="000001" nomeusuario:=usurio->nome administrador:="Sim" variveis externas: *Qualquer funo as troca funes internas: *S so invocadas por uma funo dentro da classe anexausuario(arraydedados) trocausuario(arraydedados) retirausuario(codigodousuario) funes externas: *Qualquer funo as invoca posicionausuario(codigodousuario) editausuario()

chaveok(chaveusuario) Fim Fcil, no? Pois j esta criada a classe usurio. As funes so conhecidas como mensagens/mtodos/comportamentos e as variveis como atributos/caractersticas. Notem que: 1.- Todo o que se faa com um usurio, se far em um mesmo programa. 2.- Para outro sistema que necessite a entidade (leia-se objeto) usurio, voc usar este cdigo. (Isto se chama reutilizao). O novo sistema necessitar novas variveis/funes (P.E.: idade do usurio). Logo, anexamos uma nova funo. Deste modo, ampliamos o horizonte de nossas classes. E a compatibilidade faz classes hereditrias se mantm inalterveis. Modelos da realidade. O computador pensa como ns, e no ns como o computador. Nossas funes EMULAM O PENSAMENTO HUMANO. Levantamento de dados. A seguir veremos um caso muito interessante que nos mostra, desde o inicio, a forma em que toma vida um sistema, via anlise orientada a objetos. Um cliente pede mercadoria, se verifica se exista no armazm, e se h se retira a mercadoria do armazm e se lhe despacha a mercadoria, se gera uma fatura e se paga a fatura. Sabe (ou recorda) alguma lngua? Pois prepare-se para uma lio: Sujeitos: Cliente, mercadoria, armazm, fatura. Verbos: pede mercadoria, existe no armazm, retira a mercadoria, despacha a mercadoria, paga a fatura. Cada classe ser um sujeito e cada verbo uma mensagem. Deste modo o usurio faz a anlise por ns, (e o firma dando-o por aceito). Se o sistema falha mais adiante, o far a anlise por ns! - A fatura no recalcula- nos dir o usurio. Se seguirmos o esquema, teremos uma funo recaulculafatura(). Se no existe, temos uma nova funo. Isso anlise/desenho/programao OOP! O modelo espiral. O modelo espiral prope quatro etapas (em forma de cruz). Cada etapa (c/ as reas criadas), em sentido horrio, ser: ANLISE/DESENHO/PROGRAMAO/IMPLEMANTAO Desenharemos um espiral em sentido horrio que termina no centro da cruz . Voc ter algo assim como:

Anlise

Desenho

! --------------------------------------------------------------------! Implementao ! Programao Isto que significa: Quando lhe pedem um sistema, desenvolver o ciclo anlise/desenho/programao/implementao, cercando-se cada vez mais ao centro. Iremos anexando funes/variveis a nossas classes. O interessante, que o sistema ir funcionando por etapas. Outra grande vantagem ser que o resultado das classes (cada funo) ser o manual de procedimentos e funes da empresa. Ou seja, se amanh se trocar de linguagem de programao, a anlise J ESTARA FEITA. S se necessitaram programadores, no analistas. Se poder deixar a empresa, mas este esquema/manual permanecer. Atualmente, eu no crio classes para minhas entidades. Fao meus programas e funes, mas com a filosofia antes mencionada (cada funo uma ao). Pass-la a objetos no me demandar esforo. Mas sim tenho classes criadas para aes crticas. Na lib5.zip encontra uma classe DBF.PRG, que a classe que venho utilizando a muito tempo para meus programas em Clipper (Desde a poca do DOS). Nota importante: O Visual Basic 5.0 uma linguagem eminentemente orientada a objetos. Logo seguiram os demais linguagens (Ahhh, meu velho Clipper/class(e). Lhe tirou anos de vantagem ao resto!). No esto perdendo tempo, esto adiantando-se no tempo. Os arquivos .INI - dando inteligncia ao sistema Em um dado momento mencionei o objeto como o array com variveis de uma entidade (usurio, no exemplo). Que tal um array com as variveis de ambiente do sistema? Vale. Que tal se esse array fosse manipulvel fora do sistema? Vale. E que tal se esse array contenha derivaes lgicas.?(vender_ao_credito=no) Vale. Pois pense isto, e eu o utilizo com muito xito. Na biblioteca lib5.zip encontraram um programa TS.INI com um grupo de funes que utilizo para tal propsito. Ao iniciar o sistema, declaro uma varivel pblica arrini, e a carrego com o arquivo .INI respectivo. Por exemplo: MODULO.INI ------------------[inifonts] roman|10|20|n roman|10|20|s [finfonts] [cores]

colorbrowse=255|255|192 [inireporte1] cabeceira=GFTP S.A. RELATRIO DE EMPREGADOS DA EMPRESA, POR ORDEM DE SALDO ordem=saldo chave=codigo+[ ]+nome+[ ]+endereco+[ ]+transform(saldo,"999,999.99") [finreporte1] [parametros] impressora=LPT2 numerodecopias=4 administrador=Grenville imposto=18.00 maximodesconto=10.50 path=c:\meupath\ temp=c:\temp\ [fluxo de faturas] dolares=sim soles=sim credito=no cartaocredito=sim troca=no [coordenadas] janelaprincipal=000|000 ... Notem que aqui armazeno as caractersticas do ambiente do sistema: Se vendo a vista e/ou o crdito, em reais e/ou dlares, se aceitam cartes de crdito, valor de desconto mximo, etc. Deste modo, minha classe para qualquer sistema de faturao a mesma, e as mensagens (funes) se invocam quando a varivel de ambiente o permite. De este modo: - Quando fizerem um sistema de faturao, chegar um momento no qual a implementaram do sistema depender unicamente de mover os "switchs" adequados. - Com esta metodologia, economizo at 50% sobre os de trabalhos de compilao/linkedio, pois basta definir uma varivel de ambiente na parte crtica do sistema, para logo analis-lo. De feito, cada vez que se pedir, desfazer algo de um sistema, "desativado", e meu cdigo permanece limpo. Por outro lado, fazendo uma rotina de configurao, conseguindo que o sistema seja configurvel at pelo usurio. - Lendo um pouco mais afrente, chego a dar "inteligncia" aos meus sistemas: O usurio decide se vende ou no a crdito, o sistema armazena as coordenadas das janelas em que estavam, as cores, as FONTES so configurveis... Ou seja, parece um sistema "profissional" (E um sistema profissional). So feitos sistemas que so "interpretes" de arquivos *.INI, ou seja, criado um "molde" de trabalho que meus sistemas lem, e so

capazes de interpretar. (Um sistema de cheio de informao, onde as estruturas de arquivos esto no molde, os campos a ler, as validaes, etc.). MANIPULAO DE ARQUIVOS Antes tambm mencionei que tenho uma classe .DBF vejamos este exemplo: DD.INI --------[cliente.dbf] cliente|c|006|0 nome|c|040|0 *indice* cliente|cliente|cliente.cdx upper(nome)|nome|cliente.cdx [cliente.dbf]

A.PRG ---------local arrfiles:={"cliente"} public arrini,oa arrini:=tsleeini("misistema.ini") oa:=dbf():new() a0(tsgetini("path",arrini,"")) if oa:abre(arrfiles)=0 ... else msgalert("No se podem abrir arquivos!. Tente novamente" ,"FATAL") endif oa:cierra(arrfiles) - Sim no existe o arquivo cliente.dbf, o criar em o path definido em MISISTEMA.INI, sim no existe o ndice, o criara em o path definido em MISISTEMA.INI. - Este o princpio de um dicionrio de dados, que para mim foi suficiente, mas que pode continuar crescendo! - Notem que esta classe foi feita para trabalhar com SIXCDX, mas com muito poucas trocas se pode trabalhar com outro tipo de ndices (se podem conseguir o SIXCDX, consiga-o. muito slido, e tem muitas vantagens sobre outros ndices, at o DBFCDX!)

*FIM DE JORNADA Na seguinte jornada veremos: APROVEITANDO AS CARACTERSTICAS PRPRIAS DO WINDOWS - O Clipboard do Windows - De pais a filhos - janelas MDI