Página 1 de 1

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 11:48
por microvolution
Prezados bom dia!

Migrei do clipper p/harbour usando a HMG 3.0.35.
Minha migração foi ainda em modo console.
Até a versão do Win XP, se a gente pressioniar "Alt+Enter" ele abre nosso programa em tela cheia.
A partir do win Vista (se não me engano) isso foi desabilitado e das versões seguintes também.
Aí encontrei uma rotina (um exemplo bem simples) que permite decidir se aplicamos o nosso aplicativo em modo janela ou tela cheia.

Aí o exemplo que peguei necessita que a gente compile junto uma rotina feita na linguagem C.
Esse arquivo chama-se fullscreen.c

Então, como faço para incluí-lo na compilação? pois já tentei os seguintes métodos e não funciona:
1 - se eu acrescentá-lo no arquivo .HBP quando a gente vai compilar (F5) no HMG ele desaparece.
2 - se eu tentar incluí-lo na seção "INCLUDES" a mesma coisa acontece; aliás, a HMG nem aceita incluí-lo em lugar algum.
3 - tentei então em configurações e incluir na seção "additional LIBs" e lá aceita, só que o aplicativo ao ser compilado ele apresenta uma tela de erro, mas, não aparece nenhuma informação para que a gente possa corrigir.

Portanto, qual o procedimento para se compilar junto com o harbour HMG uma rotina em "C"?
segue cópia do arquivo em "C" (fullscreen.c):

Código: Selecionar todos

/****************************
*
* fullscreen.c
*
* Stanis - stanis.luksys@gmail.com
* Nenhuma licença de uso, faça o que bem entender
*
* JAMAIS utilize fora do modo 25x80
* pode causar danos de HARDWARE
*
*/
#include "windows.h"
#include "hbapi.h"

DISPLAY_DEVICE GetPrimaryDevice()
{
    int index=0;
    DISPLAY_DEVICE dd;
    dd.cb = sizeof(DISPLAY_DEVICE);

    while (EnumDisplayDevices(NULL, index++, &dd, 0))
    {
        if (dd.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) return dd;
    }
    return dd;
}

BOOL SetDisplayResolution(long PelsWidth, long PelsHeight)
{
    DISPLAY_DEVICE dd = GetPrimaryDevice();
    DEVMODE dm;
    dm.dmSize = sizeof(DEVMODE);
    if (!EnumDisplaySettings(dd.DeviceName, ENUM_CURRENT_SETTINGS, &dm))
    {
        return FALSE;
    }

    dm.dmPelsWidth = PelsWidth;
    dm.dmPelsHeight = PelsHeight;
    dm.dmFields = (DM_PELSWIDTH | DM_PELSHEIGHT);
    if (ChangeDisplaySettings(&dm, CDS_TEST) !=DISP_CHANGE_SUCCESSFUL)
    {
        return FALSE;
    }

    return (ChangeDisplaySettings(&dm, CDS_FULLSCREEN)==DISP_CHANGE_SUCCESSFUL);
}

HB_FUNC ( SETDISPLAYMODEFULLSCREEN )
{
	HWND hWnd = FindWindow( NULL, hb_parc( 1 ) );
	SetDisplayResolution( 800, 600 );
	ShowWindow( hWnd, 0 );
	SetWindowLong( hWnd, GWL_STYLE, WS_SYSMENU );
	ShowWindow( hWnd, 3 );
}


HB_FUNC ( SETDISPLAYMODENORMAL )
{
	HWND hWnd = FindWindow( NULL, hb_parc( 1 ) );
	ChangeDisplaySettings(NULL, 0);
	ShowWindow( hWnd, 0 );
	SetWindowLong( hWnd, GWL_STYLE, WS_TILEDWINDOW );
	ShowWindow( hWnd, 1 );
}
segue o arquivo de teste da função (TESTE.PRG):

Código: Selecionar todos

#include "hbgtinfo.ch"

/*
* RECOMENDO SEMPRE UTILIZAR EXIT PROCEDURE
* PARA VOLTAR A MODO NORMAL
*/
INIT PROCEDURE Primeira()
	SetDisplayFullScreen(1)
