quarta-feira, 28 de abril de 2021

FMX - Abrindo imprimindo e alterando um arquivo

No último post, há alguns dias atrás,
criamos um programa no C++ builder,
que fazia leitura, pesquisa individual,
e remoção de um cadastro criado manualmente
num arquivo.
E como ficou determinado que no post seguinte,
nós faríamos alterações num cadastro dentro
de um arquivo de texto, aqui está cumprido.
Pena que por falta de tempo suficiente
não fizemos isto antes, mas conseguimos
reservar algumas horas para programar.
Sempre que temos que fazer alterações num
arquivo, optamos por trabalhar com a abertura
de dois e de nomes diferentes, isto é óbvio,
sendo um como leitura e outro como escrita.
No arquivo que abrimos como escrita,
fizemos as alterações, mas ele precisa
assumir o nome do arquivo que foi aberto 
como leitura, sendo que o arquivo,
que foi aberto como leitura precisa
ser destruído, e o arquivo que foi aberto
como escrita e que recebeu as alterações,
agora é o arquivo principal.
Para fazer este processo conheço
duas maneiras, uma é a clássica, usando,
as funções da biblioteca padrão do C,
à saber, as funções rename ( ..., ... );
e remove ( ... ); e a outra maneira,
pouco usada, acredito assim, mas que estamos
usando neste programa e no programa do post
anterior, que é na força bruta, com comandos
do dos, e que funciona perfeitamente ainda hoje.
Na opção de alterar cadastro, preferi manter,
o que foi configurado no programa anterior,
isto é, apagar um cadastro deixando o espaço
em branco, para isto basta clicar no botão
"Editar", sem que nada tenha sido escrito,
nos campos do componente de edição.
Mesmo nós tendo criado manualmente 29 cadastros,
O programa está pronto para selecionar um cadastro,
entre centenas ou milhares, porque a pesquisa
é eficiente e não falha, e sabemos muito bem
do que estamos falando.
Então, nos posts anteriores, fizemos leitura,
fizemos precisa pesquisa, fizemos remoção,
e agora alteração de cadastros em arquivo.
Pergunta:
Podemos fazer um programa para criar cadastros,
onde um foi removido com sucesso,
ou se não houver cadastros vazios, inserir
com precisão abaixo do último cadastro?
ora, o programa terá de ser inteligente
o suficiente para detectar cadastros vazios,
e inserir o novo cadastro no primeiro vago
que encontrar, e se não houver cadastros vazios,
ele automaticamente irá inserir depois do último.
Vamos queimar nossos miolos?
Até breve, se Deus quiser. 
Assistam o vídeo por favor.
Se precisarem de ajuda com o C++ builder,
entre em contato comigo.




//-----------------------------------------------------------------------
//FormCreate está funcionando com um evento OnClick do Button1
void __fastcall TForm2::FormCreate ( TObject *Sender ) {
   Label_Manual ( Sender );

   ScrollBox1 -> Visible = false;
   Button1 -> Visible = false;
   //pos X, pos Y, Width, Height, Size, Bool, Color,String
   T_Text ( 50, 35, 500, 20, 17, true, 2, 3, "ARQUIVO - ABRINDO IMPRIMINDO E ALTERANDO" );

   Imprime_Arquivo ( Sender );

   Button1 -> Visible = true;
   x++;

   if (  x == 2 && Form2 -> Edit1 -> Text == "" ) {
Beep ( 500, 500 );
Form2 -> Show ( );
Form3 -> Hide ( );
Form1 -> Hide ( );
                        x = 1;
   }

   if ( x == 2 ) {
   int c = 0;
   c = Contador ( );
   T_Text ( 100, 60, 270, 17, 14, true, 3, 1, "Alterando o cadastro de Nº: " );
   T_Rect ( 340, 60, 20, 17, 3, 4 );
   T_Text ( 340, 60, 20, 17, 14, true, 3, 0, c );
   Form2 -> Terceira_janela ( Sender );
   x = 1;
   }
}
//---------------------------------------------------------------------------


domingo, 11 de abril de 2021

FMX - Pesquisando e removendo cadastros em arquivo

