Clipper On Line • Ver Tópico - Listar Arquivos em uma Grid

Listar Arquivos em uma Grid

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Listar Arquivos em uma Grid

Mensagempor Pablo César » 18 Mar 2013 16:04

Olá Wellington,

- Não precisa incluir o Directry.ch, pois você não está utilizando nenhuma constante do Directry.
- Você colocou como variáveis PUBLIC as que eram do tipo LOCAL. Isso ocupa mais memória, sem necessidade.

guanabara escreveu:inseri um textbox para que eu possa digitar um novo nome para o arquivo e que apos o enter o mesmo renomei-e e mova para uma pasta com o mesmo nome
Tenho algumas perguntas, sobre isto:

- Não seria mais prático mudar o nome do arquivo de dentro do grid ?
- Qual é a necessidade de alterar o nome do arquivo ?
- Por qual motivo mudar para uma sub-pasta ? Não seria melhor mudar o nome para outro que não exista ?
- Acho que esta sintaxe, não deve estar funcionando. RENAMEFILE('C:\IMAGENS\TIF\' + cimagem, ...//... Verifique se não está se perdendo o arquivo renomeado. Pelo que eu entendo, deveria copiar com novo nome e depois excluir o arquivo, seria mais seguro.
- Mudando o arquivo para outra pasta, na visualização, ele utiliza o cPath que estaria fixo. Portanto não iria encontrar o arquivo na nova pasta/sub-pasta.

guanabara escreveu:só que quando chega mais o menos em 150 registros modificados a imagem da tela não é mais substituida pela próxima imagem
Você poderia disponibilizar um PrintScreen para ver os nomes dos arquivo a partir desses 150 registros ?

- Com respeito ao tamanho da janela, o programa não iria ficar estranho, caso a resolução da tela de algum terminal possa a ser menor ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Listar Arquivos em uma Grid

Mensagempor guanabara » 18 Mar 2013 16:59

Não precisa incluir o Directry.ch, pois você não está utilizando nenhuma constante do Directry.

É verdade, nos meus teste inseri o Directry.ch e esqueci de tirar, já tirei... hehehehe

Você colocou como variáveis PUBLIC as que eram do tipo LOCAL. Isso ocupa mais memória, sem necessidade.

Eu mudei de Local para Public pois apareceu o seguinte erro: Error Base/1003 Variable does not existe: CIMAGEM called from Renomear(174). Só resolveu quando passei para Public... Nem me pergunte porque.....

Não seria mais prático mudar o nome do arquivo de dentro do grid ?
- Qual é a necessidade de alterar o nome do arquivo ?
- Por qual motivo mudar para uma sub-pasta ? Não seria melhor mudar o nome para outro que não exista ?
- Acho que esta sintaxe, não deve estar funcionando. RENAMEFILE('C:\IMAGENS\TIF\' + cimagem, ...//... Verifique se não está se perdendo o arquivo renomeado. Pelo que eu entendo, deveria copiar com novo nome e depois excluir o arquivo, seria mais seguro.


Pelo textbox ficou bem pratico, funciona assim: quando abro o executável o SetFocus vai direto pro textbox, e lá digito o nome de uma cidade que visualizo na imagem do arquivo *.TIF, após digitar o nome da cidade dou enter, o que acontece: criasse uma pasta com o mesmo nome da cidade que digitei no textbox, renomeias-se o arquivo assim: Textbox + - + PRO01OLV.TIF, a parte final do nome do arquivo vem dos nomes originais que são: PRO01OLV.TIF, PRO01OLW.TIF, PRO01OLX.TIF (são 64mil arquivos, sem ordem nenhuma, na mesma pasta que só podem ser identificados após visualização). fazendo assim não fica com nome repetido, e o próprio comando RENAMEFILE os move para a pasta criada pois o caminho do arquivo renomeado é diferente. Após isso o setfocus vai para o grid, desce automaticamente 1 item, mostra a imagem equivalente a este item e retorna automaticamente para o textbox para que eu possa renomear um novo arquivo.

Mudando o arquivo para outra pasta, na visualização, ele utiliza o cPath que estaria fixo. Portanto não iria encontrar o arquivo na nova pasta/sub-pasta.


Isso é verdade..rsrsrssr...Após renome-alo e move-lo, se eu clicar no grid e subir os itens já não mostra mais a imagem do mesmo, não tem problema...heheheh, pois não da erro nenhum..... e a imagem já tá identificada e na sua pasta...

Você poderia disponibilizar um PrintScreen para ver os nomes dos arquivo a partir desses 150 registros ?


Não é bem 150 registros, cada hora é um tanto, não são os mesmo arquivos pois quando chega pelos 150 registros os anteriores já foram renomeados e movidos, tipo, parece ser um problema de memoria da Imagem, pois se eu fechar o programa quando renomear 100 registros e abri-lo novamente, não acontece nada... Tanto que fiz essa gambiarra.. hehehehe:

  If valor > 100
      Thiswindow.Release()
   endif


Não foi voce que me indicou essa gambiarra, mais aprendi com você o comando acima, de uma função de sair do programa que inseriu em uma outra fonte...hehehehe
guanabara
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 49
Data de registro: 03 Mar 2013 17:33
Cidade/Estado: Aracatuba-SP
Curtiu: 35 vezes
Mens.Curtidas: 2 vezes

Listar Arquivos em uma Grid

Mensagempor Pablo César » 18 Mar 2013 17:52

guanabara escreveu:Eu mudei de Local para Public pois apareceu o seguinte erro: Error Base/1003 Variable does not existe: CIMAGEM called from Renomear(174). Só resolveu quando passei para Public... Nem me pergunte porque.....
kkkkk (quê idade você tem ? você parece ser muito hilário, rs). É simples, ocorre que ao passá-las como Public, além das variáveis tornaram-se visíveis estarão ativas durante toda a execução do programa, sem fazer reposição de memória como era feito com Local. Isto é uma prática muito comum em Clipper, mas tem que deixar alguns vícios que poderão custar caros quanto a performance dos seus programas que sejam mais complexos. Se a função está precisando da variável cImagem, então re-crie ela como local da mesma forma que foi criada na função Exibir().

guanabara escreveu:Pelo textbox ficou bem pratico, funciona assim: quando abro o executável o SetFocus vai direto pro textbox, e lá digito o nome de uma cidade que visualizo na imagem do arquivo *.TIF, após digitar o nome da cidade dou enter, o que acontece: criasse uma pasta com o mesmo nome da cidade que digitei no textbox, renomeias-se o arquivo assim: Textbox + - + PRO01OLV.TIF, a parte final do nome do arquivo vem dos nomes originais que são: PRO01OLV.TIF, PRO01OLW.TIF, PRO01OLX.TIF (são 64mil arquivos, sem ordem nenhuma, na mesma pasta que só podem ser identificados após visualização). fazendo assim não fica com nome repetido, e o próprio comando RENAMEFILE os move para a pasta criada pois o caminho do arquivo renomeado é diferente
Agora entendi a sua real necessidade, mas o inconveniente que eu vejo em tudo isso é que criasse um monte de sub-pasta, sem necessidade (ao meu ver). O que você acha de ao invés de mover para sub-pasta, você renomeia os arquivo com o nome da cidade ? E aqui vai outra pergunta que vai ser chave para uma solução bem mais prática e mais abrangente: Cada cidade poderá ter mais de uma tif ? Pois se for, podemos renomear várias tif ao mesmo tempo com nomenclatura sequencial. Exemplo: "São Paulo_001.tif", "São Paulo_002.tif", "São Paulo_003.tif" ... e assim sucessivamente. Bastará você selecionar os registros com MultiSelect para renomeá-los.

guanabara escreveu:Não é bem 150 registros, cada hora é um tanto, não são os mesmo arquivos pois quando chega pelos 150 registros os anteriores já foram renomeados e movidos, tipo, parece ser um problema de memoria da Imagem, pois se eu fechar o programa quando renomear 100 registros e abri-lo novamente, não acontece nada... Tanto que fiz essa gambiarra
Entendi, parece ser mesmo dessa questão de ter passado as variáveis para Public. Corrija e veja se é isso.

Você não respondeu a uma questão minha:
Pablo César, antes escreveu:Com respeito ao tamanho da janela, o programa não iria ficar estranho, caso a resolução da tela de algum terminal possa a ser menor ?
Se o programa for utilizado em diversos terminais, tem que se certificar que todos eles tem a mesma resolução ou até maior, mas nunca menor. Senão vai ficar com a imagem cortada, ao menos que disponibilize outra janela para visualização ou colocar a janela com ScrollBar para rolagem da janela.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Listar Arquivos em uma Grid

Mensagempor luiz antonio da silva » 19 Mar 2013 23:17

Olá Pablo !

Fiz uma pequena alteração no código do nosse amigo, sei que ficou meio confuso mas poderá ser melhor explicado e quem sabe...melhorado né...rs, essa alteração resolve o problema de resoluções diferentes, vc tendo um tempinho pra testar e dar seu parecer, sinta-se em casa...rs

*mudei para minigui por não ter hmg disponivel.

#include <minigui.ch>

Function Main(cPath)
Public aFiles:={}, aTemp, nTam, I
Public MaxWd:=1920; MaxHd:=1440
Public wd:=GetDesktopWidth(), hd:=GetDesktopHeight()

/*
As variaveis MaxWd e MaxHd definem tamanho maximo para resolução do monitor
Wd é o tamanho atual das colunas (em pixel)
Hd é o tamanho atual das linhas (em pixel)

como calcular (Exemplo):
(100/1920) = 0.0520833 (colunas em %)
(100/1440) = 0.0694444 (linhas em %)

coordenadas: linha 30 coluna 300
achar % da linha = (30*0.694444) = 20.83332%
achar % da coluna = (300*0.520833) = 15.62499%

codigo:
define label lb1
       col (hd*0.0694444)/100  // o mesmo que 30 (so que em percentual)
       row (wd*0.520833)/100   // o mesmo que 300 (so que em percentual)
       ...
       
       
Wd sendo 1024 e Hd sendo 768 ficaria assim traduzido
coluna: (1024*0.520833)/100
linha : (768*0.694444)/100
*/

If cPath=Nil
   cPath:="C:\IMAGENS\TIF"
Endif

aTemp:=Directory(cPath + "\*.tif")
nTam:=Len(aTemp)
For I=1 To nTam
    AaDd(aFiles,{aTemp[I,1]})
Next

DEFINE WINDOW Form_1 AT 0,0           ;
       WIDTH wd                       ;
       HEIGHT hd                      ;
       TITLE "Visualizador de Imagens";
       ICON NIL MAIN
       
       DEFINE GRID Grid_1
              ROW    (hd*1.157407)/100   //10
              COL    (wd*0.868055)/100   //10
              WIDTH  (wd*26.04165)/100   //300
              HEIGHT (hd*87.546269)/100  // 670
              ITEMS aFiles
              VALUE 1
              WIDTHS { ((wd*26.04165)/100) }  //300
              HEADERS {'Nome do Arquivo'}
              FONTNAME "Arial"
              FONTSIZE 9
              TOOLTIP ""
              ONCHANGE Exibir(cPath, This.Value)
       END GRID

    DEFINE IMAGE Image_1
        ROW    (hd*9.259256)/100  //80
        COL    (wd*28.645815)/100 //330
        WIDTH  (wd*70.0)/100      //1500
        HEIGHT (hd*85.0)/100      //1500
        PICTURE ""
        HELPID Nil
        VISIBLE .T.
        STRETCH .F.
        ACTION Nil
    END IMAGE

    DEFINE TEXTBOX Text_1
        ROW    (hd*4.629628)/100 //40
        COL    (wd*43.40275)/100 //500
        WIDTH  (wd*50.0)/100     //680
        HEIGHT (hd*3.472221)/100 //30
        FONTNAME "Arial"
        FONTSIZE 9
        ONENTER RENOMEAR()
        UPPERCASE   .T.
        VALUE ""
    END TEXTBOX
   
      DEFINE LABEL NomeAgencia
        ROW    (hd*4.629628)/100 //40
        COL    (wd*31.24998)/100 //360
        WIDTH  (wd*17.3611)/100  //200
        HEIGHT (hd*3.472221)/100 //30
        VALUE "Nome da Agencia:"
        FONTNAME "Arial"
        FONTSIZE 10
        FONTBOLD .T.
        VISIBLE .T.
    END LABEL

END WINDOW

MAXIMIZE WINDOW FORM_1

        Exibir(cPath,1)
        Form_1.Text_1.SetFocus
        Form_1.Center
        Form_1.Activate

Return nil

Function Exibir(cPath,nItem)

     Public cImagem:= GetProperty("Form_1","Grid_1","Item",nItem)[1]

     If IsControlDefined(Image_1,Form_1)
        SetProperty("Form_1","Image_1","Picture",cPath + "\" + cImagem)
     Endif

Return Nil

Function Renomear()

   Public cProcura:=GetProperty("form_1","text_1","Value")

   If Empty ( Form_1.Text_1.Value )
      MsgInfo("Nome do Arquivo Em Branco, Digite o novo nome do arquivo confor imagem abaixo...")
      Return
   EndIf
   
   
   DIRMAKE(CProcura)
   RENAMEFILE('C:\IMAGENS\TIF\' + cimagem, 'C:\IMAGENS\'+ cProcura +'\' + cProcura + ' - ' + cImagem + '.JPG')
 
 
   SetProperty("Form_1","Text_1","Value", "")

   Valor:=GetProperty("form_1","GRID_1","Value")
 
   SetProperty("Form_1","GRID_1","VALUE", VALOR + 1)
   SetProperty("Form_1","Image_1","Picture", "")
 
 
    Msgbox((STR(VALOR)))  // PARA VER EM QUAL REGISTRO PAROU DE TROCAR AS IMAGENS //
 

Return Nil


Abraço.
Luiz
HMG 3.4.4 - SQL SERVER - ORACLE
luiz antonio da silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 21 Nov 2006 21:12
Cidade/Estado: serrana-sp
Curtiu: 13 vezes
Mens.Curtidas: 10 vezes

Listar Arquivos em uma Grid

Mensagempor Pablo César » 20 Mar 2013 11:44

Parabéns Luiz ! Nunca tinha visto essa forma de atribuir valores ao Row, Col, Height e Widths. Você teria outros exemplos para mostrar-nos ? Se pudesse postar neste tópico (para não haver desvio de assunto) eu agradeceria.

Se bem que o colega Wellington (alias guanabara) ainda não respondeu as minhas questões apresentadas, o que eu temia era sobre a resolução da tela e o que poderia ser feito para que o tamanho das imagens não excedam o tamanho do form principal. A minha sugestão seria visualizar num segundo form e que pudesse adicionar scrollbars. E você apresentou uma solução muito útil para dimensionar tamanhos de acordo a resolução. Também postei uma outra solução de redimensionamento em tempo de execução no link que passei aqui acima.

As vezes os colegas não gostam de serem questionados, mas tudo depende de qual é o resultado exigido e o que pode ser melhorado. Parece ser perda de tempo as vezes quando fazemos muitas perguntas, mas tem o objetivo de apresentar soluções mais adequadas e que dão lugar a novas ideias enriquecendo o nosso constante aprendizado.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar de usuário

Pablo César
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 5312
Data de registro: 31 Mai 2006 10:22
Cidade/Estado: Curitiba - Paraná
Curtiu: 142 vezes
Mens.Curtidas: 152 vezes

Listar Arquivos em uma Grid

Mensagempor luiz antonio da silva » 20 Mar 2013 14:08

Opa !

Vou montar alguns exemplos legais e colocar no tópico indicado.

Luiz.
HMG 3.4.4 - SQL SERVER - ORACLE
luiz antonio da silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 21 Nov 2006 21:12
Cidade/Estado: serrana-sp
Curtiu: 13 vezes
Mens.Curtidas: 10 vezes

Listar Arquivos em uma Grid

Mensagempor guanabara » 25 Mar 2013 13:43

kkkkk (quê idade você tem ? você parece ser muito hilário, rs). É simples, ocorre que ao passá-las como Public, além das variáveis tornaram-se visíveis estarão ativas durante toda a execução do programa, sem fazer reposição de memória como era feito com Local. Isto é uma prática muito comum em Clipper, mas tem que deixar alguns vícios que poderão custar caros quanto a performance dos seus programas que sejam mais complexos. Se a função está precisando da variável cImagem, então re-crie ela como local da mesma forma que foi criada na função Exibir().


Desculpa a demora pela resposta, estava renomeando as 65 mil fotos com esse programa que você elaborou e terminei ontem... Tenho 34 anos, os risos é porque estou muito feliz em aprender a continuidade do Clipper que é o HMG. Não consegui passar as variáveis para Local por falta de tempo, como coloquei o If para quando chegar em 100 registros ele abortar o programa pra mim ficou bom pois dou uma descansada nos braços e reabro o programa novamente..

Agora entendi a sua real necessidade, mas o inconveniente que eu vejo em tudo isso é que criasse um monte de sub-pasta, sem necessidade (ao meu ver). O que você acha de ao invés de mover para sub-pasta, você renomeia os arquivo com o nome da cidade ? E aqui vai outra pergunta que vai ser chave para uma solução bem mais prática e mais abrangente: Cada cidade poderá ter mais de uma tif ? Pois se for, podemos renomear várias tif ao mesmo tempo com nomenclatura sequencial. Exemplo: "São Paulo_001.tif", "São Paulo_002.tif", "São Paulo_003.tif" ... e assim sucessivamente. Bastará você selecionar os registros com MultiSelect para renomeá-los.


Então sobre as sub-pastas é um pedido do meu patrão, ele quer que cada cidade fique em uma pasta com seus respectivos arquivos. Cada cidade tem centenas de *.Tif e tenho que manter o nome original do arquivos no final do novo nome, exemplo:

Nome Antigo: PRO01N0P.TIF
Novo Nome: ARACATUBA - PRO01N0P.TIF

Se o programa for utilizado em diversos terminais, tem que se certificar que todos eles tem a mesma resolução ou até maior, mas nunca menor. Senão vai ficar com a imagem cortada, ao menos que disponibilize outra janela para visualização ou colocar a janela com ScrollBar para rolagem da janela.


Desculpa não ter dado atenção a esta pergunta, então, a imagem realmente fica cortada em todos os computadores que rodei o software, nem tem problema para mim, pois somente parte da visualização da imagem é importante pra mim que é na parte superior central, pois lá se encontra o nome da cidade de todos os arquivos *.TIF.

Olá Pablo !

Fiz uma pequena alteração no código do nosse amigo, sei que ficou meio confuso mas poderá ser melhor explicado e quem sabe...melhorado né...rs, essa alteração resolve o problema de resoluções diferentes, vc tendo um tempinho pra testar e dar seu parecer, sinta-se em casa...rs

*mudei para minigui por não ter hmg disponivel


Obrigado pela atenção Luis Antônio, testei aqui e rodou perfeitamente para mostrar as imagens, mas como havia dito acima a imagem naquele tamanho pra mim é o ideal, fica cortada uma parte dela, só que a parte que quero ver fica bem dimensionada na tela. Copiei o código para futuros projetos. Valeu mesmo. :{

Se bem que o colega Wellington (alias guanabara) ainda não respondeu as minhas questões apresentadas, o que eu temia era sobre a resolução da tela e o que poderia ser feito para que o tamanho das imagens não excedam o tamanho do form principal. A minha sugestão seria visualizar num segundo form e que pudesse adicionar scrollbars. E você apresentou uma solução muito útil para dimensionar tamanhos de acordo a resolução. Também postei uma outra solução de redimensionamento em tempo de execução no link que passei aqui acima.

Pablo, desculpa mesmo por demorar para responder, segue acima minha colocações sobre suas questões.

As vezes os colegas não gostam de serem questionados, mas tudo depende de qual é o resultado exigido e o que pode ser melhorado. Parece ser perda de tempo as vezes quando fazemos muitas perguntas, mas tem o objetivo de apresentar soluções mais adequadas e que dão lugar a novas ideias enriquecendo o nosso constante aprendizado.

Não vejo problemas em seus questionamentos, pelo contrário, acho muito importante, pois me faz abrir os olhos sobre questões que não havia visualizado no código. Este mês está sendo um ótimo mês pra mim, pois fazia anos que não programava e você me fez voltar a ativa com sua Atenção e paciência em compartilhar seu conhecimento. Serei eternamente grato pela sua disposição... Valeu Amigo... :-Y
guanabara
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 49
Data de registro: 03 Mar 2013 17:33
Cidade/Estado: Aracatuba-SP
Curtiu: 35 vezes
Mens.Curtidas: 2 vezes

Anterior



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 6 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro