
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Recriar O Arquivo Em Tempo De Execução
pergunta respondeu ao RenatoMejias de Micheus em Delphi, Kylix
renatomejias, a mensagem diz que o arquivo está sendo usado por outro processo. E acho que é o seu processo (programa): Talvez aí esteja o problema. você utiliza: if not FileExists(sala) then begin FileClose(FileCreate(sala)); FFileHandle := TFileStream.Create(sala, fmOpenWrite or fmShareDenyWrite); FFileHandle.Seek(0, soFromEnd); end; try if sala = '' then else [b]memo1.Lines.LoadFromFile(sala);[/b] StatusBar1.Panels[0].Text := TimeToStr(now); ScrollMessage.Msg:=WM_VScroll;Observe que se o arquivo não existe, você supostamente cria e o fecha (via FileCreate e FileClose) e em seguida cria-o novamente utilizando TFileStream.Create, estando aberto para escrita e bloqueando a escrita por outros. Em seguida posiciona no fim do arquivo. Para mais adiante tentar executar o LoadFromFile (onde acusa o erro). Talvez a forma como LoadFromFile utiliza para a abertura do arquivo impede que ele já esteja em uso. Não estou certo do que mais você possa fazer com este arquivo, mas a impressão que tenho é que a parte que envolve o TFileStream não tem finalidade e se você removê-la o arquivo estará criado e fechado, podendo ser aberto e lido por LoadFromFile. []s -
Como Passar O Valor De Um Edit (real) Para Uma Sql
pergunta respondeu ao Tamires de Micheus em Delphi, Kylix
Tamires, já que seus campos são "realmente numéricos", passe os valores como parâmetro, não o "texto": with (FdmList.Objects[FdmList.IndexOf('CARA200')] as Tdm) do begin cds.Close; cds.CommandText := 'SELECT * ' + 'FROM CARA200 ' + 'WHERE CARA200.COD_TAXA = ' + edtCodTaxa.Text + ' AND ' + 'CARA200.VAL_INIFAI = :ValInicial AND ' + 'CARA200.VAL_FINFAI = :ValFinal ' + 'ORDER BY CARA200.DAT_VIGOR, CARA200.DAT_INCLUS DESC '; cds.Params.ParamByName('ValInicial').AsFloat := vValIniFai; cds.Params.ParamByName('ValFinal').AsFloat := vValFinalFai; cds.Open; end; Se não me engano a propriedade Params do CDS possui o método ParamByName. Se não tiver pode usar Params[0] e Params[1], respectivamente. -
Thales, com certeza dará certo e ainda achariamos outras tantas. Considerando o formato do texto que nosso colega postou: campos separados por vígula e texto delimitado por aspas duplas, acho (não estou com Delphi - não testei) daria para escrever a sua função deste modo: Function CopyQuote(st: string; index: integer) : String; var FieldValues :TStringList; begin FieldValues := TStringList.Create; try CommaText := st; if (Index >= 1) and (Index <= FieldValues.Count) then Result := FieldValues[Index -1] else Result := ''; finally FieldValues.Free; end; end; Tudo é uma questão de situação/aplicação. A idéia foi propor apenas um ajuste ao que o colega já havia implementado, bem como dar mais uma opção a ele, já que haviam outros post's resolvendo o problema. A cada alternativa apresentada ampliamos nosso conhecimento de modo a nos aperfeiçoar. Não é este nosso objetivo?! ;) É como cito em minha nota de rodapé: "Há sempre, pelo menos, dois modos de fazer uma mesma coisa. Mesmo que sejam certo e errado" []s
-
Bom, vou entrar na onda também. ;) Partindo do princípio que seu arquivo texto conterá os dados como você mensionou, não preocupei-me em fazer qualquer validação da linha lida. Deste modo, a sugestão que tenho é utilizar uma função que irá receber a linha lida e a cada chamada a mesma, remove o campo lido retornando-o. Para isso, as atribuições a tabela deverão ser realizadas na seqüência que os campos aparecem na linha do arquivo texto. O resultado será apenas os valores - sem as aspas duplas delimitando os mesmos. Se houver algum campo no arquivo texto que não seja utilizado, basta chamar a função sem atribuí-la a alguém. Acho que funcina. function GetField(var :FullStr :String) :string; var Idx :Integer; FieldStr :string; begin // retira qualquer espaço que possa haver nas extremidades FullStr := Trim(FullStr); Delete(FullStr, 1, 1); // retira a primeira aspas dupla (") - primeiro delimitador Idx := Pos('"', FullStr); // procura o último delimitador de texto do campo Result := Copy(FullStr, 1, Idx -1); // retorna o field encontrado Delete(FullStr, 1, Idx); // remove o field até o delimitador (") Delete(FullStr, 1, Pos(',', FullStr)); // remove a vírgula se houver end; ... while not eof(F1) do begin readln(f1,s1); IBTable1.Open; IBTable1.insert;// IBTable1.fieldbyname('COD').asstring := GetField(s1); IBTable1.fieldbyname('CONTAD').asstring := GetField(s1); IBTable1.fieldbyname('CONTAC').asstring := GetField(s1); IBTable1.fieldbyname('DATA').asstring := GetField(s1); IBTable1.fieldbyname('VALOR').asstring := GetField(s1); IBTable1.fieldbyname('REG1').asstring := GetField(s1); IBTable1.fieldbyname('HISTORICO').asstring := GetField(s1); IBTable1.fieldbyname('REG2').asstring := GetField(s1); IBTable1.applyupdates; closefile(f1); end;
-
pixe00, você terá que gravar seu conteúdo em algum lugar e posteriormente recuperá-lo. Uma forma simples, seria gravá-lo num arquivo texto: Gravar -> ComboBox1.Items.SaveToFile(FileName) Recuperar -> ComboBox1.Items.LoadFromFile(FileName)
-
pixe00, não lembro se o MSAccess tem o tipo datetime (acho que sim). Utilizando campos datatime, você pode fazer a subtração diretamente e o resultado será no mesmo formato: data e hora. Se você quizer ter como resposta (visual) um número de horas que ultrapasse 23:59:59h, você terá que usar um artifício - calcular este período e formatá-lo adequadamente. Se for este o caso, dê uma olhada neste post. []s
-
Juniorboll, faz tempo que não uso paradox, mas acho que dá para fazer assim: - você altera a estrutura da tabela, modificando o campo auto-increment (+) para Integer; - salva a estrutura; - Volta a editá-la novamente e retorna o campo para auto-increment. Dê uma conferida. []s
-
Acho que você já descobriu a resposta. O que você realmente deseja como resultado nesta consulta? você precisa restornar todos os campos das duas tabelas (já que está utilizando o "*")? Ou você quer retornar os produtos com situação='' que aparecem em Informa?
-
Churc, vê se eu não vou dizer besteira.Se adaptar o código que postei outro dia para encerrar processos (link) acho que daria para implementar, com algumas restrições é claro, o que o colega quer. É o seguinte, se o código que cria o processo fica no form principal (p.ex.) e não é chamada alguma janela com a opção ShowModal (apenas show) a partir dele, então funciona. - Carrega-se o programa através de CreateProcess; - Se o process o foi carregado com sucesso, quarda-se num loop até que o mesmo termine, mas chamando Application.Processmessages; - Se for encerrar o processo na mão é só utilizar TerminateProcess; Meu exemplo neste link para baixar (Processos.zip). Chamando o ProcessMessges no loop, garante que o restro da aplicação coninue funcinando. E quando a aplicação chamada for fechada é encerrado o loop. (acrescentado: 10/09/2006) O lance com o ShowModal é que só quando fechar a janela o programa continuará - mas corretamente, caso a processo tenha sido fechado. []s
-
Paulo, como é que está de inglês? Não sei explicar corretamente não, mas acredito não ser difícil de imaginar que isso ocorra. Se você tem várias janelas sobrepostas e há uso da "transparência", é de se levar em conta que a cada pixel que você mover uma janela, todas as outras também deverão ser redesenhadas para que o que você esteja vendo represente uma realidade. Lendo o link abaixo e vendo que é utilizado o conceito de camadas (layers), onde cada uma representa a imagem (bitmap) da janela que sofrerá operações lógicas(pixel-a-pixel) para que a imagem final desenhada no desktop corresponda a sobreposição das janelas, dá então para ter uma idéia de que o processador é bastante exigido. Quando não havia transparência, se bem me lembro, sempre que uma janela era movimentada sobre outra, apenas as áreas necessárias (que se tornavam visíveis) eram invalidadas e repintadas. Essa é mais fácil. Porque o recurso foi introduzido na versão Beta 3 do Windows 2000. Veja Layered Windows
-
Fabiana, escreva o seguinte código no evento OnDrawCell do seu StringGrid: procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer; Rect: TRect; State: TGridDrawState); var X, C, R :Integer; begin C := Col; R := Row; if (Col = 2) and (Row > 0) then with Sender as TStringGrid do begin X := Rect.Left +(Rect.Right -Rect.Left) -Canvas.TextWidth(Cells[C, R]) -3; Canvas.TextRect(Rect, X, Rect.Top +2, Cells[C, R]); end; end; A declaração e uso das variáveis C e R são necessárias devido ao uso de "with Sender as TStringGrid do". Como StringGrid também possui as propriedades Col e Row, há um "conflito" e acaba sendo utilizados seus valores e não os dos parâmetros. Observe que presumi que você coloca o "texto numérico" já formatado com 2 casas após a vírgula. []s
-
Fabiano, não entendi direito o porquê de utilizar o "As produtora", mas isso não vem ao caso. Ou talvez venha. Esperimente remover esta linha (em vermelho) já que aparentemente não está de acordo. você já definiu como alias das tabelas as letras A e B, o que deveria ser o "As produtora". Query1.Close; Query1.SQL.Clear; Query1.SQL.Add('Select * From produto A, informa B'); Query1.SQL.Add('As produtora'); // *** retire esta linha Query1.SQL.Add('Where A.codproduto = B.codproduto and A.situacao= "" '); Query1.SQL.Add('Order By frigorifico,data'); Query1.Prepare; // *** chame após montar todo o SQL. Não é obrigatório, já que será automaticamente chamado no Open caso você esqueça Query1.Open;
-
Faça o seguinte, no lugar de DBGrid1.SelectedField.Value, utilize o campo da tabela associada ao seu DBGrid. Como não tenho esta informação, a título de exemplo, vou supor que o dataset ligado ao DataSource, que você associou ao DBGrid, chama-se ADOConsulta. Então, se um dos campos que você tem neste dataset é justamente o chave (ID_Atd), então você passaria no locate da seguinte forma: 1) se você adicionou os fields ao seu componente - dataset: DM.TbAtendimento.Locate('ID_Atd', ADOConsultaID_Atd.Value, []); 2) se você não adicionou os fields ao componente - dataset: DM.TbAtendimento.Locate('ID_Atd', ADOConsulta.FieldByName('ID_Atd').Value, []); Tenha em mente que o DBGrid apresenta os registros do dataset a ele associado; A linha atualmente selecionada (não vale para multipla seleção) representa sempre o registro (linha) em que o dataset está posicionado. Por isso lhe disse no post anterior, que se o componente (dataset) que você utiliza no DBGrid e no form de edição são os mesmo, bastaria ao abrir o form para edição que você chamasse o método Edit do dataset, uma vez que já estaria posicionado no registro correto. []s
-
Churc, era mais ou menos isto mesmo que eu havia "lido por ai". Implementei a opção para alteração da variável de ambiente. Dei uma adaptada para obter o valor original ao entrar no programa e restaurar ao sair. Eu disse que o programa era antigo e simples, esqueci de dizer que é ridículo :blink:(tem uma tela com um browse e um relatório - só). Então este program tem apenas 800kb e se compilar com o delphi, provavelmente irá duplicar, sem contar que terei que tentar compilar o componente que utilizei na época para acessar o Access (KADAO). Daí as coisas só podem é piorar. Certo?!! s3c, com relação a este assunto, tenho acompanhado uma discursão em outro forum (não é propaganda :)) sobre o assunto e não sei não. Eu gosto muito do D7 e acho que ainda não trocaria. Mas para se ter uma idéia real, as vezes é necessário que nós mesmos, em nossa realidade, testemos. Comecei o download e as exigências não são poucas. Quem sabe, daqui a pouco não estejamos discutindo isto aqui também? Se alguém se interessar pelas discursões: Download do Turbo Delphi, Turbo C++ e Turbo C# (o mais antigo) Turbo Delphi Ilusão (o mais recente) No mais, obrigado aos colegas pela força. []s
-
A resposta pode depender de como você constuiu sua aplicação. Se você utilizar datamodule, então os dois form's poderiam estar apontando para o mesmo dataset e então bastaria apenas chamar o segundo form e botar o dataset em edição. Mas ai, se no seu primeiro form, onde está o dbgrid, você tem associado a ele o resultado de uma query, então no outro form(provavelmente) não dará para editá-lo. Daí você teria que utilizar no segundo form um dataset tipo TTable onde posicionaria no registro a ser editado. Se você não utilizar datamodule, também poderia chamar o segundo form passando como parâmetro o código (o ou os campos chave) e neste form, então, você posicionaria a tabela e botaria ela em modo edição. Isto tudo considerando que você está utilizando componentes dataware (DBEdit, DBComboBox, ...), porque se estiver utilizando apenas Edit's aí terá que, além de tudo, mover o conteúdo de cada campo da tabela para os edit's. Confundiu um pouco? Acho que sim. Dê mais alguns detalhes, tipo Componentes que utiliza (TQuery, TTable, ADO), banco sendo utilizado (Paradox, Firebird), se trabalha com datamodule ou não.
-
Estou recompilando um programa antigo e simples no D3. Porém quando o programa roda no XP dá erro quando começa a mostrar o relatório. Já li em algum forum sobre o fato estar associado ao arquivo temporário que o Quickreport e que há um meio de contornar alterando a unit onde o arquivo é criado. Como na época nem pensava em passar por este problema não dei importância. Alguém se lembraria da solução ou teria visto por ai algo a respeito? Já procurei nos forums que participo, mas não consegui encontrar a resposta (evidentemente não pesquisei pelo texto correto :( ) []s p.s. antes que sugiram, não gostaria de compilar na versão D7
-
Esqueci de me logar antes. :huh: Paulo, Vai dar para fazer relógio digital de todo o jeito :)
-
Esperimente o uso de parâmetros, acredito que você não terá que se preocupar com este detalhe. Observe também que talvez você deva utilizar >= e <= para filtrar o período com as datas passadas inclusas.
-
Modificar Imagem No Imagelist
pergunta respondeu ao Thales Pontes Martins de Micheus em Delphi, Kylix
Acho que não vai resolver. Se você observar o código, não é feito grande coisa com este bitmap. Na inicialização (InitBitmap) ele é criado, "em branco", com o tamanho definido por Width e Height do ImageList. E depois é retornado o seu handle caso Image em GetImageHandle(Image, ImageDDB: TBitmap) seja passado com nil. -
utilizando o exemplo do maikel: 'select * from atendimento where data_ped between #01/09/2006# and #06/09/2006#' O Access utiliza o sustenido (#) como delimitador de datas. mas pode tentar também: 'select * from atendimento where data_ped between :DtInicial and :DtFinal' e passar os parâmetros utilizando seu dataset (você não postou qual está utilizando...) tipo: Query.ParamByName('DtIncial').AsDateTime := StrToDate('01/09/2006'); Query.ParamByName('DtFinal').AsDateTime := StrToDate('06/09/2006'); se for componente ADO, se não me engano é um pouco diferente: adoquery1.Parameters.ParamByName('DtIncial').AsDateTime := StrToDate('01/09/2006');
-
Modificar Imagem No Imagelist
pergunta respondeu ao Thales Pontes Martins de Micheus em Delphi, Kylix
Thales, não sei não, aquele processo tem uma chamada para DragLock no início da movimentação e DragUnLock no final. Parece sugerir que não dará para mudar a imagem depois que começar a arrastar. Tem que testar, e ser for verdade, acho que você terá que mudar a abordagem para métodos de animação. Thales, esse lance envolve rotação, certo. Naquele esquema de desenho das peças através da lista de pontos (polígonos), seria interessante você remapear o desenho delas em relação ao centro, assim você calcula(rotaciona) os pontos a serem desenhados de forma mais fácil e adicionar a um array para utilizar o método Polygon, do canvas, que acredito trabalhará melhor e deixará seu código bastante enchuto. (já utilizei antes, podemos falar mais disto por mail se quizer) s3c, acho que poderia ser isto mesmo porque é um recurso mantido pelo SO. Se olhar o código, o componente TImageList, entre outras facilidades, faz uso das funções da API do Windows. Quando é chamado o método GetImageBitmap, o handle para o bitmap é obtido através da chamada a função da API ImageList_GetImageInfo (link msdn). Entretando, quando é dado um panorama geral sobre o Image List (link msdn), há o seguinte comentário sobre a obtenção de informação da imagem:_______________________________ Image Information There are a number of functions that retrieve information from an image list. The ImageList_GetImageInfo function fills an IMAGEINFO structure with information about a single image, including the handles of the image and mask bitmaps, the number of color planes and bits per pixel, and the bounding rectangle of the image within the image bitmap. You can use this information to directly manipulate the bitmaps for the image. The ImageList_GetImageCount function retrieves the number of images in an image list. _______________________________ A parte em vermelho parece indicar que seria possível mexer no bitmap mantido pelo SO. Acho que entendi direito, não? Neste caso, concordo com o Thales que deverá haver algum meio de fazê-lo. A título de curiosidade, dando mais umas fuçadas, achei uma função que nem lebrava mais dela, mas que volta e meia vê-se perguntas de como reduzir/apliar uma imagem, e esta é uma das aplicações dela: CopyImage( HANDLE hImage, // handle of the image to copy UINT uType, // type of image to copy int cxDesired, // desired width of new image int cyDesired, // desired height of new image UINT fuFlags // copy flags ); basta atribuir o resultado ao handle de um TBitmap, como de costume. -
Modificar Imagem No Imagelist
pergunta respondeu ao Thales Pontes Martins de Micheus em Delphi, Kylix
É acho que pode ficar mei puxado, mas, vale um teste. estou de olho, quqer novidade posto sim.Dá para "dar uma palhinha" do que você pretende desenhar nele. Tipo, vai desenhar linhas, outros bitmap's, texto? []s -
Modificar Imagem No Imagelist
pergunta respondeu ao Thales Pontes Martins de Micheus em Delphi, Kylix
Acho que será quase imperceptivel. Utilizar o método proposto, pode ter suas vantagens. você obtém um bitmap único, onde pode usar o canvas livremente sem ter que se preocupar com os off-set dentro do grande bitmap. Li em algum lugar que elas são "agrupadas" em quatro colunas. Fazendo um teste, com quatro imagens adicionadas, observei que realmente o bitmap retornado por GetImageBitmap tem relamente 4x a largura que defini na propriedade Width e 2x a altura. Aparentemente tem área a mais alocada para otimização em novas inserções. Despois é capaz que o método GetBitmap faça apenas um "CopyRect" do grande bitmap. É, tinha visto um exemplo deste na net, mas não encontrei nenhum da forma como você queria utilizar. []s -
Pode ser usando a classe TStrings?! Isso vai servir para qualquer "search and replace in text file", não só PHP: procedure OpenPHPFile(PHPFileName :String; var ArqPHP :TStrings); begin ArqPHP := TStrings.Create; ArqPHP.LoadFromFile(PHPFileName); // Lê o arquivo end; procedure SavePHPFile(PHPFileName :String; var ArqPHP :TStrings); begin ArqPHP.SaveToFile(PHPFileName); // grava devolta ArqPHP.Free; ArqPHP := Nil; end; procedure ParseFile(var ArqPHP :TStrings; StrToSearch, StrToInsert :string); var Idx, StrPos :Integer; begin with ArqPHP do for Idx := 0 to Count -1 do // substitui todas as ocorrências, LINHA-A-LINHA // função presente na unit SysUtils - Delphi7 StringReplace(Strings[Idx], StrToSearch, StrToInsert, [rfReplaceAll, rfIgnoreCase]); end; procedure ProcessPHPFile(PHPFileName :String); var ArqPHP :TStrings; begin OpenPHPFile(PHPFileName , ArqPHP); ParseFile(ArqPHP, 'CodPessoa?>', '1002'); ParseFile(ArqPHP, 'NomPessoa?>', 'Zequinha'); SavePHPFile(PHPFileName , ArqPHP); end; ou simplesmente utilizando a propriedade Text do TStrings e menos modularizado: procedure ProcessPHPFile(PHPFileName :String); var ArqPHP :TStrings; begin ArqPHP := TStrings.Create; ArqPHP.LoadFromFile(PHPFileName); // Lê o arquivo StringReplace(ArqPHP.Text, 'CodPessoa?>', '1002', [rfReplaceAll, rfIgnoreCase]); StringReplace(ArqPHP.Text, 'NomPessoa?>', 'Zequinha', [rfReplaceAll, rfIgnoreCase]); ArqPHP.SaveToFile(PHPFileName); // grava devolta ArqPHP.Free; end;
-
Modificar Imagem No Imagelist
pergunta respondeu ao Thales Pontes Martins de Micheus em Delphi, Kylix
Thales, essa eu não faço idéia mas... Para fazer isso, você não podeira utilizar os métodos GetBitmap e Replace? var bmp :TBitMap; begin bmp := TBitMap.Create; try ImageList1.GetBitmap(0, bmp); bmp.Canvas.TextOut(0, 0, 'Escreve no BMP'); ImageList1.Replace(0, Bmp, nil); finally bmp.Free; end; end; []s