Jump to content
Hercles

Lazarus: Runtime Error 217

Recommended Posts

Hercles

Erros que aparece no Lazarus quando se copila. Que tipo de erro seria este?

Projeto project1 elevou classe exceção 'RunError(217)'.

no endereço 7FEFD08940D

Share this post


Link to post
Share on other sites
I-NOZex

so diz esse erro? o depurador nao aponta nenhuma linha onde está a causa do problema, ou que linhas correu antes de dar erro?

isso é um erro ao nivel da execução...e

entretanto deixo aqui uma boa resposta a explicar o que sao os tipos de erro run-time e compile-time

http://stackoverflow.com/a/846421

quanto ao problema em si, nao te posso ajudar mais, tens que dar mais informação...

codigos que tejam no build do form ou no onshow...

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
nunopicado

É, isso é um erro de acesso à memória.

Uma qualquer instrução que lá tens que está a aceder ao que não deve.

Muito possívelmente, estás a usar um comando num evento de um qualquer componente, que ao ser criado executa o evento antes do que tu estás à espera, e logo, o tal comando é executado, dando origem ao erro.

Tenta o seguinte:

A cada evento que estejas a usar, um de cada vez, comenta o código que lá está.

Quando deixar de dar erro, é porque é esse evento que está a ser executado mal.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

erro nesta linha //filedata.loadfromfile(filename); mas é porque eu estou aprofeitando o codigo de outro projeto e esta linha não se aplicaria a esse que estou fazendo, eu acho.... :)

Share this post


Link to post
Share on other sites
nunopicado

Então está resolvido, certo?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Claro que sim... Mas para ti, isso deve ser invisivel.

Queres copias a base de dados, usas os comandos respectivos ou um utilitário de gestão, como o HeidiSQL, nos ficheiros não deves mexer.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

é porque vou ter que enviar o projeto e se tiver que enviar o arquivo do MYSQL não se aonde ele vai esta....

Share this post


Link to post
Share on other sites
nunopicado

é porque vou ter que enviar o projeto e se tiver que enviar o arquivo do MYSQL não se aonde ele vai esta....

Volto a dizer, tu não copias o ficheiro do MySQL. Copias um backup da base de dados.

Este será depois reposto no servidor do professor, e funcionará a partir de lá.

Por isso é que te falei ao inicio em usares o SQLite. Aí sim, era um ficheiro que mandavas com o programa.

No MySQL tens de executar um backup da base de dados (há várias formas, como o HeidiSQL ou o MySqlDump) que será reposta. No lado do teu software, terás de permitir que o utilizador escolha o endereço do servidor, username e password, porta TCP e nome da base de dados.

É assim que o MySQL funciona.

Também já o disse, preocupa-te agora a fazer a versão 1 do programa.

Quando a concluires, voltamos a falar sobre o MySQL.

Só para não morreres de ansiedade até lá, procura o ficheiro mysqldump.exe que está na pasta do MySQL.

Depois, executa-o assim:

mysqldump -h127.0.0.1 -uroot -padmin --single-transaction  --default-character-set=utf8  --result-file="c:\copia_bd.sql" BDNome

Onde 127.0.0.1 é o IP do computador que tem o MySQL instalado (se executares isto no próprio PC, podes deixar o 127.0.0.1)

root é o nome de utilizador do servidor MySQL - Substitui pelo que tiveres configurado

admin é a password do utilizador escolhido - Substitui pela que tiveres configurado

c:\copia_bd.sql é o caminho e nome do ficheiro onde queres gravar o backup

BDNome é o nome da base de dados que queres copiar - Substitui pela que tiveres configurado

Para repor a base de dados com este ficheiro, precisarás por exemplo do mysql.exe, que está geralmente na mesma pasta do mysqldump.exe

mysql -h127.0.0.1 -uadmin -padmin BDNome < c:\copia_bd.sql


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

