Ir para conteúdo
Fórum Script Brasil

Thales Pontes Martins

Membros
  • Total de itens

    453
  • Registro em

  • Última visita

Tudo que Thales Pontes Martins postou

  1. pois é sc3, esse link fala sobre as variáveis AllocMemCount e AllocMemSize que como eu disse, no Delphi 2006 estão deprecated. Com essa função (GetHeapStatus) eu consegui detectar e resolver algums leaks. Só que eu observei que ela também está deprecated no Delphi 2006 apesar de funcionar; Isso significa que deve haver outra função que a substitui, mas qual? Outra dúvida que surgiu é o seguinte -> Eu tenho um form que minha aplicação cria ao ser clicado um botão, e libera da memória ao ser fechado. Nele eu tenho declarado uma var TForm na interface Private -> type TForm2 = class(TForm) . . . Private _form : TForm; . . . Essa variável _form vai receber no caso o form principal, porque o form que eu estou criando controla algumas propriedades do form principal. Aí tem um botão no form que o fecha -> procedure TForm2.button1Click(sender : tobject); begin hide; free; if assigned(_form.OnPaint) then _form.OnPaint(_form); end; Pergunta: Se eu leio a variável _form depois que eu chamo um free no Form2 não era pra dar erro? Já que _form é um campo de Form2 e que já não existe mais porque eu chamei free? Ou será que a memória não está mais alocada mais seu conteúdo ainda permanece?
  2. opa, mas tem a função GetHeapStatus que funciona direitinho -> var Heap : THeapStatus; begin Heap := GetHeapStatus; AlgumaCoisa := Heap.TotalAllocated; end;
  3. Opa descobrí aqui que no delphi 6 funciona direitinho, mas no delphi 2006 que é oque eu estou usando esta variável está deprecated. :(
  4. Descobri. Existe a variável global AllocMemSize da unit System que indica quantos bytes de memória a aplicação está usando.
  5. Obrigado CorN_Sk8, é justamente a função de que necessitava. É importante lembrar que é preciso chamar ReleaseDC depois que a pintura for efetuada. E também é possivel fazer com a função GetDC.
  6. Paulo, aquele código que eu postei está errado. Eu testei ele aqui e corrigi. Eu tranformei numa função que pega um arquivo jpg e salva em um arquivo bmp redimensionado para o tamanho da tela sem perder a proporção. -> procedure ResizeToFit(sFile, dFile : String); var aux, bmp : TBitmap; ih, iv, th, tv : integer; //ih = resolução horizontal da imagem, //th = resolução horizontal da tela sr, dr : TRect; jpg : TJPEGImage; ph, pv : real; begin bmp:=tbitmap.Create; jpg:=TJPEGIMAGE.Create; jpg.LoadFromFile(sFile); bmp.Assign(jpg); jpg.Free; ih:=bmp.width; iv:=bmp.height; th:=GetSystemMetrics(SM_CXSCREEN); tv:=GetSystemMetrics(SM_CYSCREEN); aux:=TBitmap.Create; ph:=(ih/iv); pv:=(iv/ih); sr.top:=0; sr.left:=0; sr.right:=ih; sr.bottom:=iv;// sr é o retangulo de fonte. dr.top:=0; dr.left:=0; if ((ih >= iv) and (th >= tv)) then begin dr.right:=th; dr.bottom:=round(th*pv); end; if ((iv >= ih) and (tv >= th)) then begin dr.right:=round(tv*ph); dr.bottom:=tv; end; if ((iv >= ih) and (th >= tv)) then begin dr.right:=round(tv*ph); dr.bottom:=tv; end; if ((ih >= iv) and (tv >= th)) then begin dr.bottom:=round(th*pv); dr.right:=th; end; aux.width:=dr.right; aux.height:=dr.bottom; aux.canvas.copyrect(dr,bmp.canvas,sr); aux.SaveToFile(dFile); aux.Free; bmp.Free; end; então ResizeToFit('k:\mulheres\Keyra001.jpg','k:\keyraResized.bmp'); salva a imagem 'k:\mulheres\Keyra001.jpg' no arquivo 'k:\keyraResized.bmp' já redimensionada. Infelizmente o uso desse código não é encorajado porque deixa a qualidade da foto muito ruim. porque é o chamado redimensionamento Nearest Neighbor. Faça a prova aí.
  7. não tenho certeza mas acho que se você colocar pointer(OpenPictureDialog1.FileName) funciona. Ou se você jogar para a string faça pointer(nome).
  8. porque que você não cria primeiro o form login, mostra ele, quando fechar você inicia a aplicação -> Program Project1; {$r *.res} begin Application.Initialize; FLogin:= TFLogin.Create(Application); FLogin.ShowModal; FLogin.Free; Application.CreateForm(TFMenu, FMenu); Application.Run; end; Lembre-se que deve-se fechar o FLogin com o método Close senão o programa não continua.
  9. O Delphi diz que no Win 9x há um limite de 64KB de texto para esse componente, mas não diz nada sobre o Windows XP.
  10. Rapá, de qualquel forma você vai ter que carregar a imagem na memória pra gerar o Bitmap, então você lê o Width e o Height direto da sua variável. Olhe, considere o seguinte -> Vamos supor que você carregou um um JPEG numa var. -> var jpg : TJPEGImage; begin jpg:=TJPEGImage.Create; jpg.LoadFromFile('k:\mulheres\Daniella Cicarelli045.jpg'); end; agora você passa ela pra um bitmap -> var bmp : TBitmap; begin bmp:=TBitmap.create; bmp.Assign(jpg); end; Aí você lê as propriedades width e height do Bitmap e descobre que as dimensões são 200 x 300. e você sabe que a resolução da tela é 800 x 600 por exemplo. então você vai ter que redimensionar a imagem para que ela ocupe a tela toda mantendo a proporção. - > var aux : TBitmap; ih, iv, th, tv : integer; //ih = resolução horizontal da imagem, //th = resolução horizontal da tela sr, dr : TRect; begin ih:=bmp.width; iv:=bmp.height; th:=800;//Aqui você coloca uma função que retorne a resolução horizontal da tela. tv:=600;//Aqui você coloca uma função que retorne a resolução vertical da tela. aux:=TBitmap.Create; sr.top:=0; sr.left:=0; sr.right:=ih; sr.bottom:=iv;// sr é o retangulo de fonte. dr.top:=0; dr.left:=0; if ((ih >= iv) and (th >= tv)) then begin dr.right:=th; dr.bottom:=round((tv/iv)*tv); end; if ((iv >= ih) and (tv >= th)) then begin dr.right:=round((th/ih)*th); dr.bottom:=tv; end; if ((iv >= ih) and (th >= tv)) then begin dr.right:=round(ih*(th/ih)); dr.bottom:=tv; end; if ((ih >= iv) and (tv >= th)) then begin dr.bottom:=round(iv*(tv/iv)); dr.right:=th; end; aux.width:=dr.right; aux.height:=dr.bottom; aux.canvas.copyrect(dr,bmp.canvas,sr); end; eu acho que depois desse código o Bitmap aux conterá a imagem corretamente redimensionada para preencher a tela sem perder o aspecto. Eu acho, né, pode ter algum erro. Testa aí e faz um debug.
  11. Com o Bitmap seria a mesma coisa só que com TBitmap.create ao invés de TJPEGImage.create. Lembre-se de adicionar JPEG em uses. Talvez algum outro colega saiba de uma maneira melhor e possa ajudar. Um abraço. Depois me manda esse programa aí.
  12. var altura, largura : integer; begin with TJPEGImage.Create do begin LoadFromFile('K:\Mulheres\Ellen Rocche01.jpg'); altura:=height; largura:=width; free; end; end; Depois desse código as variaveis altura e largura conterão as dimensões em pixels do arquivo 'Ellen Rocche01.jpg'. não seria necessário carregar a imagem na memória pra saber as dimensões se agente conhecesse a estrutura interna do arquivo.
  13. Não entendí bem, você gostaria que o seu programa tivesse um editor hexadecimal para a imagem? Se isso ajuda, existe a propriedade Pixels no canvas no qual pode-se ler e escrever a cor de um pixel da imagem, tipo para colocar uma cor num pixel -> Image1.canvas.pixels[34,67] := $0000FF; //Vermelho Image1.canvas.pixels[100,200] := $00FF00; //Verde Image1.canvas.pixels[665,432] := $FF0000; //Azul Explique melhor oque você quer fazer.
  14. Eu não conheço nenhuma função que faça isso. você pode fazer um TJPEG.LoadFromFile e ler as propriedades Width e Height para saber. Ou então conhecer a estrutura interna dos arquivos JPEG. Nas imagem Bitmap existem 2 registros de 4 bytes cada um no cabeçalho da imagem que informam a resolução horizontal e vertical. Só que como o formato do Bitmap varia também, a posição desses registros dentro do arquivo também varia. Então novamente é necessário conhecer a estrutura interna dos dados.
  15. No seu pode ter funcionado mas no meu não. Eu testei no Delphi 6 e no Delphi 2006 e deu o mesmo erro. o erro é que ele considera o TBitmap como um tipo record declarado na unit Windows, e não a classe TBitmap declarada na unit Graphics. E eu ainda coloquei Graphics primeiro do que Windows no Uses e não funcionou. Mas valeu. Opa, é só colocar Graphics.TBitmap que funciona. Desculpe a ignorância.
  16. Eu adicionei Graphics em uses. Se não tivesse adicionado o erro seria outro, ele diria que TBitmap não é um identificador declarado. Deve ser erro do meu delphi. você tentou esse código aí? Eu escreví direto no Project->View Source.
  17. Obrigado por responder, Churc. Ainda não pude testar essa função porque quando chega na linha _bmp := TBitmap.Create; ele diz que Create não é um identificador declarado, o que é um erro inexplicável. Mas vou continuar tentando;
  18. É isso mesmo, Churc, valeu! Que vergonha o Delphi já não ter isso pronto não é?
  19. Eu observei que quando se captura a imagem de um canvas de um form usando coordenadas que ultrapassam os limites do form, é possível capturar até tudo que está sendo mostrado na tela. Eu acho que oque determina que o canvas possa ler a memória de vídeo é o seu handle. Então eu queria saber se tem como, num programa sem forms, eu declarar uma canvas e por um handle nele para capturar o conteúdo da tela, igual eu faço com o canvas do form? Obrigado.
  20. O Delphi tem o TOpenDialog e o TSaveDialog, para salvar e abrir ARQUIVOS, mas e o dialog para escolher pasta? Como é que eu faço pra mostrar um dialog para abrir pastas? obrigado.
  21. Se ArrayInteiro for do tipo Set of integer, somente Ninteiro in ArrayOfInteiro basta. Se ArrayInteiro for do tipo Array of integer então -> type IntegerDynArray = array of integer; function contem(elem : integer; arr : IntegerDynArray) : Boolean; var i : cardinal; begin for i:=0 to length(arr)-1 do if (arr[i] = elem) then begin result:=true; exit; end; result:=false; end; Ou Ainda -> type IntegerDynArray = array of Integer; function contem(elem : integer; arr : IntegerDynArray) : Boolean; var i : integer; begin for i in arr do begin if (i = elem)then begin result:=true; exit; end; end; result:=false; end;
  22. var v : integer; begin v:=GetTickCount; Repeat Application.ProcessMessages; Until (GetTickCount > (v+5000)); . . . end; Ou ainda Sleep(5000);
  23. Apenas vá nas propriedades de vídeo e coloque um papel de parede que seja mais alto doque largo, digamos um retrato, e selecione a opção "Estender" e entenderá oque eu digo. Ele vai esticar a foto na horizontal deixando-a fora do aspecto original. Se eu não me engano existe um método no Canvas que desenha uma foto mudando a resolução. Agora, se for esse o método usado no TImage quando a propriedade Stretch está true não deve ser muito bom não. Se você fizer uma experiencia com o TImage você pode ver que não é uma redimensionamento suave, é o chamado redimensionamento nearest neighbor, que deixa a foto com qualidade ruim. O bom seria o redimensionamento Bilinear ou Bicubic. O tal do GDIPlus que vem com o windows xp faz isso, só que o Canvas do Delphi só acessa o GDI antigo, é preciso baixar as units que importam as funções do GDIPluss. Então digamos que eu tenha uma foto com metade da altura da tela, que seja mais alta doque larga, se eu coloco como papel de parede com opção centralizar ela vai ficar no tamanho original e eu quase não vou enchergar de longe, e se eu coloco com opção estender ela vai ficar esticada na horizontal. O que eu queria é que a foto preenchesse a altura toda da tela e mantesse a proporção entre largura e altura. ;) Boa sorte aí.
  24. Presumo que isto seja para aquele programa dos papéis de parede, se é eu vou te dar uma sugestão: Já reparou que o Windows XP não permite que você estenda um papel de parede que não tenha a mesma resolução da tela sem tirar o aspect ratio da mesma, caso não seja 4:3, ou seja, se eu tenho uma foto num aspect ratio diferente de 4:3 eu tenho duas opções -> ou deixo no tamanho original com aspecto original. ou deixo com aspecto 4:3 do tamanho da tela. porque que você não implementa uma rotina, já que você terá que converter as JPG para BMP, que redimensione a foto para preencher a altura ou a largura da tela toda mas mantendo o aspecto original?
  25. Fala Paulo, é o seguinte -> Uma vez eu precisei de um procedimento que preenchesse um TStringList com os nomes dos arquivos dentro de uma pasta, então eu escreví o seguinte -> function GetLocalFileList(Path : string; list : Tstrings) : cardinal; var search : TSearchRec; i : integer; begin if (path[length(path)] = '\') then delete(path,length(path),1); list.Clear; i:=findfirst(Path+'\*.*',$2F,search); if (i <> 0) then begin result:=1; findclose(search); exit; end; if (search.Name <> '.') and (search.Name <> '..') then list.Add(path+'\'+search.Name); while true do begin if (findnext(search) <> 0) then break; if (search.Name <> '.') and (search.Name <> '..') then list.Add(path+'\'+search.Name); end; { i:=0; while (i<=list.Count-1) do begin if directoryexists(list[i]) then list.Delete(i) else inc(i); end;} //só para diretórios findclose(search); result:=0; end; Então você declara uma TStrings -> var list : TStrings; begin list:=TStringList.Create; . . . Aí você passa como parametro a pasta onde estão as fotos e a lista -> GetLocalFileList('C:\Mulheres\',List); Aí utilize Random para escolher uma foto da lista -> Randomize; repeat foto:=List[random(list.count)]; until ((uppercase(copy(foto,length(foto)-3,4))='.JPG') or (uppercase(copy(foto,length(foto)-3,4))= '.BMP')); mas isso pode causar um loop infinito se não houverem imagens na pasta então é melhor passar um filtro na lista -> i:=0; while (i<=list.Count-1) do begin if ((uppercase(copy(list[i],length(list[i])-3,4)) <> '.BMP') and (uppercase(copy(list[i],length(list[i])-3,4)) <> '.JPG')) then list.delete[i] else inc(i); end; aí sim use -> Randomize; foto:=List[random(list.count)]; Eu acho que para assegurar que a lista contenha apenas arquivos e não pastas deve-se inserir a parte que está como comentario na função, não me lembro bem porque faz muito tempo que a escreví. acho que é isso, qualquer coisa me avise.
×
×
  • Criar Novo...