Harbour MiniGUI Lights

HMG-Lights tem o objetivo de oferecer informações sobre o uso da Harbour MiniGUI

HMG-IDE 3.0.0 test XI e

Publicado por Paulo Sérgio D. em 2009 Novembro

hmg

Olá meus amigos,

Não se assustem com o tamanho do titulo do nosso post, mas é verdade, a nossa HMG-IDE esta na versão 3.0.0 test XI release “e”.

E nós da HmgLights viemos mais uma vez detalhar as novidades desta versão. Eu tenho certeza que depois de lerem este post, vocês terão claramente a visão de como a HMG tem evoluído nestes últimos tempos. Veja os detalhes e mais a diante a explicação de cada um.

HMG-IDE

1-) Adicionado, tradução da HMG para o Português do Brasil.

2-) Adicionada, função “Copy target To:”.

3-) Adicionada, função que cria um PRG para um evento de qualquer objeto.

4-) Adicionadas mais duas abas em “Project Browse” (Include e Config).

5-) Adicionada função “HMG Reference” no menu “Help”.

6-) Adicionada função “Wizard Report Builder” para relatórios criados.

HMG

1-) Novos arquivos de “RESOURCES” baseados no KDE Crystal Diamond.

2-) Mensagens da HMG agora com Português correto.

Bom, agora vamos explicar todas as mudanças citadas acima, passo a passo.

HMG-IDE

1-) Adicionado, tradução da HMG para o Português do Brasil.

No dia 30 de Outubro de 2009, ás 17:15, o Roberto Lopez, postou um novo release para a HMG-IDE 3.0.0, no qual, dentre outras funções, permite a utilização de arquivos de idiomas pela IDE, fazendo assim com que a IDE possa ser traduzida para vários idiomas. E nós da HMGLights não perdemos tempo… Começamos a tradução para portugues do brasil no mesmo dia e horas mais tarde, no fórum, postamos a tradução e o Roberto Lopez adicionou a mesma na distribuição oficial da HMG-IDE. Ficamos muito felizes por estarmos contribuindo com este maravilhoso projeto e também por ajudar aquelas pessoas que se perdem um pouco com a IDE em inglês a mergulhar de cabeça no universo HMG. Então, a meu ver, esta primeira novidade já é bastante interessante, pois agora nós poderemos utilizar a IDE no idioma que mais nos agradar. Pois também não fomos os únicos a postar arquivos de internacionalição para a HMG ide. Outros grandes contribuidores postaram arquivos para o polonês e turco dentre outros.

2-) Adicionada, função “Copy target To:”.

Esta também é sem duvida uma excelente função. Com esta função nós poderemos especificar um outro diretório para que o nosso projeto, quando recompilado, seja movido o executável para a pasta em questão. Ex:

“Copy target to: C:\Teste\”

Neste exemplo, toda vez que eu recompilar meu projeto, o executável gerado será movido automaticamente para a pasta “TESTE”, localizada no meu “C:”. Isso ajuda muito na hora de separarmos os arquivos de nossa aplicação do código fonte.

Esta função também aceita nomes com espaços para o “target”. Mas para que funcione você deve inserir o caminho que deseja entre aspas duplas. Por favor lembrem-se disso: Ao adicionar um “Path” no campo “Copy target to:” (com ou sem espaços no nome),  SEMPRE terminem o mesmo com barra (“\”)

Ex: Copy target to: “C:\Arquivos de Programas\teste 2\teste\”

Simples, fácil, rápido e muito útil.

3-) Adicionada, função que cria um PRG para um evento de qualquer objeto.

A janela “Object Inspector” também sofreu mudanças, veja a figura abaixo.

Agora ao selecionarmos um objeto, na aba “Events”, você verá alem de “Event, value” um sinal de “+”, de “-“ e de “…”. Ao clicar no sinal de “+”, será sugerido um nome para o PRG que será criado para esta ação. Ou seja, ao clicar no sinal de “+”, você poderá criar uma função que será automaticamente vinculada à ação “dona” do sinal “+” que você clicou. O nome sugerido inicialmente sempre será FORM_OBJETO_EVENT, mas você poderá mudar isso da maneira que lhe convier. Lembrando sempre que esta nova função é opcional e o modo antigo ainda continua funcionando muito bem. Clicando no sinal de “-“ você remove a ação criada juntamente com o PRG. Ambos serão removidos do projeto caso seja lecionado o sinal de “-“. Clicando no sinal de reticências “…”, você poderá editar o PRG que contem a função definida na ação. Ou seja, podemos perceber que a cada novo release a HMG e a HMG-IDE estão evoluindo muito bem.

Obj_Inspector

4-) Adicionadas mais duas abas em “Project Browse” (Include e Config).

O project browse ficou mais completo ao ganhar essas duas abas. Veja as figuras abaixo:

Na aba “Configuration” você poderá definir a configuração do seu projeto. Isso é individual e poderá ser configurado de forma individual para cada projeto gerado com a HMG IDE. Ou seja, se você, a partir desta versão, adicionar, um Path para includes, libs, e nomes de outras libs para um projeto, eles não serão utilizados para outros projetos como default. Isso torna muito mais usual a programação com HMG-IDE, pois nós sabemos que uma lib que poderá ser usada em um projeto, talvez não seja interessante em outro. Alem disso, na aba “Config”, você poderá também definir se o projeto será com modo “Console”, e ainda se deseja compilar o mesmo com suporte a multi-tarefa. Alem de poder definir os “Paths” para suas libs e includes, bem como os nomes das LIB que se deseja usar e ainda definir o assunto comentado no item 2 (“Copy Target To:”). Para usufruir destas configuração basta clicar duas vezes em cima dos itens.

Configuration

A aba “Include” irá conter todos os includes criados a partir da opção no menu “Project->New Include”, ao fazer isso será aberto o seu editor de textos para que você possa escrever, ou adicionar o seu “include” personalizado ao seu projeto. Essa opção tambem é individual para cada projeto.

include

5-) Adicionada função “HMG Reference” no menu “Help”.

O menu “Help” ganhou mais um item o “HMG Reference”, ao clicar neste botão o seu navegador padrão será iniciado com a documentação da HMG, que agora vem como padrão junto na distribuição oficial (C:\hmg\DOC). Ou seja, se você esta no meio de uma programação, e bateu aquela dúvida de como um objeto funciona, ou qual os eventos/metodos dele, basta clicar neste item e ler a documentação.

6-) Adicionada função “Wizard Report Builder” para relatórios criados.

A partir desta versão da HMG-IDE, todos o relatórios gerados com o gerador de relatórios poderão ser abertos pelo “Wizard” por defaul. Antigamente, quando criávamos algum relatório com o novo gerador de relatórios da HMG-IDE, ao clicarmos sobre o mesmo na aba “Report” do “Project Browse”, o mesmo era aberto em formato de código fonte. Isso não acontece mais com esta versão da HMG-IDE. Mas lembrem-se, apenas os relatórios criados a partir desta versão poderão ser abertos pelo wizard.

HMG

1-) Novos arquivos de “RESOURCES” baseados no KDE Crystal Diamond.

Bom, conversando outro dia no fórum com o grande Roberto Lopez, nós sugerimos a ele uma mudança nos arquivos de “RESOURCES” da HMG, e ele me disse que “novos ícones para o resources são bem vindos”, então após converter algum ícones do pacote KDE Crystal Diamond, eu publiquei no fórum e ele gostou. O Roberto Lopez fez alguns ajustes nos resources que eu postei e adicionou estes na distribuição oficial, agora a HMG conta com várias imagens, ícones, e cursores mais modernos. Veja a figura abaixo:

RESOURCES

2-) Mensagens da HMG agora com Português correto.

Já faz um bom tempo que as mensagens em outros idiomas (inclusive o português) da HMG eram traduzidas pelo google. E para usarmos as mensagens da HMG para o português correto tínhamos que modificar o código fonte da HMG e recompilar a mesma. Nós aqui do HMGLights também já postamos um tópico de como proceder para corrigir o português da HMG, mas isso não mais será necessário a partir desta versão da HMG. Pois o Roberto Lopez, também já adicionou na distribuição oficial a correção do idioma português do brasil. Uma grande contribuição do nosso grande colaborador “Salamandra”.

Bom, como vocês podem ver, a HMG vem evoluindo muito rápido, e tenho certeza de que podemos esperar muitas outras funcionalidades para as próximas versões. Fiquem atentos ao nosso blog, pois nós iremos documentar cada passo rumo a evolução da HMG e tudo será documentado aqui.

Um grande abraço a todos e até o próximo post.

Enviado em Editor-Ombudsman | Tagged: , , , , , , , , , | 2 Comentários »

NETIO

Publicado por Paulo Sérgio D. em 2009 Novembro

servidor

Olá meu amigos,

Primeiramente gostaria de me desculpar pela demora em escrever este post. Esta semana foi realmente muito corrida para mim.

Hoje vamos falar sobre o NETIO, a nova biblioteca para compartilhamento de arquivos DBF sobre TCP/IP inclusa na mais nova versão do Harbour (2.0).

Criada pelo Przemyslaw Czerpak “Przemek”, grande contribuidor do projeto Harbour, a biblioteca “libhbnetio.a”  nos permite o compartilhamento de arquivos DBF com os mais variados tipos de drivers pelo protocolo TCP/IP. Os drivers suportados no momento são: DBF, DBFFPT, DBFBLOB, DBFNTX, DBFCDX, DBFNSX, SDF e DELIM.