pensei que a parte dois do trabalho fosse mais fácil, estava pensando entregar incompleto mesmo... fiquei o dia todo pesquisando a parte um e não consegui fazer nada... :(

Share this post


Link to post
Share on other sites
nunopicado

Até parece que não conheces o pessoal aqui do forum! :P

Diz as tuas dúvidas que nós ajudamos.

Recomendação: Não tentes fazer a parte 2 sem concluir a 1... Uma casa não se começa pelo telhado.

Esquece agora o MySQL, e vamos aos ficheiros. Em quê concretamente é que tens dúvidas?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

bom! sei que vou ter uma variável para cpf , nome, idade e salario (acho que todas podem ser do tipo string porque não vou fazer nenhum calculo).

vou ter que escolher um algoritmo de busca para o primeiro caso "achar funcionário".

sei que vou ter que usar o eof e writeln ....

if txtcpf:= cpf then

frmfuncionario.txtnome:= nome

frmfuncionario.txtidade:= idade;

frmfuncionario.txttxtsalario:= salario;

como eu faço para ligar o arquivo txt como estas variáveis e separar as string por string e jogar dentro de cada variável?

Share this post


Link to post
Share on other sites
nunopicado

Sabes ler do ficheiro uma string?

Imagina que tens a seguinte definição:

cpf=11 caracteres

Nome=40 caracteres

Idade=3 caracteres

salario=10 caracteres

Cada registo vai-te ficar com um total de 11+40+3+10 = 64 caracteres

//Reg1: '12345678901Nuno Miguel Picado                       36   5000.00' <-- 64 caracteres
//Reg2: '21335456513Hercles                                  22   6500.00' <-- 64 caracteres

.
.
.
  readln(arquivo,Reg);
  cpf     := Trim(Copy(Reg,1,11));  // O Copy extrai uma substring de outra. A substring começa no primeiro valor (ex.: 1) e tem o tamanho do 2º valor (ex.: 11)
  Nome    := Trim(Copy(Reg,12,40)); // O Trim elimina eventuais espaços que possa haver à esquerda ou direita da substring
  Idade   := Trim(Copy(Reg,52,3));
  Salario := Trim(Copy(Reg,55,10));

Convém saberes que há outras formas, muito mais eficientes, de leres um ficheiro de texto.

Pessoalmente fazia isto com records e ficheiros tipados, mas a fazer em ficheiro de texto, seria com uma stringlist para carregar todo o arquivo em memória e trabalhar com ele daí.


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

No menu tem Abrir que seleciona o arquivo texto que eu quero este reg vai ser a variável que recebe este arquivo... no pascal lembro que usava o assign

Share this post


Link to post
Share on other sites
nunopicado

Sim, e aqui podes usar algo parecido. Em Delphi é AssignFile e CloseFile (tudo o resto é igual a Pascal), em Lazarus creio ser igual, se bem que nunca usei ficheiros dessa maneira em Lazarus.

Eu pessoalmente usava uma TStringList. É uma classe que te carrega todo o ficheiro em memória e te permite percorrer como se fosse um array (é efectivamente um array de strings, embora com algumas funções associadas para ajudar ainda mais).


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

seria algo parecido com isso? ah declarei filedata como variável global do tipo Tstringlist;

procedure Tfrmmeusfuncionarios.Button1Click(Sender: TObject);
var reg: string;
begin
AssignFile(filedata);
while not eof(filedata) do
readln(filedata,Reg);
  cpf	 := Trim(Copy(Reg,1,11));  // O Copy extrai uma substring de outra. A substring começa no primeiro valor (ex.: 1) e tem o tamanho do 2º valor (ex.: 11)
  if cpf =  txtcpf.text then
  begin
  Nome    := Trim(Copy(Reg,12,40)); // O Trim elimina eventuais espaços que possa haver à esquerda ou direita da substring
  txtnome.text:= nome;
  Idade   := Trim(Copy(Reg,52,3));
  txtidade.text:= idade;
  Salario := Trim(Copy(Reg,55,10));
  txtsalario.text:= salario;
  end;
  CloseFile
end;  

ah fiz este código pra escolher o arquivo que quero usar:

procedure Tfrmmeusfuncionarios.mnuprincipalabrirClick(Sender: TObject);
begin
 //tipo de aquivo
 dlgarquivoabrir.filter:='Aquivos texto (*.txt)|*.txt|'+
 'imagens(*.bmp;*.ico)|*.bmp;*.ico|'+
 'Todos os Arquivos (*.*)|*.*';
 dlgarquivoabrir.filterindex:=1; //seleciona tipo.txt
 //somentes arquivos existentes podem ser selecionados
   dlgarquivoabrir.options:=[ofshowhelp,offilemustexist];
   if (dlgarquivoabrir.execute) then //abrir alguma arquivo?
   begin
 filename:= dlgarquivoabrir.filename; // txtnome do arquivo que
									    //foi aberto
   showmessage ('Aquivo: '+ filename +'foi aberto.');
   Panel1.caption:='Contectado ao: '+ filename;
   //carrega o arquivo na lista de strings
//    filedata.loadfromfile(filename);
   //exibe o arquivo no memobox
   // ativa o botao salvar
   mnuprincipalsalvar.enabled := true;
   end else
begin
 showmessage('Abrir Arquivo foi cancelado');
 end
end;														 

mas isto ==:> AssignFile(filedata); não é aceito pelo copilador....

Share this post


Link to post
Share on other sites
nunopicado

Pois não... :)

