Jump to content
Fórum Script Brasil
  • 0

Escolher Um Arquivo Aleatório


Paulo Nobre

Question

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 to comment
Share on other sites

5 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.1k
    • Total Posts
      651.8k
×
×
  • Create New...