RETURN
EXIT PROCEDURE Ultima()
	SetDisplayFullScreen(0)
RETURN


/****
* Main()
*/
PROCEDURE Main()
	
	SET COLOR TO "N+/B"
	CLS
	SET CURSOR OFF

	FOR i:=1 TO Int(MaxCol()/10)
		@ MaxRow()-2, i*10 SAY Str(i,1)
	NEXT
	@ MaxRow()-1, 11 SAY Replicate("123456789 ",10)

	FOR i:=1 TO 30
		@ i, 1 SAY StrZero(i,2)
	NEXT

	SET COLOR TO "W+/B,W+/BG"
	
	@ 00, 00 TO MaxRow(), MaxCol()
	@ 00, 00 say "TL"
	@ 00, MaxCol()-1 say "TR"
	@ MaxRow(), 00 say "BL"
	@ MaxRow(), MaxCol()-1 say "BR"
	
	@ 07, 5 SAY PAdC( "Simula‡Æo de Tela Cheia no Windows 7", MaxCol()-10 )
	
	@ 10, 5 SAY PAdC( "Sua resolu‡Æo de tela foi alterada para 800 X 600." , MaxCol()-10 )
	@ 11, 5 SAY PAdC( "Se esta nÆo ‚ a sua resolu‡Æo padrÆo, a configura‡Æo" , MaxCol()-10 )
	@ 12, 5 SAY PAdC( "anterior ser  recarregada automaticamente ao final" , MaxCol()-10 )
	@ 13, 5 SAY PAdC( "da execu‡Æo deste programa." , MaxCol()-10 )
	
	DO WHILE .T. 
		@ 17, 20 PROMPT " TELA CHEIA "
		@ 17, 34 PROMPT " TELA JANELADA "
		@ 17, 52 PROMPT " SAIR "
		MENU TO nMenu
		DO CASE 
			CASE nMenu == 1
				SetDisplayFullScreen(1)
			CASE nMenu == 2
				SetDisplayFullScreen(0)
			OTHERWISE
				EXIT
		ENDCASE
	ENDDO
	
RETURN



/****
* SetDisplayFullScreen()
*/

PROCEDURE SetDisplayFullScreen( nMode )
	LOCAL cScr := savescreen(0,0,maxrow(),maxcol())
	IF nMode == 1
		Hb_GtInfo( HB_GTI_CODEPAGE, 	255 )
		Hb_GtInfo( HB_GTI_FONTNAME, 	"Consolas" )
		Hb_GtInfo( HB_GTI_FONTQUALITY, HB_GTI_FONTQ_HIGH )
		Hb_GtInfo( HB_GTI_FONTWIDTH, 	10 )
		Hb_GtInfo( HB_GTI_FONTSIZE, 24 )
		SetDisplayModeFullScreen( Hb_GtInfo( HB_GTI_WINTITLE ) )
	ELSE
		Hb_GtInfo( HB_GTI_FONTWIDTH, 9 )
		Hb_GtInfo( HB_GTI_FONTSIZE, 20 )
		SetDisplayModeNormal( Hb_GtInfo( HB_GTI_WINTITLE ) )
	ENDIF
	SetMode(25,80)
	restscreen( 0, 0, maxrow(), maxcol(), cScr )