A NETIO trabalha com a plataforma Cliente/Servidor, mas de um jeito bem diferente da LetoDB ou de qualquer outro SGBD. Com a LetoDB ou qualquer outro SGBD, todo o processamento fica por conta do Servidor. Com isso os dados “mastigados” trafegam pela rede, o mesmo já não acontece com a NETIO. Apesar desta também possuir um servidor, a única coisa que o server da NETIO faz é abrir uma porta para escutar as requisições do Cliente NETIO e servir o mesmo com acesso a tabela requisitada, sem processamento algum. Então podemos concluir que toda parte do processamento bem como exclusão, alteração, inclusão, reindexação, fica por conta do Cliente.

Pelos testes que realizamos aqui podemos ver que em uma rede local o desempenho é maravilhoso, sem contar que ela vem junto com as libs do harbour por isso não precisamos recompilar a mesma. Essa lib também é linkeditada automaticamente quando você compila um projeto com a MiniGUI. Ou seja, se for criar algum projeto usando esta tecnologia você não precisará fazer menção desta biblioteca no seu projeto com a HMG.

Ainda não realizei testes fora de uma rede local com esta LIB. Mas dentro de muito breve estaremos concluindo os testes e postando os resultados aqui. Afinal esta solução ainda esta engatinhando, mas já ganhou destaque e muitos fãs no universo harbour. Ela promete melhorar muito com o passar do tempo.

Bom, em meus testes eu criei um pequenino servidor do NETIO, e um simples cliente. Este exemplo pode ser baixado deste link HmgServerIO Download, ou se você já baixou a nova versão da HMG 3.0.0 (test X ou superior) procure o mesmo dentro da pasta “C:\hmg\samples\NETIO.02”.

Lembrete: Quando for recompilar o SERVER com a NETIO não se esqueça de passar o parametro “/mt” para o build.bat, pois sem esse parametro o seu SERVER não irá funcionar. Ex:

C:\>hmg\samples\NETIO.02\HmgServerIO\build.bat /mt HmgServerIO.hbp

O parametro /mt habilita o suporte a multi-threading no harbour. Requerida aqui para o uso desta função.

Se conectando….

Veja o código fonte, a parte de conexão com a base de dados tem uma alteração. Quando nos conectamos localmente podemos usar o seguinte comando.

DBUseArea(.t.,,”Clientes.DBF”,”Clientes”)

Para usar o NETIO cliente use da seguinte forma:

“net:” + “IP DO SERVIDOR” + “:” + “PORTA DE ESCUTA DO SERVER” +”:”+”NOME DA TABELA”

DBUseArea(.t.,,”net:IP_DO_SERVER:PORTA_DO_SERVER:Clientes.DBF”,”Clientes”)

Um ponto importante a ressaltar aqui é que o server do NETIO ainda não trabalha com Path da base de dados, ou seja, para acessar base de dados sem colocar o caminho completo de onde, no servidor, ela se encontra, o server deve ser iniciado na mesma pasta da base de dados. Caso contrário a forma de abertura seria assim:

“net:” + “IP DO SERVIDOR” + “:” + “PORTA DE ESCUTA DO SERVER” +”:”+”PATCH DA BASE DE DADOS NO SERVER”+”:”+”NOME DA TABELA”

DBUseArea(.t.,,”net:IP_DO_SERVER:PORTA_DO_SERVER:C:\teste\Clientes.DBF”,”Clientes”)

Servidor

Uma das grandes vantagens desta solução é o fato de que com apenas algumas linha você pode escrever um server  compila-lo no linux e deixar toda sua base de dados neste maravilhoso SO. Pois criar um simples server com NETIO é questão de onze linhas de código:

proc main()

local pListenSocket

pListenSocket := netio_mtserver()

if empty( pListenSocket )


? “Cannot start server.”


else


wait “Press any key to stop NETIO server.”
netio_serverstop( pListenSocket )
pListenSocket := NIL

endif

return

Como disse, creio que esta biblioteca irá melhorar muito com o passar do tempo. Fique atento, porque nós do HmgLights postaremos mais códigos e mais novidades sobre esta lib. Abaixo deixo o e-mail que foi escrito na “Harbour mailing list” para divulgar esta novidade.

Um forte abraço a todos, e até o próximo post.

Revision: 12382

http://harbour-project.svn.sourceforge.net/harbour-project/?rev=12382&view=rev

Author:   druzus
Date:     2009-08-31 22:56:45 +0000 (Mon, 31 Aug 2009)Log Message:
———–
2009-09-01 00:56 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/harbour.spec
* harbour/harbour-win-spec
* harbour/harbour-wce-spec
* harbour/bin/hb-func.sh
* harbour/contrib/Makefile
+ harbour/contrib/hbnetio
+ harbour/contrib/hbnetio/netio.h
+ harbour/contrib/hbnetio/netiomt.prg
+ harbour/contrib/hbnetio/netiocli.c
+ harbour/contrib/hbnetio/netiosrv.c
+ harbour/contrib/hbnetio/Makefile
+ added new library: HBNETIO.
It implements alternative RDD IO API which uses own TCP/IP sockets
to exchange data between client and server.
This library contains client and server code and is fully MT safe.
On client side it’s enough to execute:
NETIO_CONNECT( [<cServer>], [<cPort>], [<nTimeOut>] ) -> <lOK>
function to register alternative NETIO RDD API and set default
server address and port.
<cServer>  – server addres       (default 127.0.0.1)
<cPort>    – server port         (default 2941)
<nTimeOut> – connection timeout  (default -1 – not timeout)

Above settings are thread local and parameters of the 1-st successful
connection are used as default values for each new thread.
After registering NETIO client by above function each file starting
“net:” prefix is automatically redirected to given NETIO server, i.e.
use “net:mytable”
It’s also possible to pass NETIO server and port as part of file name,
i.e.: use “net:192.168.0.1:10005:mytable”
On the server side the following functions are available:
create NETIO listen socket:
NETIO_LISTEN( [<nPort>], [<cAddress>], [<cRootDir>] )-> <pListenSocket> | NIL
accept new connection on NETIO listen socket:
NETIO_ACCEPT( <pListenSocket> [, <nTimeOut>] )-> <pConnectionSocket> | NIL
start connection server:
NETIO_SERVER( <pConnectionSocket> ) -> NIL
stop connection accepting or connection server:
NETIO_SERVERSTOP( <pListenSocket> | <pConnectionSocket>, <lStop> )-> NIL
activate MT NETIO server (it needs MT HVM):
NETIO_MTSERVER( [<nPort>], [<cAddress>] ) -> <pListenSocket> | NILTo create NETIO server is enough to compile and link with MT HVM
this code:proc main()
local pListenSocketpListenSocket := netio_mtserver()
if empty( pListenSocket )
? “Cannot start server.”
else
wait “Press any key to stop NETIO server.”
netio_serverstop( pListenSocket )
pListenSocket := NIL
endif
returnNETIO works with all core RDDs (DBF, DBFFPT, DBFBLOB, DBFNTX, DBFCDX,
DBFNSX, SDF, DELIM) and any other RDD which inherits from above or
use standard RDD IO API (hb_file*() functions).
Without touching even single line in RDD code it gives the same
functionality as REDBFCDX in xHarbour but for all RDDs.
It’s possible that such direct TCP/IP connection is faster then
file server protocols especially if they need more then one IP frame
to exchange data so it’s one of the reason to use it in such cases.
Please make real speed tests.
The second reason to use NETIO server is resolving problem with
concurrent access to the same files using Harbour applications
compiled for different platforms, i.e. DOS, LINUX, Windows and OS2.
It’s very hard to configure all client stations to use correct
locking system. NETIO fully resolves this problem so it can be
interesting alternative also for MS-Windows users only if they
do not want to play with oplocks setting on each station.
I’m interesting in user opinions about real life NETIO usage.

Have a fun with this new toy  ;-)

+ harbour/contrib/hbnetio/tests
+ harbour/contrib/hbnetio/tests/netiotst.prg
+ harbour/contrib/hbnetio/tests/netiotst.hbp
+ harbour/contrib/hbnetio/tests/data
+ added simple test code for NETIO. It activates NETIO MT server
and then connects to this server to create and browse table with
memo file and production index with few tags.

Modified Paths:
————–
trunk/harbour/ChangeLog
trunk/harbour/bin/hb-func.sh
trunk/harbour/contrib/Makefile
trunk/harbour/harbour-wce-spec
trunk/harbour/harbour-win-spec
trunk/harbour/harbour.spec

Added Paths:
———–
trunk/harbour/contrib/hbnetio/
trunk/harbour/contrib/hbnetio/Makefile
trunk/harbour/contrib/hbnetio/netio.h
trunk/harbour/contrib/hbnetio/netiocli.c
trunk/harbour/contrib/hbnetio/netiomt.prg
trunk/harbour/contrib/hbnetio/netiosrv.c
trunk/harbour/contrib/hbnetio/tests/
trunk/harbour/contrib/hbnetio/tests/data/
trunk/harbour/contrib/hbnetio/tests/netiotst.hbp
trunk/harbour/contrib/hbnetio/tests/netiotst.prg

This was sent by the SourceForge.net collaborative development platform, the world’s largest Open Source development site.
_______________________________________________
Harbour mailing list
Harbour@harbour-project.org