Com este programa criado no C++ builder,
utilizando alguns recursos lógicos do C,
podemos fazer leitura, pesquisa individual,
e remoção de um cadastro criado manualmente
num arquivo. No post anterior nós listamos
e pesquisamos dentro de um arquivo, já neste,
podemos listar, fazer pesquisa individual
e remover cadastro dentro de um arquivo.
Será que podemos no próximo post fazer
alterações num cadastro dentro de um arquivo?
Eu acredito que sim, fomos capacitados para isto.


//---------------------------------------------------------------------------
void __fastcall TForm4::Button2Click ( TObject *Sender ) {
T_Rect ( 90, 112, 150, 80, 4, 1 );
T_Rect ( 60, 260, 460, 20, 4, 1 );

Button1 -> Visible = true;
str_5 = "";
Edit1 -> Text = "";
Label1 -> Text = "";
                                        y = true;
nl = 0;
                                        b1 = 0;
Button2 -> Visible = false;

Memo1 -> Visible = false;

Primeira_janela ( Sender );
}
//---------------------------------------------------------------------------

domingo, 4 de abril de 2021

FMX - abrindo - lendo e pesquisando em arquivo


No post anterior, criamos um programa
para criar, listar, remover e apagar
cadastros, e tudo funcionou perfeitamente,
mas aquele programa não salvava os cadastros
num arquivo, tudo se perde quando o programa
é fechado, pensando em criar uma nova versão
daquele programa, com recursos para salvar,
ler, remover e alterar os cadastros em um
arquivo, comecei fazendo a parte de leitura
e pesquisa mas num arquivo previamente criado.
O programa apresentado aqui, faz uma precisa
pesquisa em um arquivo, em chamadas totalmente
aleatória, e nem foi preciso usar a função
fseek do C, mas o raciocínio lógico foi 
indispensável.
O programa oferece quatro opções num menu
clássico e funciona tudo corretamente.
Assista no vídeo o programa funcionando:



//---------------------------------------------------------------------------
void __fastcall TForm1::Pesquisando_Cadastros ( TObject *Sender ) {
   //Limpa -> "Todos os cadastros"
   T_Rect_1 ( 240, 70, 160, 18 );

   //Limpa Nome
   T_Rect_1 ( 120, 112, 60, 20 );
   //Limpa Altura
   T_Rect_1 ( 120, 128, 88, 20 );
   //Limpa peso
   T_Rect_1 ( 120, 143, 78, 20 );
   //Limpa Idade
   T_Rect_1 ( 120, 160, 95, 20 );

   T_Rect_1 ( 107, 290, 390, 20 );
   //Limpa da tela o Informe
   T_Rect_1 ( 100, 250, 180, 35 );

ScrollBox1 -> Visible = false;

const int TAM = 60;
char **buffer;
buffer = ( char** ) malloc ( 2000 * sizeof ( char* ) );

char *pt;
pt = ( char * )  malloc ( 100 );

T_Rect_4 ( 120, 80, 250, 20 );
T_Text_3 ( 120, 78, 250, 20, 16, false, true, 0, "Digite o número do cadastro" );
T_Rect_1 ( 107, 290, 390, 20 );

Edit1 -> Visible = true;
Edit1 -> SetFocus ( );
Edit1 -> Text = "";

Button1 -> Visible = true;
Button2 -> Visible = false;

String st = "0";
st += Edit1 -> Text;
wcstombs (  pt, st.c_str ( ), 100 );

free ( pt );
free ( buffer );
}
//---------------------------------------------------------------------------



sábado, 3 de abril de 2021

Fmx - programa cadastros de amigos


Sempre que ficamos muitos dias sem programar,
Quando voltamos, fica aquele embaraço e perguntas:
Por onde começar? O que fazer? tentar corrigir alguns bugs
De programas passados? nisto lá vai um bom tempo perdido...
Nesta procura, procurei inspiração nos blogs que temos,
E no canal do youtube, e foi lá vendo um vídeo de um programa,
Que criamos alguns anos atrás que tive a idéia de convertê-lo
Para uma janela gráfica do C++ builder.

