Ir para conteúdo
Fórum Script Brasil

paulobergo

Membros
  • Total de itens

    295
  • Registro em

  • Última visita

Tudo que paulobergo postou

  1. Como ler uma string de tras pra diante... e como obter o nome do diretório e o nome de um arquivo em uma string (acho que é isso que você quer, não é?) Procedure TForm1.Button1Click(Sender: TObject); Var cr, lf, sString, sLeft, sRight: String; iPos: Integer; Begin cr := chr(13); lf := chr(10); sString := 'c:\arquivos de programas\delphi6\lib\zeos\readme.txt'; iPos := Length(sString); While (iPos>0) do Begin If Copy(sString,iPos,1)='\' then Begin sLeft := Copy(sString,1,iPos-1); sRight := Copy(sString,iPos+1,Length(sString)-iPos); Break; End; {EndIf If Copy(sString,iPos,1)='\'} iPos := iPos-1; End;{While (iPos>0)} ShowMessage('Original='+sString+cr+ 'Parte esquerda='+sLeft+cr+ 'Parte direita='+sRight); // Mas, você bem que podia usar isso: sLeft := ExtractFileDir(sString); sRight := ExtractFileName(sString); ShowMessage('Agora, veja: '+cr+ 'Parte Esquerda = '+sLeft+cr+ 'Parte direita = '+sRight+cr+ 'Ok?'); End; Ok? Olha... uma boa coisa a fazer, independente da linguagem e do ambiente que você está usando, é procurar, no próprio help do software, palavras que correspondam ao que você está querendo... No caso do Delphi, filedir, filename, getcurrentdir, etc... levariam você a identificar a função... No caso, como estas funções estão na unit Sysutils (que, diga-se de passagem, tem realmente um montão de funções úteis), uma olhada na guia "see also" de qualquer coisa que você pesquise na ajuda, irá levá-lo a descobrir recursos que você nem imaginava descobrir... Ok?
  2. Olá! O problema é que preciso de um campo calculado (o valor de cada produto, no caso, qtde x custo)... Daí sou obrigado a colocar os campos necessários na definição da tabela... Quanto ao uso da tabela, realmente ela é aberta em um dbGrid, para correção de algumas informações... quanto ao Dbgrid não há problema... Agora estou pensando na possibilidade de criar o componente TTable em runtime... por enquanto, vou mantendo três ttables no form (um para VisualDBase, um para FoxPro e outro para MySQL)... De qualquer forma, grato pela atenção...
  3. Criando um TTable em "runtime", definindo o tipo dos campos numéricos conforme a tabela. Segue um fragmento da rotina de criação, em "runtime", de um componente TTable com tipos de campos variados. A motivação para isso é: - Tendo um programa para edição de uma tabela de inventário, é preciso que este programa abra tabelas de diferentes gerenciadores; as tabelas tem, em comum, determinados campos, necessários para se fazer um inventário: codigointerno, codigoean, descricao, unidade, custoun, saldo; - Uma vez que as tabelas podem ser diferentes (MySQL, Paradox, FoxPro ou VisualdBase7), os campos numericos são diferentes (tFloat ou tBCD)... e como há um campo calculado (no caso, o valor do produto = custoun X saldo), é preciso definir no dataset da tabela os campos que serão utilizados; - Como não conseguia "redefinir" os tipos dos campos que geravam problema (custoun e saldo), utilizava quatro componentes TTable distintos, um para cada tipo de gerenciador; - Para eliminar estes componentes, a solução foi criar um único TTable, em "runtime", com os campos necessários... Como o código todo é muito extenso, coloquei somente as partes mais importantes... Nome do form: formInveEdit ("formulário para Edição de Inventário") // Procedure TformInveEdit.FormCreate(Sender: TObject); Begin // Criar o componente TTable aqui, ao criar o form Invent := TTable.Create(Application); InventDS.DataSet := Invent; Invent.OnCalcFields := InventCalcFields; End; Procedure TformInveEdit.InventCalcFields(DataSet: TDataSet); Begin // Este evento "calcula" o valor de cada item, multiplicando o custo unitário pela quantidade // do produto. With Invent do Begin Try FieldByName('valor').AsFloat := FieldByName('custoun').AsFloat* FieldByName('saldo').AsFloat; Except FieldByName('valor').AsFloat := 0; End; End;{With Invent} End; Procedure TformInveEdit.AbrirButtonClick(Sender: TObject); // Botão para Abrir/Fechar a Tabela Var MyFieldCustoUnBCD, MyFieldSaldoBCD: TBCDField; MyFieldValor, MyFieldCustoFloat, MyFieldSaldoFloat: TFloatField; MyFieldDescricao: TStringField; Begin sTable := sTableEdit.Text; If AbrirButton.Caption = '&Abrir' then Begin If Invent.Active then Invent.Close; {EndIf} AbrirButton.Caption := 'Fechar'; Invent.TableName := sTable+IIF(bMySQLUse,'','.dbf'); // ********** Só consigo definir os campos na primeira vez que acesso a tabela. // Do contrário, teria que "destruir" o componente e criá-lo de // novo. If bFirstOpen then Begin // ********************** Definições dos campos. Início. // Primeiro, o campo "calculado", valor, sempre "tFloat". Invent.FieldDefs.Clear; MyFieldValorFloat := TFloatField.Create(Invent); // .Create(Invent); With MyFieldValorFloat do Begin FieldName := 'valor'; Calculated := True; DataSet := Invent; Name := 'Invent'+'valor'; DisplayFormat := '0.00'; Invent.FieldDefs.Add(Name, ftFloat, 0, false); Invent.FieldDefs.Update; End; MyFieldDescricao := TStringField.Create(Invent); With MyFieldDescricao do Begin FieldName := 'descricao'; Calculated := False; DataSet := Invent; Size := 6; Name := 'Invent'+'descricao'; Invent.FieldDefs.Add(Name, ftString, 06, false); End; If bMySQLUse or bIsParadox then // Se quero abrir uma tabela de inventário feita no Paradox ou MySQL, criar // campos de saldo e custo unitário como tFloat Begin MyFieldCustoUnFloat := TFloatField.Create(Invent); With MyFieldCustoUnFloat do Begin FieldName := 'custoun'; Calculated := False; DataSet := Invent; Name := 'Invent'+'custoun'; Precision := 0; Size := 0; // sFormatoCusto depende de cada empresa; // Numa fabrica de raçoes, onde o custo unitário tem até quatro casas decimais, // é "0.0000"; num comércio comu, é "0.00" DisplayFormat := sFormatoCusto; EditFormat := sFormatoCusto; Invent.FieldDefs.Add(Name, ftFloat, 0, false); End; // Se tabela pelo MySQL, usar TFloat ********** Início ******** MyFieldSaldoFloat := TFloatField.Create(Invent); With MyFieldSaldoFloat do Begin FieldName := 'saldo'; Calculated := False; DataSet := Invent; Name := 'Invent'+'saldo'; Precision := 0; Size := 0; // sFormatoEstoque depende de cada empresa; // Numa loja que não tem estoque fracionado, será "0" e numa loja que tem // estoque fracionado (agropecuária por exemplo), pode ser "0.000" DisplayFormat := sFormatoEstoque; EditFormat := sFormatoEstoque; Invent.FieldDefs.Add(Name, ftFloat, 0, false); End;{With MyFieldEstestaFloat} // Se tabela pelo MySQL ou Paradox, usar TFloat ********** Fim ******** End Else Begin // Se tabela ttDbase ou ttFoxPro, usar TBCD ********** Início ******** MyFieldCustoUnBCD := TBCDField.Create(Invent); With MyFieldCustoUnBCD do Begin FieldName := 'custoun'; Calculated := False; DataSet := Invent; Name := 'Invent'+'custoun'; Precision := 0; Size := 4; // sFormatoCusto depende de cada empresa; // Numa fabrica de raçoes, onde o custo unitário tem até quatro casas decimais, // é "0.0000"; num comércio comu, é "0.00" DisplayFormat := sFormatoCusto; EditFormat := sFormatoCusto; Invent.FieldDefs.Add(Name, ftBCD, 4, false); End; MyFieldSaldoBCD := TBCDField.Create(Invent); With MyFieldSaldoBCD do Begin FieldName := 'saldo'; Calculated := False; DataSet := Invent; Name := 'Invent'+'saldo'; Precision := 0; Size := 3; // sFormatoEstoque depende de cada empresa; // Numa loja que não tem estoque fracionado, será "0" e numa loja que tem // estoque fracionado (agropecuária por exemplo), pode ser "0.000" DisplayFormat := sFormatoEstoque; EditFormat := sFormatoEstoque; Invent.FieldDefs.Add(Name, ftBCD, 3, false); End;{With MyFieldEstestaBCD} // Se tabela ttDbase, usar TBCD ********** Fim ******** End; {EndIf} // ********************** Definições dos campos. Final. End; {EndIf bFirstOpen then bFirstOpen := False; Invent.Open; Invent.First; StatusBar1.SimpleText := IntToStr(Invent.RecNo)+'/'+IntToStr(Invent.RecordCount); End Else Begin Invent.Close; StatusBar1.SimpleText := '0/0'; AbrirButton.Caption := '&Abrir'; End; {EndIf} .. .. .. Espero que seja de alguma utilidade! Abraços!
  4. Oi Pessoal... De uma máquina com o Windows 98, acessando (via ODBC ou Zeos em uma aplicacao Delphi) uma tabela detalhada de cupons fiscais (isto é, cada linha corresponde a um item que passou no caixa), preciso consultar imediatamente o último registro da tabela... Atualmente, faço isso: 'select Max(idcupom)' 'from cuponsfiscais' iIdCupom := FieldByName('idcupom').AsInteger Com isso, "pego" o ponteiro para o último registro adicionado... Então, para obter os dados do ultimo item gravado: 'select *'+ 'from cuponsfiscais' 'where idcupom='+IntToStr(iIdCupom) So que isso é mais lento do que abrir uma tabela (uma do paradox ou dBase) e fazer um Cupons.Last Já dei uma boa olhada no manual do MySQL5 mas não encontrei ainda uma forma de fazer isso... Grato por qualquer ajuda!!!
  5. Bom... imagino que você deveria criar um programa, no caso, um programa que funcione como um serviço nos Windows XP, 2000, 2003 pra cima... Nesse programa, voce pode usar a função BlockInput... ela vem na dll user32.dll, presente nos Windows98, Millenium, XP, 2000, etc... Você declara a função assim: Function BlockInput(fBlockIt:Boolean):Integer;stdcall;external 'user32.dll'; Para usar, é simples: Chame: BlockInput(True); para bloquear a entrada e BlockInput(False); para liberar Este programa, instalado como serviço em cada estação, poderia receber, via socket (tcp/ip) o comando para bloquear ou desbloquear teclado e mouse... Seria preciso também definir o logon do Windows para o padrão do NT, para que control+alt+del leve à tela de login e não ao gerenciador de tarefas, onde o serviço de parar teclado e mouse poderia ser derrubado... Bom... isso é só uma idéia... Espero ter ajudado... Ah... vê se dá uma melhorada em algumas coisas heim?! "intenSão" :lol: escrito assim deixa qualquer um tenso!
  6. Como assim? Você quer, tipo, pegar o infeliz que tá no computador com o ip 192.168.0.33 e, sem nenhum aviso, bloquear o teclado e o mouse dele, independentemente do programa que ele estiver usando?
  7. Oi Pessoal... O texto a seguir, é o "ANTES" Consegui migrar toda uma base de dados em tabelas Visual dBase7 para o MySQL... O problema é que tive que fazer isso com cada tabela, é mesmo... uma-a-uma... através do DBExplorer... fiz assim: acmemy = alias do MySQL via ODBC conector. acmedb = alias da pasta c:\arquivos de programas\application data\dbTeste\acme, com tabelas Visual dBase7 e dBaseIV 2.0 Usando o DBExplorer, para importar todos os dados de uma determinada tabela, é só abrir a guia SQL do alias acmeDb e, por exemplo, para passar os dados da tabela de regiões, digitar: insert into :acmemy:ar_regi (rg_esta, rg_cida, rg_mapa, rg_posx, rg_posy, rg_codi, rg_pais, rg_vend) select rg_esta, rg_cida, rg_mapa, rg_posx, rg_posy, rg_codi, rg_pais, rg_vend from ':acmedb:ar_regi.dbf' Se for o primeiro comando sql executado, é solicitado o nome do usuário e sua senha, e pronto!!! registros importados... Agora... tentei fazer isso em um TQuery... mas dá todo tipo de erro... ele não aceita executar uma query contendo aliases diferentes... Alguma idéia??? Grato por qualquer dica!!! Abraços Bom... depois de queimar bem as pestanas, consegui colocar o seguinte código em uma TQuery e funcionou: insert into ":ACMEMYSQL:fi_serv" (descricao, codigo) select descricao, codigo from ":ACMEBDE:fi_serv" Onde ACMEMYSQL é, claro, o alias no servidor MySQL e o ACMEMYSQL é o alias das tabelas dBase, Paradox, etc... etc... Também deu certinho com as minhas tabelas do Access (mdb)... tudo isso via o conector ODBC para o MySQL e para outras tabelas (como as do MsAccess)... A próxima "vítima" será o alias das tabelas do Excel (planilhas que são acessadas como tabelas)... Funcionando, também posto aqui.
  8. Olá! Micheus! valeu pela colaboração... mas não é bem isso... Precision parece que retorna a capacidade de um buffer para receber um valor armazenado, por exemplo, em um tFloat ou tBDC... Então, o jeito foi resgatar, do fundo do baú, o comonente HTable da minha velha Halcn500 (componentes para acessar dBaseIII, Clipper, etc...)... e resolvi quase que por completo a parada... adaptei uma das minhas aplicações no fim de semana para poder abrir tabelas "BDE" ou tabelas MySQL... Essa lib (Halcyon) tem a função FieldLen para obter o tamanho e a função FieldDecimals para retornar quantas casas decimais... Infelizmente, ela não consegue abrir alguns tipos mais complexos de tabelas, como as do VisualDBase7, com campos tipo autoincremento, ou que tenham mais do que 128 campos... Mas deu para ajudar bastante... O que eu não entendo é que, visualizando qualquer tabela pelo dBExplorer, conseguimos obter perfeitamente o número de decimais... mas resgatar isso no Delphi é ainda um mistério... De qualquer forma, agradeço!!! Abraços!
  9. Oi pessoal... Andei procurando mas não encontrei nada sobre isso... Simples... dado um campo de uma tabela, do tipo ftFloat, ftCurrency, ftBCD... Como recuperar a quantidade de casas decimais do campo? Pelo DBExplorer, por exemplo, sei que um campo, p.e., precocusto é do tipo Numerico, tamanho = 14 (size), quatro casas decimais (scale=4)... Como recuperar essa informacao pelo Delphi? No caso, iFieldG := 14; iSize := table1.Fields[iFieldG].Size; iDataSize := table1.Fields[iFieldG].DataSize; ShowMessage(table1.Fields[iFieldG].DisplayName+'='+ 'iDataSize='+IntToStr(iDataSize)+ 'iSize='+IntToStr(iSize)); Se o campo é string (char) de 13 caracteres (codigoean), DataSize = 14 e Size = 13 Se logico (boolean), retorna DataSize=2 e Size =0 Se Data (datetime), retorna DataSize=4 e Size =0 Se Inteiro (integer), retorna DataSize=2 e Size =0 e assim por diante... O caso é... onde fica a quantidade de casas decimais? Grato por qualquer ajuda!!! Abraços
  10. Olá. Tenho alguns programas assim... O método que uso para "modular" o sistema é colocar as aplicaçoes (ou módulos) em dll's. Assim... um programa principal (ou, no caso, até mais de um), executável, "chama" os outros módulos através de funções dessas dll's; Essas dll's então abrem uma ou mais janelas, dependendo do que fazem... Então, tenho uma dll para o cadastro de clientes.... uma para o de fornecedores, uma para o de estoque, uma para a tabela de tributação, outra para representantes, uma para funcionarios, uma dll para emissao de notas de venda ou registro de notas de entrada, uma para registro contabil... dentre varias... Esse é um caminho... Ok?
  11. Oi... Realmente, declarar ou não a fastsharemem não faz diferença... tem mesmo alguma coisa pegando na Zeos... Já experimentei até mesmo criar os componentes dinamicamente, mas também não adianta... Agora, isso tudo só acontece nas dll's... nas aplicações normais (executáveis), não tem problema... Ainda vou experimentar colocar estes componentes em outro programa agora, que vai rodar como um serviço no xp para dar acesso às tabelas do MySQL para os usuários dos programas em Clipper... vamos ver se, como serviço, os componentes da Zeos resolvem funcionar sem problemas! Por enquanto, nas dll's, vou usando o TDatabase mesmo! De qualquer forma, agradeço muitissimo a colaboração!!! Abraços!
  12. E'... não sei porque há bloqueio para fazer o download clicando diretamente no link... Mas acho que você consegue baixá-lo, com um ritght-click e salvar destino como... De qualquer forma, salvei outra cópia neste link:
  13. Ok... misterio.zip Grato pela ajuda!!! Abraços!
  14. Olá Churc! E'... estamos de volta! O esquema de criar as dll's do jeito que você indicou quase resolveram o problema... Infelizmente, bastou colocar um componente zTable da Zeos para a mensagem voltar! isso acontece também com os componentes Query... tudo funciona direitinho, mas na hora de fechar, eis que surge a mensagem de "runtime error..." Executando na IDE, aparece também esta mensagem "MySQLConn.exe raised too many consecutive exceptions: 'access violation...'"... E o chato é que isso só acontece com os componentes da ZeosLib... com uma TQuery ou TTable da BDE (inclusive com o conector ODBC para o MySQL), tudo certo... Ao código que você passou, eu só acrescentei isso: Try Connected := True; // Removi porque aqui não tem como eu conectar... bIsOk := True; Except bIsOk := False; End; If bIsOk then Begin zQuery := TZReadOnlyQuery.Create(Self); zQuery.Connection := zConn; zQuery.SQL.Add('select * from dbsenha'); Try zQuery.Open; bTableOk := True; Except bTableOk := False; End; If bTableOk then ShowMessage('conectou legal e abriu a query...') Else ShowMessage('conectou legal mas não abriu a query...'); {EndIf} If bTableOk then Begin zQuery.Close; ShowMessage('Tabela Fechada!'); End; {EndIf} ShowMessage('Destruir!'); zQuery.Destroy; ShowMessage('Enfim!'); End Else ShowMessage('olha os parametros porque não conectou!'); {EndIf} ShowMessage('ok até aqui?'); Ah... no código acima, fiz a tentativa de resolver o problema criando o comp. query dinamicamente... mas isso tambem não resolveu... Então, pessoal, novamente, grato por qualquer ajuda!!! Abraços!
  15. Puxa vida... viver não é preciso... mas aprender é!!! Devo ter perto de umas trezentas dll's desse tipo... todas no mesmo padrão e a maioria delas ia receber o componente da Zeos... (isto é, irão receber!)... então, foi ótimo solucionar isso!!! Agradeço muitíssimo pela colaboração! Abraços!
  16. Oi pessoal! Eu de novo com coisas estranhas no MySQL!!! Mas vamos lá... Até então, vinha com sucesso (e empolgado) com o MySQL5+XP+Apache+IIS e o Comp. Zeos... Só que agora que passei para a parte "pesada", nas aplicações que são, em sua maioria, dll's, comecei a receber a mensagem de erro "runtime error 216 at 1001ada7" ao sair da aplicação. Detalhando... 99% das aplicações desktop que eu desenvolvo são dll's, como no exemplo simples a seguir... ou seja, as janelas (form's) estão todas em dll's chamadas pela aplicação principal... E tudo ia bem até eu cismar de substituir os componentes de bancos de dados da BDE pelos da Zeos... A Aplicação até funciona, mas dá a mensagem de erro ao fechar... não precisa sequer abrir uma tabela do MySQL... basta estabelecer a conexão com o servidor e pronto. No exemplo a seguir, criei uma dll simples, que tão somente abre um form no desktop e estabelece a conexão com o MySQL... não faz mais nada e fecha... Após a aplicação "chamadora" fechar, aparece a mensagem... Então: ********** Executável - aplicação principal ********** Início. unit teste2MySQLUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Function FazLogin(): Boolean; StdCall; External 'uMySQL4.dll'; Implementation {$R *.dfm} Procedure TForm1.Button1Click(Sender: TObject); Begin FazLogin(); ShowMessage('Conectou sem falha?'); Application.Terminate; End; End. ********** Executável - aplicação principal ********** Fim. ********** Dll - arquivo principal, que define a uMySQL4.dll ***** Início Library uMySQL4; // uMySQL4.dpr uses ShareMem, Classes, SysUtils, Windows, Forms, Dialogs, uMySQL1 in 'uMySQL1.pas' {MySQLForm}; {$R *.res} Function FazLogin(): Boolean; Export; Begin Try Begin MySQLForm := TMySQLForm.Create(Application); MySQLForm.SoLogin(); End; Finally MySQLForm.Release; End; FazLogin := True; End; Exports FazLogin; Begin End. ********** Dll - arquivo principal, que define a uMySQL4.dll ***** Final ********** Dll - unit do form, que contem o componente Zeos ****** Início unit uMySQL1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ZConnection; type TMySQLForm = class(TForm) FecharButton: TButton; ZConn: TZConnection; procedure FormActivate(Sender: TObject); procedure FecharButtonClick(Sender: TObject); private { Private declarations } public { Public declarations } Function SoLogin(): Boolean; end; Var MySQLForm: TMySQLForm; sMySQLDatabase, sMySQLUser, sMySQLPass, sMySQLHostName: String; bMySQLLoginPrompt: Boolean; iMySQLPort: Integer; Implementation {$R *.dfm} Function TMySQLForm.SoLogin(): Boolean; Begin MySQLForm.ShowModal; SoLogin := True; End; Procedure TMySQLForm.FormActivate(Sender: TObject); Begin sMySQLDatabase := 'acmeltda'; sMySQLUser := 'root'; sMySQLPass := '1234r'; sMySQLHostName := 'localhost'; iMySQLPort := 3306; bMySQLLoginPrompt := False; With zConn do Begin Database := sMySQLDatabase; User := sMySQLUser; Password := sMySQLPass; HostName := sMySQLHostName; Port := iMySQLPort; LoginPrompt := bMySQLLoginPrompt; Connected := True; End;{With zConn} End; Procedure TMySQLForm.FecharButtonClick(Sender: TObject); Begin zConn.Connected := False; MySQLForm.Close; End; End. ********** Dll - unit do form, que contem o componente Zeos ****** Fim E' isso aí... O que pode estar errado? Os componentes da Zeos (Table, Queries, etc...) comportam-se extremamente bem dentro dos executáveis mas dentro da dll provoca esse 'bug' na sáida... Grato por qualquer ajuda!!! Abraços!
  17. Alô! Olha... não se basei apenas no que eu vou dizer... procure outras opiniões também... Minha opinião pessoal, é a de que imagens não foram feitas para ficar em bancos de dados... Por muito tempo insisti em colocar imagens em registros... desde o tempo do Clipper..., passando pelo Acess, pelo VisualFoxPro e dBASEIV... até que a ficha caiu, depois de arquivos enormes, falhas ocasioanadas por problemas de gravação ou de hd ou sistema operacional, dificuldade de padronização das imagens, etc.... Enfim, hoje eu coloco imagens em pastas acessiveis por referencia a um ou mais campos do banco de dados... Por exemplo, no sistema de clubes, a foto fica em uma pasta com a primeira letra do nome da pessoa, dentro de outra pasta, com o dígito da categoria e, por fim, gravado com o codigo do associado: c:\inetpub\wwwroot\acme\a\08400.jpg = foto de um associado com nome iniciando em "A", categoria Fundador ("0"), ficha 0084, titular (ultimos 00) c:\inetpub\wwwroot\acme\images\c\198201 = foto de um dependente com nome iniciando em "C", categoria Efetivo ("1"), ficha do titular 0982, sequencia do dependente: 01 Outro exemplo, do cadastro de produtos do sistema comercial: c:\inetpub\wwwroot\acme\images\mercado16\7896052600724.jpg agua mineral com gas schincariol 500ml, que esta no grupo 016-bebidas Vantagem: nos exemplos, observe que as imagens ficam em uma pasta do servidor da intranet, sendo, portanto, usadas nas paginas de consultas pela web... Ok? Espero ter ajudado! Abraços!
  18. Olá. slTexto := TSTringList.Create slTexto.Add('Isso vai para a impressora pela LPT1'); slTexto.Add('ou outra porta válida... COM1, COM2, LPT2... etc...'); slTexto.SaveToFile('LPT1'); slTexto.Free ou AssignFile(ft2Port,'LPT1'); ReWrite(ft2Port); Write(ft2Port,'Isso tambem pode ser impresso'+chr(12)); CloseFile(ft2Port); Neste exemplo, a folha é "ejetada" pelo caracter de controle FF = chr(12) * Importante... é preciso saber se a impressora suporte impressão direta, ok? Espero ter ajudado!
  19. Oi pessoal! Olha, consegui, através do componente Zeos, usar tanto queries da BDE como queries em MySQL em aplicações CGI e ISAPI tanto no Apache como no IIS (ambos no XP). Se a tabela que tenho que consultar/acessar é MySQL, uso o componente TZReadOnlyQuery (da Zeos)... se é uma tabela dBaseIV, 7, Fox26, dbaseIII ou Paradox, uso um TQuery (da BDE)... Seja: zQuery1 = Componente TZReadOnlyQuery, da Zeos, para acessar MySQL Query1 = Componente TQuery, da BDE, para as demais tabelas Então: sCampoNome := 'descricao'; If bMySQLUse then sConteudo := zQuery1.FieldByName(sCampoNome).AsString Else sConteudo := Query1.FieldByName(sCampoNome).AsString; {EndIf} O que eu gostaria, remexendo os guardados de Clipper do meu passado (e de forma similar ao que acho que existe em PHP), era fazer referência ao componente como se fosse uma macro (coisa do Clipper), assim: If bMySQLUse then sComponente := 'zQuery1' Else sComponente := 'Query1'; {EndIf} sCampoNome := 'descricao'; sConteudo := (sComponente).FieldByName(sCampoNome).AsString; Ok? Mais uma vez, grato por qualquer ajuda!
  20. Jeito tem... Você precisa pesquisar pelas chaves no registro que contenha a string de formatação da data... No Delphi existe a classe TRegistry. Veja este exemplo de como acessar o Registro: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} Procedure TForm1.Button1Click(Sender: TObject); Var sAtual: String; rgMeuRegistro: TRegistry; Begin rgMeuRegistro := TRegistry.Create; rgMeuRegistro.RootKey := HKEY_USERS; sAtual := '?'; With rgMeuRegistro do Begin If OpenKey('.DEFAULT\Control Panel\International',False) then Begin sAtual := ReadString('sShortDate'); CloseKey; End; {EndIf} End;{With rgMeuRegistro} If sAtual='?' then ShowMessage('não achou a chave') Else Begin ShowMessage('Atualmente, é '+sAtual+' e agora será alterado para yyyy/mm/dd'); With rgMeuRegistro do Begin If OpenKey('.DEFAULT\Control Panel\International',False) then Begin // Caso queira mesmo alterar, tire o comentário na linha seguinte. // WriteString('sShortDate','yyyy/mm/dd'); CloseKey; End; {EndIf} End;{With rgMeuRegistro} End; {EndIf} End; End. Ok? Espero ter ajudado! Abraços!
  21. Isso isso isso... só um detalhe... "Atrás", "atrasado", "atrasar" são palavras de uma mesma família, têm o mesmo radical e todas são escritas com "s". "Através" também é escrita com "s". (colaboração: TV Escola) Ok?
  22. Olá pessoal... No Delphi6 do trabalho, tem o componente dbExpress... Em casa, no meu Delphi6, não tem o componente, que até aparece na lista lá em Component/Configure Palette mas vazio! Tem como fazer a sua instalação, sem ter que reinstalar o Delphi6 todo? Grato por qualquer ajuda!!! Abraços!
  23. paulobergo

    Sql No Delphi

    Olá Daniel! Mais o menos desde 1997 eu migrei meus aplicativos Clipper para Delphi, usando SQL da própria BDE, inicialmente com tabelas Fox26 e atualmente dBaseIV e VisualDBaseIV... Então, sugiro que você experimente executar sua query usando o SQLBuilder primeiro ou o DBExplorer, para verificar se ela retorna um valor inteiro válido na contagem de registros... Bom... fiz isso também... vê se ajuda! - Criando uma tabela Visual dBASE7 create table 'visitas.dbf' ( idvisitas autoinc, num_visita char(4), cod_cliente char(5) ) - Incluindo algumas informações: insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0001','00044') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0002','00223') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0004','00145') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0003','00031') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0005','00145') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0006','00032') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0007','00031') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0008','00044') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0009','00223') insert into 'visitas.dbf' (num_visita, cod_cliente) values ('0010','00045') - verificando select * from 'visitas.dbf' order by cod_cliente idvisitas num_visita cod_cliente 4 0003 00031 7 0007 00031 6 0006 00032 1 0001 00044 8 0008 00044 10 0010 00045 3 0004 00145 5 0005 00145 2 0002 00223 9 0009 00223 - Contando as visitas ao cliente '00044' Procedure TForm1.Button1Click(Sender: TObject); Var iVisitas: LongInt; sCodCliente: String; Begin sCodCliente := '00044'; iVisitas := 0; With query1 do Begin SQL.Clear; SQL.Add('select count(cod_cliente) qtvisitas'); SQL.Add('from ":temp:visitas.dbf"'); SQL.Add('where cod_cliente="'+sCodCliente+'"'); Prepare; Open; iVisitas := FieldByName('qtvisitas').AsInteger; Close; If iVisitas=0 then ShowMessage('Não teve nenhuma visita!') Else If iVisitas=1 then ShowMessage('Só teve uma visita!') Else ShowMessage('Foram '+IntToStr(iVisitas)+' visitas!'); {EndIf} End;{With query1 do Begin} End; Ok? Abraços!
  24. Olá! Use o FormatFloat. Veja: procedure TForm1.Button1Click(Sender: TObject); Var vValor: Double; begin vValor := HKCurrEdit1.Value; Label1.Caption := FormatFloat('0.00',vValor); end; No caso, com vValor=7.044,80 o resultado será 7044,80... aí é só você tirar a vírgula para formatar do seu jeito... Veja também... vValor = 137044,80 FormatFloat('0000000000.000',vValor) resultará em 0000137044,800 Espero ter contribuido! Abraços!
×
×
  • Criar Novo...