
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
da forma como você está implementando talvez este artigo lhe ajude: http://www.activedelphi.com.br/print.php?sid=186
-
você está incluindo a data no seu SQL no corpo do texto ou como parâmetro? Se for no corpo do texto, me recordo que para o Access utiliza-se sustenido(#) como delimitador e formado mm-dd-yyyy, já para o MySQL o delimitador é acento agudo??(´) e formato yyyy-mm-dd. Do manual do MySQL: - MySQL recupera e mostra valores DATETIME no formato 'YYYY-MM-DD HH:MM:SS'... - MySQL recupera e mostra valores do tipo DATA no formato 'YYYY-MM-DD'
-
Talvez você esteja utilizando, mas pelo sim pelo não: acredito que você também vá precisar utilizar a função SetCaptureControl, para capturar os eventos do mouse fora de sua aplicação.
-
Maikel, a dica do s3c não funcionou por um pequeno detalhe, a função retorna o path até a barra delimitadora ("\"), logo não estava entrando no loop (era só acompanhar o valor da variável na execução passo a passo ;) ). Mas, se houvesse a possibilidade de seu programa ser executado na raiz do disco, fatalmente ocorreria um GPF. Assim veja se isto lhe ajuda: s := ExtractFilePath(Application.ExeName); // extrai o caminho até a barra "\" (inclusive) SetLength(s, Length(s)-1); // Retira a barra "\" if LastDelimiter('\', s) > 0 then // Evita erro caso path seja a raiz (p.ex "c:\") s := Copy(s, 1, LastDelimiter('\', s) -1); // copia até nível anterior, se quizer manter a barra, retire o "-1" []s
-
Eu tive o mesmo problema, na oportunidade pesquisei e descobri que ele está no diretório do Delphi, só não está instalado. A solução é a seguinte: - No delphi, vá na opção Component->Install Package; procure dentro da pasta do delphi 7 a pasta Bin e em seguida localize um arquivo com o nome dclqrt70.pbl Observe que não haverá o componente TQRChart (gráficos) na paleta, se precisar utilizá-lo, dê um toque, pois foi um processo meio chato e não me lembro no momento. Se for registrado, baixe o update para QuickReport 3.5.1 Std. (D7) http://www.qusoft.com/getfile.asp?level=0&...=QRSTD351D7.EXE []s
-
O post acima foi meu. Descupe não estava logado.
-
você utiliza o resultado de um TQRExpr deste modo: - QRExpr1.Value.intResult // para inteiros - QRExpr1.Value.dblResult // para double talvez assim funcione: qrexpr1.Value.dblResult*MAX(query1.preço) []s p.s. Faria isto, atribuindo o cálculo a um QRLabel no evento BeforePrint da banda que o contém.
-
Faça o seguinte: altere o comando utilizando os cursores OCR_SIZENS (resize norte/sul) pelo IDC_SIZEWE (resize leste/oeste) procedure TForm1.Button1Click(Sender: TObject); begin SetSystemCursor(LoadCursor(0, IDC_SIZEWE), OCR_SIZENS); end; Agora será possível entender porque a restauração é feita utilizando o mesmo comando. Clique no botão, vá até as bordas de uma janela (norte, sul, leste e oeste) e observe que na verdade o que ocorre é um swap (troca) entre os cursores!!! []s
-
no form principal (ou o que será o"chamador"): ... uses <units já declaradas>, <unit do form a chamar>; ... // evento onclick do button; procedure FormPrincipal.Button1click(sender :TObject); begin SeuForm.ShowModal; // SeuForm é o form que você quer chamar end; o ex. acima é para o caso de o seu form está sendo criado automaticamente (o padrão, se você não mexeu nas opções do projeto); caso você o crie dinamicamente então poderá ser assim: ... uses <units já declaradas>, <unit do form a chamar>; ... // evento onclick do button; procedure FormPrincipal.Button1click(sender :TObject); begin SeuForm := TSeuForm.Create(Self); try SeuForm.ShowModal; finally SeuForm.Free; end; end; []s
-
Uma pista: http://www.activedelphi.com.br/modules.php...order=0&thold=0 Uma vídeo-aula: Criando a tabela: http://www.delphibr.com.br/apost/videoaula...te/cliente.html Criando um aplicativo simples: http://www.delphibr.com.br/apost/videoaula...phi/delphi.html ainda bem que temos o Google ao nosso lado. ;)
-
Parece que não é tarefa simples, porém possível: Documentação a respeito http://msdn.microsoft.com/library/default....4fdb340.xml.asp http://www.osronline.com/DDKx/graphics/provider_8mxz.htm Código ex. em C http://www.codeguru.com/Cpp/W-P/printing/article.php/c5893/ []s Lembrei que certa vez utilizei a mensagem WM_SPOOLERSTATUS, para testar algo similar ao que você pretende. Observei que não funciona no XP, então verificando no site da Micro$oft e encontrei a seguinte observação: http://msdn.microsoft.com/library/default....ntspol_3zub.asp Dê atenção ao final do texto onde está escrito NOTE. Não testei, mas se funcionar, é ama maneira mais simples de chegar ao que você quer. []s
-
Já que tive que identar o código para tentar avaliar o mesmo, segue algumas observações ref. o fragmento do código abaixo: 1) se não realizei a identação erroneamente, você deverá colocar um begin após o teste if Tabela.Fields.DataType in [ftString, ftMemo] then e o respectivo end antes do else if Tabela.Fields.DataType in [ftDate,ftTime,ftDateTime] then já que, como está, o teste de datas(ftDate,ftTime,ftDateTime) será realizado apenas se o string(ftString, ftMemo) for vazio e imagino que não seja o que você deseja; 2) ao que parece, você passa como parâmetro a Tabela posicionada em um determinado registro e utiliza o valor atual de seus campos para criar um filtro a ser aplicado a ela própria. É isto? 3) aparentemente esta mesma Tabela poderá ter em seus registros campos string(ftString, ftMemo) com descrições repetidas ou similares a do registro atual, já que você utiliza uma query com a clausula where contendo um LIKE. É isto? Supondo que seja (é o que parece), observe que a concatenção poderá não gerar um filtro correto quando primeiro=1. (p.ex. Filter := 'Field0=10 and Field1='amx' or Field1='amxdo' or Field1='cramx' ' deve ser diferente de Filter := 'Field0=10 and (Field1='amx' or Field1='amxdo' or Field1='cramx') ', eu não estou certo já que raramente utilizo este recurso). A título de sugestão, você já utilizou QR_Geral.Fields[0].AsString no lugar de QR_Geral.Fields[0].Text ? procedure TTabelas.Pesquisa(Tabela: TTable); ... if Tabela.Fields[i].DataType in [ftString, ftMemo] then if Tabela.Fields[i].AsString <> '' then begin QR_Geral.Close; QR_Geral.Sql.Clear; QR_Geral.Sql.Add('Select Distinct '+Tabela.Fields[i].FieldName+' From '+ Tabela.TableName+' Where Upper('+ Tabela.Fields[i].FieldName+') Like '+#39+'%'+UpperCase(Tabela.Fields[i].AsString)+'%'+#39+' '); QR_Geral.Open; primeiro_qr := 0; QR_Geral.First; while QR_Geral.EOF = False do begin if primeiro_qr = 0 then begin aux_str := Tabela.Fields[i].FieldName + ' = ''' + QR_Geral.Fields[0].Text + ''''; primeiro_qr := 1; end else begin aux_str := aux_str + ' or ' + Tabela.Fields[i].FieldName + ' = ''' + QR_Geral.Fields[0].Text + ''''; end; QR_Geral.Next; end; end else if Tabela.Fields[i].DataType in [ftDate,ftTime,ftDateTime] then //aux_str := Tabela.Fields[i].FieldName + ' = to_date(''' + DateToStr(Tabela.Fields[i].AsDateTime) + ''',''yyyy-mm-dd'')' + ' '; aux_str := Tabela.Fields[i].FieldName + ' = ' + DateToStr(Tabela.Fields[i].AsDateTime) + ' '; []s
-
Não sei se é o caso do componente que você utiliza. Eu acesso o Firebird utilizando o MDO e ele tem uma caracteristica similar. Segundo o desenvolvedor, para fins de otmização o recordcount não tem a indicação correta sobre o número de registros no banco e sugere que para este fim seja utilizado um select count(*). []s
-
Achei melhor postar uma solução. Em função do formato do seu arquivo, acredito que seja uma solução razoável e você poderá buscar na linha lida qualquer parâmetro desejado: function RetornaParametro(Texto, Delimitador1, Delimitador2 :string) :string; var PosDelimitador1, PosDelimitador2 :Integer; begin PosDelimitador1 := Pos(Delimitador1, Texto); if PosDelimitador1 > 0 then // Se encontrou o delimitador inicial procura pelo final ou fim da linha begin Inc(PosDelimitador1, Length(Delimitador1)); // Posiciona no início de texto procurado PosDelimitador2 := Pos(Delimitador2, Texto); if PosDelimitador2 = 0 then // Se não há o segundo delimitador, retorna até o resto da linha PosDelimitador2 := Length(Texto) +1; Result := Trim(Copy(Texto, PosDelimitador1, PosDelimitador2 -PosDelimitador1)); end; end; // seu código postado - adaptado var Sobrenome :String; ... begin ... AssignFile(ArqTxt,'C:\texto.txt'); Reset(ArqTxt); while not eof(ArqTxt) do begin Readln(ArqTxt, Linha); // exemplo da busca do sobrenome Sobrenome := RetornaParametro(Linha, 'Sobrenome:', 'Idade:'); end; 1) Se não houver uma palavra que delimite o fim da linha, então passe qualquer coisa que não exista para o Delimitador2 (p.ex. ':FIM'); 2) Se os Delimitadores não forem case sensitive, talvez seja mais seguro convertê-los para UppeCase, bem como, converter o Texto com UpperCase: function RetornaParametro(Texto, Delimitador1, Delimitador2 :string) :string; ... PosDelimitador1 := Pos(UpperCase(Delimitador1), UpperCase(Texto)); if PosDelimitador1 > 0 then // Se encontrou o delimitador inicial procura pelo final ou fim da linha begin Inc(PosDelimitador1, Length(Delimitador1)); // Posiciona no início de texto procurado PosDelimitador2 := Pos(UpperCase(Delimitador2), UpperCase(Texto)); ... []s
-
você não poderia utilizar um componente de Query com seu select? Aparentemente seria o mais apropriado ao observar seu questionamento. Stored Procedures costumam ser utilizadas para executar algum procedimento no bando de dados ou retornar uma "linha" como resultado. []s
-
Paulo Nobre, também não tenho nada a acrescentar com relação ao problema em questão. Entretanto, observando seu código, acredito que seria interessante você dar atenção especial ao fato de você ter definido a variável Reg globalmente e criá-la em vários pontos do código (reg:= TRegistry.Create;) e apenas liberá-la no FormClose. Acredito que a inicialização de reg deveria ocorrer apenas no OnCreate e a finalização no OnDestroy. Observe que a cada vez que você chama o método Show do form, o evento OnShow é executado e por conseqüência, você aloca memória para sua variável reg e libera apenas uma vez no Close (quando você termina a aplicação). []s
-
Nada melhor do que um pouco mais de informação para podermos dar melhores sugestões. Observando sua segunda tentativa, observamos que você utiliza componentes DBText para digitar os campos, logo imagino que eles estejam ligados a um DataSource que por sua vez deve estar ligado ao seu DataSet IBDataSet1, o qual provavelmente contém o select dos campos de sua tabela. Vamos agora observar sua primeira tentativa; você está utilizando este mesmo DataSet (IBDataSet1), alterando seu select para conter o teste do campo nome. Isto com certeza não deve ser feito. Neste tipo de situação, você deverá utilizar um outro componente contendo o select de teste desejado. Neste cenário, seu DataSet IBDataSet1 continuaria contendo o select correto e um outro DataSet (p.ex. IBDataSetNome) teria o select de teste. Então, no seu evento btn_gravarClick, você faria algo como: IBDataSetNome.Close; IBDataSetNome.SelectSQL.Clear; IBDataSetNome.SelectSQL.Add('SELECT * FROM ' + nomeTabela); IBDataSetNome.SelectSQL.Add('WHERE NOME = ' + #39 + DBEdit1.Text + #39); IBDataSetNome.Open; if IBDataSetNome.EOF Then begin IBDataSet1.Post; DM.Trans.CommitRetaining; mensagem:= 'O Registro foi Incluido ou alterado com sucesso. '; Application.MessageBox(Pchar(mensagem), 'Informação', MB_OK+MB_ICONINFORMATION); Executar := habilitaBotoes; end else ShowMessage('Este nome já existe!!!!'); Observe que o IBDataSet1.Insert normalmente deve ocorrer antes que a edição dos campos possa ser executada pelo usuário - normalmente você tem um botão Incluir ou similar. No evento onClick deste botão você colocaria o comando IBDataSet1.Insert (mais uma vez não dá para precisar como foi construido seu projeto e assim ficamos na suposição). E isto é o que deveria bastar para que seu código funcionasse. Na verdade costumo não deixar este tipo de teste para o momento da gravação. Este teste eu realizo no evento OnExit do campo a ser testado e, existindo, após a mensagem eu movo o foco devolta ao campo e no evento OnClick do botão gravar fica apenas o Post. Também usaria o IBDataSetNome de forma diferente, onde passaria o nome como parâmetro - mas não vamos complicar por enquanto. Não trabalho com a paleta do IB, mas a filosofia é sempre a mesma. Espero que agora você consiga resolver este problema. qualquer coisa, estamos aí (ou melhor aqui!!!) []s
-
No caso de não optar pela sugestão do colega s3c (select no banco), e sim utilizar algo parecido com seu código atual (teste no if), não esqueça de levar em consideração a questão de case sensitive (maiúsculas <> de minúsculas), pois ainda poderá estar tratando nomes iguais como sendo distintos. []s
-
Amarildo, pelo que você colocou nos posts entendi que você desenhou sua tela para as dimensões 800x600 e deseja manter o aspecto dela ao escaloná-la. Imagino que sejam as novas telas wide (??). Tentar manter o aspecto neste caso não será possivel já que a relação da primeira é 4:3 enquanto da segunda é aproximadamente 16:9 e nesta situação a melhor opção é calcular o fator de escala utilizando a altura (menor valor - para que parte da tela não fique fora da área de visualização). Estas constantes tipadas, só terão seus valores alterados através de atribuição explícita. Na verdade acredito que você não precise delas já que, como disse o colega s3c, você pode utilizar Screen.Height e Screen.Width e estas sim estão atualizadas com a resolução atual. Tanto que, utilizando a rotina abaixo, se você chamar este seu form a partir de outro ele ocupará toda a tela, dai você o fecha (não sai do programa), altera a resolução do vídeo e abrindo novamente ele ocupará toda a tela. Verifique se o seu código alterado(abaixo) lhe dá o resultado esperado. procedure TForm1.FormCreate(Sender: TObject); var Fator :Double; begin Scaled := true; if (Height <> Screen.Height) then begin Fator := Screen.Height /Height; ScaleBy(Screen.Height, Height); Width := Trunc(Width * Fator); Height := Trunc(Height *Fator); end; end; []s
-
Amarildo, como não temos maiores detalhes, vou exemplificar com base na idéia de que estamos falando de tabelas paradox e componentes da paleta Data Access (a filosofia pode ser aproveitada para outros componentes). você citou no início do post: assim, vou considerar que estas informações estão numa tabela local e que o componente TDataBase que utilizaremos é exclusivo para o acesso que faremos a partir da seleção da filial. Adicione um componente TDatabase ao form principal (ou datamodule), edite suas propriedades via "Database Editor..." (botão direito do mouse), ex.: Name: <nome de sua escolha> Alias: <não utilizar> Drive Name: STANDARD Parameter Overrides: PATH=<caminho da base de dados desejada> Agora observe que ao abrir para edição a propriedade Params do componente TDatabase, teremos as propriedades acima editadas, ex.: DATABASE NAME=ControleDesenhos DRIVER NAME=STANDARD PATH=D:\PROGRA~1\DESENHOS\BASE Acredito que fique claro que basta alterar a linha de Params onde aparece a definição do PATH para que aponte para o path obtido na seleção. Como todas suas tabelas/querys estarão conectadas a este database, basta fecha-lo, alterar o path e reabrí-lo para trocar de filial. Espero ter ajudado.
-
Veja se estes possíveis "contornos" (workarounds) do problema se aplicam ao seu caso: http://qc.borland.com/qc/wc/qcmain.aspx?d=7561 []s
-
(desculpe me intrometer) você provavelmente observará que ao seguir a orientação do s3c, colocar o {$R *.dfm} logo após o Implementation, o recurso "Code Parameters" estará em operação. Se você tiver outro form em seu projeto, que não tenha sofrido a alteração citada, você deverá observar que o recurso funciona perfeitamente. Isto também ocorre quando você estiver editando uma linha do código fonte e deixá-la incompleta (pode ser sem um ";"), passar para uma linha abaixo e nela escrever a chamada de uma função, p.ex. (já aconteceu comigo). Logo, se houver alguma coisa fora dos padrões de codificação esperado, esta situação deverá sempre se repetir. você vai observar que não faz a menor diferença para a compilação do programa, porém seria melhor manter da forma com é o padrão ou seja, não coloque nada entre o Implementation e o {$R *.dfm} []s
-
uses System Elevar ao quadrado: function Sqr(X: Extended): Extended; Tirar a raiz quadrada: function Sqrt(X: Extended): Extended; []s
-
1) Observe que o código do botão incluir (abaixo) não está chamando a sua procedure Inclui, logo sua lista não está sendo populada. procedure TForm1.BtincluirClick(Sender: TObject); begin F.Nome:=EdNome.text; F.Peso:=strtofloat(EdPeso.text); F.Altura:=strtofloat(EdAltura.text); Listreg.Items.Add(F.Nome); Listreg.Items.Add(FloatToStr(F.Peso)); Listreg.Items.Add(FloatToStr(F.Altura)); Listreg.Items.Add(FloatToStr(F.Imc)); Listreg.Items.Add(F.Condicao); Listreg.Items.Add(''); Ednome.Clear; Edpeso.Clear; Edaltura.Clear; LbResImc.Caption:=''; LbResRes.Caption:=''; Ednome.SetFocus; end; []s
-
Acho que a ideia da coisa você já tem: Criar um form para entrada dos parâmetros, e um form para colocar o seu relatório (QReport), o qual receberá os parâmetros e mostrará o resultado no preview. Se a questão é como utilizar o quickreport, você precisará adicioná-lo a um form, configurar seus parâmetros (margens, tamanho papel, ...), configurar a propriedade DataSet para o dataset que você utilizar para sua consulta; se for uma consulta simples, como parece ser (apenas detalhe) você provavelmente irá apenas configurar o header, rodapé (talvez) e adicionar um QRBand trocando sua propriedade BandType para rbDetail; daí é só adicionar nesta banda os componentes QRLabel e QRDBText (neste você seta as propriedades DataSet e DataField)... Não sei se era exatamente isto que você queria saber, pois não está muito claro onde está a dúvida. Com relação a imprimir no canvas, como o sugeriu o colega Billdeps, eu acredito que não seja a opção mais prática em seu caso. O QuickReport gerencia tudo de maneira simples e fácil. Já utilizei deste recurso, em situações em que o QuickReport não supria minhas necessidades, pois como o Billdeps disse: voce consegue manipular melhor os dados. (eu diria que podemos fazer o que nos der na cabeça) []s