RETURN
segue o exemplo do arquivo HBP (TESTE.HBP) (acontece que dessa forma não aceita na HMG somente em modo console usando o recurso de prompt de comando (CMD.EXE):

Código: Selecionar todos

-oteste

-w0 -es2
-mt

-gtwvw
-gui

teste.prg
fullscreen.c
segue o conteúdo do arquivo ERROR:

Código: Selecionar todos

hbmk2: Processando op‡äes do ambiente: -compiler=mingw
hbmk2: Processando arquivo de configura‡Æo:
       G:\MVinfo\hmg.3.0.35\harbour\bin\hbmk.cfg
hbmk2: Processando: SICCA34.hbc
hbmk2: Processando: SICCA341.hbc
Harbour 2.0.0 (Rev. 13372)
Copyright (c) 1999-2010, http://www.harbour-project.org/
pci10033.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
pci10035.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
pci10126.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
pci10254.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
pci10255.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
pci10256.c:1: fatal error: can't open C:\DOCUME~1\wal\CONFIG~1\Temp\ccFFXjl9.s for writing: Invalid argument
compilation terminated.
hbmk2: Erro: Executando compilador C. 1
gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer  -O3 -Wall -W -IG:/MVinfo/hmg.3.0.35/harbour/include -IG:/MVinfo/hmg.3.0.35//include -IG:/MVinfo/hb32/migrar/sci10000 -IG:/MVinfo/hb32/migrar/sci10000/ pci10000.c dci10000.c dci10001.c dci10002.c ext.c impresso.c pci10001.c pci10002.c pci10003.c pci10004.c pci10005.c pci10006.c pci10007.c pci10008.c pci10009.c pci10012.c pci10013.c pci10014.c pci10015.c pci10016.c pci10017.c pci10018.c pci10019.c pci10020.c pci10021.c pci10022.c pci10024.c pci10025.c pci10026.c pci10027.c pci10028.c pci10031.c pci10032.c pci10033.c pci10034.c pci10035.c pci10038.c pci10039.c pci10040.c pci10041.c pci10042.c pci10043.c pci10044.c pci10045.c pci10046.c pci10047.c pci10100.c pci10102.c pci10110.c pci10115.c pci10116.c pci10120.c pci10121.c pci10122.c pci10123.c pci10124.c pci10125.c pci10126.c pci10127.c pci10130.c pci10131.c pci10132.c pci10133.c pci10135.c pci10136.c pci10140.c pci10151.c pci10152.c pci10200.c pci10202.c pci10203.c pci10204.c pci10210.c pci10211.c pci10212.c pci10213.c pci10215.c pci10216.c pci10217.c pci10220.c pci10221.c pci10222.c pci10225.c pci10226.c pci10227.c pci10228.c pci10229.c pci10230.c pci10231.c pci10240.c pci10250.c pci10251.c pci10252.c pci10254.c pci10255.c pci10256.c pci10260.c pci10270.c pci10271.c pci10272.c pci10273.c pci10995.c pci10996.c pci10997.c pci10998.c pci10999.c pimpr105.c pimpr110.c pimpr115.c pimpr120.c pimpr121.c pimpr125.c pimpr130.c rci10000.c rimpr000.c rotinas5.c C:\DOCUME~1\wal\CONFIG~1\Temp\hbmk_4n84mz.c

Agradeço se alguém souber a resolução do problema.

Atenciosamente,
MICROVOLUTION.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 13:17
por alxsts
Olá!

É necessário utilizar diretivas do pré processador:

Código: Selecionar todos

Function Main()

   //...
   //... Código Harbour
   //...

Return NIL

//-----------------------------

#pragma BEGINDUMP

   //...
   //... Código C
   //...

#pragma ENDDUMP
Cole a sua função C dentro das diretivas #pragma BEGINDUMP ... #pragma ENDDUMP dentro do teu PRG principal.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 14:34
por microvolution
Bom, fiz as alterações que me foram solicitadas... copiando todo o conteúdo do arquivo FULLSCREEN.C para dentro do meu MAIN.PRG (após o RETURN NIL) e não deu certo.

Vejam a mensagem de erro:

Código: Selecionar todos

hbmk2: Processando op‡äes do ambiente: -compiler=mingw
hbmk2: Processando arquivo de configura‡Æo:
       G:\MVinfo\hmg.3.0.35\harbour\bin\hbmk.cfg
hbmk2: Processando: SICCA34.hbc
hbmk2: Processando: SICCA341.hbc
hbmk2: Harbour: Compilando m¢dulos...
Harbour 2.0.0 (Rev. 13372)
Copyright (c) 1999-2010, http://www.harbour-project.org/
hbmk2: Compilando...
hbmk2: Linkando... SICCA341.exe
g:/mvinfo/hmg.3.0.35/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../../mingw32/bin/ld.exe: cannot find -lfullscreen
collect2: ld returned 1 exit status
hbmk2: Erro: Executando linkeditor. 1
gcc.exe .hbmk\win\mingw\pci10000.o .hbmk\win\mingw\dci10000.o .hbmk\win\mingw\dci10001.o .hbmk\win\mingw\dci10002.o .hbmk\win\mingw\ext.o .hbmk\win\mingw\impresso.o .hbmk\win\mingw\pci10001.o .hbmk\win\mingw\pci10002.o .hbmk\win\mingw\pci10003.o .hbmk\win\mingw\pci10004.o .hbmk\win\mingw\pci10005.o .hbmk\win\mingw\pci10006.o .hbmk\win\mingw\pci10007.o .hbmk\win\mingw\pci10008.o .hbmk\win\mingw\pci10009.o .hbmk\win\mingw\pci10012.o .hbmk\win\mingw\pci10013.o .hbmk\win\mingw\pci10014.o .hbmk\win\mingw\pci10015.o .hbmk\win\mingw\pci10016.o .hbmk\win\mingw\pci10017.o .hbmk\win\mingw\pci10018.o .hbmk\win\mingw\pci10019.o .hbmk\win\mingw\pci10020.o .hbmk\win\mingw\pci10021.o .hbmk\win\mingw\pci10022.o .hbmk\win\mingw\pci10024.o .hbmk\win\mingw\pci10025.o .hbmk\win\mingw\pci10026.o .hbmk\win\mingw\pci10027.o .hbmk\win\mingw\pci10028.o .hbmk\win\mingw\pci10031.o .hbmk\win\mingw\pci10032.o .hbmk\win\mingw\pci10033.o .hbmk\win\mingw\pci10034.o .hbmk\win\mingw\pci10035.o .hbmk\win\mingw\pci10038.o .hbmk\win\mingw\pci10039.o .hbmk\win\mingw\pci10040.o .hbmk\win\mingw\pci10041.o .hbmk\win\mingw\pci10042.o .hbmk\win\mingw\pci10043.o .hbmk\win\mingw\pci10044.o .hbmk\win\mingw\pci10045.o .hbmk\win\mingw\pci10046.o .hbmk\win\mingw\pci10047.o .hbmk\win\mingw\pci10100.o .hbmk\win\mingw\pci10102.o .hbmk\win\mingw\pci10110.o .hbmk\win\mingw\pci10115.o .hbmk\win\mingw\pci10116.o .hbmk\win\mingw\pci10120.o .hbmk\win\mingw\pci10121.o .hbmk\win\mingw\pci10122.o .hbmk\win\mingw\pci10123.o .hbmk\win\mingw\pci10124.o .hbmk\win\mingw\pci10125.o .hbmk\win\mingw\pci10126.o .hbmk\win\mingw\pci10127.o .hbmk\win\mingw\pci10130.o .hbmk\win\mingw\pci10131.o .hbmk\win\mingw\pci10132.o .hbmk\win\mingw\pci10133.o .hbmk\win\mingw\pci10135.o .hbmk\win\mingw\pci10136.o .hbmk\win\mingw\pci10140.o .hbmk\win\mingw\pci10151.o .hbmk\win\mingw\pci10152.o .hbmk\win\mingw\pci10200.o .hbmk\win\mingw\pci10202.o .hbmk\win\mingw\pci10203.o .hbmk\win\mingw\pci10204.o .hbmk\win\mingw\pci10210.o .hbmk\win\mingw\pci10211.o .hbmk\win\mingw\pci10212.o .hbmk\win\mingw\pci10213.o .hbmk\win\mingw\pci10215.o .hbmk\win\mingw\pci10216.o .hbmk\win\mingw\pci10217.o .hbmk\win\mingw\pci10220.o .hbmk\win\mingw\pci10221.o .hbmk\win\mingw\pci10222.o .hbmk\win\mingw\pci10225.o .hbmk\win\mingw\pci10226.o .hbmk\win\mingw\pci10227.o .hbmk\win\mingw\pci10228.o .hbmk\win\mingw\pci10229.o .hbmk\win\mingw\pci10230.o .hbmk\win\mingw\pci10231.o .hbmk\win\mingw\pci10240.o .hbmk\win\mingw\pci10250.o .hbmk\win\mingw\pci10251.o .hbmk\win\mingw\pci10252.o .hbmk\win\mingw\pci10254.o .hbmk\win\mingw\pci10255.o .hbmk\win\mingw\pci10256.o .hbmk\win\mingw\pci10260.o .hbmk\win\mingw\pci10270.o .hbmk\win\mingw\pci10271.o .hbmk\win\mingw\pci10272.o .hbmk\win\mingw\pci10273.o .hbmk\win\mingw\pci10995.o .hbmk\win\mingw\pci10996.o .hbmk\win\mingw\pci10997.o .hbmk\win\mingw\pci10998.o .hbmk\win\mingw\pci10999.o .hbmk\win\mingw\pimpr105.o .hbmk\win\mingw\pimpr110.o .hbmk\win\mingw\pimpr115.o .hbmk\win\mingw\pimpr120.o .hbmk\win\mingw\pimpr121.o .hbmk\win\mingw\pimpr125.o .hbmk\win\mingw\pimpr130.o .hbmk\win\mingw\rci10000.o .hbmk\win\mingw\rimpr000.o .hbmk\win\mingw\rotinas5.o _temp.o    -mconsole -Wl,--start-group -lgtwvg -lfullscreen -lhmg -lhbmysql -lmysql -lcrypt -ledit -leditex -lgraph -lini -lreport -lhbwin -lhbziparc -lhbmzip -lmsvfw32 -lvfw32 -lsddodbc -lrddsql -lsddmy -lhbodbc -lodbc32 -lhbhpdf -lhbvpdf -lhbmemio -lhbsqlit3 -lsqlite3 -lhbfimage -lhbpgsql -lpq -lhbtip -lhbct -lhbmisc -lhbnetio -lxhb -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib  -Wl,--end-group -oSICCA341.exe -LG:/MVinfo/hmg.3.0.35/harbour/lib -LG:/MVinfo/hmg.3.0.35//lib -LG:/MVinfo/hb32/migrar/sci10000/
Aguardo mais informações.

Grato,
MICROVOLUTION

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 15:13
por alxsts
Olá!
microvolution escreveu:g:/mvinfo/hmg.3.0.35/mingw/bin/../lib/gcc/mingw32/4.4.1/../../../../mingw32/bin/ld.exe: cannot find -lfullscreen
Em algum lugar o linker está sendo orientado a usar a lib fullscreen, que não existe. Remova esta referência do teu arquivo .Hbp. Também não é necessário colocar fullscreen.c no .Hbp. Se os problema persistirem, poste o conteúdo do .Hbp.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 15:17
por microvolution
millllllll perdões....
está correto (por enquanto compilou), eu esqueci de retirar da guia CONFIGURAÇÃO de dentro do ADDITIONAL LIBS o "fullscreen.c".

Mais uma vez, mil perdões.

Agora compilou... só o resultado não foi o esperado, mas, está correto.


Bom, já que deu certo, preciso saber:

Para cada arquivo em "C" eu acrescento as linhas dessa forma:

Código: Selecionar todos

#pragma BEGINDUMP
	   //...
	   //... Código C (função 1)
	   //...
#pragma ENDDUMP

Código: Selecionar todos

#pragma BEGINDUMP
	   //...
	   //... Código C (função 2)
	   //...
#pragma ENDDUMP
OU FAÇO TUDO NUM SÓ, como no exemplo abaixo:

Código: Selecionar todos

#pragma BEGINDUMP
	   //...
	   //... Código C (função 1)
	   //...
	   //...
	   //... Código C (função 2)
	   //...
	   //...
	   //... Código C (função 3)
	   //...
#pragma ENDDUMP
Grato,
MICROVOLUTION.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 15:32
por alxsts
Olá!

Pode colocar tudo junto entre um par de diretivas. Só não pode ter duas funções em C com nomes iguais.

Quanto ao efeito, sinto muito. Isto deve ser um código antigo e dependente de hardware.

Se eu fosse você,não perderia muito tempo com isto. Invista este tempo estudando uma biblioteca gráfica, para mudar o visual do teu sistema. Já que está compilando com HMG, altere suas telas através dela.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 15:44
por microvolution
Assunto: compilar rotinas .C junto com HMG 3.0.35
alxsts escreveu:Olá!
Se eu fosse você,não perderia muito tempo com isto. Invista este tempo estudando uma biblioteca gráfica, para mudar o visual do teu sistema. Já que está compilando com HMG, altere suas telas através dela.
Ah sim... obrigado pela sugestão... quero muito isso!!!

você pode me mandar algum material para que eu possa tomar como exemplo?

1- Estou precisando fazer isso, pois no Object Pascal (delphi versão XE3 que tenho) consigo fazer os formulários...
mas nesse novo formato do clipper que agora é harbour, que inclusive acabei de aprender um pouco com você que posso colocar rotinas em "C" dentro do clipper... que legal.

2 - Outra coisa, preciso fazer com que os meus DBFs/NTXs sejam acessados pelo DELPHI, pois estou pensando em desenvolver um FRENTE DE LOJA/CAIXA no delphi que já domino mas, o problema é que o DELPHI lê DBF/CDX.

O que você me sugere nesse caso?

Grato,
MICROVOLUTION.
PS: cópia MP.

compilar rotinas .C junto com HMG 3.0.35

Enviado: 28 Abr 2015 23:49
por alxsts
Olá!
microvolution escreveu:você pode me mandar algum material para que eu possa tomar como exemplo?
Materiais sobre Harbour e suas bibliotecas são, em geral, escassos. Não sou a melhor pessoa para te orientar sobre HMG mas, creio que as melhores fontes de informação, atualmente, sejam a pasta de exemplos que acompanha o produto (no caso da versão 3.0.35, <Drive>:\HMG.3.0.35\SAMPLES) e o HMG Forum, agora com novo visual, muito bom, por sinal.
microvolution escreveu:1- Estou precisando fazer isso, pois no Object Pascal (delphi versão XE3 que tenho) consigo fazer os formulários...
Com HMG você conseguirá desenhar os forms. Claro que não se compara à IDE do Delphi, que não conheço mas tenho excelentes referências. Existem outras opções que podem ser usadas com Harbour, tais como HwGUI, a biblioteca do Marcos Gambeta e a HbQT. Pessoalmente prefiro estas duas últimas pois gosto de notação OOP e elas facilitam isto. Penso que com Qt, o Harbour ganha muitos recursos que não existem nas outras, incluindo a utilização de CSS (Cascading Style Sheets) e classes para interação com sistemas gerenciadores de bancos de dados relacionais que são multiplataforma (como a própria Qt). No Harbour, por padrão, temos na HbWin, as classes para fazer isto através de ADO. Mas, funciona apenas no Windows. Já com a Qt, funciona até em mobile...
microvolution escreveu:2 - Outra coisa, preciso fazer com que os meus DBFs/NTXs sejam acessados pelo DELPHI, pois estou pensando em desenvolver um FRENTE DE LOJA/CAIXA no delphi que já domino mas, o problema é que o DELPHI lê DBF/CDX.
Sinceramente, se fosse eu, faria tudo em Delphi (aí você escolhe o banco de dados, mas não DBFCDX) ou tudo em Harbour, com HbQt e MariaDB. Buscando no Google, é possível encontrar pelo menos uma ferramenta gratuita para acessar CDX (arquivos do FoxPro) atrvés do Delphi. O bom de tudo isto, é que com Harbour, você poderá mesclar o uso de DBFCDX com banco relacional a qualquer momento. O DBFCDX mais recente está cada vez melhor, com campos datetime, timestamp, autoincrement, etc... além disto você pode criar tabelas e índices na memória...