
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
:huh: Tá bom, eu vou falar o que falta, mas vou ter que concluir o código para isso, e não é o que pretendia. Se você tivesse observado com atenção o que eu postei na resposta parcial, você teria sacado o que está faltando. Veja que lá eu coloquei no meio do comentário : label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth)); Esse label7 e o outro label de que lhe falei, não foi?! Então, la no código parcial, que coloquei tem exatamente a mesma linha, só que falando do label6 (o que você já possui), logo, o que tá faltando é você duplicar o código: procedure TForm1.Timer1Timer(Sender: TObject); begin if not label6.visible then begin if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then begin label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth)); label6.Visible := true; end; end else begin if (label6.Left+2) >= ClientWidth then label6.visible := false else label6.Left := label6.Left+2; end; // *** aqui o código do label6, duplicado para o label7 - daria para simplificar (otimizar) usar o mesmo // código para os dois labels, mas... if not label7.visible then begin if ((label6.left +label6.Canvas.TextWidth(label6.Caption)) > clientwidth) then begin label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth)); label7.Visible := true; end; end else begin if (label7.Left+2) >= ClientWidth then label7.visible := false else label7.Left := label7.Left+2; end; end; então, como já disse antes, você adiciona esse label7 ao seu form, define a sua propriedade Visible como False e, lá no seu click do botão "Processar", evidentemente você teria que copiar o caption do label6 para o label7: procedure TForm1.BitBtn1Click(Sender: TObject); begin ... // aqui estão aquelas coisas que você tem no seu código, não vou repeti-las mas elas continuam aqui heim!!! for I:=cont downto I do begin label6.caption:=label6.caption+Frase[I]; edit2.text:=edit2.text+Frase[I]; end; label7.caption := label6.caption; // <<< acrescentar esta linha <<< end; Só isso!!! ;) Bom, você vai levar esses pontos de "lambuja". O problema é que você vai ter que correr atrás... Nesta questão de iniciantes, (você não é o único por aqui) segue uma dica que de chata poucos usam, mas é um tema de Algoritmos chamado "Teste de Mesa", ele é ótimo em situações como esta, facilitando na detecção/solução de problemas. Só para ter uma idéia do que é isto dê uma espiada neste arquivo que achei na net e procure pela palavra "teste de mesa" - arquivo Abraços
-
clebes, neste post tem um exemplo de como fazer isto. O componente pode não ser o que você está utilizando, mas o conceito é exatamente o mesmo. Tente adaptar ao seu caso (componente, nome de tabelas e campos) e se houver alguma dúvida é só postar aqui. Abraços
-
Xistyle, acho que você poderia utilizar variáveis para guardar a posição Col,Lin e atualizá-la no evento OnSetEditText. Este evento ocorre após o usuário atualizar o conteúdo da célula do StringGrid. Daí, ao clicar no botão, você atribuiria estes valores às propriedades Row e Col para reposicionar na última célula digitada. Para acessar e apagar o conteúdo da célula seria através da propriedade Cells[Col, Row]. Acho que era isso. :unsure:
-
Xistyle, o fato de ser indicado o número de pontos "n" a serem entrados, não viabilizaria que você modificasse o tamanho de sua matriz dinamicamente? Tipo, se o cara informa 10, então você a define com 10 colunas, se define 15, então você a redimensiona para 15. Este procedimento no StringGrid é realizado manipulando as propriedades RowCount (nº de linhas) e ColCount (nº de colunas). É por aí sua dúvida?
-
Comentários também são bons, mas eu me refiro a identação. Veja o mesmo código que postei antes da forma como você faz em seu código fonte:procedure TForm1.Timer1Timer(Sender: TObject); begin if not label6.visible then begin if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then begin label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth)); label6.Visible := true; end; end else begin if (label6.Left+2) >= ClientWidth then label6.visible := false else label6.Left := label6.Left+2; end; """ end; Qual a forma que você acha que fica mais legível?! ;)
-
falto só essa parte... meu DbGrid principal está com o nome de DbGrid1 mesmo, acho que precisa fazer um contador, que para cada dbgrid criado, adicione +1 no numero dele. Ex : Dbgrid4, Dbgrid5.... no primeiro post que eu lhe respondi tem a seguinte linha no código: Name := 'DBGrid1'; // *** este nome deve ser único no post seguinte: TabSheet.Name := 'TabSheet'+IntToStr(PageControl1.PageCount +1); // garante nome único no seguinte: Se você prestou atenção aos comentários, você deve ter observado que deve dar um nome único para cada componente. e ainda no próximo: Você não quer excluir um botão que você criou dinamicamente? Então, se você tem o nome dele na criação, você tem como localizá-lo e destruí-lo. Acho que esta questão já está respondida, além do que parece-me que você já tem a resposta - por favor preste mais atenção ao ler os comentários. <_< Parabéns!!! :D
-
[resolvido] Dúvida Sobre Objects Do Stringgrid
pergunta respondeu ao McBlade de Micheus em Delphi, Kylix
McBlade, acho que não vou ajudar muito, mas vou fazer alguns comentários mesmo assim. Exato. Objects guarda um TObjecs que é a classe base de todas (ou de pelo menos 99,9%) as outras classes existentes no Delphi. Com sua atribuição, você guardou uma cópia do ponteiro para a classe TButton (endereço da instância alocada para seu botão). O que exatamente você pretende fazer?O uso do parent funciona no sentido em que você vai ter o botão colocado dentro da área do componente StringGrid, mas isso parece meio estranho e pode ter efeitos colaterais. O que já vi por aí (em artigos na net) é que o componente é sim desenhado dentro da célula do grid. Como é feito para mostrar bitmap's, checkbox, .... -
Filtros Em Combobox Para Gravar Em Tabela
pergunta respondeu ao acaciofc de Micheus em Delphi, Kylix
Neste caso acho que poderia ser conveniente utilizar um TDBLookupComboBox.Ele tem a propriedade ListSource (datasource que aponta para um dataset), ListField (campo que aparecerá na lista) e KeyField (campo chave - no seu caso seria o nome da cidade) onde você define uma fonte de consulta. As propriedades DataSource e DataField são as da tabela do cliente (como você já utiliza agora). A idéia é que você pode criar uma consulta (com um DataSet do tipo TQuery da vida) onde você parametriza a cláusula WHERE pelo campo UF (o parâmetro tem que ter o mesmo nome do campo no dataset Cliente). Este dataset (consulta), teria sua propriedade DataSource apontando para o datasouce ligado ao seu dataset do Cliente. Com isso, quando você muda o conteúdo de estado no cliente, bastaria que fechasse e abrisse a consulta para que a lista (TDBLookupComboBox) apresente apenas as cidades daquele estado. A idéia é esta. Espero que tenha conseguido me fazer entender. Dê uma olhada no componente, veja o que consegue e qualquer coisa posta aí. Abraços -
Fazer Uma Consulta Para Repetir O Campo De Um Registro
pergunta respondeu ao mcsmarmcs de Micheus em Delphi, Kylix
Vou tentar, afinal, você não colocou nome de tabelas e campos necessários (ainda não desenvolví o 6º sentido ;)). Vou supor que seu componente TQuery, utilizado na consulta, receberá em design-time o texto da consulta SQL em sua propriedade SQL. Sua consulta SQL deve ser algo mais ou menos assim: SELECT ordem, placa, data FROM nome_tabela WHERE ordem = :ordem ORDER BY data DESC ordenado pela data em ordem decrescente. procedure TForm1Edit1Exit(Sender :TObject); begin QryConsulta.Close; QryConsulta.ParamByName('ordem').AsString := Edit1.Text; QryConsulta.Open; // ao abrir a consulta, se não estiver vazia, o primeiro registro será o último // registro cadastrado - lembre-se que a ordenação é decrescente if not QryConsulta.EOF then EditPlaca.Text := QryConsultaplaca.AsString; ... // outros campos se houverem begin end; end;se você adicionou os campos da consulta em design-time, então utiliza o campo diretamente. Mas, se não adicionou, então utiliza o método FieldByname. Ex., ao invés de utilizar: QryConsultaplaca.AsString, você utiliza QryConsulta.FieldByName('placa').AsString; Abraços -
Filtros Em Combobox Para Gravar Em Tabela
pergunta respondeu ao acaciofc de Micheus em Delphi, Kylix
To usando o TDBComboBox, está certo? Pode ser. Significa que sua tabela de cidades tem basicamente os campos Cidade e UF, certo? E você grava no cadastro do cliente o nome da cidade (o texto, não um código), é isso? -
Filtros Em Combobox Para Gravar Em Tabela
pergunta respondeu ao acaciofc de Micheus em Delphi, Kylix
acaciofc, você está realmente utilizando um TComboBox ou algum componente dataware, tipo TDBCompoBox, TDBLookupComboBox? -
Visitante, quando você fala em "código pascal", está se referindo no código para listar na tela um pedido, é isso. Tipo aquela tela DOS de antigamente (usando readln e writeln) ou está falando em Delphi mesmo, interface gráfica e tal?
-
Alessandro, veja se esta solução em outro post serve para seu caso.
-
deio, os tópicos foram mixados por tratarem-se da mesma coisa. Observe que já havia uma resposta!!!
-
Geração De Código De Barras Itf (2by5) Em Bmp
pergunta respondeu ao paulobergo de Micheus em Delphi, Kylix
paulobergo, experimenta utilizar a função de conversão que postei outro dia para transformar seu BMP em JPG - post (o método é um pouco diferente do seu) Abraços -
A idéia é a mesma. Entretanto, como sua idéia é "matar" o mesmo e não apenas ocultar, é conveniente que os componentes adicionados à ela não a tenham apenas como Parent (local onde são desenhadas), mas sim, como Owner também. Isso garantirá que ao ser destruída (via método Free), esses componentes que a ela forma adicionados também o sejam. Para acessar a guia ativa (a TabSheet), você deve obter sua instância, que nesse caso seria a guia ativa no PageControl, ou seja, via propriedade PageControl.ActivePage. A forma mais elegante, digamos assim, seria você remover o componente de seu Owner para depois eliminá-lo. Por ex.: var Componente :TComponent; begin Componente := PageControl.ActivePage; PageControl.RemoveComponent(Componente); // remove-o da lista de componentes interna do Owner Componente.Free; end; Mas pelo que me lembro, o método anterior (mais simplista) também resulta na remoção correta do componente. É testar para ver. Abraços
-
"só falta isso", justamenta a parte mais complexa do programa. A única que exige algum esforço. ;) Observei que é um trabalho em dupla... Siga a dica que dei, utilize dois labels. Comece com um visível (seu label6) e outro oculto (novo label7). Quando o label visível ultrapassar os limites da janela, torne o outro visível e siga movendo ele (como fez com o anterior). Mas antes de dar visibilidade a ele, calcule a posição em que deverá aparecer: é a quantidade de pixels que ultrapassaram a janela. Como achar essa posição: label7.Left := -(label7.Canvas.TextWidth(label7.caption) -((label6.left +label6.Canvas.TextWidth(label6.Caption)) -clientwidth)); vou por metade do código aqui, se você entendeu o espírito da coisa, completará a outra metade: procedure TForm1.Timer1Timer(Sender: TObject); begin if not label6.visible then begin if ((label7.left +label7.Canvas.TextWidth(label6.Caption)) > clientwidth) then begin label6.Left := -(label6.Canvas.TextWidth(label6.caption) -((label7.left +label7.Canvas.TextWidth(label7.Caption)) -clientwidth)); label6.Visible := true; end; end else begin if (label6.Left+2) >= ClientWidth then label6.visible := false else label6.Left := label6.Left+2; end; """ end; Não esqueça de levar em consideração as observações pertinentes do deio Outra dica, faça a identação do código porque visualizar lógicas com if's sem identação é complicado - dá muito trabalho.
-
estou achando é que eu foi quem não explicou direito. :huh: Você não quer excluir um botão que você criou dinamicamente? Então, se você tem o nome dele na criação, você tem como localizá-lo e destruí-lo. Não é isso que você quer? Veja o código a seguir: procedure Form1.Button1Click(Sender :TObject); begin with TButton.Create(Self) do begin Name := 'Button3'; Left := 15; Top := 20; Parent := TabSheet1; end; end; procedure Form1.Button2Click(Sender :TObject); var Componente :TComponent; begin Componente := FindComponent('Button3'); if Assigned(Componente) then Componente.Free; end; Foi isso que eu quiz dizer no outro post
-
Se você prestou atenção aos comentários, você deve ter observado que deve dar um nome único para cada componente. Posto isso, utilize o método FindComponent(nome_componente) do seu form. Todos os componentes que tiveram como Owner o Form (self) estarão numa lista que poderá ser consultada com este método que retorna um TComponente (declare a variável para receber o retorno, teste se não é nula e depois apenas chame o Free dela) - dê uma olhada no help.
-
Nem tudo. O trabalho do curso é seu e você deve fazê-lo. ;) A pergunta deveria ser uma dica. Voce deve saber que vai precisar de um timer (para mover a posição num intervalo de tempo) e dois labels. O lance é fazer um label entrar no final da área client (ClientWidth ou ClientHeigth) enquanto o outro vai saindo (Left ou Top). Observe que o mesmo tanto que sair de um lado deve estar entrando no outro.
-
Fazer Uma Consulta Para Repetir O Campo De Um Registro
pergunta respondeu ao mcsmarmcs de Micheus em Delphi, Kylix
mcsmarmcs, faça uma consulta (query) no OnExit do Edit de modo a localizar o registro, passando como parâmetro da consulta (a utilizar na cláusula where) o texto digitado. Essa sua consulta deve ordenar o resultado pela data em questão. Daí não tem erro, se você ordena ascendente, basta posicionar no último registro (last) da consulta; se você ordena decrescentemente, basta pegar o primeiro item da consulta. -
Vale utilizar outro label?
-
[resolvido] Duvida Sobre Como Usar O Rave,melhor Eu Não Sei Usar?
pergunta respondeu ao Se você esta contente.... de Micheus em Delphi, Kylix
S.v.e.c..., acho que ele está mais para um primo distante. Seguinte, enquanto não aparece uma dica melhor por aqui, dê uma espiada nestes links e veja o que você aproveita, são coisas que normalmente são precisamos: - Conhecendo os Componentes do Rave Report - Parte I - Relatório Simples com Rave Report - Trabalhando com parâmetros no Rave Report - Traduzindo o Preview do Rave Report - Criar relatório PDF no Delphi 7 com o RAVE - Outras dicas no Ramos da Informática (cod. barras, boletos, parâmetros,... Bom estudo. -
Carregar é só assim: var PicName :string; begin PicName := ExtractFilePath(Application.FileName) +Format('foto%d.jpg', [CodCliente]); if FileExists(PicName) then Image1.Picture.LoadFromFile(PicName); end; você está utilizando que componente/meio de captura?As imagens serão gravadas no mesmo tamanho da aquisição, ou serão redimensionadas? Alguns posts associados: 1, 2
-
Carlos Rocha, segue um exemplo básico (incrementar e ajustar é por sua conta): type TFormMain = class(TForm) ... private procedure StoreConfig; function LoadConfig :boolean; end; implementation ... uses IniFiles; ... procedure TFormMain.StoreConfig; var IniFile :TIniFile; begin try IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Config.ini'); IniFile.WriteString('DATABASE', 'DBServer', ZConnection1.HostName); IniFile.WriteString('DATABASE', 'DBName', ZConnection1.Database); IniFile.WriteString('DATABASE', 'DBUser', ZConnection1.User); finally IniFile.Free; end; end; function TFormMain.LoadConfig :boolean; var IniFile :TIniFile; begin try IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Config.ini'); ZConnection1.HostName := IniFile.ReadString('DATABASE', 'DBServer', ''); ZConnection1.Database := IniFile.ReadString('DATABASE', 'DBName', ''); ZConnection1.User := IniFile.ReadString('DATABASE', 'DBUser', ''); finally IniFile.Free; end; Result := ZConnection1.HostName <> ''; end; procedure TFormMain.FormCreate(Sender: TObject); begin ... if not LoadConfig then begin StoreConfig; ShowMessage('Prepare o arquivo de configuração do programa'); Application.Terminate; end else ZConnection1.Connect; end; procedure TFormMain.FormDestroy(Sender: TObject); begin StoreConfig; ... end; Explicando um pouquinho... A idéia é que ao carregar o programa (form principal), sejam carregadas as configurações no arquivo, bem como, ao encerrar, essas configurações sejam salvas. Para tanto, foi criado um procedimento para gravação (StoreConfig), onde as informações em uso para a conexão são gravadas num arquivo localizado na mesma pasta do programa. São gravados o HostName (que é o IP ou nome que identifica o servidor aonde o banco está instalado), Database e User. A Password NÃO deve ser gravado no arquivo. Uma função foi criada para a leitura e tem como objetivo carregar do arquivo os parâmetros de conexão, sendo que se o arquivo ainda não existir, as propriedades da conexão serão carregadas com o valor default (o terceiro parâmetro em ReadString - ''), fazendo com que o retorno da mesma seja False. Isto ocorrendo, estaremos gerando o arquivo em branco o qual deve ser preenchido para nova execução do programa. Utilizamos este recurso para evitar que venhamos a tentar conectar ao banco sem que os parâmetros de conexão estejam corretamente configurados. Atenção e ajustes devem ser realizados no caso do uso de datamodules. Deve-se ter o cuidado de observar que o componente de conexão já deve estar criado, assim, a criação do datamodule tem que preceder a carga das configurações. Também, ao gerar o projeto final, deve ser verificado que a conexão não esteja ativa (já em design-time) - ela tem que ocorrer em run-time. E lembre-se dos itens que mencionei neste seu outro post.