Ir para conteúdo
Fórum Script Brasil
  • 0

Armazenar Variaveis


juniorboll

Pergunta

Queria saber uma coisa, como eu armazenaria essa veriavel para que quando eu iniciar o meu programa novamente ela estivesse la, fiz o seguinte tenho 3 variaveis para armazenar as datas semanal quinzenal e mensal que foram pagas, ate ai tudo bem eu fiz deu beleza, mas quando eu fecho o programa e abro denovo ele não tem mais essas datas que tavam armazenadas o que eu devo fazer??

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0
Guest Visitante

Eu acho melhor tu fazer um sistema de banco de dados em sql porque teu programa pode crescer e tu pode precisar de mais espaço para armazenar as variaveis, mas enquanto isso:

para aumentar o tamanho do arquivo executável para caber as variáveis:

Var f : integer;
aux : TDateTime;
begin
  f:=fileopen(paramstr(0),$42);
  fileseek(f,0,2);
  FileWrite(f,aux,sizeof(aux)*3);
  FileClose(f);
end;
Depois para gravar as variáveis:
Var f: integer;
begin
  f:=filopen(paramstr(0),$42);
  fileseek(f,0-3*sizeof(TDateTime),2);
  Filewrite(f,var1,Sizeof(TDateTime));
  Filewrite(f,var2,Sizeof(TDateTime));
  Filewrite(f,var3,Sizeof(TDateTime));
end;
Depois para ler as variáveis do arquivo:
Var f: integer;
begin
  f:=filopen(paramstr(0),0);
  fileseek(f,0-3*sizeof(TDateTime),2);
  Fileread(f,var1,Sizeof(TDateTime));
  Fileread(f,var2,Sizeof(TDateTime));
  Fileread(f,var3,Sizeof(TDateTime));
end;

Voce pode escrever um programa só para aumentar o tamanho de exe se quiser. abrassss

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é, essas funções colocan as váriaveis no final do arquivo. você vai estar abrindo o próprio arquivo executável e gravando e lendo os valores no final.

Se não funcionar, é porque tem algum erro no código, então tente:

para aumentar o tamanho do arquivo executável para caber as variáveis:

Var f : integer;
aux : array[1..3] of TDateTime;
begin
  f:=fileopen(paramstr(0),$42);
  fileseek(f,0,2);
  FileWrite(f,aux,sizeof(aux));
  FileClose(f);
end;
Depois para gravar as variáveis:
Var f, tam: integer;
begin
  f:=filopen(paramstr(0),$42);
  tam:=fileseek(f,0,2);
  fileseek(f,tam-(sizeof(TDateTime)*3),0);
  Filewrite(f,var1,Sizeof(TDateTime));
  Filewrite(f,var2,Sizeof(TDateTime));
  Filewrite(f,var3,Sizeof(TDateTime));
end;
Depois para ler as variáveis do arquivo:
Var f, tam: integer;
begin
  f:=filopen(paramstr(0),0);
  tam:=fileseek(f,0,2);  
  fileseek(f,tam-(sizeof(TDateTime)*3),0);
  Fileread(f,var1,Sizeof(TDateTime));
  Fileread(f,var2,Sizeof(TDateTime));
  Fileread(f,var3,Sizeof(TDateTime));
end;

:o Lembre-se de colocar um FileClose(f); antes de fechar o programa, ou se for função, no final de cada função. ;)

Só mais uma coisa, você está colocando a data em forma de string ou em variavel TDateTime? Porque eu sugiro que use TDateTime, porque corre menos riscos de erro. acho que pode-se usar a funcao StrToDate para converter.

Qualquer problema, não deixe de perguntar. abrasssss

Link para o comentário
Compartilhar em outros sites

  • 0

Se a sugestão do colega Thales de armazenar em um banco não for apreciada (tem vantagens como facilidade na manipulação e poder ser compartilhada a outros usuários) e você tem o desejo de manter os dados para cada execução do seu programa, eu vejo alguns inconvenientes no método apresentado (apesar de já ter utilizado deste artifício em certa oportunidade):

- cada vez que você recompilar o programa (uma nova versão) a informação se perderá;

- se você precisar adicionar mais campos, deverá adiconar uma rotina de "conversão" no seu programa auxiliar, para ler no formato antigo, adicionar os novos campos e gravar os dados no novo "formato" no programa principal.