http://lists.harbour-project.org/mailman/listinfo/harbour

Enviado em Programação | Tagged: , , , , , | Deixar um comentário »

HMG 3.0.0

Publicado por Paulo Sérgio D. em 2009 Outubro

hmg

Harbour MiniGUI 3.0.0

Olá meus amigos,

Esta semana esta sendo bem corrida para nós usuários/testadores da HMG. Porque no último feriado dia 12 de outubro de 2009 ás 00:52 Hrs. O nosso grande Roberto Lopez postou no forum da HMG a nova versão para testes da MiniGUI. Estamos falando da versão 3.0.0.

E nós do HmgLights não deixamos por menos e demos início a uma semana bem longa de testes e estudos, para saber o que muda ou não nesta nova versão.

Bom, logo de cara mudou a versão do Harbour e do compilador MinGW.

A versão da HMG 3.0 trás consigo o Harbour em sua versão 2.0 e o MinGW na sua versão 4.4.1. Por isso já podemos perceber um detalhe. Todas as bibliotecas que foram compiladas com as versões anteriores da HMG devem ser recompiladas nesta nova versão para poder funcionar corretamente.

O Harbour 2.0 trás muitas novidades. Em conjunto com o MinGW 4.4.1 a compilação/recompilação ficou muito rápida. Uma melhora muito visível. Fizemos alguns testes e, por exemplo:

Em um teste eu recompilei um projeto que tenho aqui com 18 arquivos PRG´s de mais ou menos 600 linhas cada, este projeto também conta com 17 telas (arquivos FMG) cada tela com vários “controles”. Na HMG versão 2.9.5 (estable) recompilando com a opção de “incremental data” eu tinha uma demora de mais ou menos 2 minutos e meio. Com essa nova versão da HMG o mesmo projeto estava recompilado com “incremental data” em menos de 15 segundos. Quase caiu meu queixo no teclado. E também percebi uma certa melhora nos Controle GRID e BROWSE. O sistema ficou mais “esperto”.

Esse foi o principal teste e foi realizado em um Celeron 3.6 Ghz Com 1 GB de RAM, com windows XP SP/2. Outros testes foram realizados, mas com projetos menores e em todos elas a recompilação com a nova versão “matou a pau” no quesito rapidez. rs…

Oque Mudou?

Bom, logo de cara muitas funcionalidades foram inseridas.

HMG

1-) O arquivo de recursos (RESOURCES) não se chama mais (obrigatoriamente) “MAIN.RC”. Agora é <NomedoProjeto>.RC.

2-) Quando o seu projeto for compilado não será mais gerado um executável com o nome de “MAIN.EXE” e sim <NomedoProjeto>.EXE.

3-) Agora nos podemos instalar a HMG em outro diretório diferente que “C:\hmg”, sem nenhuma alteração.

4-) Pelo que me parece a partir desta versão a HMG e a HMG-IDE virão juntas em um mesmo pacote.

5-) O arquivo “Compile.BAT” foi substituído por “BUILD.BAT”.

Veja os novos parametros para o arquivo “BUILD.BAT”

Syntax:

Build [/i|/r|/d|/cs|/ci/cr] <PrgFile> | <filelist.hbp> [config.hbc]

[/i] : incremental build
[/r] : incremental build (rebuild all)
[/cs] : Console/mixed mode (std build)
[/ci] : Console/mixed mode (incremental build)
[/cr] : Console/mixed mode (incremental rebuild all)
[/d] : Debug mode (gui and console)

<filelist.hbm> : A text file with .hbp extension containing a source list
<configfile.hbc>: A text file with configuration parameters as additional
libs, include paths and lib paths.

<configfile.hbc> Syntax:

incpaths = incpath1 incpath2 … incpathn
libpaths = libpath1 libpath2 … libpathn
libs = lib1 lib2 … libn


- library names must not include ‘lib’ prefix nor ‘.a’ extension.

- build.bat will create an ‘error.log’ file in the app folder when build
process ends with an error condition.

Bom, como você pode ver, agora, temos duas opções a mais de arquivos de configuração. O arquivo <filelist.hbm> que deverá conter uma lista com os nomes dos arquivos PRG que fazem parte do seu projeto e o arquivo <configfile.hbc> que deve conter todas as configurações extras para o seu projeto, como caminho dos includes externos, caminhos das lib´s externas e o nome das lib´s que se necessita usar.

HMG IDE

Todas as funcionalidades citadas acima também se aplicam à HMG-IDE. Por isso se você tem um projeto com resources, quando você abrir o mesmo na HMG-IDE nova, se você não renomeou o mesmo de “MAIN.RC” para <NomedoProjeto>.RC, então você terá um arquivo de Resources em branco. Basta fechar o projeto renomear o arquivo e abri-lo novamente na HMG-IDE.

Um ponto a resaltar aqui é que as outras versões da HMG-IDE não são compatíveis com essa versão da HMG. Por isso quando for testar a HMG 3.0.0 lembre-se de baixar e instalar também a versão 3.0.0 da HMG-IDE.

Harbour 2.0

Nesta versão deste poderoso compilador, nós temos várias novidades. Dentre elas três me chamaram muito a atenção.

1-) MEMIO. Com esta nova função você poderá criar base de dados na memória. Isso mesmo, você poderá criar, inserir/alterar/excluir registros em uma base de dados temporária na memória. Para ver exemplos baixe a nova versão da HMG e procure nesta pasta. “C:\hmg\SAMPLES\MEMORY.TABLES”

2-) Temporary Table. Esta função lhe dará, de uma certa forma, a facilidade para criar e manipular arquivos (DBF) temporários também. Para exemplos veja “C:\hmg\SAMPLES\TEMPORARY.TABLE”

3-) NETIO. Essa é de longe a mais maravilhosa novidade. Bom, quando eu baixei a nova versão do harbour HMG e HMG IDE, tive que recompilar todas as bibliotecas que utilizo para esta nova versão. Minha surpresa foi ao recompilar a LIB LetoDB. Quando eu recompilei a mesma, ela gerou o arquivo “librddleto.a” e também o “LetoDB.exe” (servidor). Só que quando eu fui recompilar meu projeto com esta nova versão o harbour detectou uma dependência no modulo “librddleto.a”. Ou seja, meu projeto com a LetoDB foi pro espaço. Eu postei o código fonte no nosso HMG Fórum e o Roberto Lopez também tentou recompilar a LIB. Ele recompilou e na hora de compilar o projeto… BUMMMM. O mesmo erro. Ou seja nesta versão nada de LetoDB até agora. Fiquei muito chateado, pois pensei como faria para acessar uma tabela DBF com TCP/IP. Bom nesta versão da “HMG 3.0.0 test VII” o Roberto postou dois exemplos com esta nova tecnologia que promete dar muito oque falar. O NETIO permite você acessar uma base de dados com o protocolo TCP/IP. Mas de uma forma diferente da LetoDB (além de ser “nativo” no harbour). Este também trabalha com servidor/cliente mas de uma forma mais singela que irei explicar com muito mais detalhes no meu próximo post, que espero postar dentro de mais ou menos 4 dias.


OBS

Bom, existem algumas mudanças, uma delas é que a lib ADORDD não é compativel com esta versão do Harbour. Tambem vale lembrar que a LetoDB pelo que me parece até agora não funcionou. Se alguem conseguir uma pista, por favor poste aqui.

Vale Lembrar também que tanto a HMG quanto a HMG-IDE nesta versão, ainda estão em fase de testes. Creio eu que ainda vai demorar algumas semanas (meses) para esta chegar na sua versão estável. Por isso se você for utiliza-la, lembre-se que deverá utiliza-la para testes não sendo (ainda) recomendada para produção. Quando a versão estável for lançada nós postaremos aqui para “comemorar”. rs…

Um forte abraço e aguardem o novo post sobre NETIO.

Enviado em Editor-Ombudsman | Tagged: , , , , , , , | 6 Comentários »

HMG com Microsoft Agents

Publicado por Paulo Sérgio D. em 2009 Outubro

merlin

Olá meus amigos,

Não se espantem com o tamanho deste post, ele é pequenino, mas traz uma noticia muito usual.

Atualmente um de meus hobbys preferidos é encontrar códigos e/ou bibliotecas para implantar em minhas aplicações com HMG OFICIAL.

Outro dia eu estava vendo os códigos fontes e exemplos contidos nos arquivos da HMG Extended, e encontrei muita coisa legal que dá pra ser portada com muita facilidade para a HMG oficial. Dentre elas encontrei algo que realmente chamou minha atenção… Estou me referindo a Classe TMsAgent criada pelo mexicano Juan Carlos Salinas Ojeda. Este classe nos permite interagir com os Pensonagens Microsoft Agent (acho que a figura ai em cima explica bem oque quero dizer rs…).

Meu único trabalho foi criar um makefile e recompilar o código fonte da biblioteca com harbour+MinGW para poder utiliza-lo na HMG oficial… Trabalho este que estou divulgando agora pra vocês juntamente com o código fonte da mesma, um exemplo (tambem criado pelo Juan Carlos), um editor de Personagens, para quem quiser criar seus próprios agents, e um site com vários Microsoft Agent´s para download.

Pense nas possibilidades?! rs… você poderá deixar seus softwares bem mais profissionais (e quem sabe pode utilizar esta biblioteca até para criar alguns ovos de páscoa. he he he).

