Paulo Nobre Postado Agosto 12, 2006 Denunciar Share Postado Agosto 12, 2006 Suponha que eu tenha uma pasta:C:\Minhas figuras com 10 figuras bmp e 5 jpg.Como poderia fazer para escolher aleatoriamente um desses arquivos.Alguém poderia me dar uma idéia simples de fazer isso.Imagino que tenha que usar randon, mas como seria esse uso?Agradeço a ajuda!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Agosto 12, 2006 Denunciar Share Postado Agosto 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Agosto 12, 2006 Denunciar Share Postado Agosto 12, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Agosto 13, 2006 Autor Denunciar Share Postado Agosto 13, 2006 Fala, Thales,Valeu por mais esta força.De fato estou tentando desenvolver o programa de papéis de parede.Vou estudar o código que você eestá me passando e tentar implementá-lo.Desculpe a ignorância mas não tenho a menor idéia do que seja aspect ratio.Converter de jpg para bmp sei fazer, mas o que você sugeriu não tenho amenor idéia. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Agosto 13, 2006 Denunciar Share Postado Agosto 13, 2006 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í. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Agosto 13, 2006 Autor Denunciar Share Postado Agosto 13, 2006 Valeu, Thales Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
Suponha que eu tenha uma pasta:C:\Minhas figuras com 10 figuras bmp e 5 jpg.
Como poderia fazer para escolher aleatoriamente um desses arquivos.
Alguém poderia me dar uma idéia simples de fazer isso.
Imagino que tenha que usar randon, mas como seria esse uso?
Agradeço a ajuda!!
Link para o comentário
Compartilhar em outros sites
5 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.