Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. 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
  2. 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í.
  3. 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
  4. 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)?
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. Micheus

    Botões

    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
  12. 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
  13. 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
  14. Já tentou algo como: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=http://www.meusite.com.br/basedados/arquivol.mdb;Persist Security Info=False
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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.
  22. Micheus

    Problemas Com Canvas

    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
  23. 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;
  24. 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.
  25. 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.
×
×
  • Criar Novo...