Peço que você, meu querido leitor, avalie o código fonte da biblioteca citada, e do exemplo contido no arquivo abaixo para uma melhor explicação/utilização da classe TMsAgent.

OBS: Na hora de compilar seu projeto utilizando esta tecnologia não se esqueça de fazer referencia a biblioteca TMsAgent nas “Preferences” da HMG-IDE. Se você ainda não sabe como fazer isso, por gentileza, leia este outro post: Lib Externa na HMG

O arquivo completo para a utilização desta biblioteca está neste link : TMsAgent – HmgLights

Fique atento, pois com o tempo muitas outras bibliotecas e função serão disponibilizadas aqui para download.

Um forte abraço e até o proximo post.

Enviado em Programação | Tagged: , | Deixar um comentário »

Algumas dicas e truques

Publicado por Paulo Sérgio D. em 2009 Setembro

coelho

Olá meus amigos,

Aproveitando o tempo que a pneumonia me deu longe do trabalho convencional, vou tentar, dentro deste 7 dias, escrever alguns artigos para o nosso querido blog. :)

Neste artigo nós vamos publicar alguns truques e dicas que podemos experimentar com a utilização da HMG. Fiquem atentos porque durante a nossa caminhada na HMG vamos estar atualizando este POST com novos truques e dicas.

Dicas adicionadas em 14, setembro de 2009

Adicionando Itens ao GRID

Bom suponha que nós temos uma array multidimensional e queremos adicioná-la a um grid control. Uma maneira de fazer isso é por meio do famoso FOR/NEXT, mas existe uma maneira bem mais prática e com uma única linha de código.

AEVAL( aItems, { | a1 | Form.Grid_1.addItem( a1 ) } )

Explicando:

aItems – é a nossa array multidimensional contendo todos os registros que gostaríamos que fosse incluídos no objeto Grid Control.

A1 – é uma array temporária utilizada para adicional os elementos de 1 em 1 para o objeto Grid Control.

Form.Grid_1.addItem( a1 ) – Aqui chamamos a função addItem do objeto grid para adicionar o elemento contido em a1 no nosso Grid.

Colorindo as ToolTips

Para você que deseja colorir as suas tooltips, fica aqui a nossa dica.

Defina uma variavel dentro da sua Function Main contendo a cor que você quer que tenha as suas tooltips, e utilize o comando SET TOOLTIPBACKCOLOR <variavel>

Para que todas as suas tooltips fiquem com a mesma coloração execute esta função antes de dar o ACTIVATE na sua janela MAIN, ok?!

Exemplo:

Function Main()

Local a_TmpColor   := { 193, 224, 255} //Array de cores do tooltip

SET TOOLTIPBACKCOLOR a_TmpColor

Load Window Main

Main.Center

Main.Activate

Return Nil

Funções para manipular dados no GRID

O Objeto Grid é um dos mais utilizados na programação com HMG, só perdendo para o objeto BROWSER. Aqui deixo duas funções que utilizo com freqüência, mas que não lembro o nome do criador das mesmas.

*—————————————————————————————-*

Function GetColValue( xObj, xForm, nCol ) //Função para obter uma coluna(célula) de um grid

*—————————————————————————————-*

Local nPos:= GetProperty(xForm, xObj, ‘Value’)

Local aRet:= GetProperty(xForm, xObj, ‘Item’, nPos)

Return aRet[nCol]


*————————————————————–*

Function SetColValue( xObj, xForm, nCol, xValue ) //Função para mudar o valor de uma coluna(célula) no grid

*————————————————————–*

Local nPos:= GetProperty(xForm, xObj, ‘Value’)

Local aRet:= GetProperty(xForm, xObj, ‘Item’, nPos)

aRet[nCol] := xValue

SetProperty(xForm, xObj, ‘Item’, nPos, aRet)

Return NIL

Converter tipo de dados

Esta função converte qualquer tipo de dados em uma string. Ela foi desenvolvida por um grande colaborador do projeto HMG nosso amigo Bicahi Esgici.

Segue o código da função:

/*

f.Any2Strg() : Covert any type data to string

Syntax       : Any2Strg( <xAny> ) -> <cString>

Argument     : <xAny> : A value in any data type

Return       : <cString> : String equivalent of <xAny>

History      :

7.2006 : First Release

*/

FUNC Any2Strg( xAny )

LOCA cRVal  := ‘???’,;

nType  :=  0,;

aCases := { { “A”, { | x | “{…}” } },;

{ “B”, { | x | “{||}” } },;

{ “C”, { | x | x }},;

{ “M”, { | x | x   } },;

{ “D”, { | x | DTOC( x ) } },;

{ “L”, { | x | IF( x,”On”,”Off”) } },;

{ “N”, { | x | NTrim( x )  } },;

{ “O”, { | x | “:Object:” } },;

{ “U”, { | x | “<NIL>” } } }

IF (nType := ASCAN( aCases, { | a1 | VALTYPE( xAny ) == a1[ 1 ] } ) ) > 0

cRVal := EVAL( aCases[ nType, 2 ], xAny )

ENDIF

RETU cRVal // Any2Strg()

Ícones, cursores e imagens

Bom, eu sempre ficava meio perdido quanto a que imagens e cursores utilizar nos meus projetos com a HMG. Foi ai que procurando algumas imagens novas e fuçando nas subpastas da HMG, eu descobri a pólvora (he he he). Dentro da pasta HMG tem uma pasta chamada RESOURCES. Dentro desta pasta estão todos os ícones, cursores e imagens utilizados pela HMG em seus botões padrão e etc…. (como a janela e botões de impressão, o ícone padrão do projeto dentre outros). Qual o grande truque aqui? Seguinte, selecione suas imagens preferidas para utilizar na HMG e substitua as existentes (ps: Troque as imagens por imagens com as mesmas dimensões e extensões), rode o arquivo “MakeRes.Bat” e recompile seus projetos… você terá as novas imagens adicionadas sem o menor esforço. E tem mais, para não ficar mais procurando qual ícone usar ou qual imagen adicionar nos seus botões, você pode usar os mesmo que a HMG usa, para isso basta informar o nome que esta contido dentro do arquivo “minigui.rc” que foi associado a imagem (ou cursor) em questão. Veja abaixo uma cópia do arquivo “minigui.rc” que esta da pasta “C:\HMG\RESOURCES\”.

// MANIFEST FOR CREATE ‘XP-STYLE’ APPLICATIONS

1 24 “c:/hmg/resources/WindowsXP.Manifest”

MINIGUI_FINGER        CURSOR        c:\hmg\resources\FINGER.CUR
HMG_DRAGLIST            CURSOR        c:\hmg\resources\draglist.cur
HMG_DRAGUP               CURSOR        c:\hmg\resources\dragup.cur
HMG_DRAGDOWN        CURSOR        c:\hmg\resources\dragdown.cur

// EDIT COMMAND IMAGE BUTTONS

MINIGUI_EDIT_CANCEL   BITMAP          c:\hmg\resources\edit_cancel.bmp
MINIGUI_EDIT_CLOSE       BITMAP          c:\hmg\resources\edit_close.bmp
MINIGUI_EDIT_COPY         BITMAP          c:\hmg\resources\edit_copy.bmp
MINIGUI_EDIT_DELETE    BITMAP          c:\hmg\resources\edit_delete.bmp
MINIGUI_EDIT_EDIT          BITMAP          c:\hmg\resources\edit_edit.bmp
MINIGUI_EDIT_FIND         BITMAP          c:\hmg\resources\edit_find.bmp
MINIGUI_EDIT_NEW          BITMAP          c:\hmg\resources\edit_new.bmp
MINIGUI_EDIT_OK              BITMAP          c:\hmg\resources\edit_ok.bmp
MINIGUI_EDIT_PRINT      BITMAP          c:\hmg\resources\edit_print.bmp
MINIGUI_EDIT_ADD          BITMAP          c:\hmg\resources\edit_add.bmp
MINIGUI_EDIT_DEL           BITMAP          c:\hmg\resources\edit_del.bmp
MINIGUI_EDIT_SET            BITMAP          c:\hmg\resources\edit_set.bmp

ZZZ_AAAWINDOW              ICON       c:\hmg\resources\WINDOW.ICO
ZZZ_LED_ON                          ICON       c:\hmg\resources\LED_ON.ICO
ZZZ_LED_OFF                        ICON       c:\hmg\resources\LED_OFF.ICO

HP_END                              BITMAP     c:\hmg\resources\HP_END.BMP
HP_TOP                               BITMAP    c:\hmg\resources\HP_TOP.BMP
HP_NEXT                           BITMAP    c:\hmg\resources\HP_NEXT.BMP
HP_BACK                           BITMAP    c:\hmg\resources\HP_BACK.BMP
HP_PRINT                         BITMAP    c:\hmg\resources\HP_PRINT.BMP
HP_ZOOM                          BITMAP    c:\hmg\resources\HP_ZOOM.BMP
HP_GOPAGE                     BITMAP    c:\hmg\resources\HP_GOPAGE.BMP
HP_CLOSE                         BITMAP    c:\hmg\resources\HP_CLOSE.BMP
HP_SAVE                          BITMAP    c:\hmg\resources\HP_SAVE.BMP
HP_THUMBNAIL          BITMAP    c:\hmg\resources\hp_thumbnail.bmp
HP_GLASS                        CURSOR    c:\hmg\resources\HP_GLASS.CUR

