
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Converter Imagem Jpeg, Ou Jpg Para .bmp
pergunta respondeu ao schaukoski de Micheus em Delphi, Kylix
schaukoski, no seu outro post (Image, Como Saber Formato (extensão) Da Picture., saber se é .JPEG, .BMP ou .JPG) observando que você provavelmente precisava converter para bmp a imagem carregada eu havia colocado uma opção que também pode ser útil -> Post - Faz o resize proporcional (thumbnail); - Grava em arquivo ou campo do banco; - Não importa o formato de entrada - saída é BMP; Abraços -
Duas sugestões, levando em conta os detalhes que você colocou, veja se uma delas funciona (e você não citou que compontentes está usando :angry:):1) Utilizando um Table com o esquema do mastersource que você tem atualmente, experimente setar Filter para 'tipodocumento = 0' na tabela FOTO; 2) Utilizando uma query (QryFoto), você pode fazer uma instrução SQL do tipo: SELECT imagem FROM FOTO WHERE codficha = :codficha AND tipodocumento = 0 daí, no evento OnDataChange do DataSource ligado a CADASTRO você coloca:procedure TForm1.DSCadastroDataChange(Sender: TObject; Field: TField); begin QryFoto.Close; QryFoto.ParamByName('codficha').AsInteger := TabCadastroCodFicha.AsInteger; QryFoto.Open; end;Isso fará que a cada linha posicionada em cadastro, seja posicionado na foto correspondente - similar a utilizar MasterSource. Tenta aí.
-
Seus form's/datamodules estão sendo criados automaticamente, ou seja, você não os cria dinamicamente é isto? Se for, vá no menu do delphi Project->Options e altere a ordem em que seu datamódule é criado (arrastando ele para antes do form que o utiliza. Veja se é isto. Abraços
-
Relatório Com O Resultado De Uma Subconsulta Numa Ttable
pergunta respondeu ao overbits de Micheus em Delphi, Kylix
overbits, uma coisa é certa: se você seleciona "qualquer" tabela da lista, pode aplicar um filtro qualquer, ordenar por qualquer campo e você está utilizando paradox, então usar um TTable pode não ser uma boa opção. Isso porque para ordenar pelos campos desejados, deverá haver um índices criado para este campo - se você ordena por todos, então terá um índice para cada campo.De qualquer modo, você tem mantido os filtros quando aplica a nova ordenação (índice)? Voce está utilizando os dois filtros juntos: campo escolhido e data na mesma string Filter? Voce já tentou implementar isto utilizando uma query, aonde você ajusta dinamicamente sua SQL para aplicar os filtros (cláusula WHERE) e ordenação (cláusula ORDER BY)? -
O data source é o caminho, no servidor aonde você acha o seu banco accesss. Na verdade, nunca vi nenhum caso por ai de acesso a banco de dados access colocado em um site, via Delphi. O comum é ver o uso deste recurso nas páginas ASP. Mas aparentemente a idéia seria mais ou menos esta: se em seu site, o banco de dados estivesse em uma pasta chamada basedados, vamos pensar o localização do seu banco como sendo http://ServerName/basedados/mydb.mdb. Assim, Server seria "http://ServerName" e Data Source seria "\database\mydb.mdb". Para testar, eu coloquei um banco access em meu provedor, e testei com esta conexão: Provider=MS Remote.1;Data Source=\database\mydb.mdb;Mode=Read;Remote Server=http://www.site.com.br;Remote Provider=Microsoft.Jet.OLEDB.4.0;Internet Timeout=300000;Transact Updates=True Até conectou, mas tentando acessar qualquer tabela, recebo a mensagem: "Erro de servidor da internet: objeto/módugo não encontrado" (a mensagem está em português mesmo). Dê uma olhada neste link Abraços
-
Image, Como Saber Formato (extensão) Da Picture.
pergunta respondeu ao schaukoski de Micheus em Delphi, Kylix
schaukoski, você vai sempre gravar no formato bmp? Por acaso tem algo a ver com o seu outro post. Voce está transformando em BMP para gravar no blob ou disco? Se for, e você estiver fazendo o resize da figura (transformando em thumbnail), então veja esta adaptação que fiz daquela função MakeThumbNail2 (eu a renomeei aqui): procedure MakeThumbNail(aSource :TGraphic; aDest: TBitmap; iWidth, iHeight: Integer); var Escala :Double; begin aDest.Width := iWidth; aDest.Height := iHeight; // Esta parte é utilizada para manter a proporção, sem que // o maior dos lados ultrapasse a maior medida informada (acho que está 100%) Escala := aSource.Width /aSource.Height; if (iWidth *Escala) > iHeight then aDest.Height := Round(iHeight /Escala) else if (iHeight /Escala) > iWidth then aDest.Width := Round(iWidth *Escala); // Desenha a imagem no tamanho calculado aDest.Canvas.StretchDraw(Rect(0, 0, aDest.Width, aDest.Height), aSource); end; // Carrega imagem para visualização em Image1 procedure TForm1.BtnLoadClick(Sender: TObject); begin // Lê qualquer tipo de imagem permitido if OpenPictureDialog1.Execute then Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName); end; // Grava imagem visualizada no Image1 para um arquivo bmp (reduzido) procedure TForm1.BtnSaveClick(Sender: TObject); var BmpDst :TBitmap; begin // Verifica se há uma imagem carregada if Assigned(Image1.Picture.Graphic) then begin // Cria bitmap destino a ser utilizado na gravação BmpDst := TBitmap.Create; try // Transforma a imagem carregada (qualquer tipo) em um thumbnail BMP MakeThumbNail(Image1.Picture.Graphic, BmpDst, 100, 100); // *** Opção para gravar em arquivo ou na base de dados *** // 1) Grava a imagem no formato BMP BmpDst.SaveToFile('c:\fichario\foto\'+dbedit1.text+'.bmp'); // 2) Grava a imagem no formato BMP num campo da tabela DBImage1.Picture.Assign(BmpDst); // Limpa o Image1 Image1.Picture.Assign(nil); finally BmpDst.Free; end; end; end; Ao utilizar como origem (aSource) um TGraphic, não precisamos nos preocupar com que tipo de imagem ela é. Abraços -
DelQ, este seu "já busque" seria apenas com o intúito de mostrá-lo na tela, é isso? Qual é o lay-out que você está utilizando para seu form? Algo parecido com esta hierarquia? +-------------------+ | Dados do pedido | | ... | +-------------------+ | Dados dos Itens | | ... | +-------------------+ | Dados do Kit para | | Item selecionado | +-------------------+ Abraços
-
Para o caso de você ainda não ter uma resposta... Seu outro post Carlos Rocha, o componente ZTable não possui estes métodos mesmo, mas você pode implementá-lo atraves a utilização das propriedades IndexFieldNames ou SortedFields (aonde você define um "índice dinâmico" - ordenação por mais que um campo é só separar com ",") e da propriedade Filter, aonde você filtra os campos iguais aos valores desejados. Abraços
-
Marcelo, demorei para dar um retorno porque estava tentando contornar umas questões, e cheguei a conclusão de lhe sugerir a utilização algum outro componente do tipo ToolBar.Pelo que andei verificando, este procedimento deveria ser executado automaticamente quando você define uma toolbar customizada (Customizable=True). Mas ocorre que o código do componente (unit ComCtrls) está com algumas inconsistências. Um ex. é olhar em TToolBar.CNNotify e observar que, no tratamento do evento TBN_QUERYINSERT, há linhas comentadas e que deveriam ser responsáveis pela inserção dos botões na sua barra (retirar o comentário não resolve o problema). Nos testes que fiz, até consegui salvar os botões da barra, entretanto, devido a um bug (não solucionado - ver link Borland Developer Network), você não consegue adicionar os botões que foram retirados da barra anteriormente. Abraços
-
Webcam, Bd Mysql 5 E Delphi 7, Conectando-os
pergunta respondeu ao schaukoski de Micheus em Delphi, Kylix
Sim. De acordo com a documentação do MySQL (link - Data Type Storage Requirements), pode ser de até 4GB, conforme tipo utilizado:TINYBLOB, TINYTEXT: 2^8 ou 256 Bytes BLOB, TEXT: 2^16 ou 65536 bytes (64 KB) MEDIUMBLOB, MEDIUMTEXT: 2^24 ou 16777216 bytes (16 MB) LONGBLOB, LONGTEXT: 2^32 ou 4294967296 bytes (4 GB) Sim, ele realmente diminui o tamanho da imagem. Mas a abordagem da figura armazenada em um diretório (seguro) também pode ser interessante quando as imagens são grandes, evitando estufar um banco que possua milhares de registros. Abraços -
ArchimedS-S, desculpe minha ignorância, mas, quê botões e remover de onde? não saberia lhe dizer não. Por acaso você já colocou um break-point ali para verificar o conteúdo de Value? Mas, se você adicionou os campos ao seu componente DataSet (Table ou Query), então, a título de sugestão, você poderia utilizar o evento GetText do field, p.e.: procedure TQReport.QryDadosDSC_TIPOGetText(Sender: TField; var Text: String; DisplayText: Boolean); begin if Sender.IsNull then Text := 'Não informado' else Text := Sender.AsString; end;você pode atruibuir este método para o evento OnGetText de todos os campos que você queira que tenham este "resultado". Abraços
-
José, acredito que haja condições de você fazer através de comando SQL sim. Dê uma olhada neste link(MySQL 5.0 Reference Manual). você verá que há possibilidade de você ignorar(ignore), atualizá-los (update) ou substituir (replace) itens já existentes na tabela. Se este INSERT INTO obter os registros via SELECT, talvez você já possa aí, na cláusula WHERE evitar a obtenção de dados que já existam na tabela destino, utilizando um "WHERE NOT EXISTS...". Seria isto? Abraços
-
Goetten, no seu caso, quando você pretende adicionar ou remover campos em uma tabela que já exista, você deve utilizar uma query com a devido comando SQL para este fim:ALTER TABLE table_name ADD column_name column_type Através da propriedade FieldDefs, só quando for para criar uma tabela. Do help FieldDefs property (TDataSet): ...While an application can examine FieldDefs to explore the field definitions for a dataset, it should not change these definitions unless creating a new table with CreateTable or CreateDataSet. Abraços
-
Já tentou algo como: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=http://www.meusite.com.br/basedados/arquivol.mdb;Persist Security Info=False
-
Transformar Data Dd/mm/aa Em Ddmmaaaa
pergunta respondeu ao Renato_agito10 de Micheus em Delphi, Kylix
Renato_agito10, por esta linha, aparentemente você adicionou os campos ao seu dataset, então para simplificar o código (e só neste caso), sugiro que você coloque a formatação que Churc passou (ddmmaaaa) na propriedade DisplayFormat do field, daí é só continuar utilizando como você mostrou acima. Abraços -
Voce utiliza esta string na propriedade ConnectionString do componente TADOConnection (paleta ADO) e você também tem que ajustar os parâmetros contidos nesta string para que aponte para o seu banco de dados e servidor correto. Se você vai passar o usuário e senha (admin, ''), você deve desabilitar a propriedade LoginPrompt. Voce pode fazer isto em design-time e testar através da ativação da conexão via propriedade Connected. É fácil de configurar a sua própria string de conexão: após adicionar o componente TADOConnection no seu form ou datamodule, basta dar um duplo click nele; selecinar Use Connection String; pressionar Build...; e inserir o caminho completo para o banco de dados no item 1 da guia Conexão; daí você utiliza o botão Testar conexão - você vai saber se a conexão funcionará ou não. Acessando uma base em outro computador via rede, utilizando o IP eu obtive a string assim: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\192.168.65.2\giro\local.mdb;Persist Security Info=False ou, pelo nome do computador: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\eg0981079\giro\local.mdb;Persist Security Info=False Abraços
-
Webcam, Bd Mysql 5 E Delphi 7, Conectando-os
pergunta respondeu ao schaukoski de Micheus em Delphi, Kylix
Se não estou enganado, isto resolve o problema da visualização. No cadastro, como você citou antes, as imagens continuarão com 320x120. Se você quizer armazenar em outro tamanho teria que utilizar o procedimento que Churc postou anteriormente. Editado por Micheus em 11/02/2007 Há uma outra opção para gerar o tumbnails, que é através do método StretchDraw do Canvas. Eu não estava certo se haveria alguma diferença no resultado final, mas o Churc deu uma conferida e disse ser o mesmo. Então, utilizando o mesmo procedimento implementado anteriormente, poderiamos escrever assim: procedure MakeThumbNail2(aSource, aDest: TBitmap; iWidth, iHeigth: Integer); begin aDest.PixelFormat := aSource.PixelFormat; aDest.Width := iWidth; aDest.Height := iHeigth; aDest.Canvas.StretchDraw(Rect(0, 0, iWidth, iHeigth), aSource); end; Abraços -
Não entendi a dúvida. O exemplo que coloquei no post anterior já mostra como utilizar a parametrização? :huh: você pretende mostrar um header com o nome dos campos e nas linhas o resultado de sua consulta, é isto? Acho que se você colocar um exemplo da sintax utilizada, a qual acusava erro, fica mais fácil de tentar entender. Não entendi muito bem a pergunta, porque TSQLQuery é uma classe e SQLQuery.SQL é uma referência a propriedade SQL desta classe (que também refere-se a uma classe - TStrings). Não está não. Também acho que você tem que entender o que está fazendo, senão, como ficará em uma próxima vez? Abraços
-
Vixe!!! Carlos Rocha, agora você deu uma viajada legal... Que negócio é esse de usar FindField onde, aparentemente, deveria utilizar FindKey?! :blink: Resolva isto e você vai avançar mais um pouco. Mais alguns comentários/sugestões sobre a codificação: ... if TablePedidosCodigoPedido.AsInteger <= 0 then begin ShowMessage('Digite o número do pedido!'); DBEditCodigoPedido.SetFocus; Exit; end; if TablePedidosDataCadastro.IsNull then begin ShowMessage('Digite a data do pedido!'); DBEditDataCadastro.SetFocus; Exit; end; if TablePedidosNomeCliente.AsInteger > 0 then begin // procura pelo cliente usando o código if not TableClientes.FindField(TablePedidosNomeCliente.AsString) = '' then begin ShowMessage('Código de cliente inválido!'); DBEditCodigoCliente.SetFocus; Exit; end; end else begin ShowMessage('Digite o código do cliente!'); DBEditCodigoCliente.SetFocus; Exit; end; TablePedidos.Post; if TableItens.State in [dsInsert,dsEdit] then TableItens.Post; AtivarControles(False); // desativa os controles end; Numa sequência como esta, em que satisfeito um if..then é executado um exit, o mais apropriado seria aninhar adequadamente utilizando else's e não exit. Observe que haverá uma única condição em que as linhas a partir de "TablePedidos.Post;" serão executadas: quando NomeCliente.AsInteger > 0 e for encontrado; para as demais opções você utiliza o exit para evitar o Post. Utilizando a lógica, você poderia escrever o procedimento desta forma:... if TablePedidosCodigoPedido.AsInteger <= 0 then begin ShowMessage('Digite o número do pedido!'); DBEditCodigoPedido.SetFocus; end else if TablePedidosDataCadastro.IsNull then begin ShowMessage('Digite a data do pedido!'); DBEditDataCadastro.SetFocus; end else if TablePedidosNomeCliente.AsInteger > 0 then begin // procura pelo cliente usando o código if not TableClientes.FindField(TablePedidosNomeCliente.AsString) = '' then begin ShowMessage('Código de cliente inválido!'); DBEditCodigoCliente.SetFocus; end else begin TablePedidos.Post; if TableItens.State in [dsInsert,dsEdit] then TableItens.Post; AtivarControles(False); // desativa os controles end; end else begin ShowMessage('Digite o código do cliente!'); DBEditCodigoCliente.SetFocus; end; end;é claro que existem situações que não tem jeito, mas sempre que possível, dê preferência a algo nesta linha. Outra coisa é a seguinte: tá meio estranho você fazer um "type-cast" de um campo string para interger e compará-lo com zero. Pelo menos, é o que parece ao olhar esta linha TablePedidosNomeCliente.AsInteger > 0. Eu lhe diria que não faz o menor sentido. Se este campo possui realmente o nome de um cliente, seria mais apropriado que você testasse se ele é nulo ou está vazio, o que poderia ser feito com Trim(TablePedidosNomeCliente.AsString) <> '' Abraços
-
Em teoria, deveria funcionar quando você configura o TQRDBText com o Dataset e datafield apontando para o campo desejado e alterar as propriedades AutoSize para False e AutoStretch para True (isto também vale para o QRMemo). Então você ajusta apenas a largura máxima que você quer que ocupe no relatório - a altura fica em uma linha, já que ele a aumentará sozinho.Quanto a não atualizar o QRMemoHi, acho que está apenas faltando você limpá-lo antes de atribuir novo valor: QRMemoHI.Lines.Clear; Abraços
-
A princípio não deveria ser problema. :huh: Ele não mostra nada deste campo? Conferiu as propriedades AutoSize=False, AutoStretch=True? Experimente utilizar um TQRDBMemo para este campo.
-
Robison, acho que esse assunto é referente ao seu outro post, certo? Eu não saberia como resolver o problema que vem se desenrrolando por aqui. Mas já que você mantém um tipo de estrutura que lhe indica o que e onde algo deve ser desenhado, permitam-me sugeri algo que já utilizei em outra oportunidade, que se bem me lembro não gerava este efeito de piscar. Era um esquema para desenha fluxogramas/portas lógicas. Derrepente vale o teste. :) O princípio é o seguinte: você define e cria um canvas no form onde estará adicionado o seu ScrollBox, então cria um procedimento para desenhar seus elementos gráficos no scrollbox utilizando aquele canvas (observe, não é utilizado outra coisa além do scrollbox). Um exemplo: type TForm1 = class(TForm) ScrollBox1: TScrollBox; private ScrollCanvas :TCanvas; procedure DesenhaDiagrama; end; ... procedure TForm1.FormCreate(Sender: TObject); begin ScrollCanvas := TCanvas.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin ScrollCanvas.Free; end; // aqui va o procedimento que lê a estrutura de dados e procede ao // desenho por ela representado procedure TForm1.DesenhaDiagrama; begin ScrollCanvas.Handle := GetDC(ScrollBox1.handle); // desenha os diagramas ... ScrollCanvas.Rectangle(10, 10, 200, 150); // desenhando apenas um retângulo ... ReleaseDC(ScrollBox1.handle, ScrollCanvas.Handle); end; // aqui, quando o form for redesenhado, redesenha o diagrama procedure TForm1.FormPaint(Sender: TObject); begin DesenhaDiagrama; end; Abraços
-
Carlos Rocha, vamos por partes então. Comece corrigindo duas coisas que não estão legais no código da procedure abaixo (veja comentário com "// *** COMPARE"): procedure TCPedidos.RecalculaPedido; var TmpTable:TTable; TmpTable :TTable; // *** COMPARE Total:Currency; // armazena valores do tipo moeda begin // cria um objeto Table via codificação TmpTable := TTable.Create(Self); // *** COMPARE try // define DatabaseName e TableName via codificação TmpTable.DatabaseName := TableItens.DatabaseName; TmpTable.TableName := TableItens.TableName; TmpTable.Open; TmpTable.FindKey([TablePedidosCodigoPedido.AsInteger]); Total := 0; // inicializa a variavel totalizadora while (not TmpTable.Eof) and (TmpTable.FieldByName('NumeroPedido').AsInteger = TablePedidosNumeroPedido.AsInteger) do begin // Acumula o Total da linha Total := Total + (TmpTable.FieldByName('preço').AsCurrency * TmpTable.FieldByName('Quantidade').AsFloat); TmpTable.Next; // próximo registro end; finally TmpTable.Close; // fecha a tabela TmpTable.Free; // libera objeto da memória end; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', Total); end; Isto já deverá reduzir alguns erros que você obteve na compilação. Tentando adiantar algum problema... Se o índice (chave em uso) da tabela de itens (TmpTable) não possuir como 1º campo o NumeroPedido, além de poder posicionar no pedido errado, o seu WHILE vai furar, já que poderá aparecer um novo pedido antes que todos os desejados tenham sido encontrados. Por ex., se a chave for algo como NumItem|NumPedido, você terá numa sequência:1 | 100 (Item 1 do pedido 100) 1 | 101 (Item 1 do pedido 101) 1 | 102 (Item 1 do pedido 102) 2 | 100 (Item 2 do pedido 100) 2 | 101 (Item 2 do pedido 101) 3 | 100 (Item 3 do pedido 100) 3 | 101 (Item 4 do pedido 101) donde resulta que após encontrar o registro com o número de pedido solicitado em FindKey, o próximo corresponderá a outro pedido, encerrando o loop. Agora, sendo prático, por que é que você não utiliza uma query para fazer este somatório? Seria penas um componente do tipo Query (TQuery, ZQuery, ...) com a propriedade SQL deste modo: depois o seu procedimento seria apenas algo como:procedure TCPedidos.RecalculaPedido; begin // *** para o caso de você NÃO querer adicionar o sql em design-time, você pode adicionar aqui // *** tirando o comentário das 4 linhas a seguir // QueryTotal.SQL.Clear; // QueryTotal.SQL.Add('SELECT SUM(preço) AS PrecoTotal'); // QueryTotal.SQL.Add('FROM ITENS_PEDIDO'); // QueryTotal.SQL.Add('WHERE NumeroPedido = :NumeroPedido'); QueryTotal.ParamByName('NumeroPedido').AsInteger := TablePedidosNumeroPedido.AsInteger; QueryTotal.Open; StaticTextTotal.Caption := FormatCurr('###,###,##0.00', QueryTotal.FieldByName('PrecoTotal').AsCurrency); QueryTotal.Close; end;
-
Acredito que você terá que monitorar os eventos referentes a customização (OnCustomizeAdded, OnCustomizeDelete, ...), e a partir deles, guardar nesta chave o que deverá ser mostrado ou removido da barra quando o programa for carregado uma outra vez.
-
Boa noite José, já que ai deve ser aproximadamente 21:00hs (aqui são apenas 15:00hs) :D Por que mostrar num ListView? Não poderia utilizar em um DBGrid? Voce não teria quase nenhum trabalho braçal... Se você concatenar a data a sua SQL então você pode utilizar:Query1.SQL.Clear; Query1.SQL.Add('select ... where Data between ' +QuotedStr(FormatDateTime('yyyy-mm-dd', DateTimePicker1.Date)) +' and ' +QuotedStr(FormatDateTime('yyyy-mm-dd', DateTimePicker2.Date))); Query1.Open; se for parametrizado, então:Query1.SQL.Clear; Query1.SQL.Add('select ... where Data between :DtInicio and :DtFim'); Query1.ParamByName('DtInicio').AsDate := DateTimePicker1.Date; Query1.ParamByName('DtFim').AsDate := DateTimePicker2.Date; Query1.Open;Recomendo este formato.