Acredito que uma boa solução seria você pode optar por colocar num arquivo .INI (mais vulnerável) ou armazenar nas chaves de registro do windows (um pouco mais seguro), visto que:

- As informações não se perderiam com uma nova versão do programa;

- O controle das informações a serem armazenadas ficaria num único programa;

- A inclusão/exclusão de novos campos também ficariam mais tranquilas.

Link para o comentário
Compartilhar em outros sites

  • 0

Pois é. Voce pode fazer o seu programa procurar um arquivo .ini na pasta do windows, caso não encontre, quer dizer que é a primeira vez que o programa é executado naquele computador, então ele cria o arquivo. Mas a desvantagen é que se você colocar o programa em outro computador as variaveis seram perdidas. E no caso de colocalas no executável, não interessa para onde você leve o programa que as variaveis estarão sempre lá.

O problema das novas versões e dos novos campos são resolvíveis. você pode colocar no final do arquivo executável um identificador que pode ser uma string, que indicará o término do exe e o inicio dos dados. Aí, antes de cada variável você coloca um numero inteiro que irá identificar do que se trata a variável, tipo: 1 é a data de ocorrencia de não sei oque, 2 é a data de não sei oque lá........... Desse jeito você pode colocar as variáveis em qualquer ordem que não tem problema. E poderá inserir novos campos sem interfirir nos outros..... Aí, toda vez que o seu programa rodar ele checa a existencia dessas variáveis no final do arquivo.... se não existirem é porque o programa foi recompilado, então ele mesmo já coloca as variáveis no final..... Agora se o programa for executado e já existirem as variaveis, ele recupera os seus valores. Em certa ocasião eu usei estes artifícios, e funcionou perfeitamente.

Agora......, você pode fazer um sistema de abrir e salvar. Que aí o cara salva o estado do programa em um arquivo de escolha dele, e depois ele tem que ter esse arquivo para o seu programa abrir. Voce escolhe qual método te atende melhor.

Desculpe não ter respondido antes, é que eu to trabalhando o dia todo e final de semana também. Abrasss

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

mas, como eu faria para gravar

uma variavel string?? eu teria que estipular o tamanho dela??

as tres strings teriam que ter o mesmo tamanho??

ou teria jeito de fazer com tamanho diferente?1

Link para o comentário
Compartilhar em outros sites

  • 0

Quando você declara uma variável desse jeito->

var st : string[10];
Voce estará alocando estaticamente, não é possível mudar o comprimento dela, então você pode escreve-la no arquivo diretamente, assim ->
FileWrite(f,st,length(st)+1)
Agora......., quando é uma string dinamica ->
var st : string;
Na verdade no endereço dela não tem texto nenhun, só um ponteiro para o texto, então faça isso->
var st : string;
ch : ^char absolute st;
begin 
  st := 'Vamos ver se grava';
  FileWrite(f,ch^,length(st));
end;

Só que eu estou apanhando aqui para abrir o próprio executável em modo de escrita. Quando eu mando abrir a função retorna um código de erro. Eu estou conseguindo abrir normal em modo de leitura, mas aí não grava nada. Voce tem certeza que você abriu o arquivo exe no bloco de notas e as variáveis estavam lá no final?????

Eu vou ficar tentando aqui, e assim que eu conseguir eu posto aqui. Talvez esses caras mais fodas saibam oque está acontecendo, tipo o Micheus, o Churc e o Graymalkin. Os caras que nunca perguntam nada, só respondem. Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

é, pode ser

mas eu tentei o codigo que coloquei no exemplo ( o link na minha ultima resposta)

e ele escreve, ai abri o exe no bloco de notas e fui em Editar, Localizar...

e procurei o texto que eu queria

la estava assim:>

(...) Ã ÿÿÿÿ

meunomecom ÿÿÿÿ

10letrasna ÿÿÿÿ

variavel.. ÿÿÿÿ

variavel!. ÿÿÿÿ

variavel!! U‹ì3Équalquer (..)

as cinco variaveis que escrevi!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

so que não estava com quebra de linhas igaul aqui, quando eu dei CTRL+V aqui no textarea do comentario, apareceu com quebra de linha, não sei porque!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

cara, mah noticias, ele não da erro, mas parece qie não grava nada não

sabe porque, eu pensei assim, vai que aquelas strings que eu achei são

