Ir para conteúdo
Fórum Script Brasil
  • 0

Escolher Um Arquivo Aleatório


Paulo Nobre

Pergunta

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

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0

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í.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...