Primeira Coluna – Nomes que serão usados dentro da programação (este nome deve ser colocado no item PICTURE nos nossos Objetos )

Segunda Coluna – Define o tipo de arquivo que se esta referenciando (Icones, cursores, imagens)

Terceira Coluna – O nome do arquivo que será utilizado

Copiando base de dados

Bom, essa dica é simples mas evita um erro difícil de se “achar”. Suponhamos que você tenha um arquivo DBF com uma determinada estrutura e gostaria de gravá-lo em um outro arquivo DBF com a mesma estrutura (um BackUp ou um LOG talvez, :) ), você então poderia tentar grava-lo utilizando o seguinte comando abaixo:

For i := 1 to &cArea1->( FCount() )

&cArea2->( FieldName( i ) )         :=        &cArea1->( FieldGet( i ) )

Next i

Se você tentar utilizar do código acima, na hora da compilação você receberá uma mensagem igual a esta aqui:

FUNC_BASE.prg(157) Error E0022  Invalid lvalue: ‘->’

Para solucionar isso a única alternativa foi utilizar um outro comando que faria a mesma coisa… segue o código abaixo:

For i := 1 to &cArea1->( FCount() )

&cArea2->( FieldPut(   i,   &cArea1->(   FieldGet(   i   )   )   )   )

Next i

Eu procurei no grande google um motivo para este erro mas não encontrei nada de relevante sobre o erro “E0022″, fica aqui então minha pequena dica pra contornar quando a situação for a citada acima.


Enviado em Programação | Tagged: , , , | Deixar um comentário »

Encriptação na HMG

Publicado por Paulo Sérgio D. em 2009 Setembro

Inicio

Olá meus amigos,

Primeiramente gostaria de me desculpar com nossos amigos leitores pela demora em escrever um novo post. Digamos que nossa vida dá muitas voltas e algumas não são tão boas assim :(

Bem chega de lenga-lenga e vamos ao que realmente interessa.

Hoje nós iremos tratar de um assunto muito importante para todos os programadores… a Encriptação.

Durante muito tempo, muitos programadores criaram suas próprias rotinas para encriptação de dados. Eu mesmo fiz algumas bem malucas aqui (rs..). Pois manter uma base de dados longe do alcance de pessoas indesejáveis é algo trivial a todo programador.

Bom, na HMG também podemos fazer isso, só que de uma forma bem mais fácil. Hoje nós aprenderemos a utilizar os recursos da maravilhosa “Crypto Library for MiniGUI” criada pelo Grigory Filatov. Pra quem não conhece o Grigory Filatov, ele é um dos pais da HMG Extended.

Dentro da pasta “C:\hmg\SOURCE\CRYPT” você poderá ver os fontes desta biblioteca de encriptação criada pelo Grigory, vale a pena dar uma olhada. A biblioteca tem funções muito úteis para encriptação de base de dados em DBF, arquivos INI e dentre outras. Mas mesmo que vc utilize uma base de dados em SQL poderá fazer uso desta LIB sem problemas, pois a mesma nos permite encriptar “qualquer coisa”. A lib utiliza o algoritmo XOR de encriptação. Neste post não vou explicar como este algoritmo funciona (deixo isso como dever de casa), e vou dar ênfase nas funções contida na “libcrypt.a”.

A Chave

Como em toda rotina de encriptação nós vamos precisar de uma “chave de encriptação”. A chave poderá ser qualquer seqüência de caracteres, mas lembre-se de que quanto maior a chave, maior será a segurança da sua encriptação. As funções desta LIB utilizam chaves com no máximo 10 dígitos.

Exemplos de chaves que nós poderíamos utilizar com esta lib:

c_Chave := “*aZ91!@# $”

ou

c_Chave := “9K stg!h#@”

As funções:

_ENCRYPT(cStr, cPass)

Esta função retorna a encriptação do argumento contido em “cStr”. O argumento será encriptado de acordo com a chave contida no parâmetro “cPass”. Exemplo:

MsgInfo( _ENCRYPT( “Teste de texto simples para encriptação” ,  c_Chave ) )

_DECRYPT(cStr, cPass)

Esta função retorna a desencriptação do argumento contido em “cStr”. O argumento será desencriptado de acordo com a chave contida no parâmetro “cPass”. Exemplo:

c_Texto := _ENCRYPT(“Teste de texto simples para encriptação”, c_Chave)

MsgInfo( _DECRYPT( c_Texto, c_Chave ) )

OBS: Em ambas funções acima praticamente qualquer conteúdo pode ser passado como parâmetro, desde simples strings até conteúdos de EditBox, TextBox, RichEdit e etc.

FI_CODE(cInFile, cPass, cOutFile, lDelete)

Esta função é realmente especial, pois ela encripta um arquivo INI. Vamos por partes:

cInFile – Aqui deverá conter o nome+path do arquivo INI que se quer encriptar

cPass – Neste parâmetro nós passamos para a função a chave para a encriptação do arquivo

cOutFile – Neste aqui, deveremos passar o nome+path do arquivo que esta função irá gerar. Este arquivo por sua vez estará encriptado, ou seja é o resultado da função FI_CODE

lDelete – Neste argumento nós definimos um valor lógico para a exclusão ou não do arquivo INI original. Se vc quiser que após a encriptação o arquivo original seja deletado passe o parâmetro “.t.” neste argumento.

FI_DECODE(cInFile, cPass, cOutFile, lDelete)

Esta função é a função para desencriptação de um arquivo INI que foi encriptado pela FI_CODE.

Todos os parâmetros são praticamente os mesmos, com exceção, é claro, dos parâmetros cInFile e cOutFile.

Desta vez cInFile deverá contem o arquivo ENCRIPTADO e cOutFile conterá o nome do arquivo que será gerado sem encriptação alguma.

DB_ENCRYPT(cFile, cPass)

Esta função é específica para o uso em DBF´s. Ela codifica toda a base de dados passada como paramentro em cFile, utilizando a chave contida em cPass.

DB_UNENCRYPT(cFile, cPass)

Esta função é simplesmente a função complementar da função DB_ENCRYPT. Ou seja, esta função desencripta uma base de dados encriptada pela função acima.

Bom, pessoalmente posso dizer que uso muito esta LIB com algumas alterações que fiz aqui. Particularmente eu faço uso de apenas duas funções da mesma, que são estas abaixo:

_ENCRYPT(cStr, cPass)

_DECRYPT(cStr, cPass)

Com essas funções eu consigo encriptar e desencriptar tudo que necessito, e esta LIB é muito útil pra mim. Por ser open-source você poderá modificá-la a seu gosto e construir a sua própria LIB se assim desejar. Vale a pena dar uma boa olhada no código desta pequena biblioteca.

OBS : Quando for fazer uso desta biblioteca não se esqueça de referencia-la no item “preferences” na HMG-IDE para que a mesma possa ser compilada junto ao seu projeto. Qualquer dúvida, por gentileza, leia este post: LIB Externa na HMG IDE

Abraços a todos e até o próximo post,

Enviado em Programação | Deixar um comentário »

Programando Funções em modulos

Publicado por Paulo Sérgio D. em 2009 Agosto

harbour-logo

Olá meus amigos,

hoje estamos aqui para falar sobre um assunto que é muito util pra todos nós.

Antigamente, com o clipper, quando queriamos criar sistemas em modulos, para futuramente expandir ou modelar nossos sistemas, nós, utilizamos as OVERLAYS (OVL). Hoje com o harbour e a minigui não é diferente, e apartir de agora você confere aqui no HmgLights como criar e executar modulos em seus sistemas.

Primeiro passo

Bom, creio eu que você vai criar uma pasta para fazer este teste, ok?!

Faça logo de inicio o seguinte:

1 – ) Crie sua pasta

2 – ) Vá em C:\hmg\BATCH, copie o arquivo Compile.bat pra dentro da pasta que você acabou de criar.

3 – ) Abra o arquivo Compile.bat copiado procure esta TAG:

:STD_COMP

4 – ) Logo abaixo dela terá uma linha com os seguintes comandos e parâmetros:

%HRB_DIR%\bin\harbour %1.prg -n -i%HRB_DIR%\include;%MINIGUI_INSTALL%\include;.

5 – ) Logo após o parametro “%1.prg” inclua o parâmetro “/gh”. Vai ficar assim:

%HRB_DIR%\bin\harbour %1.prg /gh -n -i%HRB_DIR%\include;%MINIGUI_INSTALL%\include;.

O porque dessa Gambeta.

O parametro /gh passa para o compilador harbour a ordem para desenvolver, ao invés de um executável, um arquivo com extensão “HRB”. Trata-se do “Harbour Portable Object”, isso mesmo é como se estivéssemos falando de uma OVL 32 bits…. Maravilhoso não acha!? Também gostei muito.

Ao tentar compilar meu exemplo com o arquivo bat padrão da HMG eu não obtive sucesso quando passei pra este o parâmetro “/gh”, então a única solução que ví foi modificar uma copia dos mesmo e utiliza-la desta forma.

Exemplo Básico

Ok, chega de lenga-lenga e vamos ao que interessa…. PROGRAMAÇÃO

Vamos criar um exemplo pequeno mas que vai nos mostrar exatamente o poder da nossa linguagem de programação favorita.

Crie um exemplo na HMG IDE contendo apenas uma janela (MAIN) e um botão.

