
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Como compactar arquivos usando o compactador do XP?
pergunta respondeu ao Renatosky de Micheus em Delphi, Kylix
Renatosky, se você já sabe como fazer utilizando o programa Winzip, com seus parâmetros, então não deverá ter muita dificuldade em utilizar o backup do Windows. O que você está aparentemente precisando saber é: 1) Nome do programa: NTBackup.exe 2) Parâmetros a serem passados: podem ser vários, então, acesse o menu Iniciar do seu Windows, ache a opção Executar..., digite o texto ntbackup /? e tecle ENTER. Você deve ver o arquivo de help sendo aberto justamente mostrando os parâmetros de linhas de comando para o programa. Abraços -
powerz, você já consegue fazer a consulta que retorna estas informações? Este é o primeiro passo.No quickreport, basicamente você deverá ter uma banda Title e um detail. Mas isto vai mesmo depender de como você estará obtendo os dados para o relatório e do lay-out desejado. (faltariam mais informações, para que alguém dê algum pitaco mais acertado ;)). A questão de como enviar arquivos você pode se basear nestes tópicos:- Anexar Arquivo A E-mail, Anexar arquivo a e-mail - Como Enviar Email Através Do Delphi? Quanto ao relatório a ser enviado, entra em questão o formato em que você pretende enviar. Provavelmente você terá que exportá-lo em outro formato (diferente do .qrp) de modo que, quem o receba consiga lê-lo. Dê uma olhada nestes posts: - converter qrp para txt - Exportar Qrp p> Jpg Ou quem sabe, utilizar outro gerador de relatórios. Espero que outros colegas lhe dêem mais algumas sugestões. Abraços
-
(Resolvido)Exportar para excell
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
Que sacanagem... :( utiliza a propriedade FormatNumber antes da atribuição:Excel.Cells[i +1, 4].NumberFormat := '#.##0,00'; só tem que observar que o separador de decimal e milhar são os definidos na configuração local do Windows, logo, é conveniente montar esta máscara usando o formato das configurações do usuário e não o formato como coloquei (o padrão americano, seria #,##0.00). Abraços -
Marcos, acho que a lógica seria mais ou menos essa: // DiaInicial - equivalente ao dia da semana de onde começar // QtdAulas - quantidades de aulas a gerar para o dia procedure GeraAulas(DiaInicial :TDateTime; QtdAulas :Byte); var DiaInicial, DiaFinal :TDateTime; begin // inicialização da querie de feriados with qryFeriados do begin Close; SQL.Clear; SQL.Add('Select dt_Feriado'); SQL.Add('From Tab_Feriado'); SQL.Add('Where dt_Feriado = :dt_Feriado'); end; // inicialização da querie para inserção with qryAuxiliar do begin SQL.Clear; SQL.Add('Insert Into Tab_Calendario (dt_Aula, id_Professor, id_Materia) '); SQL.Add('values(:dt_Aula, :id_Professor, :id_Materia)'); end; DiaFinal := <data>; // indica a última data do ano a ser considerada while DiaInicial < DiaFinal do begin // verificar se o dia sendo processado está cadastrado como feriado qryFeriados.ParamByName('dt_Feriado').AsDateTime := DiaInicial; qryFeriados.Open; if not qryFeriados.RecordCount = 0 then begin // repetiremos a inclusão para a quantidade de aulas do dia // talvez, você precise adicionar um campo na tabela que indique // de que aula está tratando (1ª, 2ª ou 3ª) for Idx := 1 to QtdAulas do begin qryAuxiliar.ParamByName('dt_Aula').AsDateTime := DiaInicial; qryAuxiliar.ParamByName('id_Professor').AsInteger := StrToInt(Trim(GetStrEsquedo(cbbProfessor.text,'-'))); qryAuxiliar.ParamByName('id_Materia').AsInteger := StrToInt(Trim(GetStrEsquedo(cbbMateria.text,'-'))) qryAuxiliar.ExecSQL; end; end; qryFeriados.Close; // avançamos uma semana para gerar aulas no mesmo dia da semana seguinte DiaInicial := DiaInicial +7 end; end; Veja se seria por aí. Abraços
-
Se você tem a versão Standard do QuickReport, então não existe realmente o filtro (conforme significado da mensagem). Veja este post. Abraços
-
maikel, você estaria fazendo uso de recursos da DLL VideoCap (AVICAP32.dll)? Se for, dê uma olhada na mensagem WM_CAP_FILE_SAVEAS. Veja como usá-la com uma função extraída da unit AviCap.pas (655linhas de interface para acessar AVICAP32.DLL): function capFileSaveAs(hwnd:THandle; szName:LongInt):LongInt; begin Result := SendMessage(hwnd, WM_CAP_FILE_SAVEAS, 0, szName); end; hwnd é o handler alocado para a janela de visualização (não o handler do Panel). Faça um teste Abraços
-
você precisa apenas colocar na máquina do cliente, além do executável, uma biblioteca DLL.No servidor (onde instalou o servidor FireBird), você encontra na pasta de instalação do mesmo uma sub-pasta chamada "Bin" (ex. C:\Arquivos de programas\Firebird\Firebird_2_0\bin). Nesta pasta existe a DLL fbclient.dll . Mas dependendo do componente de acesso que você está utilizando, isto poderá variar. Por exemplo, se utilizar os componentes da paleta IB (Interbase), estes esperam localizar a DLL GDS32.DLL. Se na instalação do banco FireBird foi marcada a opção para cópia da dll para compatibilidade, no seu servidor (pasta c:\Windows\System32) existirá um o arquivo GDS32.dll, que nada mais é do que a fbclient.dll renomeada. Se estiver utilizando Zeos, você terá que levar a dll de acordo com a versão que você selecionou em seu componente de conexão... Então, acho que seria mais interessante você dar mais detalhes a respeito de que forma de acesso ao banco você está utilizando. Abraços
-
Mostrar no DbGrid as aulas em vermelho apartir de uma contagem
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
robinhocne, você utiliza alguma ferramenta para mexer com a estrutura do banco de dados? Tipo IBExpert, por exemplo? -
(Resolvido)Exportar para excell
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
João, acho que é apenas um problema de "lógica" com seu procedimento. Experimente deste modo e leia os comentários que coloquei no seu código alterado: procedure Tfrm_pedidos.Button3Click(Sender: TObject); var i :integer; excel :variant; begin try excel := CreateOleObject('excel.application'); if not Excel.Application.Visible then Excel.Application.Visible := true; Excel.WorkBooks.Add; // Cabeçalho da sua tabela - linha 1 Excel.Cells[1, 1] := 'Descricao'; Excel.Cells[1, 2] := 'Qtd.'; Excel.Cells[1, 3] := 'Vlr. Unit'); Excel.Cells[1, 4] := 'Vlr. Total'; i:=2; // dados são colocados a partir da linha 2 ZQuery_gridpesq.First; While not .ZQuery_gridpesq.Eof do begin Excel.Cells[i, 1] := ZQuery_gridpesq.FieldbyName('descricao').asString; Excel.Cells[i, 2] := ZQuery_gridpesq.FieldbyName('quantidade').asString; Excel.Cells[i, 3] := ZQuery_gridpesq.FieldbyName('valor_unit').AsFloat; Excel.Cells[i, 4] := ZQuery_gridpesq.FieldbyName('valor_total').AsFloat; inc(i); ZQuery_gridpesq.Next; end; // ao sair do loop, você já terá encontrado o EOF do dataset // e o valor de "i" será o da linha seguinte ao do último valor. // Inicializa a fórmula 2 linhas após a última // com dados do dataset. Excel.Cells[i +1, 3] := 'Total: '; // inicializamos a fórmula dinamicamente para apontar para o // segmento da 2ª linha até a última preenchida (valor final de "i") Excel.Cells[i +1, 4] := Format('=SOMA(D2:D%d)', [i]); // grava arquivo excel excel.Workbooks[1].Saveas('C:\a.XLS'); except showmessage('Ocorreu erro ao executar a transferência'); end; end; O componente que o vms postou é bem interessante, porém não me parece que ele exporte totais, já que em DBGrid não existe esta linha para ser exportada. Talvez o colega vms possa dar alguma dica a esse respeito respeito. Abraços -
noiss, então neste caso, verifique se no código do seu programa você colocou fixo o endereço do servidor que não é mais válido. Altere-o para o novo IP do servidor, de modo a possibilitar a conexão com o banco que lá está, recompile o executável e redistribua-o aos clients. Sendo esta a situação, a melhor opção seria possibilitar que o endereço de acesso ao banco fosse configurado e gravado em um arquivo ini ou registro do windows, assim você não precisaria alterar o executável a cada vez que o servido mude. Abraços
-
Bom, eu implementei o código aqui (eu utilizei o Bloco de Notas como programa) e observei o seguinte: - O registro da extensão só é realizado quando executado o programa pela conta do Administrador. Como usuário "normal", há erro na criação da chave (já na primeira chamada à EditarChave); - Uma vez executado o programa, o registro foi feito corretamente: aparecem em HKEY_CLASSES_ROOT as chaves ".QRP" e "ArquivoQRP" (devidamente configurado); - Já ao visualizar o arquivo no Windows Explorer, o ícone não se alterou. Entretanto, no menu de contexto (clicar o botão direito sobre nome do arquivo) aparece como default a opção "Abrir com Bloco de Notas" (conforme configurado) bem como ao dar um duplo-click o arquivo é aberto com o bloco de notas. Assim, acho que possivelmente você já teria mesmo associado a extensão para teste, porém por não executar o programa como Administrador (login do Windows) as alterações no registro não foram feitas. É só uma hipótese, mas que você pode verificar olhando o arquivo de registros e procurando pelas duas chaves que deveriam ter sido criadas. Abraços
-
Carlos, não há do que se desculpar não. Desculpe se me fiz parecer rude. :blush: O comentário foi apenas no sentido de salientar que fazer este tipo de validação em uma opção Sair do menu não é o mais apropriado já que ainda há outras opções de fechar a aplicação sem usar o menu. é possivel colocar isto no evento onclose do form, aí, independente, irá apresentar a mensagem.Sim, você está certo. Mas, eu penso que o evento OnCloseQuery (questiona fechamento) é o lugar mais apropriado porque ele tem exatamente esta finalidade: possibilitar que o processo de fechamento do form seja interrompido através da atribuição de False ao parâmetro CanClose (pode fechar). ah... se possível, utilize as tag's QUOTE (o balãozinho em modo edição) e CODE (o ícone parecido com um pergaminho), pois elas facilitam a leitura dos posts ;) E vms, meu nome é com u e não com ll. ;) Abraços
-
Mostrar no DbGrid as aulas em vermelho apartir de uma contagem
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
É mais ou menos isto a que me referia sim. Entretanto, observe que este outro "contador" tem que ser sequencial pela Categoria, caso contrário ficaria igual a pOrd e não surtiria o efeito desejado. Na prática você deveria declarar uma variável local para cada categoria, inicializá-las, incrementá-las conforme a categoria e retornar em o respectivo valor da categoria sendo retornada na variável a ser retornada (pAul). Vejamos se consigo fazer a alteração na procedure que resulte nisto que citei: CREATE PROCEDURE STPCSLAUL ( palu numeric(6,0)) returns ( pord numeric(3,0), pAul Numeric (3,0), pins numeric(2,0), pdat date, phor time, pcat char(2)) as DECLARE pCuntCatA INTEGER; DECLARE pCuntCatB INTEGER; DECLARE pCuntCatC INTEGER; DECLARE pCuntCatD INTEGER; DECLARE pCuntCatE INTEGER; BEGIN pOrd = 0; pCuntCatA = 0; pCuntCatB = 0; pCuntCatC = 0; pCuntCatD = 0; pCuntCatE = 0; FOR Select P.Instrutor, P.Data, P.Horario, P.Categoria From AulasPraticas P, Instrutores I Where P.Aluno=:pAlu AND P.Status=1 AND I.Codigo=P.Instrutor ORDER BY P.Data, P.Horario INTO :pIns, :pDat, :pHor, :pCat DO BEGIN pOrd = :pOrd + 1; IF pCat = "A" THEN BEGIN pCuntCatA = :pCuntCatA +1; pAul = :pCuntCatA; END ELSE IF pCat = "B" THEN pCuntCatB = :pCuntCatB +1; pAul = :pCuntCatB; END ELSE IF pCat = "C" THEN pCuntCatC = :pCuntCatC +1; pAul = :pCuntCatC; END ELSE IF pCat = "D" THEN pCuntCatD = :pCuntCatD +1; pAul = :pCuntCatD; END ELSE IF pCat = "E" THEN pCuntCatE = :pCuntCatE +1; pAul = :pCuntCatE; END SUSPEND; END END aí o tal do teste seria por este campo que armazena o sequencial por categoria (pAul): (Trim(DtmIza.QryPraticas.FieldByName('pCat').AsString) = 'C') and (DtmIza.QryPraticas.FieldByName('pAul').AsInteger > 5) Veja aí se você entendeu o "espírito da coisa". Abraços -
é econômico mas não funcional, se este código for posto no evento do menu. Isto porque se o usuário teclar ALT+F4 ou clicar no grande "X", esta confirmação não ocorrerá e a aplicação será fechada. vms, complementando... Supus que "confirmar saida.Checked" refira-se a uma opção de menu que equivá-la a uma configuração onde estando marcado deverá ser apresentada a mensagem para confirmação, e não a uma ação. acho que é isto que o código que propus faz. Voce o testou? Abraços
-
Não estou certo, mas acho que pode ter algo a ver com a versão do Excel que estaria sendo inicializada. Caso mais ninguém dê uma sugestão, talvez você pudesse utilizar OLE para fazer esta exportação. Veja esta dica: Exportar dados de um DBGrid para o Excel ou este tópico: Exportar Para O Excel Abraços
-
Como controlar o acesso simultaneo em um tabela para que 2 usuários nã
pergunta respondeu ao cassios de Micheus em Delphi, Kylix
Penso que não é uma boa idéia (impedir que outro usuário faça um cadastro).O que deve ocorrer é uma mudança de paradigma - tente deixar de lado os conceitos da programação mono-usuário. Neste contexto, o que deve ser observado é que o tal número que você retorna ao usuário, só deve (pode) ser retornado ao mesmo após a gravação da informação - não ao iniciar. Assim, você deve, ou seguir a sugestão que o Jhonas deu e definir o campo como auto-increment, ou então, obter este novo número (coisa que aparentemente você já faz) no último momento em que você for gravar a informação - como é o caso do efento BeforePost do dataset. Locar tabelas, não é muito conveniente, visto que você deixará outros usuários impedidos de acessá-la - isto pode deixa-los bastante irritados. :D No máximo, o lock de registros durante a alteração (não a inclusão), o que é normalmente previsto pelos gerenciadores, ou devem ser setados explicitamente. Abraços -
Carlos não lembro de ter visto questinamentos sobre este assunto aqui na sessão Delphi. Mas lembro de ver vários questionamentos nestes outros dois foruns que frequento: DevMedia ActiveDelphi os atalhos são da página de pesquisa. Apenas coloque como palavra chave ECF e dê uma passada pelos tópicos que lá aparecem. No DevMedia tem um tópico ("Sistema ECF completo LIVRO [ECF Na Visão de Um Programador]") que pode ser interessante. Abraços
-
vms, na verdade para a saída do aplicativo basta que você chame o método Close certo?! Quando um form é fechado, dois eventos ocorrem: OnCloseQuery e OnClose. No caso do form principal, quando ele é fechado sua aplicação é encerrada. Assim, não se faz necessário para este form o uso do evento OnClose setando Action com caFree. Este método é interessante quando mostramos um form com Show e ao ser fechado pelo usuário, queremos que ele seja liberado da memória. Assim, sugiro que você utilize o evento OnQueryClose, onde você deverá setar o parâmetro CanClose para True caso queira que seu form (e aplicação, neste caso) seja fechado. procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin CanClose := True; if ConfirmarSaida1.Checked then // se deve confirmar a saída... if MessageDlg('Deseja Sair do Aplicativo?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then CanClose := False; end; Observe, que inicialmente permitimos o fechamento do form, ao inicializarmos o parâmetro com true. Depois, se verificado que deve ser feita a confirmação de saída, emitimos a mensagem para confirmação, porém mudamos o valor do parâmetro apenas se o usuário responde que não quer sair - quando setamos o parâmetro com false. Isto deve funcionar de acordo com o que você pretende. Contudo, há um item a ser levado em conta, que é quando sua aplicação está em funcionamento e o usuário encerra a sessão do Windows sem ter finalizado ela antes. Veja este tópico. Abraços
-
Com certeza pensando em WEB a melhor opção seria MySQL por ser o mais difundido neste meio.Entretanto, acho que a questão servidor - web, não chega a ser relevante visto que em uma rede corporativa, você também terá o banco instalado em um servidor na empresa. Eu tenho preferência pelo FireBird. Quanto a componentes de acesso, para iniciar é interessante realmente trabalhar com os componentes já disponíveis com o Delphi (paleta Interbase para Interbase e Firebird). Entretanto, quando dominar um pouco mais as nuances deste tipo de implementação, eu sugeriria o uso de componentes da paleta Zeos. Vejo como benefício a facilidade de migração da aplicação para outros bancos de dados (free) que são suportados pelo componente. Outro tópicos referentes ao assunto: Banco De Dados Aprender, Dúvida quanto a escolha Uma Duvida Sobre Firebird, Consulta WEB Abraços
-
Eder, o link que o Jhonas lhe passou inicialmente contém o código que você precisa implementar para o que você deseja - está mais ao final do artigo (Automatizando a tarefa com o Delphi). Vou postá-lo aqui (ref. Associando extensão de arquivo à uma aplicação Delphi): procedure RegistrarExtensao(const Extensao, TipoArquivo, NomeAplicacao, Executavel: string); var ChaveArquivo: string; Registro: TRegistry; procedure EditarChave(const Chave, Valor: string); begin Registro.OpenKey(Chave, True); Registro.WriteString('', Valor); Registro.CloseKey; end; begin Registro := TRegistry.Create; try Registro.RootKey := HKEY_CLASSES_ROOT; Registro.LazyWrite := False; ChaveArquivo := ‘Arquivo’ + Extensao; //Registra a extensão EditarChave(’.’ + Extensao, ChaveArquivo); //Define a descrição para o tipo de arquivo EditarChave(Format(’%s’, [ChaveArquivo]), TipoArquivo); //Adiciona uma entrada no menu de contexto EditarChave(Format(’%s\shell\open’, [ChaveArquivo]), Format(’&Abrir com %s’, [NomeAplicacao])); //Associa a extensão à aplicação EditarChave(Format(’%s\shell\open\command’, [ChaveArquivo]), Format(’”%s” “%s”‘, [Executavel, ‘%1′])); //Define o ícone associado ao tipo de arquivo EditarChave(Format(’%s\DefaultIcon’, [ChaveArquivo]), Format(’%s, 0′, [Executavel])); finally Registro.Free; end; //Notifica o SO da alteração na associação do tipo de arquivo SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); end; procedure RegistrarExtensaoQRP; begin RegistrarExtensao(’QRP’, ‘Arquivo de visualização de relatório’, ‘AbrirQRP’, ParamStr(0)); end; procedure TfrmPrincipal.FormCreate(Sender: TObject); begin RegistrarExtensaoQRP; end; Na prática, você vai precisar da procedure RegistrarExtensao apenas, e no seu form você utilizará o comando: RegistrarExtensao('QRP', 'Arquivo de visualização de relatório', 'AbrirQRP', <path e nome do programa de terceiro>); Abraços Eder, o link que o Jhonas lhe passou inicialmente contém o código que você precisa implementar para o que você deseja - está mais ao final do artigo (Automatizando a tarefa com o Delphi). Vou postá-lo aqui (ref. Associando extensão de arquivo à uma aplicação Delphi): procedure RegistrarExtensao(const Extensao, TipoArquivo, NomeAplicacao, Executavel: string); var ChaveArquivo: string; Registro: TRegistry; procedure EditarChave(const Chave, Valor: string); begin Registro.OpenKey(Chave, True); Registro.WriteString('', Valor); Registro.CloseKey; end; begin Registro := TRegistry.Create; try Registro.RootKey := HKEY_CLASSES_ROOT; Registro.LazyWrite := False; ChaveArquivo := ‘Arquivo’ + Extensao; //Registra a extensão EditarChave(’.’ + Extensao, ChaveArquivo); //Define a descrição para o tipo de arquivo EditarChave(Format(’%s’, [ChaveArquivo]), TipoArquivo); //Adiciona uma entrada no menu de contexto EditarChave(Format(’%s\shell\open’, [ChaveArquivo]), Format(’&Abrir com %s’, [NomeAplicacao])); //Associa a extensão à aplicação EditarChave(Format(’%s\shell\open\command’, [ChaveArquivo]), Format(’”%s” “%s”‘, [Executavel, ‘%1′])); //Define o ícone associado ao tipo de arquivo EditarChave(Format(’%s\DefaultIcon’, [ChaveArquivo]), Format(’%s, 0′, [Executavel])); finally Registro.Free; end; //Notifica o SO da alteração na associação do tipo de arquivo SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil); end; procedure RegistrarExtensaoQRP; begin RegistrarExtensao(’QRP’, ‘Arquivo de visualização de relatório’, ‘AbrirQRP’, ParamStr(0)); end; procedure TfrmPrincipal.FormCreate(Sender: TObject); begin RegistrarExtensaoQRP; end; Na prática, você vai precisar da procedure RegistrarExtensao apenas, e no seu form você utilizará o comando: RegistrarExtensao('QRP', 'Arquivo de visualização de relatório', 'AbrirQRP', <path e nome do programa de terceiro>); Abraços
-
Acho que agora conseguiremos avançar mais, então penso que tem uma forma sim! Vamos lá... Se o código no lado do Client está assim mesmo, então fica complicado ao receber no lado do Server. O ideal é que a informação chegue completa, ou seja, todos os campos de uma só vez (enviadas com um único SendText), assim ela é processada em uma única string (quando processada ReceiveText). Padronizando o formato da mensagem a ser enviada, teremos facilidade no seu recebimento e interpretação. Eu não estou certo de que sempre será enviado nesta sequência (Identificação Client, Comando diverso, Comando Hexa), mas vou supor que sim, então vamos tentar algo assim: procedure ... var CmdHexa :string; begin CmdHexa := #$AA#$55#$03#$07#$1F; // imagino que este valor fixo seja apenas para teste, // então fica conveniente colocá-lo em uma variável // e a string legível poderá conter caracteres "estranhos" ClientSocket1.Socket.SendText(Format('%s|%s|%s',[ComboBox1.Text, Edit1.Text, CmdHexa])); end; o que estamos fazendo é utilizar o caracter "|" como delimitador de campo. Assim, termos os três campos bem definidos. Há viabilidade até de algum dos campos ficarem nulos, sem gerar problemas. Da forma como estava sendo enviada a mensagem pelo Client (uma sequencia Hexa e outra com identificação/comando) ficaria mais complicado manipular a informação recebida pelo Server. Com a formatação proposta, teremos facilidade em tratar a mensagem recebida, com exemplificado: var ClientId, HexaValue, ReceivedCmd, ReceivedMsg :String; DelimiterIdx :Integer; begin ReceivedMsg := Socket.ReceiveText; // retiramos o primeiro campo: Identificação DelimiterIdx := Pos('|', ReceivedMsg); ClientId := Copy(ReceivedMsg, 1, DelimiterIdx -1); Delete(ReceivedMsg, 1, DelimiterIdx); // retiramos o segundo campo: Comando diverso DelimiterIdx := Pos('|', ReceivedMsg); ReceivedCmd := Copy(ReceivedMsg, 1, DelimiterIdx -1); Delete(ReceivedMsg, 1, DelimiterIdx); // o que sobra é o terceiro campo: Comando Hexa HexaValue := CharsToHexa(ReceivedMsg); // será o texto legível que no caso do exemplo anterior // irá conter o texto "$AA$55$03$07$1F", enquanto que // o texto recebido seria visualizado como "ªU□□□" // (se não me engano) que deve ser o texto em // ReceivedMsg neste ponto do código Memo1.Lines.Add(Format('De: %s > %s %s', [Socket.RemoteAddress, ReceivedCmd, HexaValue])); Memo1.SelStart:= Length(Memo1.Lines.Text); //... ListBox1.ItemIndex := ListBox1.Items.Add(ReceivedCmd); //... Setup.ComPort1.WriteStr(ListBox1.Items.Text); end; É apenas uma adaptação do que você postou. Espero que você capte o espírito da coisa e o adeque a seu código. Abraços
-
para facilitar, você poderia colocar a formatação desta string, tipo: 0-9 = identificação cliente (ex: Cliente<idx> 10-20 = comando (ex: CMDxx) 21-30 = valor hexadecimal (ex: AA55030201) também, acho que seria útil, visualizar o código que faz a formatação e o envio desta string pelos Clients, e do lado do Server, o código que processa este recebimento. Assim, acredito que ficaria mais fácil ter uma idéia melhor sobre a questão. Abraços.
-
Ricardo, este é um tipo de assunto bem específico e que você provavelmente vai achar pouca coisa (ou nada) a respeito nos forums de programação. Talvez em forums de eletrônica você tenha mais sucesso. Nesta página tem alguma coisa sobre exemplos em Delphi: Saber Eletrônica (procure nela pelo texto "Delphi") Se estiver interessado em cursos: - Redes RS 485 com Microcontroladores PIC - Interfaces Gráficas para Supervisórios Industriais -Aplicações em Delphi. Abraços
-
pouco improvável, mas não impossível. Renato, por acaso este seu dataset MESROMCAR1, não possui os fields adicionados a ele? Se os possuir, faça o seguinte teste: exclua-os e reinclua-os (duplo click no componente, aparece lista de fields - remova todos e depois add all) Abraços
-
(Resolvido)Filtro banco de dados por hora
pergunta respondeu ao João Paulo Taraciuk de Micheus em Delphi, Kylix
João, apenas uma sugestão. Quando você não adiciona os campos ao dataset, fica mais legível e seguro você utilizar FieldByName(<nome>) do que Fiels[<indice>]. Legível porque só de olhar você sabe de quem está "falando" e seguro porque caso a ordem de algum campo vier a ser modificada no banco, ou algum novo campo incluído/excluído no meio, você pode ter problemas. Assim, no caso de: Edit2.Text := DM_agenda.ZQry_consulta.Fields[2].AsString; seria preferível: Edit2.Text:=DM_agenda.ZQry_consulta.FieldByName('Horario')AsString; Abraços