Ir ao conteúdo
  • Cadastre-se

FBO_COUTINHO

Membro Pleno
  • Posts

    21
  • Cadastrado em

  • Última visita

Tudo que FBO_COUTINHO postou

  1. Tente isto: function CheckFolders(): Boolean; begin if not (DirExists('C:\MEUSISTEMA')) then begin MsgBox('Pasta MEUSISTEMA não existe, será criada.',mbInformation, MB_OK); Result := false; end else if (DirExists('C:\MEUSISTEMA\BANCO')) then begin MsgBox('Pasta MEUSISTEMA\BANCO já existe, será renomeado para MEUSISTEMA\BANCOOLD',mbInformation, MB_OK); RenameFile('C:\MEUSISTEMA\BANCO', 'C:\MEUSISTEMA\BANCOOLD'); RenameFile('C:\BMEUSISTEMA\EXECUTAVEL.EXE', 'C:\MEUSISTEMA\EXECUTAVELOLD.EXE'); Result := True; end; end; procedure InitializeWizard; begin CheckFolders(); end;
  2. Olá. E se você tentar ler caracter por caracter até encontrar o #9? Se você souber a sequencia dos itens numa linha do arquivo então fica fácil: var {suas vars...} acumulador: string; i: integer; ind_dado; begin while not Eof(txt) do begin ReadLn(txt,linha); acumulador:= ''; //reseta o acumulador a cada nova linha ind_dado:= 0; //zera o indice de dados da linha a cada nova linha //faz uma varredura em todos os caracteres em "linha" for i:= 1 to length(linha) do begin if(linha[i] <> #9)then // acumulador:= acumulador + linha[i] else begin case ind_dado of 0: //indice 0 é cliente begin SetLength(cliente,length(cliente)+1); cliente[length(cliente)-1]:= acumulador; inc(ind_dado); end; 1: //indice 1 é Marca begin SetLength(Marca,length(Marca)+1); Marca[length(Marca)-1]:= acumulador; inc(ind_dado); end; 2: //indice 2 é um campo de valor numerico com casas decimais begin SetLength(Floats,length(Floats)+1); TryStrToFloat(acumulador,Floats[length(Floats)-1]); inc(ind_dado); end; 3: //indice 3 é um campo de valor numerico sem casas decimais begin SetLength(Words,length(Words)+1); TryStrToInt(acumulador,Words[length(Words)-1]); ind_dado:= 0; end; end; acumulador:= ''; //reseta o acumulador pra pegar o proximo dado end; end; end; end;
  3. O problema é que você está tentando jogar um valor numérico (real) pra um campo texto (edit5.text). você tem que converter o valor numérico pra texto antes de fazer esta atribuição. Então no seu código faça: //incorreto //Edit5.text:=(soma)/4; //correto Edit5.text:= FloatToStr((soma)/4); ------------------------------------- //incorreto //Edit5.text:='sqrt(vezes)'; //correto Edit5.text:= FloatToStr(sqrt(vezes));
  4. Talvez esteja acessando um indice de um vetor ou matriz que extrapole o tamanho da mesma ou, se for um vetor ou matriz dinamico, faltou alocar memoria para este... Ou talvez esteja tentando atribuir ou ler objetos que já foram destruídos da memória... É difícil dizer sem dar uma olhada no código mas verifica se talvez seja um destes que mencionei
  5. Carlos José de Souza, muito obrigado por sua sugestão. Até já fiz um aplicativo pra testar a funcionalidade do MDI e realmente é o que eu estava procurando mesmo. Muito bom. valeu
  6. Cara sua dica de criar um form pra conter meu painel de botões e depois fazer este form aparecer nos outros forms da aplicação foi demais. Fiz assim: 1. Criei os forms "Form1", "Form2" e "FormPainel", onde "FormPainel" é o form que contém os botões pra troca de telas, que é visivel em todos os forms da aplicação. 2. Na unit do programa criei uma classe pra ter as funções OnActivate e OnClose que responderão a todos os forms da aplicação, vinculando as funções dos forms para as funções desta classe program Project1; uses Controls, //acrescentado Forms, U_Diversos in 'U_Diversos.pas', Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, U_UniversalPanel in 'U_UniversalPanel.pas', U_Painel in 'U_Painel.pas' {FormPainel}, U_GlobalUnit in 'U_GlobalUnit.pas'; //cria instância para eventos OnFormActivate e OnFormClose //que responderão a todos os forms da aplicação Type TUniversalEvents = class procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); end; {$R *.res} var UniversalEvents: TUniversalEvents; { TOnShowEvent } procedure TUniversalEvents.FormActivate(Sender: TObject); var i: integer; begin //faz todos os outros forms ficarem invisíveis, ficando //visível apenas o form que chamou esta função //(o form que chamou esta função é passada como "Sender") for i:= 0 to Screen.FormCount-1 do begin if(Screen.Forms[i] <> TForm(Sender))then Screen.Forms[i].Visible:= False; end; //verifica se o form que contém os botões de navegação //entre forms já está criado if(assigned(FormPainel))then begin //se o painel de botões não estiver no form atual //ele será colocado no form atual if(FormPainel.Parent <> TForm(Sender))then begin FormPainel.BorderStyle:= bsNone; FormPainel.Parent:= TForm(Sender); FormPainel.Visible:= True; FormPainel.Align:= alLeft; end; end; end; procedure TUniversalEvents.FormClose(Sender: TObject; var Action: TCloseAction); begin //se qualquer form for fechado então //a aplicação será encerrada Application.Terminate; end; var i: integer; begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TFormPainel, FormPainel); for i:= 0 to Screen.FormCount-1 do begin Screen.Forms[i].OnActivate:= UniversalEvents.FormActivate; Screen.Forms[i].OnClose:= UniversalEvents.FormClose; end; Application.Run; end. E agora o código do form que contém os botões pra troca de telas: unit U_Painel; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls; type TFormPainel = class(TForm) Panel1: TPanel; Btn1: TSpeedButton; Btn2: TSpeedButton; procedure Btn1Click(Sender: TObject); procedure Btn2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormPainel: TFormPainel; implementation uses Unit1, Unit2; {$R *.dfm} procedure TFormPainel.Btn1Click(Sender: TObject); begin Form1.Show; end; procedure TFormPainel.Btn2Click(Sender: TObject); begin Form2.Show; end; end. E pronto! Agora ao invés de utilizar os eventos OnFormShow e OnFormClose será que não daria pra usar um TApplicationEvents pra responder ao comando de troca de form pra poder alterar o parent do form de painel de botões?
  7. Olá amigos. Preciso de uma ajuda... Imagine que em uma aplicação tenho vários forms. Quero ter uma barra lateral sempre visivel que deve ser tipo um painel com botões para navegar por entre os forms. Este painel é um só para a aplicação inteira, ou seja, ao trocar de form o painel com os botões deve aparecer neste outro form também. Tem algum componente especifico pra isso em vez de ter que ficar dando um ctrl+c e ctrl+v no painel? Se eu fizer ctrl+c e ctrl+v no painel pra copiá-lo para os demais forms, vai dar o maior trabalho ter que sempre repetir o código dos botões e se mudar algo tem que copiar tudo de novo correndo o risco de deixar algum form desatualizado... Tem que ser botões grandinhos pra usar com display touch-screen então por isso não uso tabcontrols ou menus. Também não gosto de usar notebook porque acho que o controle dele me faz perder muito tempo ao fazer o layout dos forms e além disso todas as funções e eventos de objetos ficariam acumulados em uma unica unit deixando o código muito desorganizado... Agradeço sugestões (pode ser um componente das novas versões do delphi [embarcadero])
  8. Muito obrigado, era dessas informações que eu precisava.
  9. Caros amigos. Dentre as duas operações qual consome mais tempo de processamento: divisão "/" ou deslocamento de bits ">>" ? Um exemplo: high_byte= (byte)(word_val / 256); low_byte = (byte)(word_val & 0xFF); //ou high_byte= (byte)(word_val >> 8); low_byte = (byte)(word_val & 0xFF);
  10. Cara era isso mesmo, você matou a charada! Quando coloquei esses "guards" deu certo. Não entendo o porquê disso mas tá compilando certinho agora. Bom demais! Muito obrigado pessoal, vocês são 10! Agora pode fechar o tópico porque foi finalizado com chave de ouro!
  11. Infelizmente nenhum código funcionou no meu compilador... Eu uso um compilador pra microcontrolador que se mostra um pouco limitado. Agradeço a ajuda de todos aqui.
  12. Para que possa abrir um arquivo que tem extensão associada a um aplicativo específico use o comando "ShellExecute". Abaixo um trecho de código para seu uso: Em "Uses" declare ShellAPI No evento do clique do botão, coloque o código: Shellexecute(handle,'open',pchar(file_name),nil,nil,SW_shownormal); //file_name é local+nome do arquivo. Exemplo: file_name:= 'c:\congelados\020712.btw' Exemplo em que o usuário digitou "020712" no Edit e depois clicou no botão: procedure TForm1.Button1Click(Sender: TObject); var file_name: string; begin file_name:= 'C:\congelados\' + Edit1.Text + '.btw'; if(FileExists(file_name))then //verifica se o arquivo existe Shellexecute(handle,'open',pchar(file_name),nil,nil,SW_shownormal) except ShowMessage('ERRO 404'); //erro de arquivo não encontrado end;
  13. Continua dando erro... Achei que poderia ser por causa do nome "TPoint" aí mudei para o código: typedef struct TPxy{ int x; int y; }TPxxyy; Ao compilar aparecem as mensagens: identifier 'TPxxyy' redeclared was declared as: 'struct TPxy' now declared as: 'struct ' struct/union/enum/class tag 'TPxy' redefined
  14. Agradeço as considerações a respeito do código. A chamada da função funcionou do modo como sugeriu "distancia((TPoint){0, 0}, (TPoint){100, 100});" Mas agora ao compilar o código aparece este erro: identifier 'TPoint' redeclared was declared as: 'struct' now declared as: 'struct' E não existia esta struct em nenhum lugar antes. Tanto que mudei o nome da struct para "TMyPoint" e continua dando o mesmo erro. Alguma ideia do porquê?
  15. Em C puro, tendo uma função que possui uma estrutura como parametro, posso passar valores puros pra função e esses valores serem interpretados como sendo uma estrutura? Exemplo: typedef struct{ int x; int y; }TPoint; int distancia(TPoint A, TPoint B) { return(sqrt(sqr(Bx-Ax) + sqr(By-Ay))); } void main(void) { int d; d = distancia(TPoint(0,0), TPoint(100,100)); //<--- queria fazer esta mágica aqui printf("A distancia é %d",d); }
  16. Talvez possa fazer deste modo: //Na cláusula Uses adicione "ShellAPI" e "StrUtils" //Colocar na tela um Edit (Edit1) e um Botão (Button1) //Função Execute - abre o arquivo pelo notepad // retorna True caso consiga abrir o arquivo // retorna False caso não consiga abrir o arquivo function Execute(FileName, Parameter: string): boolean; begin if(FileExists(Parameter))then begin try ShellExecute(Application.Handle, nil, PChar(FileName), // Filename with path PChar(Parameter), // Parameters (not needed) PChar(Parameter), // path of file SW_SHOW); result:= True; //operação bem sucedida except result:= False; //erro na operação end; end else result:= False; //erro na operação (arquivo não encontrado) end; //Evento "OnClick" do botão TButton1 procedure TForm1.Button1Click(Sender: TObject); var filename: string; begin case AnsiIndexStr(Edit1.text, [ '020000', //string referente ao indice 0 do case '020712', //string referente ao indice 1 do case '020712' //string referente ao indice 2 do case //adicione outras strings aqui e o indice relativo abaixo seguindo a ordem ]) of 0: ShowMessage('ERROR 404'); 1: begin filename:= '020712'; ShowMessage('Carre Suino congelado ' + filename +#13#10 + 'Clique em OK para abrir o arquivo'); if(Execute('notepad','c:\congelados\' + filename + '.btw') = False)then ShowMessage('Falha ao abrir o arquivo "c:\congelados\' + filename + '.btw"'); end; 2: begin filename:= '20714'; ShowMessage('Picanha Premium Congelada ' + filename +#13#10 + 'Clique em OK para abrir o arquivo'); if(not Execute('notepad','c:\congelados\' + filename + '.btw'))then ShowMessage('Falha ao abrir o arquivo "c:\congelados\' + filename + '.btw"'); end; end; end; Outras opções: - Colocar um Memo na tela e abrir o arquivo no Memo ao invés do notepad. - Ao invés do usuário ter que digitar o nome do arquivo você poderia alistar todos os arquivos em um ComboBox e o usuário apenas teria que selecionar o arquivo na lista do combobox. Se usar um ComboBox poderia colocar o titulo do arquivo (exemplo: Picanha Premium Congelada) para o usuario selecionar ao invés do nome numérico do arquivo e internamente no programa chamar o arquivo usando como base o indice do item selecionado no ComboBox (combobox.itemindex)
  17. Creio que este Comport que anexei é o que você está precisando. TComPort_V1.5.rar
  18. Vou tentar explicar. Você vinculou vários componentes uma única função "OnSelectSell" que você chamou de "colorir_celula". Quando esta função é chamada por um componente, o endereço deste componente é passado pra função sob o nome "Sender". Para que você acesse os atributos deste componente dentro da função você deve usar o endereço "Sender". Deu errado seu codigo anterior porque dentro da funçao "colorir_celula" você estava acessando os atributos do ultimo componente criado e endereçado sob o nome "grade". Por isso ao usar o comando ""TStringAlignGrid(Sender)." deu certo xD
  19. Dentro da função "colorir_celula" troque os comandos "grade." por "TStringAlignGrid(Sender)." que deve resolver
  20. Componente ComPort: https://sourceforge.net/projects/comport/ Deve-se instalar os dois packages, o DsgnCport e o CportLib. O codigo que você indicou já faz parte do componente CPort. Para usar deve-se: 1- indicar a porta serial. Exemplo: ComPort1.Port:= COM1; 2- selecionar um baudrate padrão. Exemplo: Comport1.BaudRate:= br115200; Ou usar um baudrate customizado. Exemplo: ComPort1.BaudRate:= brCustom; ComPort1.CustomBaudRate:= 250000; 3- abrir a porta serial através do comando "ComPort1.Open;" ou "Comport1.connected:= true;" 4- envio de string pela porta pelo comando: ComPort1.WriteStr('texto'); 5- recepçao serial: recomendo usar o evento OnRxChar. Dentro do evento pra ler o que recebeu use o comando: Comport1.ReadStr(string_destino,Count); //string destino é uma variavel criada por você pra armazenar o que recebeu. Count é variavel da propria funçao que indica qtos bytes foram recebidos. 6- pra fechar a porta é só usar o comando "Comport1.close;" ou "Comport1.connected:= False;" Função util: Para enumerar, ou alistar, as portas seriais identificadas no PC coloque um combobox e no evento "OnDropDown" do combobox você coloca o codigo: "TTComboBox(Sender).items.clear; EnumComPorts(TCombobox(Sender).items);" Eu usei este componente até com controle de fluxo Xon/Xoff e funciona muito bem.
  21. procedure Port_Find_and_Replace(); var SL: TStringList; OD: TOpenDialog; ind_line: integer; tmp_line: string; original_port: string; new_port: string; inside_ecf: boolean; spaces_before: integer; begin //pergunta qual porta serial o usuário quer salvar no arquivo new_port:= InputBox('Nova porta serial','Nova porta serial:','COM1'); if(Pos('COM',new_port) = 0)then begin ShowMessage('Digitou uma porta inválida. Operação cancelada'); exit; end; //cria um OpenDialog com o filtro de arquivos XML OD:= TOpenDialog.Create(Application); OD.Filter:= 'Arquivos xml|*.xml'; if(OD.Execute)then begin original_port:= ''; //cria um StringList para armazenar o arquivo XML SL:= TStringList.Create; SL.LoadFromFile(OD.FileName); //procura a entrada "<ECF>" no StringList inside_ecf:= False; for ind_line:= 0 to SL.Count-1 do begin //verifica se encontrou a entrada "<ECF>" if(Pos('<ECF>',SL.Strings[ind_line]) <> 0)then inside_ecf:= True; //verifica se saiu da entrada "<ECF>" por segurança if(Pos('</ECF>',SL.Strings[ind_line]) <> 0)then begin inside_ecf:= False; break; end; //verifica se encontra a entrada "<PortaSerial>" dentro de "<ECF>" if(inside_ecf)then begin if(Pos('<PortaSerial>',SL.Strings[ind_line]) <> 0)then begin //armazena a linha completa onde está a porta serial original tmp_line:= SL.Strings[ind_line]; //conta os espaços pra manter identação spaces_before:= 0; while(tmp_line[1] = ' ')do begin spaces_before:= spaces_before + 1; //apaga o espaço da linha Delete(tmp_line,1,1); end; //apaga caracteres até chegar ao fim do texto "<PortaSerial>" Delete(tmp_line, Pos('<PortaSerial>',tmp_line), length('<PortaSerial>')); //apaga caracteres a partir de "</PortaSerial>" Delete(tmp_line, Pos('</PortaSerial>',tmp_line), length('</PortaSerial>')); //o que sobrou é o texto "COMx". Interrompe a busca original_port:= tmp_line; break; end; end; end; //verifica se encontrou uma porta serial válida no arquivo if(Pos('COM',original_port) <> 0)then begin //retorna os espaços ao conteúdo da linha para manter identação tmp_line:= ''; while(spaces_before > 0)do begin spaces_before:= spaces_before-1; tmp_line:= tmp_line + ' '; end; //salva a linha inteira com a porta original substituída pela porta nova SL.Strings[ind_line]:= tmp_line + '<PortaSerial>' + new_port + '</PortaSerial>'; //salva o arquivo SL.SaveToFile(OD.FileName); //indica que o arquivo foi alterado e salvo ShowMessage('Porta serial ' + original_port + ' substituída por ' + new_port); end else ShowMessage('Porta serial não encontrada'); //libera o OpenDialog e o StringList da memória OD.Free; SL.Free; end; end; Basta chamar a função "Port_Find_and_Replace()" a partir do clique de um botão, por exemplo

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!