Defina, na ação do botão, o seguinte comando:

hb_hrbDo(hb_hrbLoad(“demo”))

Explicando a ação.

1 -) “demo” é o nome do meu arquivo HRB que criei aqui. (vc vai criar um logo adiante)

2 -) hb_hrbLoad() é o nome da função que irá ler este arquivo gerado pelo harbour para assim ter acesso a função de dentro do mesmo.

3 -) hb_hrbDo() Essa função executa a função recuperada pelo comando hb_hrbLoad()

Ok, compile e gere o seu executável principal. Como você já deve ter percebido, se você executar este programa exemplo que acabou de criar vai dar um erro, pois nós ainda não criamos o nosso Harbour Portable Object pra interagir com a chamada das funções acima.

Harbour Portable Object, criando…

Vá na pasta que nós criamos no começo dos post. Aquela que contem o arquivo “Compile.bat” modificado.

Crie um arquivo chamado “demo.prg” e dentro dele faça o seguinte.

Function Teste()

MsgInfo(“  Teste de função do Harbour Portable Object   ”)

Return Nil

Salve, e execute o arquivo “Compile.bat” modificado, em linha de comando passando para ele o nome “demo” como parâmetro. Se tudo deu certo você terá na sua pasta um arquivo chamado “demo.hrb”.

Copie o arquivo “demo.hrb” para dentro da pasta onde se encontra o executável que foi criado no passo anterior.

Pronto Agora você pode executar o programa exemplo criado logo acima e se tudo deu certo ao clickar no botão você receberá a mensagem “  Teste de função do Harbour Portable Object   ”.

Parabéns, você acaba de criar seu primeiro Harbour Portable Object.

Pense nas possibilidades de uso desta ferramenta…. eu sei… minha mente também voou por aqui.

Abraços e até o próximo post.

Enviado em Programação | Tagged: , , , , , | 2 Comentários »

Gerando Arquivos TXT com HMG

Publicado por Crocciari em 2009 Agosto

Quando trabalhamos sobre o ambiente MS-DOS é bastante comum gerar um arquivo TXT através do conjunto SET PRINT TO <arquivo>, SET PRINT ON, SET PRINT OFF, SET PRINT TO, porém quando chegamos ao ambiente gráfico MS-Windows, as coisas mudam um pouco, primeiro as saídas para impressora são um tanto diferente e internamente acabam passando por um gerenciamento de impressão do Sistema Operacional, dificultando assim a tarefa de gerar um TXT apenas imprimindo para dentro de um arquivo TXT, técnica comum entre os programadores Clipper, mas que não pode ser usada pelos programadores HMG, procurei na documentação e nos exemplos, procurei também nos principais veículos de divulgação, e realmente não consegui uma solução satisfatória para esse problema, então trago aqui uma solução simples utilizando a função MEMOWRIT, esta é a função que grava variáveis de buffer à arquivos padrão texto (TXT).

Gerador de arquivos do tipo TXT

Gerador de arquivos do tipo TXT

O código abaixo esta todo comentado para facilitar aos novos estudiosos e programadores da linguagem HMG, e faz parte do projeto GeraTXT.Hpj, para ser utilizado no HMGIDE, o conteúdo deste projeto esta disponível no final desta publicação, faça o download do arquivo GeraTXT.RAR e descompacte, será criada uma pasta chamada GeraTxt, entre no seu HMGIDE e abra o projeto, clique no botão RUN e você já pode ver sua aplicação funcionando.

Arquivo: MAIN.PRG


#include

// define a constante ENTER para a quebra de linhas
#define ENTER chr(13) + chr(10)

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Programa Principal
*/
Function Main

// Carrega o formulario MAIN.FMG
Load Window Main

// Posiciona o formulario no centro do DESKTOP
Main.Center

// Ativa o formulario
Main.Activate

Return

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Primeira funcao a ser executada quando formulario eh iniciado.
Eh preciso definir no evento ONINIT no OBJECT INSPECTOR aba EVENTS da HMGIDE
*/
Function Main_OnInit()

// Limpa a GRID_DATA
Main.Grid_Data.DeleteAllItems

