Este exemplo foi tirado da lista da Minigui Brasil, os créditos constam no fonte...
Com ele vc inclui exclui altera....
Está feito com a minigui, mas nada impede de ser usado numa aplicação console.
/*
* Agenda de Contatos (2)
* Humberto Fornazier - Março/2003
*
hfornazier@brfree.com.br
*
* xHarbour Compiler Build 0.73.26 (SimpLex )
* Copyright 1999-2002,
http://www.xharbour.org http://www.harbour-project.org/
*
* MINIGUI - Harbour Win32 GUI library - Release 60
* Copyright 2002 Roberto Lopez <
roblez@ciudad.com.ar>
*
http://www.geocities.com/harbour_minigui/
*
*/
/*
Conversao para utilizacao de banco de dados,utilizando a tecnologia ADO
ivanil Marcelino
ivanilm@ig.com.br
Minigui x Xharbour
*/
#Include "minigui.ch"
#Include "winprint.ch"
#define BLUE { 0, 0, 128 }
Function Main()
Local i := 0
****Criar a Conexao
Public CNN
Try
CNN:=CreateObject("ADODB.Connection")
CNN:Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Agenda.mdb")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
ExitProcess(0)
End
****
SET CENTURY ON
Private lNovo := .F.
DEFINE WINDOW Form_1 ;
AT 0,0 ;
WIDTH 450 ;
HEIGHT 470 ;
TITLE "Agenda de Contatos";
MAIN ;
ICON "AGENDA" ;
NOMAXIMIZE ;
NOSIZE ;
ON RELEASE Finaliza_Sistema() ;
BACKCOLOR BLUE
@ 010,415 Grid GIndice Of Form_1 WIDTH 20 HEIGHT 360 HEADERS {""} WIDTHS { 16 } ;
FONT "Arial" SIZE 07.5 ;
TOOLTIP "Click na Letra Desejada" ;
ON DBLCLICK Pesquisa_Agenda()
@ 010,010 GRID Grid_Agenda ;
WIDTH 398 ;
HEIGHT 360 ;
HEADERS {"Código","Nome"} ;
WIDTHS {53,324} ;
FONT "Arial" SIZE 09 ;
ON DBLCLICK Novo_Registro(.F.)
@ 385,010 BUTTON Btn_Novo Of Form_1 ;
CAPTION '&Novo' ;
ACTION Novo_Registro(.T.) ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Novo Registro" ;
FLAT
@ 385,165 BUTTON Btn_Imprimir Of Form_1 ;
CAPTION '&Imprimir' ;
ACTION Imprimir() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Imprime Contatos" ;
FLAT
@ 385,318 BUTTON Btn_Sair Of Form_1 ;
CAPTION '&Sair' ;
ACTION Form_1.Release ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Finalizar Sistema" ;
FLAT
@415,18 ANIMATEBOX mensagem ;
WIDTH 360 ;
HEIGHT 20 ;
FILE 'MSG02' AUTOPLAY
END WINDOW
For i := 1 To 26
ADD ITEM { CHR(i+64) } TO GIndice OF Form_1
Next
MODIFY CONTROL GIndice OF Form_1 VALUE 1
Pesquisa_Agenda()
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
Return
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Pesquisa_Agenda()
Local oCursor,cPesq
cPesq:=ValorDaColuna("GIndice","Form_1",1)
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
cPesq := IIf( Empty(cPesq), "A" , cPesq )
oCursor:Open("Select * from agenda where nome like '"+cPesq+"%'"+" order by nome",CNN,2,3)
DELETE ITEM ALL FROM Grid_Agenda OF Form_1
Do While ! oCursor:Eof()
ADD ITEM {oCursor:Fields["Codigo"]:Value,oCursor:Fields["Nome"]:Value} TO Grid_Agenda OF Form_1
oCursor:MoveNext()
EndDo
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Novo_Registro( lNovo_Registro )
Local cCodigo := ""
Local cNome := ""
Local cEndereco := ""
Local cBairro := ""
Local cCep := ""
Local cCidade := ""
Local cEstado := ""
Local cFone1 := ""
Local cFone2 := ""
Local cEmail := ""
Local oCursor
cCodigo := ValorDaColuna( "Grid_Agenda" , "Form_1" , 1 )
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
Form_1.Btn_Novo.Enabled := .F.
Form_1.Btn_Sair.Enabled := .F.
lNovo := lNovo_Registro
If ! lNovo
oCursor:Open("Select * from agenda where codigo='"+cCodigo+"'",CNN,2,3)
if oCursor:Eof()
Release Window ALL
Return
endif
cNome := oCursor:Fields["Nome"]:value
cEndereco := oCursor:Fields["Endereco"]:Value
cBairro := oCursor:Fields["Bairro"]:value
cCep := oCursor:Fields["Cep"]:value
cCidade := oCursor:Fields["Cidade"]:value
cEstado := oCursor:Fields["Estado"]:value
cFone1 := oCursor:Fields["Fone1"]:value
cFone2 := oCursor:Fields["Fone2"]:value
cEmail := oCursor:Fields["EMail"]:value
EndIf
DECLARE WINDOW FORM_1
DECLARE WINDOW FORM_2
DEFINE WINDOW Form_2 ;
AT 0,0 ;
WIDTH 490 ;
HEIGHT 300 ;
TITLE "Agenda de Contatos - "+Iif( lNovo , "Novo Registro" , "Alterando Registro");
ICON "AGENDA" ;
MODAL ;
NOSIZE ;
ON RELEASE {|| Form_1.Btn_Novo.Enabled := .T. , Form_1.Btn_Sair.Enabled := .T. , Form_2.Btn_Excluir.Enabled := .T. , Pesquisa_Agenda() , Form_1.Grid_Agenda.SetFocus() } ;
BACKCOLOR WHITE
@ 10,10 LABEL Label_Codigo ;
VALUE 'Código' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 40,10 LABEL Label_Nome ;
VALUE 'Nome' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 70,10 LABEL Label_Endereco ;
VALUE 'Endereço' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,10 LABEL Label_Bairro ;
VALUE 'Bairro' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@100,360 LABEL Label_Cep ;
VALUE 'Cep' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,10 LABEL Label_Cidade ;
VALUE 'Cidade' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@130,345 LABEL Label_Estado ;
VALUE 'Estado' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,10 LABEL Label_Fone1 ;
VALUE 'Fone 1' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@160,346 LABEL Label_Fone2 ;
VALUE 'Fone 2' ;
WIDTH 80 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@190,10 LABEL Label_Email ;
VALUE 'e-mail' ;
WIDTH 140 ;
HEIGHT 30 ;
FONT 'Arial' SIZE 09 ;
BACKCOLOR WHITE ;
FONTCOLOR BLUE BOLD
@ 13,70 TEXTBOX T_Codigo ;
WIDTH 40 ;
VALUE cCodigo ;
TOOLTIP 'Código do Contato'
@ 43,70 TEXTBOX T_Nome ;
OF Form_2 ;
WIDTH 400 ;
VALUE cNome ;
TOOLTIP 'Nome do Contato' ;
MAXLENGTH 40 ;
UPPERCASE ;
ON ENTER Iif( ! Empty( Form_2.T_Nome.Value ) , Form_2.T_Endereco.SetFocus , Form_2.T_Nome.SetFocus )
@ 73,70 TEXTBOX T_Endereco ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEndereco ;
TOOLTIP 'Endereço do Contato';
MAXLENGTH 40 ;
UPPERCASE ;
ON GOTFOCUS Form_2.Btn_Salvar.Enabled := .T. ;
ON ENTER Form_2.T_Bairro.SetFocus
@103,70 TEXTBOX T_Bairro ;
OF Form_2 ;
WIDTH 250 ;
VALUE cBairro ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Cep.SetFocus
@103,390 TEXTBOX T_Cep ;
OF Form_2 ;
WIDTH 80 ;
VALUE cCep ;
TOOLTIP 'Cep do Contato' ;
MAXLENGTH 08 ;
UPPERCASE ;
ON ENTER Form_2.T_Cidade.SetFocus
@133,70 TEXTBOX T_Cidade ;
OF Form_2 ;
WIDTH 250 ;
VALUE cCidade ;
TOOLTIP 'Bairro do Contato' ;
MAXLENGTH 25 ;
UPPERCASE ;
ON ENTER Form_2.T_Estado.SetFocus
@133,390 TEXTBOX T_Estado ;
OF Form_2 ;
WIDTH 30 ;
VALUE cEstado ;
TOOLTIP 'Estado do Contato';
MAXLENGTH 02 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone1.SetFocus
@163,70 TEXTBOX T_Fone1 ;
OF Form_2 ;
WIDTH 110 ;
VALUE cFone1 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Fone2.SetFocus
@163,390 TEXTBOX T_Fone2 ;
OF Form_2 ;
WIDTH 80 ;
VALUE cFone2 ;
TOOLTIP 'Telefone do Contato';
MAXLENGTH 10 ;
UPPERCASE ;
ON ENTER Form_2.T_Email.SetFocus
@193,70 TEXTBOX T_Email ;
OF Form_2 ;
WIDTH 400 ;
VALUE cEmail ;
TOOLTIP 'E-mail do Contato' ;
MAXLENGTH 40 ;
LOWERCASE ;
ON ENTER Form_2.Btn_Salvar.SetFocus
@ 232,70 BUTTON Btn_Salvar Of Form_2 ;
CAPTION '&Salvar' ;
ACTION Salvar_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Salvar Registro" ;
FLAT
@ 232,210 BUTTON Btn_Excluir Of Form_2 ;
CAPTION '&Deletar' ;
ACTION Excluir_Registro() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Excluir Registro" ;
FLAT
@ 232,346 BUTTON Btn_Cancelar Of Form_2 ;
CAPTION '&Cancelar' ;
ACTION Sair_do_Form2() ;
WIDTH 120 HEIGHT 27 ;
FONT "Arial" SIZE 09 ;
TOOLTIP "Cancelar Operação" ;
FLAT
END WINDOW
Form_2.T_Codigo.Enabled := .F.
If lNovo
Form_2.Btn_Salvar.Enabled := .F.
Form_2.Btn_Excluir.Enabled := .F.
EndIf
CENTER WINDOW Form_2
ACTIVATE WINDOW Form_2
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Salvar_Registro()
Local ProximoCodigo := "",oCursor,cSQL
Local cCodigo := ""
If Empty( Form_2.T_Nome.Value )
MsgINFO( "Nome não foi Informado!!" , "Agenda" )
Form_2.T_Nome.SetFocus
Return Nil
EndIf
If lNovo
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
oCursor:Open("Select top 1 Codigo from agenda order by codigo desc",CNN,2,3)
if oCursor:Eof()
ProximoCodigo:="0001"
else
ProximoCodigo := StrZero( Val( oCursor:Fields["Codigo"]:Value) + 1 , 4 )
endif
cSql:="INSERT INTO AGENDA (Codigo,Nome,Endereco,Bairro,Cep,Cidade,Estado,Fone1,Fone2,EMail) VALUES ('"
cSql+=ProximoCodigo +"','"
cSql+=Form_2.T_Nome.Value +"','"
cSql+=Form_2.T_Endereco.Value +"','"
cSql+=Form_2.T_Bairro.Value +"','"
cSql+=Form_2.T_Cep.Value +"','"
cSql+=Form_2.T_Cidade.Value +"','"
cSql+=Form_2.T_Estado.Value +"','"
cSql+=Form_2.T_Fone1.Value +"','"
cSql+=Form_2.T_Fone2.Value +"','"
cSql+=Form_2.T_Email.Value +"')"
Else
cSql:="UPDATE AGENDA SET "
cSql+="Nome='"+Form_2.T_Nome.Value +"',"
cSql+="Endereco='"+Form_2.T_Endereco.Value +"',"
cSql+="Bairro='"+Form_2.T_Bairro.Value +"',"
cSql+="CEP='"+Form_2.T_Cep.Value +"',"
cSql+="Cidade='"+Form_2.T_Cidade.Value +"',"
cSql+="Estado='"+Form_2.T_Estado.Value +"',"
cSql+="Fone1='"+Form_2.T_Fone1.Value +"',"
cSql+="Fone2='"+Form_2.T_Fone2.Value +"',"
cSql+="Email='"+Form_2.T_Email.Value +"'"
cSql+= " Where codigo='"+Form_2.T_Codigo.Value+"'"
Endif
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
MsgInfo( "Registo "+Iif( lNovo , "Incluído" ,"Alterado!!" ) )
PosicionaIndice( Left(Form_2.T_Nome.Value,1) )
Pesquisa_Agenda()
Form_2.Release
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Sair_do_Form2()
Form_1.Btn_Novo.Enabled := .T.
Form_1.Btn_Sair.Enabled := .T.
Form_2.Btn_Excluir.Enabled := .T.
Form_2.Release
Pesquisa_Agenda()
Form_1.Grid_Agenda.SetFocus()
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Excluir_Registro()
Local cCodigo:=Form_2.T_Codigo.Value,cSql
If MsgOkCancel ("Confirma Exclusão do Registro??", "Excluir "+cCodigo)
cSql:="DELETE FROM AGENDA WHERE CODIGO='"+cCodigo+"'"
Try
CNN:Execute(cSQL)
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+chr(10)+vMat(e:Args))
Return
end
EndIf
Form_1.Grid_Agenda.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Finaliza_Sistema()
Return .t.
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ValorDaColuna( ControlName, ParentForm , nCol )
Local aRet := {}
If GetControlType (ControlName,ParentForm) != "GRID"
MsgBox( "Objeto não é um Grid!!")
Return( aRet )
EndIf
nCol := Iif( nCol == Nil .Or. nCol == 0 , 1 , nCol )
aRet := GetProperty ( ParentForm , ControlName , 'Item' , GetProperty( ParentForm , ControlName , 'Value' ) )
Return( aRet[ nCol ] )
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function PosicionaIndice(cLetra)
Local i := 0
For i := 1 To 26
If CHR(i+64) == cLetra
MODIFY CONTROL GIndice OF Form_1 VALUE i
EndIf
Next
Form_1.GIndice.SetFocus
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function Imprimir()
Local nLinha:=i:=nReg:=0,cLetra:="",oCursor,Handle,cLinha,Cr:=Chr(13)+chr(10)
Private nFont := 11
Private cArquivo := ""
Try
oCursor:=CreateObject("ADODB.Recordset")
Catch e
MsgStop("Operation: "+E:operation+"-"+"Description: "+E:Description+cr+vMat(e:Args))
Return
end
Handle:=fCreate("Rel.tmp")
if Handle<=0
Return
endif
cLetra := ValorDaColuna( "GIndice" , "Form_1" , 1 )
oCursor:Open("Select * from agenda where nome like '"+cLetra+"%'"+" order by nome",CNN,2,3)
Do While ! oCursor:Eof()
If nLinha == 0.or.nLinha>55
cLinha := PadC(" Agenda de Contatos",78)+Cr
cLinha += PadC("Contatos Cadastrados com letra "+cLetra,78)+Cr
cLinha += "Código Nome"+Cr
cLinha += Replicate("-",78)+cr
Fwrite(Handle,cLinha)
nLinha:=5
EndIf
nLinha += 1
nReg += 1
Fwrite(Handle," "+oCursor:Fields["Codigo"]:Value +" "+oCursor:Fields["Nome"]:Value+Cr)
oCursor:MoveNext()
EndDo
cLinha:=Replicate("-",78)+cr
cLinha+="Registros Impressos: "+StrZero(nReg,4)
Fwrite(Handle,cLinha)
fClose(Handle)
cArquivo :=memoRead("REL.TMP")
Define Window Form_3;
At 0,0 ;
Width 450 ;
Height 500 ;
Title "Contatos Cadastrados com Letra "+cLetra;
ICON "AGENDA";
CHILD ;
NOSYSMENU;
NOSIZE ;
BACKCOLOR WHITE
@20,-1 EDITBOX Edit_1 ;
WIDTH 460 ;
HEIGHT 510 ;
VALUE cArquivo ;
TOOLTIP "Contatos Cadastrados com Letra "+cLetra ;
MAXLENGTH 255
@ 01,01 BUTTON Bt_Zoom_Mais ;
CAPTION '&Zoom(+)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(1);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,125 BUTTON Bt_Zoom_menos ;
CAPTION '&Zoom(-)' ;
WIDTH 120 HEIGHT 17 ;
ACTION ZoomLabel(2);
FONT "MS Sans Serif" SIZE 09 FLAT
@ 01,321 BUTTON Sair_1 ;
CAPTION '&Sair' ;
WIDTH 120 HEIGHT 17 ;
ACTION Form_3.Release;
FONT "MS Sans Serif" SIZE 09 FLAT
End window
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Center Window Form_3
Activate Window Form_3
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Function ZoomLabel(nmm)
If nmm == 1
nFont++
Else
nFont--
Endif
MODIFY CONTROL Edit_1 OF Form_3 FONTSIZE nFont
Return Nil
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************
Static function vMat(a)
Local cMsg:="",I
if valtype(a)="A"
For i=1 to len(a)
if valtype(a
)="N"
cMsg += Str(a)+" "
elseif valtype(a)="L"
cMsg += if(a,".T.",".F.")+" "
elseif valtype(a)="D"
cMsg += Dtoc(a)+" "
else
cMsg += a+" "
endif
Next
Endif
Return cMsg
*****************************************************************************
/////////////////////////////////////////////////////////////////////////////
*****************************************************************************