
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
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
-
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
-
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
-
Normalmente eu utilizo esta banda quando há um dataset ligado (via MasterSource) a tabela que é utilizada para gerar a linha detalhe.
-
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
-
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
-
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
-
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
-
Crie um índice com essa caracterídtica. Qual banco de dados você está utilizando?
-
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).
-
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
-
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
-
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
-
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
-
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. ;)
-
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
-
Ricardo_PF, quem falou em pagecontrol? O colega phil_rpg fez um questionamento sobre Excel - é o que está no tópico. Não?! :unsure:
-
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
-
Que componente você está utilizando para fazer os insert's e como você está passando os parâmetros ou montando seu insert?
-
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.
-
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).
-
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.
-
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.
-
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?
-
Problemas Com Um Formulário De Login -------mim Ajude Por Favor Alguém
pergunta respondeu ao rafagyn de Micheus em Delphi, Kylix
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.