// Popular a GRID_DATA
// Adiciona itensm a GRID_DATA
Main.Grid_Data.AddItem( { “HMGLights”,”http://hmglights.wordpress.com” } )
Main.Grid_Data.AddItem( { “Harbour MiniGUI / HMG Free”,”http://harbourminigui.googlepages.com/” } )
Main.Grid_Data.AddItem( { “HMG Forum”,”http://www.hmgforum.com” } )
Main.Grid_Data.AddItem( { “Harbour Project”,”http://www.harbour-project.org/” } )

Return Nil

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Funcao ativada com o clique sobre o botao BUTTON_SETPRINT
Definir no evento ACTION no OBJECT INSPECTOR aba EVENTS da HMGIDE
*/
Function Main_Button_MemoWrit_Action()
Local cDiretorio, cFile, nPos, nObjetivo, cBuffer, aLinha := {}

// Localiza a AREA DE TRABALHO do seu sistema operacional
cDiretorio := GetDesktopFolder()

// Define um nome para o arquivo a ser gerado
cFile := cDiretorio + “\” + “MEMOWRIT.TXT”

// Define variavel com o numero de itens que se encontra na GRID_DATA
nObjetivo := GetProperty( “Main”,”Grid_Data”,”ItemCount” )

// Limpa a variavel cBUFFER
cBuffer := “”

// Imprime o conteudo da LABEL_TITULO
cBuffer += GetProperty( “Main”,”Label_Titulo”,”Value”) + ENTER

// Imprime o conteudo da LABEL_SUBTITULO
cBuffer += GetProperty( “Main”,”Label_SubTitulo”,”Value” ) + ENTER

// Imprime um traco dentro da variavel cBUFFER
cBuffer += Replicate(“=”,80) + ENTER

// Cria um Loop para passar passar por todos os itens da GRID_DATA
For nPos := 1 To nObjetivo

// Atribui uma variavel matriz com conteudo da linha do componente GRID_DATA
aLinha := GetProperty( “Main”,”Grid_Data”,”Item”, nPos )

// Imprime na variavel cBUFFER
cBuffer += aLinha[1] + ” – ” + aLinha[2] + ENTER

Next

// Imprime um traco dentro da variavel cBUFFER
cBuffer += Replicate(“=”,80) + ENTER

// Imprime quantidade de informacoes listadas
cBuffer += “Foram listados ” + AllTrim( Str( nObjetivo ) ) + ” sites sobre Harbour e HMG.” + ENTER

// Imprime um traco dentro da variavel cBUFFER
cBuffer += Replicate(“=”,80) + ENTER

// Grava a variavel cBUFFER no arquivo MEMOWRIT.TXT
If MemoWrit( cFile, cBuffer )

// Se foi criado mostra essa mensagem
MsgInfo( “Arquivo MEMOWRIT.TXT gerado com sucesso em”+ENTER+ENTER+cFile, “HMGLights” )

Else

// Se nao foi criado mostra essa mensagem
MsgStop( “Ocorreu algum erro ao criar o arquivo MEMOWRIT.TXT em”+ENTER+ENTER+cFile, “HMGLights” )

End

Return Nil

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Fim
*/

Está aplicação é composta de um formulário (FORM), algumas etiquetas de texto

(LABEL), uma grade te dados (GRID) e um botão de ação (BUTTON), o gerador do TXT que é acionado clicando-se no botão de ação, imprime o conteúdo da algumas etiquetas de texto, além da grade de dados, também um traço formado por sinais de iguais utilizando a função REPLICATE e no final exibe a quantidade de dados exibidos no TXT gerado, ampliando a didática deste exemplo para quem esta começando agora, também utilizo a função GETDESKTOPFOLDER para localizar o endereço físico da Área de Trabalho do MS-WIndows e assim gerando o arquivo lá, e fechando assim a mostragem sobre a geração de arquivos TXT.

Abaixo segue uma imagem de como foi gerado o arquivo TXT.

Conteúdo do arquivo MEMOWRIT.TXT

Conteúdo do arquivo MEMOWRIT.TXT

Claro que aqui não finalizamos este assunto, evidente que se você precisa gerar um TXT com uma quantidade muito grande de dados, será melhor gerar através de um DBF exportando seu conteúdo para TXT, mas ai já precisaremos de uma outra publicação para explicar isso para vocês.

Espero que este exemplo sirva para resolver as pequenas necessidades que todos temos em gerar arquivos TXT.

Download do projeto GERATXT.RAR

Gambate!

Enviado em Harbour MiniGUI, Programação | Deixar um comentário »

Sobre o mercado de trabalho

Publicado por Crocciari em 2009 Agosto

Camaradas, este é o primeiro de várias publicações que queremos trazer toda segunda-feira, é um periódico que nos fara um resumo sobre os acontecimentos no universo HMG e também tentaremos falar de algum assunto que se destacou no mundo e que de forma direta ou indireta acaba afetando a nós profissionais de informática.

Distribuição da HMG

Em primeiro lugar vou falar sobre a evolução da distribuição da HMG, Roberto Lopez com a ajuda de diversos amigos da comunidade, tirou diversos erros que estavam na distribuição, as principais alterações estão ligadas ao gerador de relatórios e na documentação que foi revisada e bastante atualizada, a distribuição oficial esta agora na sua versão 2.9.3, realizei diversos testes nesta distribuição e realmente se mostrou completamente estável para desenvolvimento em escala produtiva.

Em seguida falo da evolução da HMGIDE, que em poucos dias ganhou diversas novas versões, isso foi devido à erros que estavam em seu código, erros esses que foram sanados, porém notei que diversas alterações acabaram por colocar falhas, uma delas é o travamento e finalização instantânea da IDE, quando tiramos o foco de um FORM e passamos para algum botão da HMGIDE é possível que está sofra um erro fatal, porém até agora não consegui encontrar um padrão neste problema que não ocorre constantemente, é aleatório. Porém é possível utilizar esta última versão em produção tranquilamente, o que notei foi que agora a HMGIDE esta sofrendo muitas alterações, isso é bom, levando em consideração que ela ficou um tempo sem estas alterações. Agora a HMGIDE esta na sua distribuição versão 2.8.6j.

Até o final desta publicação era assim que se encontrava a distribuição oficial da HMGIDE.

Distribuição do Harbour

Quanto ao projeto Harbour, não encontrei nenhuma nova distribuição, isso se deve a fortíssima estabilidade à qual o compilador se encontra, e após testes, posso afirmar que encontra-se totalmente estável e pronto para desenvolvimento a nível de produção.

Teste da Semana

Esta semana realizei testes da ferramenta xDevStudio v.0.70, a qual promete um ambiente completo para trabalhar com diversos compiladores e bibliotecas, incluindo Harbour e MiniGUI, porém senti grande dificuldade em utiliza-la, acredito que sua característica de ser multi linguagem de programação, acabou por dificulta-la para usuários, e praticamente impossibilitando o uso para usuários inexperientes, então não aconselho à aqueles que estão começando agora e não tem tanto tempo para gastar aprendendo a ferramenta xDevStudio, não da para negar as beleza gráfica do aplicativo, que chega a ser atraente, porém é um pouco difícil para quem esta começando.

O Conteúdo

Quanto ao conteúdo do site, como Editor do blog, não posso negar que estou triste quanto a quantidade de assuntos postados, estão abaixo do volume que desejo ver aqui, porém a qualidade não pode ser negada, e isto pode ser visto no post do amigo Paulo Sérgio, aquele que fala sobre a goiaba com queijo, a dobradinha Firebird e HMG, o post é bem fácil de entender, totalmente didático e praticamente sem segredos para aqueles que querem aprender a usar o SQL junto com a HMG.

Sobre o Mercado Mundial de Programação

O mercado de desenvolvimento de aplicativo enfrenta agora um cenário totalmente novo, muitos não percebem, mas esta acontecendo uma evolução gigantesca em Hardware e Software, os fabricantes de Hardware chegaram a um nível de expansão que tornou-se difícil para eles uma evolução significativa, sendo assim, estão fazendo estudos profundos nos padrões, e isso é bom, pois em breve contaremos com máquinas bastante diferentes dessas que temos hoje, a China é atualmente um país que se prepara para entrar com produtos bem diferenciados, e não vem me dizer que produto chinês não é bom, a culpa é de todo nós, acabamos sem perceber tornando os produtos chineses o padrão mundial de produção, e isso já começou na informática, a China esta investindo muito, e não é a única, países como Japão e América (EUA), fazem o mesmo, a crise existe, mas não vai impedir o progresso tecnológico.

Esse progresso tecnológico se dá por um único motivo, os sistemas operacionais e softwares estão ficando mais pesados, precisam cada dia mais de hardware, antigamente o hardware evoluía e sofware vinha logo atrás, agora mudou, o software vai evoluir cada dia mais, e o hardware precisa correr atrás, isso também é bom. Mas se você pensa que tecnologia de software é trocar o seu MS-Windows por um mais novo, lamento te informar que você anda desatualizado. Tecnologia de software significa hoje em dia, criar aplicativos capazes de facilitar realmente a vida do homem, criar uma comunicação de entrada e saída (interface) que seja intuitiva e fácil para qualquer usuário, significa transparência sem jargões técnicos.

E onde entramos em tudo isso? Essa pergunta nem deveria existir, pois somos analistas, gerentes, programadores no fundo de nossas almas, e somos responsáveis direta e indiretamente por toda esta evolução que acontece, somos células deste grande corpo, mas você que está ai sentado em sua empresa, em seu escritório doméstico, você que desenvolve aplicações para aqueles clientes que tem dois, três funcionários no máximo, mesmo você que tem uma empresa maior e algumas centenas de clientes, não pense que o universo de desenvolvimento é apenas este que vocês atuam, na área financeira, comercial, industrial e administrativa, tem muito mais para os programadores HMG, basta olhar diferente o mercado, vou falar um pouco sobre isso.

Você já deve ter visto, mesmo que apenas em matérias jornalisticas, aquelas fábricas asiáticas enormes, cheias de robôs, pois bem, elas existem, são centenas, milhares delas e não são apenas na Ásia, elas estão na Europa e na América (EUA), e você tem ideia de qual o aplicativo que opera a maioria destes robôs? Te respondo, Clipper com base de dados DBF, espantoso? Eu não acho, temos uma linguagem veloz, simples e de fácil aprendizado, e que formou por mais de uma década um legado de aplicações e profissionais.

E o mercado destes robôs tende a aumentar, a atual crise econômica teve inicio na América, com uma grande desordem no mercado imobiliário, consequentemente atingiu a maior indústria que existe, a indústria automotiva, construir automóveis era algo rentável até um ano atrás, porém de lá para cá tornou-se o pesadelo de milhares de empresários, que veem todos os dias seus negócios ligados à fabricação de peças e suprimentos para os automóveis levando prejuízos constantes, porém um dos maiores deles aqui na Ásia, é o Sr. Fukui Honda, dono da Honda Motors, ele falou ao principal jornal do Japão, o Shimbum Asahi, e nesta entrevista ele disse que esta crise veio para modificar o mercado, e as fábricas estão se modificando na tecnologia automotiva.

Ele não mente, a prova disso se vê nas ruas aqui do Japão, os veículos híbridos que funcionam principalmente com eletricidade estão invadindo as ruas do Japão, e não são carrinhos pequenos não, são carros grandes, são sedans e wagons, os maiores fabricantes destes veículos são Toyota e Honda, seguidos de longe pela Mitsubishi, porém a Honda veem se destacando com sua tecnologia elétricasendo muito mais procurado pelos consumidores, mas continuando, o Mister Honda, diz que a Honda se prepara para lançar comercialmente o robô ASIMO, se você não conhece pesquise na Internet.

ASIMO

Este robô é o grande destaque da Honda neste ano de crise, este robô é mais do que um robô de fábrica, ele é o inicio de uma geração de androides, os robôs agora deixam de engatinhar para começar a andar como os humanos, ASIMO deve chegar as lojas da Honda em menos de trinta anos, serão vendidos como automóveis, pois para o Mister Honda, o conceito de automóvel vai além do conceito que possuímos, para ele o automóvel é uma máquina que se move sozinha e faz coisas úteis para os humanos, então ASIMO é o próximo automóvel da Honda, isso tudo pode não acontecer, ele não seria o primeiro magnata a dizer algo que não acontece, mas acontecendo ou não, o que precisamos ver é que dentro de cada um desses robôs, dentro de cada um desses carros elétricos, existe um software sendo executado, software que requer qualidade, que não pode travar, precisa ser leve, portável, e rápido na execução, com base de dados de acesso simples e que não precise de muitas configurações, vocês já conseguiram ver quem se enquadra bem nestas qualidades? Pois acredite, muitos robôs estão utilizando programas escritos em Harbour. Eu mesmo não acreditava, mas já constatei isso.

Estive certa vez em uma fábrica, e como sou fã da marca YAMAHA, não pude deixar de observar a grande quantidade de robôs desta marca, eles eram rápidos, precisos, e o software? Clipper! Não preciso dizer mais nada.

Independente de tudo isso, cada um de nós tem um papel nestes novos cenários que se levantam, vamos tentar cumprir nossa parte, vamos investir em nós mesmos, na nossa capacidade e qualidade, e não esqueça que sozinho é difícil chegar a algo concreto e rentável, experimentem tipos de associações para seus projetos, eles ficaram mais confiáveis e rentáveis, pense no volume. O futuro lucrativo e rentável se baseia em volume e qualidade.

Até a próxima semana.

Gambate!

Enviado em Editor-Ombudsman | 1 Comentário »

Firebird com HMG

Publicado por Paulo Sérgio D. em 2009 Agosto

Firebird
Olá amigos,

Hoje estamos aqui pra falar sobre como usar o maravilhoso, fantastico e free (he he he) Firebird com a nossa linguagem de programação preferida.

Não vou ficar explicando todos os detalhes, e este post esta muito longe de ser uma referencia completa sobre a dobradinha FireBird e HMG. Desta forma podermos ir diretamente a parte que mais importa, a programação.

Explicando o firebird:
O firebird é um SGBD que utiliza a linguagem SQL para a sua manipulação.
Este foi concebido através do código fonte do antigo Interbase. Hoje o firebird é considerado um excelente SGDB, muito estável, seguro e com o desempenho formidável. Se você procurar no nosso google, irá encontrar milhares de sites dedicados a este SGBD bem como muito material para estudo e otimização do mesmo, além, é claro, de poder contar com muitos livros sobre o assunto.
Visite o site do projeto: FireBird Project

Aproveite a visita ao site e já faça o download e a instalação do server na sua maquina pra testes, ok?!

Vamos agora pra parte divertida.

O Motor ODBC
Primeiramente faça o seguinte, vá até este site: IBPhoenix
Baixe o Driver ODBC para acesso ao firebird, pois sem ele nós não conseguiremos trabalhar. Este driver é gratuito e open-source, assim como o firebird.

Lembre-se disso: Sem o driver ODBC instalado você não conseguirá trabalhar com o firebird. Isso significa que tanto no computador do desenvolvedor quanto no computador do cliente, este driver deve ser (obrigatoriamente) instalado. Pois é ele quem vai fazer o “meio-de-campo” entre sua aplicação HMG com o SGBD. Espero que você tenha entendido a importância deste motor ODBC.

A string de conexão

Bom, já sabemos que o driver ODBC vai fazer a comunicação entre a HMG e o SGBD. Agora temos que procurar a string de conexão para utilizarmos com o motor ODBC.

Vá neste site e guarde a string de conexão referente o motor ODBC da IBPhoenix para o FireBird.  Connection Strings

Ou copie e cole esta aqui, pois vai dar na mesma.

Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey; DbName=localhost:C:\Teste.fdb;

Dissecando a string de conexão

Vamos por partes:

1 – Driver=Firebird/InterBase(r) driver;
Esta parte declara que tipo de driver iremos utilizar para trabalhar com o FireBird. No nosso caso esta parte é padrão e não deve ser modificada.

2 - Uid=SYSDBA;
Esta parte faz menção ao usuário do banco de dados, pois como você verá o firebird também tem funções para controlar acessos por níveis de permições entre usuários e administradores. No nosso caso estamos utilizando o usuário principal que é também o (root) administrador do FireBird. Mas lembre-se que esse é apenas um teste, em linha de produção deveremos sempre usar e abusar das permissões no firebird. Mas isso já é outra história.

3 - Pwd=masterkey;
Esta parte nada mais é do que o complemento da parte numero 2. Ou seja é a senha do usuário “SYSDBA”. Esta senha também é padrão no Firebird. Nem preciso dizer que esta deverá ser modificada em ambiente de produção.

4 - DbName=localhost:C:\Teste.fdb;
Esta parte deve ser bem estudada, pois algum erro aqui resultará numa NÃO conexão com o banco de dados. Esta parte faz referencia ao arquivo de base de dados, ou seja, o local onde o server do firebird encontrará a base de dados com todas nossas tabelas para podermos, assim, manipular as mesmas.  Nesta parte, colocaremos aonde se encontra o arquivo de base de dados alem de referenciar também o ip do server.  Ou seja, devemos colocar o IP do servidor junto com o “PATH” completo do arquivo.

Exemplo de string de conexão com server em windows:
Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey; DbName=localhost:C:\Teste.fdb;

Exemplo de string de conexão com server em linux:
Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey; DbName=192.168.1.25:/opt/database/teste.fdb;

Programação

Toda nossa programação será baseada em Query´s SQL. Isto é, quando se trabalha com SGBD nós não iremos utilizar os comando padrões xBase para manipulação de base de dados (A não ser que você queira utilizar algumas das varias RDD´s externas no mercado para tal fim. Mas isso é assunto para outro post). No meu caso, particularmente falando, eu utilizo o padrão SQL da linguagem e não me prendo a um só SGBD, pois se você construir um software com o padrão SQL você pode mudar de SGBD quando quiser sem maiores problemas.

A tabela

Para esse teste eu utilizei o software IBExpert (também da IBPhoenix) e construí uma pequena tabela de clientes contendo código, nome, endereço, cep, cidade, telefone.

Uma pequena função

Function _Sql_Test()

Local c_String := “Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey; DbName=192.168.1.25:/opt/database/teste.fdb;”

Local oConexion := todbc():new(c_String)

Local c_Msg := “”


oConexion:Setsql(  “SELECT * FROM CLIENTES” )

if !oConexion:Open()

c_Msg := “Não foram encontrado dados com esses requisitos,”+”"+CHR(13)+”";

+”ou a base de dados pode estar fora de alcance.”

MsgStop(c_Msg)

else

for i := 1 to len( oConexion:aRecordset )

oConexion:GoTo(i)

MsgInfo(oConexion:FieldByName( “NOME” ):Value)

next

oConexion:Close()

endif

oConexion:Destroy()

Return Nil

Dissecando a função

Neste passo definimos nossa string de conexão com a base de dados

Local c_String := “Driver=Firebird/InterBase(r) driver;Uid=SYSDBA;Pwd=masterkey; DbName=192.168.1.25:/opt/database/teste.fdb;”

Neste outro, nós criamos o nosso objeto de conexão, utilizando a nossa string de conexão acima.

Local oConexion := todbc():new(c_String)

Aqui começa nossa brincadeira. Como você pode ver neste passo, nós mandamos para o SGBD a nossa QUERY SQL.

È importante frisar que todos os comandos em SQL devem ser passados ao SGBD através desta função chamada SetSql().

oConexion:Setsql(  “SELECT * FROM CLIENTES” )

Agora vamos “testar” se nossa chamada ao banco de dados foi bem sucedida ou não com a função Open(). Esta função retorna verdadeira ou falsa.

Aqui no caso eu fiz mostrar uma mensagem caso a função retorne falsa, caso contrário será apresentado em tela os registros que eu capturei do SGBD em formato de mensagem também.

if !oConexion:Open()

Aqui é o nosso passo principal. Se tudo der certo entre nosso código e o SGBD o nosso objeto de conexão irá conter uma array multidimensional chamada aRecordSet. Nela nós temos todo resultado da nossa requisição ao SGBD. Ou seja, avaliando a QUERY que passei como parâmetro para a função SetSQL() dá pra imaginar que na minha array aRecordSet tenho, agora, todos os registros da Tabela Clientes com todos os campos.

for i := 1 to len( oConexion:aRecordset )

oConexion:GoTo(i)

MsgInfo(oConexion:FieldByName( “NOME” ):Value)

next

Exemplo de como ficaria a array aRecordSet na memória. Aqui vamos considerar que minha tabela clientes tem apenas dois registros.

aRecordSet

{{1,”Paulo Sérgio”,”Rua Limeira”,”13465-000”,”Americana”,”36254578”},;

{2,”Alex Marcones III”,”Rua Ipanema”,”13465-123”,”Americana”,”78945612”}}

Para “passear” por entre os registros retornados de nossa QUERY ao banco de dados, vamos fazer uso de duas funções (também nativas do obejto ODBC do harbour). A GoTo() e a FieldByName().

Agora preste bastante atenção pois vou me empenhar o máximo para lhe explicar de modo prático pra que serve a função GoTo(), ok?! A função GoTo() faz o apontador de registro (por assim dizer) ir para a posição que foi passada por parâmetro a ela. Trocando em miúdos é a mesma coisa da função DBGoTo().

A função FieldByName() retorna o valor do campo que se quer obter. No nosso caso eu quis pegar o valor do campo nome da nossa tabela de clientes.

Feito isso, nós podemos fechar nossa conexão com o SGBD

oConexion:Close()

E em seguida “destruir” o nosso objeto de conexão

oConexion:Destroy()

Finalizando

Como disse no começo dos post esse é apenas uma simples explanação de como se trabalhar com o FireBird e HMG. Confesso que no começo tudo isso foi obscuro e desgastante pra mim. Mas depois que se pega o jeito fica muito divertido e intuitivo. Uma vez que podemos obter a array podemos manipular como bem pretendermos os dados dela contida.

Acima, na nossa QUERY, nós utilizamos o comando SELECT da linguagem sql. Esse é o mais popular e poderoso comando da linguagem, com ele mais a cláusula “WHERE” você poderá construir filtros poderosos e obter dentro da sua array apenas o que for necessário pra você trabalhar. Eu sugiro uma boa pesquisa no google sobre como se trabalhar com SQL, pois assim você verá que isso não é tão difícil como parece e logo você estará escrevendo suas rotinas pra esse tipo de fim.

Abaixo eu deixo algumas querys que eu utilizo para inclusão, e alteração dos dados contidos na minha base dados.

Nesta QUERY eu peço para a função SetSQL() montar minha array aRecordSet apenas com os registros que tenham notas iguais a 10, com o codigo, nome e curso de uma tabela chamada alunos que tem mais de 20 campos e quase mil registros.

oConexion:Setsql( “SELECT CODIGO,NOME,CURSO FROM ALUNOS WHERE NOTAS=10” )

Nesta outra, eu peço para a função SetSQL() alterar um registro da minha tabela ALUNOS. Neste comando eu estou especificando que quero alterar o nome do aluno pelos dados contidos na minha variável c_Nome. A clausula WHERE, aqui, não deixa a alteração ser feita em todos os registro, e sim, apenas no registro que tiver o código igual a minha variável c_COD.

oConexion:Setsql( “UPDATE ALUNOS SET NOME=”+c_Nome+”WHERE CODIGO=”+c_COD )

Espero que este artigo o tenha motivado a trabalhar com SQL e, por favor, esse não tem a pretensão de ser completo (nem pensaria nisso. Rs…). Durante nossa jornada aqui na HMGLights vamos postar muito mais exemplos e artigos de como se trabalhar com SQL juntamente com nossa maravilhosa HMG

Abraços a todos e até o próximo post.

Enviado em Programação | 3 Comentários »