Oi Josivan,
Você tem sorte de termos um tempinho e paciência. Não falo porque você não tem experiência. Mas queira entender, que a lógica que você empregou estava muito complicada. Eu fiz ao meu jeito e com certeza cada um tem o seu. O importante é você entender que o processamento de banco de dados, isso não muda em absolutamente nada, ao contrário, você em Harbour tem mais opções como de escolher diferentes tipos de banco de dados, diferentes drivers, e outras funções que antes tÃnhamos com o Clipper na biblioteca externa da CT. Mas o que tem de diferente, é apenas a interface com o usuário que em modo gráfico o programador precisa tratar de forma diferente que era em modo console, mas isso se dá pela biblioteca gráfica e não pelo Harbour. Por isso que estranhei a sua expressão "que não consiga gravar no dbf". Isso soa um tanto absurdo (desculpe a minha sinceridade). Eu não quis explicar esse motivo, porque como vi que você estava ansioso, frustrado e até com uma certa irritação pelo que eu tinha falado, deixei de lado para não virar nada pessoal. Agora você entende ? O seu problema não era gravar no dbf como você o colocou. E sim a obtenção do resultado correto da interface com relação com o que você tem gravado no dbf. Expressar-se mal, dá lugar a maus entendimentos e muita perda de tempo também.
Eu mudei muita coisa no seu código, inclusive você não precisará ter arquivo de Ãndice. Também coloquei os LABELs onde correspondem, dentro da criação do Window MAIN. E apanhei os dados em forma de vetores tridimensional, isso facilitou. Removi varias variáveis desnecessárias e com respeito a cores eu deixei como CONSTANTES. Mudei a cor da fonte para branca quando tiver fundo preto. Criei uma função Ver_Cor(cSit) que serve para vários propositos, uma de Saida para fechar o arquivo dbf adequadamente, disponibilizei em forma de DO CASE para poder tratar cada SITuação, seja com mensagem ou adicionar rotinas especificas e disponibilizei uma função DebugMSG que serve para listar o conteúdo seja de variaveis como de vetores independente do tipo que forem.
Bom aqui segue o meu código, depois que terminei, vi que o Toledo tinha apresentado a sua solução. Acho que o importante é que você APRENDA não simplesmente que resolva a sua questão em si. Estude muito, utilize sempre uma bom alinhamento e seja claro no seu código (não abrevie nada), você tem um longo caminho. Tente manter o padrão Windows, não seja tão radical com as cores e não tente adaptar nada de telas como você fazia com o Clipper. Programação GUI é vida NOVA !
#include <hmg.ch>
// # include 'minigui.ch'
#define _verde_1 {094,255,094}
#define _branco {255,255,255}
#define _preto {000,000,000}
#define _vermelho {190,000,000}
#define _amarelo {255,255,128}
Function Main()
Local cButton
Local aRegistro
Set delete on
aRegistro:=Le_Sit()
// DebugMSG(aRegistro)
define window Form_1 ;
at 0,0;
width 520;
height 140;
NOSIZE ;
ON RELEASE Saida() ;
NOMAXIMIZE ;
Title "Titulo do programa" ;
main
col := 10
lin := 10
For i= 1 to 17
cButton := "Apto_"+AllTrim(Str(i))
@ lin, col label &cButton ;
parent Form_1;
width 40;
height 20;
value ltrim(aRegistro[i,1]) ;
tooltip 'A Suite Esta '+aRegistro[i,1] + aRegistro[i,2];
border;
font 'verdana' size 8 bold;
action {|| clicou (this.name)};
fontcolor (If(aRegistro[i,2]="IT",_branco,_preto)) ;
backcolor aRegistro[i,3] ;
centeralign
col += 50
if col>500
col:= 10
lin += 40
endif
Next
end window
Form_1.Center
Form_1.Activate
Return Nil
Function Le_Sit()
Local aTemp:={}
Select 1
use aptos
do while (!EOF())
AAdd(aTemp,{ltrim(apt),sit,Ver_Cor(1->Sit)})
skip
enddo
Return aTemp
Function Clicou (cApto)
Local nRec:=Val(CharRem("Apto_",cApto))
Sele 1
Goto nRec
Do Case
Case Upper(1->Sit) == "LI"
If msgyesno('deseja mudar a situaçao?','Apto: '+Apt+' Sit: '+Sit)
Replace sit with "OC"
SetProperty("Form_1","Apto_"+AllTrim(Str(nRec)),"BackColor",Ver_Cor(1->Sit))
SetProperty("Form_1","Apto_"+AllTrim(Str(nRec)),"FontColor",(If(1->Sit="IT",_branco,_preto)))
Endif
/*
Case Upper(1->Sit) == "OC"
Case Upper(1->Sit) == "CL" .OR. Upper(1->Sit) == "AR"
Case Upper(1->Sit) == "IT"
Case Upper(1->Sit) == "EC"
*/
OtherWise
MsgStop("Nao pode reservar !")
EndCase
Return Nil
Function Saida()
Close 1
Return Nil
Function Ver_Cor(cSit)
Local aRet
do case
case cSit =="LI"
aRet := _verde_1
case cSit== "OC"
aRet := _vermelho
case cSit == "CL" .or. cSit =="AR"
aRet := _branco
case cSit== "IT"
aRet := _preto
case cSit== "EC"
aRet := _amarelo
otherwise
aRet := _amarelo
endcase
Return aRet
Function DebugMSG
Local i, aTemp := {}
For i := 1 to pcount()
aadd( aTemp, hb_PValue(i))
Next i
MsgBox(hb_valtoexp(aTemp), "Helpful informations")
Return Nil
Eu coloquei HMG porque uso essa ferramenta, mas serve para a Minigui Extended também.
Espero que você goste. Boa sorte no seu aprendizado. Mas faça o que recomendo sempre: compile e estude cada exemplo que vem na Minigui ou na HMG na pasta SAMPLES !!!!