Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. você utiliza o "Is" para testar se uma determinada instância de objeto é da classe do objeto que você procura. você utiliza o "As" para tratar uma determinada instância de objeto como se "fosse outra" é praticamente um type-cast. Um exemplo e uso comum é quando você trabalha com o parâmetro Sender passado nos eventos. Vamos supor que seja o evento OnEnter. Há vários componentes que respondem a este evento e, se houver algum tipo de procedimento a ser realizado com vários deles, podemos utilizar um único procedimento para ser atribuido ao evento OnEnter de todos eles. Nesta situação, utilizando "Is" e "As" podemos tratar corretamente o evento para o tipo do componente que o responderá. ex.: procedure TForm1.Edit1Enter(Sender :TObject); begin if Sender IS TEdit then begin (Sender AS TEdit).Color := clBLue; end else if Sender IS TDBGrid then begin with Sender AS TDBGrid do Color := clRed; end else if Sender IS TDBEdit then with Sender AS TDBEdit do begin Color := clGreen; Font.Style := [fsBold]; end; end; Acho que é isto. []s
  2. Talvez utilizando componentes AsyncPro (link) - TApdSendFax. Algum comentário ==> link, procurar por "Just the Fax, Please" Outra opção talvez as API's ==> link (msdn) []s
  3. Micheus

    Uso Dos Metodos

    O método Locate requer como parâmetros, três informções. Veja declaração no help: function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; 1) KeyFields: string contendo a lista de campos pelos quais você deseja localizar uma informação; Cada campo deve ser separado por uma vírgula (,). Ex.: 'CodEmpresa,NomPessoa'; 2) KeyValues: um array de variant's que corresponde aos valores a serem localizados; O uso de VarArrayOf possibilita a criação desse array, sendo que passamos em sua inicialização justamente os valores que desejamos pesquisar. Ex.: [20, 'Micheus']; 3) Options: define como será realizada a nossa pesquisa; Podemos não definir qualquer valor ([]); podemos definir que a pesquisa não levará em consideração caracteres maiúsculos ou minúsculos ([loCaseInsensitive]); Podemos definir que a pesquisa não necessita ser pelo valor completo do campo (um substring por ex.) ([loPartialKey]) ou ainda uma combinação ([loCaseInsensitive, loPartialKey]); Ex. Final: Locate('CodEmpresa,NomPessoa', VarArrayOf([237, 'Mich']), [loCaseInsensitive, loPartialKey]); Acho que seria isto. []s
  4. Micheus

    Subdetail

    Normalmente eu utilizo esta banda quando há um dataset ligado (via MasterSource) a tabela que é utilizada para gerar a linha detalhe.
  5. Neste caso, você não precisaria de de bandas subdetalhes.Como cada linha terá todos os dados, você utilizaria TQRGroup's. 1) Ordene seu resultado por Cliente, Titulo e Parcelas; 2) No QuickRep adicione 1ª banda TQRGroup e set a propriedade Expression para o campo do cliente. Nesta banda coloque os QRDBText necessários para mostrar os dados do cliente que você possui; 3) No QuickRep adicione 2ª banda TQRGroup e set a propriedade Expression para o campo do titulo. Nesta banda coloque os QRDBText necessários para mostrar os dados do título que você possui; 4) No QuickRep adicione 1 banda TQRBand e set a propriedade pra rbDetail e nela adicione os QRDBText necessários para mostrar os dados dasparcelas; Deve ser só isto. []s
  6. Micheus

    Mais Um Problema

    A mensagem parece sugerir que a tabela de nome "pedido" não existe em seu banco de dados. Se o select postado está completo, acho que podem haver outros problemas com ele: 1) onde tem a linha "(d2.CodProduto = Produto)" parece que no lugar de produto deveria ter algo como d2.CodProduto; 2) a definição de Pedito d, não está sendo utilizada (relacionada) na cláusula WHERE; Ex. SELECT DISTINCT d1.Quantidade, d2.Nome FROM Pedido d, Itens d1, Produto d2 WHERE (d1.Pedido = :CodPedido) AND (d2.CodProduto = d1.CodProduto) AND (d.CodPedido = d1.CodPedido) ORDEM BY D1.Name, d2.Quantidade []s
  7. Quais bandas você adicinou ao seu relatório? O resultado da consulta vem de tabelas ou query's? Já testou o resultado "por fora"? Está correto? []s
  8. Micheus

    Dbgrid E Combobox

    Utilize as propriedades do campo (Field) que você deseja obter valor através da lista. Dê uma olhada em LookupDataSet (de onde vem os dados), LookupKeyField (campo de referência), LookupResultField (campo a ser mostrado na lista) - você acessa estas propriedades selecionando um Field do seu dataset (duplo click no componente). Dê uma olhada no help. []s
  9. Crie um índice com essa caracterídtica. Qual banco de dados você está utilizando?
  10. Desculpe, não ter entendido direito o seu questionamento. :rolleyes: Exato. Como você mesmo já citou anteriormente, variáveis do "tipo classe" são ponteiros.Embora eu não me lembre bem qual, mas, já tive a oportunide de utilizar o assign para algum outro tipo de compenente e não obtive o resultado esperado (isso porque talvez o assing não foi programado para fazer o que eu esperava que fizesse).
  11. Sim. Aliás é assim que a maioria das propriedades de uma classe são setadas. Dê uma olhada na unit Controls (p.ex.).A aplicação comum é como o exemplo abaixo: type TTeste = Class constructor Create; virtual; protected FValor :Integer; // define a variável protegida FNome :String; FDate :TDate; procedure SetValor(Value :Integer); / procedimento para atribuir o valor de FValor function GetValor :Integer; // função para retornar o valor de FValor function GetData :TDate; // função para retorna o valor de FData function GetDataAsString :String; // função para retornar FData no formato string public property Valor :Integer read GetValor write SetValor; property Nome :String read FNome; property Data :TDate read GetData; property DataAsString :String read GetDataAsString; end; constructor TTest.Create; begin inherited; FValor := 0; // inicialização da propriedade FNome := 'Teste'; FData := Date; end; procedure TTest.SetValor(Value :Integer); begin if Value <> FValor then begin FValor := Value; // faz outras coisas se necessário end; end; function TTest.GetValor :Integer; begin Result := FValor; end; function TTest.GetData :TDate; begin Result := FData; end; function TTest.GetDataAsString :String; begin Result := DateToStr(FData); end; Daí no código do programa que utiliza a classe fica apenas assim:var Teste :TTeste; begin Teste := Teste.Create; Teste.Valor := 10; // neste momento o método SetValor será chamado ShowMessage(IntToStr(Teste.Valor)); // Neste momento o método GetValor será chamado ShowMessage(Teste.Nome); // Observe que Nome é apenas leitura // porque não foi definido um meio de atribuir-lhe um valor através da // instrução [i]write [/i]na definição da propriedade. ShowMessage(Teste.GetDataAsString) // observe que você pode definir propriedades // para retornar uma mesma variável da classe de forma diferente Teste.Free; end; Até onde sei, sim.Quem sabe outros colegas possam colaborar... []s
  12. Eu iria sugerir que fosse utilizado o método Assign para copiar as propriedades de um font em outro. Acho este o método mais apropriado.Mas, após verificando a questão colocada em que poderia ocorrer de o ponteiro do primeiro passar a apontar para o segundo constatei que isso não ocorre. Ao menos, não para esta propriedade. Fui, então, dar uma olhada no código fonte do TControls e constatei que quando você colocar a atribuição proposta, o método SetFont faz justamente o uso do Assign. Resumindo: Tanto faz utilizar o Assign ou atribuir a propriedade Font diretamente. []s
  13. Paulo Nobre, é justamente neste momento que você deverá fazer o teste para verificar ser o comprimento em pixels (retornado por Canvas.TextWidth) é maior que o valor contido em ScrollWidth. Como a largura esperada é em pixels e Canvas.TextWidth retorna a largura do texto nesta unidade, estas questões pouco lhe incomodarão. []s
  14. Paulo Nobre, até que é simples. Basta você atribuir a largura desejada (em pixels) à propriedade ScrollWidth. A questão é observar que ao ser incluído um novo item na lista, deve ser observado se a largura do texto não é maior do que o previamente definido. Ex.: supondo que o 3 elemento da lista tenha o maior comprimento, então: ListBox1.ScrollWidth := ListBox1.Canvas.TextWidth(ListBox1.Items[2]); []s
  15. Eder, o que a função faz é aplicar a máscara a uma sequencia de números (sem os caracteres: / . - ). Ou seja, recebe um número de inscrição não formatado e retorna ele formatado. Acredito que esta função poderia ser adaptada para fazer algo diferente. Ao digitar a UF, você chamaria ela passando apenas este campo e poderia retornar uma máscara (no padrão MaskEdit) e esta ser aplicada a um componente MaskEdit (ao invés de um edit). Aconselho, também, a incluir os ELSE's nas cláusulas IF's que testa Estado. É fácil entender que ser Estado for "AL", não há necessidade de continuar testando Estado nos outros IF's. ;)
  16. natalie, se você não pode utilizar a propriedade CharCase dos componentes DBEdit, então você pode aplicar o uppercase sobre o campo no evento BeforePost do respectivo dataset. Ex.: procedure TForm1.Table1BeforePost(DataSet: TDataSet); begin DataSet.FieldByName('Descricao').AsString := UpperCase(DataSet.FieldByName('Descricao').AsString); // ou se você tiver adicionado os campos no seu dataset, então pode usar como segue: // Table1Descricao.Value := UpperCase(Table1Descricao.Value); end; Deste modo, antes de os dados serem gravados na tabela, você poderia converter os campos que você deseja. Espero que seja isto. []s
  17. Micheus

    Excel

    Ricardo_PF, quem falou em pagecontrol? O colega phil_rpg fez um questionamento sobre Excel - é o que está no tópico. Não?! :unsure:
  18. Micheus

    Excel

    Não é minha praia, mas vamos ver se ajuda em alguma coisa. As sheets possuem as propriedades VPageBreaks (coleção de quebra de página vertical) e HPageBreaks (coleção de quebra de página horizontal). Eles possuem a propriedade Count, que provavelmente podem dar uma noção das páginas que a sheet tem. Cada item da coleção (VPageBreak e HPageBreak respectivamente) possui uma propriedade Location que é um Range que pode talvez auxiliar na tentativa de saber se você está na última página. Bom, isto é válido para o VB, mas acredito que você consiga acessar todos estes objetos. É só uma idéia. Se funcionar, lembre-se de que você provavelmente deverá levar em conta a configuração de como está a ordem de impressão: - de cima para baixo, da esquerda para a direita - da esquerda para a direita, de cima para baixo A propriedade WorkSheet.PageSetup.Order indica isto. Pode ser xlDownThenOver ou xlOverThenDown. []s
  19. Que componente você está utilizando para fazer os insert's e como você está passando os parâmetros ou montando seu insert?
  20. Skin_, a 1ª o Eder Moraes já respondeu, vamos ver as outras. if ComboBox1.Items.IndexOf('Texto a Encontrar') >=0 then // achou texto else // não encontrou // obtendo o texto digitado TextoDigitado := ComboBox1.Text; Mais ou menos isto. Os itens (Items) são do tipo TStrings (classe), mas você pode acessá-lo como se fossem um vetor sim. Seu exemplo está correto. Lembre-se sempre de ter certeza de que não acessará um item que não existe - verifique Combo.Items.Count; você pode acessar o "vetor" indexando de 0 a (Combo.Items.Count -1) Se você não tiver dificuldes com o Inglês, utilize o Help. Tem tudo sobre as definições das classes e objetos do delphi. Se vd selecionar o componente em seu form e teclar F1, terá acesso as definições deste componente de forma fácil e rápida.
  21. Ricardo_PF, isto está relacionado às configurações das suas transações. Como foi que você configurou suas transações (duplo click sobre o componente IBTransaction)? Se você configurar como Snapshot, os dataset ligados a esta transação "irão tirar uma foto" no momento de sua abertura (open ou active) não "enxergando" alterações de qualquer outra transação. Nesta configuração, eu utilizo uma transação (Read) com a opção Read_Committed (read_committed, rec_version, nowait) e outra (Update) com as opções customizadas (read, write, read_committed, rec_version, nowait).
  22. Skin_, se isto pode ocorrer, não seria o caso de criar uma tabela para cadastrar os coletores de cada indivíduo (relacionados por um código, p.e.)?Neste caso, você talvez podesse fazer uso de um DBGrid para permitir a edição de tantos coletores quantos fossem necessários, sem preocupação com scroll, criação de componentes e alteração do lay-out.
  23. maikel, você não teria fazer um "tipo de ping" para as máquinas conectadas na rede? Tipo utilizando algum componente de conexão tentar obter resposta pela porta 25 que é a padrão para servidores SMTP.
  24. tostola, se você diminuir a precisão do campo (propriedade Precision, normalmente 15), no field do seu componente ibexpress (você não disse qual). Será que não ajudaria?
  25. Observando que este evento ocorre a cada caracter digitado. Assim, se você tive um código composto por mais que um dígito, poderá ter como efeito a alteração do nome da loja a cada caracter pressionado. Caso não deseje isto, coloque no evento OnExit.
×
×
  • Criar Novo...