Criando Projeto:
Quando criamos um projeto no C++ builder, ele gera automaticamente,
Estes quatros arquivos antes memo de salvar e compilar:
Project1.cpp
Este arquivo funciona como a função main() do C/C++,
Ele inicializa os Forms e o que for necessário para o início
através de um método interno.
(Não entendo quase nada disto, mas também não acho isto
importante, pelo menos por agora )

Unit1.CPP: Neste arquivo escrevemos nossas rotinas,
em geral, tudo o que sabemos da linguagem e precisamos aplicar 
para que nosso programa funcione corretamente.

Unit1.H: Neste arquivo escrevemos os protótipos
das funções, declarações de variáveis, de qualquer
tipo aceito pelo C ou C++.

Unit1.FMX:
Neste arquivo são escritos, todas as informações
dos componentes arrastados para o form,
e o interessante dele, é que ele escreve tudo
automaticamente, porém em Delph, mas não me importo.

O que mais me agrada no C++ builder é que podemos
programar sem a IDE (Precisa ter um bom conhecimento)
E possuir uma linha de comando bem configurada,
Apontando para os includes, libs, e ferramenta de builds.
qualquer dia vou tentar isto.
Poderia ter criado o programa num único Form,
Mas por questão de organização e de limpeza de 
Variáveis, limpeza de tela preferi, criar cada função
 em um form Independente, mas até este momento
eu não sabia que iria precisar de alguns valores de variáveis
em outros forms, aqui começaram os problemas.
Depois de muitas cabeçadas me lembrei do comando “extern”,
Que estudamos no começo de nossa formação, mas que na prática,
Nunca o tinha usado antes. Foi a nossa saída, e o programa começou a funcionar.
Quando comecei escrevendo logo declarei uma struct do C,
Esta mania de criar projetos em C++, e mesclar com códigos do C ,
É grave, “Acho que agente sai do C, mas o C nunca sai da gente”
Bom, isto não me incomoda muito, afinal, o C++ builder está preparado
Para aceitar qualquer função do C.
Mas fazendo meus testes declarei uma classe simples do C++,
E tudo funcionou normalmente, porque na verdade,
Uma struct do C e uma classe simples do C++, não possui
Grandes diferenças, eu penso sinceramente que só descobrimos
O poder das classes do C++ quando começamos entender
Método construtor
Método destrutor
Métodos e variáveis privados
Métodos e variáveis públicos
Métodos e variáveis protegidos
Poliformismo
Classes derivadas, etc...
Se um programa é simples e não precisa disto então,
Porque usar uma classe: (Opinião)
O programa terminou e ficou tudo funcionando perfeitamente,
Mas ainda tem uma questão, e se eu quisesse manter os cadastros
Criados para comparação quando saísse e retornasse para o programa?
Certamente precisaríamos salvar tudo em um arquivo,
Nisto o programa sofreria mudanças em todos os forms,
pensando bem isto ficará para uma próxima versão.

Se alguém tiver interesse no projeto, basta entrar em contato.



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

void __fastcall TForm2::Button1Click ( TObject *Sender ) {

Button1 -> Visible = true;

Button2 -> Visible = true;


Edit1 -> Visible = true;

Edit2 -> Visible = true;

Edit2 -> SetFocus ( );

Edit3 -> Visible = true;


if ( Edit2 -> Text != "" && Edit3 -> Text != "" ) {

  a++;

          codigo = a;

          Edit1 -> Text = StrToInt ( a );

  amigo [ codigo ].cod = codigo;


char *pt;

pt = ( char * )  malloc ( 100 );

String st;

st += Edit2 -> Text;

wcstombs (  pt, st.c_str ( ), 100 );

*amigo [ codigo ].nome = pt;


char *pt_2;

pt_2 = ( char * )  malloc ( 100 );

String st_2;

st_2 += Edit3 -> Text;

wcstombs (  pt_2, st_2.c_str ( ), 100 );

*amigo [ codigo ].telefone = pt_2;

}

if ( Edit2 -> Text == "" || Edit3 -> Text == "" ) {

   T_Rect_3 ( 60, 260, 390, 20 );

   T_Text_2 ( 60, 260, 400, 20, 16, true, 0, "Um ou mais campo do cadastro está vazio" );

}

}

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