do executavel que por eu ter compilado elas la , elas estao no codigo dele , então mudei o valor que queria gravar e recompilei, fui la , abri o executavel no notepad e la estavam as variaveis mesmo eu ainda não tendo gravado elas, ou seja, não funciono aquele codigo que eu fiz

não deu erro, mas não funcionou!!!

Link para o comentário
Compartilhar em outros sites

  • 0
Guest Visitante

como é que eu faço para liberar espaço no executavel quando o tamanho da string

pode mudar??

var st : string;
ch : ^char absolute st;
begin 
  st := 'Vamos ver se grava';
  FileWrite(f,ch^,length(st));
end;

???

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, ao ler seu post das 10:50, ia mesmo perguntar como é que você estava conseguindo escrever no próprio programa

então ele mesmo já coloca as variáveis no final...
Mas, no seu último post percebi que ainda não estava conseguindo. O motivo exato para que isso seja impossível eu não sei, até tenho uns palpites, mas você já deve ter observado que tentar excluir ou mover um arquivo/programa (no windows explorer) que esteja em uso é impossível.
Mas a desvantagen é que se você colocar o programa em outro computador as variaveis seram perdidas (Thales, sobre arquivo .ini)
Aqui, até vejo uma vantajem sobre o armazenamento no registro do windows, já que o arquivo .ini pode ser facilmente transportado para outras máquinas.