Primeiro porque o AssignFile, assim como o Assign do Pascal tradicional, precisa de dois argumentos: A variável do ficheiro, e o caminho para o mesmo:

AssignFile(f,'c:\teste.txt');

Agora, quando eu falei em TStringList, era de esperar que fosses ver como funciona, e não simplesmente fazer código à toa!

A TStringList é um mundo à parte no que toca a manuseio de ficheiros de texto. Esqueces Assign's, Reset's, Rewrite's e tudo o resto.

Ex:

Queres abrir um ficheiro de texto chamado c:\teste.txt:

var
  lst:TStringList;
  Idx:Integer;
begin
  lst:=TStringList.Create;  // Crias uma instância da TStringList. Lembra-te, uma classe não basta definir o tipo, é preciso criá-la, neste caso, assim

  lst.LoadFromFile('c:\teste.txt');  // Com isto, todo o ficheiro está carregado. A partir daqui é quase como trabalhar com um array

  // Exemplo: percorrer o ficheiro

  for Idx:=0 to lst.Count-1 do  // A primeira linha do ficheiro começa em 0. A última é dada pelo método Count - 1 (Count é o número total de linhas)
     begin
          ShowMessage( lst[idx] ); // Para acederes à linha, metes o índice à frente da StringList dentro de parentesis rectos

          cpf:=Trim(Copy(lst[idx],1,11));
          .
          .
          .
     end;


  lst.Free;  // Ao trabalhar com classes, devemos libertar a memória por elas ocupadas quando deixam de fazer falta. Logo, o último comando é o Free
end;

Aprofunda aqui:

https://www.portugal-a-programar.pt/topic/51671-trabalhar-com-ficheiros-de-texto-em-delphi/page__hl__tstringlist

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Hercles

acho que estou entendendo..... me respondi uma coisa quando quero munda de inteiro para string eu uso inttoint e no caso do TStringList

Share this post


Link to post
Share on other sites
nunopicado

É exactamente igual.

Se tiveres uma TStringList chamada lst e quiseres por exemplo alterar a primeira linha (posição 0):

Lst[0]:= IntToStr(2013);

A 1. linha ficará com o valor '2013'.

A propósito, para adicionar uma linha usas o método Add.

Lst.Add('blá blá blá');

E para gravares as alterações no ficheiro fazes:

Lst.SaveToFile('c:\teste.txt');


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.