Sobre o uso da string dinâmica, tem como inconveniente de não ficar registrado no arquivo o seu tamanho. Costumo, pelo menos, armazenar esta informação também, pois facilita as coisas. O exemplo postado (abaixo) nã está armazenando nem o terminador da string (#0) o que pode dificultar sua recuperação.

FileWrite(f,ch^,length(st));
deveria ser:
FileWrite(f,ch^,length(st)+1);

Talvez esses caras mais fodas saibam oque está acontecendo, tipo o Micheus, ... . Os caras que nunca perguntam nada, só respondem
Da minha parte só posso dizer: não se iluda, no meu caso é que hoje em dia não trabalho mais exclusivamente com programação (é uma segunda opção).
Link para o comentário
Compartilhar em outros sites

  • 0

Pois é cara, o que você viu lá no bloco de notas foi as constantes do programa. As variaveis mesmo não foram gravadas, porque está dando erro na abertura do exe no modo de escrita. Elas tem que ficar no final de tudo no arquivo. Eu aqui consegui abrir qualquer arquivo e escrever normalmente nele, menos o próprio exe. Eu estou tentando resolver aqui, mas pode demorar um tempo.... Quanto ao tamanho da string, não tem problema não.

O que que você vai fazer(quando você conseguir abrir o exe, claro) -> No final você vai colocar uma string de identificação de início das variáveis tipo -> '$&*(8^-+=', só pra você saber onde começa as variaveis. Aí você compila o programa e vê o tamanho dele, por que aí você vai pular esse tanto de bytes e vai começar a procurar essa string id a partir dalí, para não perder tempo. Porque você sabe que dali pra traz só tem o programa. Dá uma toleranciazinha, começa a procurar um pouco antes, digamos uns 40 bytes, porque não há muito risco de erro porque a tendencia do programa é só crescer. Então vai estar gravado essa string e depois as variaveis, sendo que pra cada variável vai ter ->

>> Um byte que indentifica de que se trata o valor, pra você poder colocar ela na variavel certa depois.

>> Um byte que indica o tamanho em bytes da variável, pra no caso de ser string você saber até onde você tem que ler ela, use length() para gravar o tamanho em bytes de uma string, e sizeof se for outra variavel qualquer alocada estaticamente.

>> E a váriavel mesmo.

Desse jeito, quando você achar a string id, você começa a ler depois dela ->

>>primeiro o identificador, pode-se usar um case para lê-la na variável correspondente ou um sistema de indexação

>>depois o tamanho da variavel

>>depois você lê a variavel pelo tamanho indicado.

Quando você lê uma variavel, digamos de 4 bytes de tamanho, o pointer do arquivo desloca-se automáticamente 4 bytes para frente, então depois que você ler uma variavel até o tamanho indicado, a próxima coisa que segue é o byte de identificação da próxima variável, assim você tem total controle. Quando você terminar de gravar as variáveis você coloca uma outra string, dizendo que terminou e não há mais nada a ser lido.

Eu já usei esse sitema num jogo de xadrez que escreví, só que eu não salvava no próprio exe, tinha um menu arquivo -> salvar... aí o programa salva todas as variáveis do programa no arquivo, pro usuário poder abrir o jogo posteriormente. Aí eu podia salvar as variáveis em qualquer ordem, deixar de salvar algumas ou salvar a mais que não tinha problema. se fosse versão diferente e o programa não reconhecesse umas das variáveis(byte identificador) ele simplesmente descartava e pulava prá próxima. Ou se ele não encontrasse uma variável ele só não colocava nada nela..... Funcionou muito bem. O único problema é que eu não estou conseguindo abrir e escrever no arquivo exe. Abraço

Link para o comentário
Compartilhar em outros sites

  • 0
so que não estava com quebra de linhas (Juniorboll 11:43)
Quebra de linha só vai existir se você gravá-la ao final das strings. Para que o notepad a interprete, por exemplo, basta concatenar um #10 ou #13 (eu sempre me confundo qual dos dois ele considera). Já se for visualizar no Edit (programa DOS), precisará inserir os dois #10#13 (acho que nesta seqüência).

ai abri o exe no bloco de notas (Juniorboll 11:42)

mas parece qie não grava nada não (Juniorboll 11:52)

Observe que o notepade é um editor de textos e, como tal, ele carregará o arquivo até encontrar o EOF (#16 se não me falha a memória) do arquivo. Como você adiciona suas variáveis ao final do arquivo e, se não estou enganado, ele ficará após este caracter. Motivo pelo qual acredito que você deva posicionar (seek) no final do arquivo utilizando o endereçamento a partir do início do mesmo na posição FileSize(nomearquivo).

Só para não complicar muito as coisas, eu costumo no processo de gravação:

- gravo cada variável no final do arquivo;

- somo o nº de bytes que as variáveis vão ocupando, no arquivo;

- gravo no arquivo este valor em seguida (normalmente do tipo word);

- gravo o identificador no final do arquivo, utilizando um string stático tipo: const Identify :string[3] = '@MX';

Para fazer a leitura:

- inicializar uma variável PosFile com FileSize(nomearquivo) -SizeOf(Idenfy);

- posicionar (FileSeek) em PosFile e ler para IdentifyAux(string[3]) a quantidade de bytes SizeOf(Idenfy);

- testar se IdentifyAux = Identify, constatando que já existe a informação no fim do arquivo;

- existindo, decrementar de PosFile o SizeOf(Word) e ler a quantidade de bytes ocupados pelas variáveis numa variável CountSize (aqui temos exatamente a posição de onde devemos começar a lê-las);

- decrementar de PosFile o valor de CountSize de modo que agora PosFile estará apontando para a posição da qual deverão ser lidos os valores das variáveis.

- ler cada variável conforme foi gravada...

Eu acredito que as coisas estão se complicando um pouco. Como disse antes, o executável não terá como se modificar, logo, acho as outras abordagens mais proveitosas e simples: Armazenar em BD, arquivos .ini ou registro do windows.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0

O que o Micheus falou:

FileWrite(f,ch^,length(st));

deveria ser:

FileWrite(f,ch^,length(st)+1);

Está certo.

Quebra de linha só vai existir se você gravá-la ao final das strings. Para que o notepad a interprete, por exemplo, basta concatenar um #10 ou #13 (eu sempre me confundo qual dos dois ele considera). Já se for visualizar no Edit (programa DOS), precisará inserir os dois #10#13 (acho que nesta seqüência).

A quebra de linha se dá pelos bytes #13 e #10 nesse ordem.

Já que o Micheus falou que um arquivo exe não pode ser modificado durante sua execução, vamos considerar que ele esteja certo e desistir dessa idéia. Pode até ser que haja uma maneira, mas até alguém descobrir......

Quanto a essa maneira que o Micheus descreveu para savar a variaveis, eu não entendi muito bem. E também não sei se voces entenderam a minha maneira. Mas de qualquer jeito ainda acho que a minha maneira é mais versátil.

A minha sugestão para você é que seu programa rode dentro de uma pasta isolado e que alí se criem os arquivos que o programa utiliza, sejam eles tabelas sql ou arquivos simples que você mesmo gravou utilizando os métodos apresentados por mim e pelo Micheus. Desse jeito toda vez que o seu programa for copiado para outro lugar, terá que ser copiada toda a pasta que contém o programa e seus arquivos. Assim nunca serão perdidos os dados quando ouver cópia ou mudança de versão. Eu particularmente prefiro esse.

Ou ainda Fazer um sistema de abrir, salvar. Que assim os usuários poderão salvar diferentes dados em diversos arquivos de maneira mais livre, e poderão abrir o que desejarem.

Ou a sugestão do arquivo na pasta do windows, podendo ser ini ou binário, mas com a desvantagem que você quando quiser copiar pra outra máquina, você terá que achar ele lá no windows, colocar junto com o programa, depois copiar o programa na outra máquina e jogar o arquivo pro windows de novo.

Se voce quiser me mandar o seu código fonte pra eu tentar fazer o sistema de gravação pra você, o meu email é -> thalespo@terra.com.br. Abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Eu disse

Aí, toda vez que o seu programa rodar ele checa a existencia dessas variáveis no final do arquivo.... se não existirem é porque o programa foi recompilado, então ele mesmo já coloca as variáveis no final..... Agora se o programa for executado e já existirem as variaveis, ele recupera os seus valores. Em certa ocasião eu usei estes artifícios, e funcionou perfeitamente.

Mas eu escreví em outro arquivo, no próprio exe eu nunca tinha escrito.

Eu iniciei um novo tópico recentemente neste fórum com o título 'Arquivo auto extraível'. O que eu fiz foi compilar um programa, e no mesmo arquivo eu juntei um outro programa que eu queria que o primeiro programa extraísse, e separando os arquivos tinha uma string id. funcionou pra cacete, só que eu abrí o exe no modo leitura, ele aceitou perfeitamente, aí quando eu rodava o programa ele gerava um outro arquivo exe no computador do cara, como se fosse um instalador. Certo? Se tiver mais alguma coisa em que eu possa ajudar, terei o maior prazer. Não deixe de postar, e avise se conseguir ou não.

Link para o comentário
Compartilhar em outros sites

  • 0

cara, eu segui a dica de vocês ai, consegui gravar

em outro executavel, verifiquei elas estao no final

do arquivo, mas quando coloco pra ler da um erro!!

tem jeito de você mandar o codigo para mim analizar( o codigo para escrever e ler strings por um exe de outro exe) !

Link para o comentário
Compartilhar em outros sites

  • 0

Posta o seu código aí pra gente criticar, p****. Porque eu não tenho nenhum código para escrever strings em arquivos exe. Só se eu inventasse agora. Mas se você quiser eu posso enviar por email o código de alguns programas que eu escreví que envolvem manipulação de arquivos.

Eu escreví um programa para concatenar vários arquivos em um só, que eu precisei para juntar arquivos vob de um dvd. Escreví um programa que mostra um form com um joguinho mas antes ele copia um programa de brincadeira pra pasta inicializar do pc, que vai fechando todas as janelas, e escreví um jogo de xadrez muito ruim e está incompleto, mais permite savar e abrir jogos em arquivos. E também escreví um programa que serve pra apagar arquivos que foram gravados em um cd, de uma pasta no hd. Acho que é só isso. abraço.

Link para o comentário
Compartilhar em outros sites

  • 0
Quanto a essa maneira que o Micheus descreveu para savar a variaveis, eu não entendi muito bem.

Acabei escrevendo um exemplo do que eu estava falando (comentado linha a linha), acredito que ficará mais claro agora: link

obs: Execute inicialmente o arquivo LeEXE.exe. Então depois utilize o GravaEXE.exe para gravar os valores.

[]s

Link para o comentário
Compartilhar em outros sites

  • 0
Acabei escrevendo um exemplo do que eu estava falando (comentado linha a linha), acredito que ficará mais claro agora: link

Pois é, Micheus. O que você tem que entender é que o intúito da troca de códigos neste fórum é de se aprender a utilização das funções do delphi, não da lógica do algorítmo, porque cada um entende apenas o próprio código. Se você explicando o sistema passo a passo eu já não entendí, imagina eu olhando o código. Eu conheço todos os comandos utilizados no programa, o problema é o entendimento do relacionamento deles para a estruturação e utilidade do código. O que está em questão é a forma como os dados são armazenados no arquivo e a versatilidade do método utilizado, não tem nada a ver com a linguagem. Mas esquece isso. Quem você tem que convencer é o juniorboll.

D4n1l0d, eu vou mandar pra você os programas. São escritos em Delphi 6, hein. O nome do cara é tão difícil que tem que copiar e colar :lol: .

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...