Ir ao conteúdo
  • Cadastre-se
Druid

Projeto delphi 5

Recommended Posts

Pessoal preciso muito da ajuda dos feras deste fórum.

Seguinte, usei e ainda uso um programa para cadastrar conteúdos de DVD, e HDD, o programa foi feito em Delphi 5, e o desenvolvedor descontinuou o programa e disponibilizou os fontes para a comunidade GNU.

Ocorre que faz muito tempo que não mexo com Delphi, e como o programa é antigo, porém muito bom e funcional, ele não trata o tamanho dos arquivos em GigaBytes/TeraBytes, nem existiam HD com 1TB ou maiores na época, e meus arquivos MKV, por exemplo, que tem valores em GigaBytes, o programa está lendo e armazenando os tamanhos dos arquivos com valores errôneos, e os apresenta com valores negativos e muitas vezes errados.

Abri o projeto e verifiquei que o desenvolvedor usa programação de baixo nível com uso de record e ponteiros, para ler um DVD, ou um HDD, e tentei por 3 dias entender a lógica disso, mas estou jogando a toalha, porque não sei como alterar a leitura/gravação dos arquivos .QDR que ele cria, para contemplar GIGA BYTES e/ou TERA BYTES.

Se alguém puder me ajudar, ficarei muito grato.

A fonte encontra-se aqui https://mega.nz/#!bgw3mL4K!ln-C0iOSHrVighGGXoHB-cZgMgDXMIdOTo5Hy-bnrXU


Att.

Druid®.

Editado por Simon Viegas
Inserir o link já com a chave.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é ninguém mais mexe com Delphi 5 mesmo, burrice minha perguntar algo neste teor não é mesmo :(.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok amigo, vou aguardar seu parecer então.

 

Veja o arquivo anexo, cheguei neste UBaseUtils.pas, mas não consegui entender como ele faz para gravar a estrutura, para poder alterar no ponto certo de inteiro para real, permitindo assim ele gravar o valor real em bytes de um giga/tera bytes, pois na época que foi desenvolvido o programa, acredito que o autor não se preocupou que chegaríamos a usar estes valores.

 

Att.

 

Druid®.

 

Debug DiskBase Delphi 5.rar

Editado por Druid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

Não é ali, eu já fiz esse tipo de ajuste incluindo Gb e Tb antes a muito tempo, por isso reconheci mais rápido.

de modo geral a rotina funciona assim

divide o tamanho do arquivo por 1024 e compara com Tb depois Gb Mb Kb, não são essas variaveis tem outro nome lá,

Tb e Gb tem que criar e incluir junto com as outras e são duas rotinas iguais para locais diferentes.

Mas pra que serve esse prog? eu tenho mais de 8.000 filmes em meu servidor.

A função é essa, mas não terminei.

// Formats big size to displayable string (in MB or GB)

function FormatBigSize(Size: comp): ShortString;

  var
    FSize      : Double;
    S          : ShortString;

  begin
    if Size > kBDivider  then
    begin
      FSize := Size;
      FSize := FSize / kBDivider;
      if FSize >= kBDivider  then
      begin
        FSize := FSize / kBDivider;
        if FSize >= kBDivider    then
        begin
          FSize := FSize / kBDivider;
          if FSize >= kBDivider     then
          begin
            FSize := FSize / kBDivider;
            if FSize < 10 then S := Format('%2.2n TB', [FSize]) else S := Format('%2.1n TB', [FSize]);
          end
            else if FSize < 10 then S := Format('%2.2n GB', [FSize]) else S := Format('%2.1n GB', [FSize]);
        end
          else
          begin
            if FSize < 10 then S := Format('%2.2n MB', [FSize])  else S := Format('%2.1n MB', [FSize]);
          end
      end
        else if FSize < 10 then S := Format('%2.2n kB', [FSize]) else S := Format('%2.1n kB', [FSize]);
    end
      else
      begin
        if Size = 0 then S := '0'  else S := Format('%2.0n B', [Size]);
      end;
  FormatBigSize := S;
  end;

//-----------------------------------------------------------------------------
// inserts spaces at thousands, millions etc.

function FormatNumber(Number: longint): ShortString;

  begin
  Result := IntToStr(Number);
  if Result[0] >  #3 then ShortInsert(' ', Result, length(Result) -2);
  if Result[0] >  #7 then ShortInsert(' ', Result, length(Result) -6);
  if Result[0] > #11 then ShortInsert(' ', Result, length(Result)-10);
  end;

//----------------------------------

variáveis

  var
    WinDateFormat, SaveWinDateFormat: (wd_mdy, wd_ymd, wd_dmy, wd_WinShort);
 TBDivider, gBDivider, mBDivider, kBDivider: Integer;

Inicilização delas

//---initialization------------------------------------------------------------

var
  KernelHandle: THandle;

begin
kBDivider := 1024;
mBDivider := kBDivider*1024;
gBDivider := mBDivider*1024;
tBDivider := gBDivider*1024;

alterar uma função de outros as vezes da trabalho, mas é isso , pra converter um numero em extenso é bem parecido.

tem que formatar a saida, o codigo esta junto abaixo da função.

Vai fazendo ai que eu te ajudo.

 

Boa diversão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi amigo Gerson, este programa serve para cadastrar todo seu acervo de mídias externas, como por exemplo: CD, DVD, BD, HDD, PENDRIVE. Como tenho também muitos filme em Gigabytes, notei que ele apresenta valores malucos, pois ele ao ler, não considera tamanhos em Gigas ou Teras, e ai tenta colocar este valor em uma variável inteira, e claro, ele armazena valores não reais, que variam de números grandes ou números negativos.

 

Existem outros programas no mercado, mas eu gosto muito de usar ele, e uso a anos, a anos atrás servia bem, para controlar meu acervo gigante de MP3, depois mudei para áudios lossless como FLAC, APE, WV, M4A, porém como meus filmes MKV são em Gigas, ai comecei a ter problemas de verificar o quanto eles estão ocupando nas mídias, por exemplo num HDD de 2TB ou 4TB que tenho aqui.

 

Vou dar uma olhada aqui e ver se consigo alterar para contemplar estes valores, espero conseguir.

Obrigado pela ajuda, mas se você conseguir resolver ai, e quiser me passar os fontes no servidor MEGA ou 4SHARED eu agradeço de coração :).

 

Att.

 

Druid®.

Editado por Druid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Gerson, uma dúvida, existe um setup deste programa onde você escolhe apresentar o arquivo, "file size", onde você determina se a apresentação é em bytes ou em Kbytes, MB (Mbytes), com a implementação do GB e/ou TB, da sua função, temos valores que cabem num Integer do Delphi 5, mas o que eu questiono é o formato como ele grava o arquivo .QDR, e como ele recupera a informação do arquivo .QDR; ocorre que se eu posso apresentar o valor em bytes, um Integer do Delphi 5, jamais irá poder conter um valor de tamanho de arquivo em GB ou TB, para isso é preciso que a estrutura comporte tamanho real do tipo COMP ou REAL, do Delphi 5, e este para mim é o "REAL PROBLEMA" de o programa estar pegando valores malucos positivos e negativos ao apresentá-lo, você concorda comigo, é lógica pura certo?

 

Penso que o programa atual está gravando valores Gigabytes e Terabytes, no formato byte errado, pois ele grava e lê com Integer, entendeu o problema?

Att.

 

Druid®.

 

P.S. Vide imagem em anexo, como está a apresentação dos valores atuais "errôneos" dos meus arquivos MKV, e a tela de Settings que posso alterar pelo programa para apresentar o tamanhos apenas em bytes.

TelaSettingsDiskBase.jpg

Editado por Druid

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em sábado, 17 de setembro de 2016 às 20:20, gerson carlos de simone disse:

Olá.

Não é ali, eu já fiz esse tipo de ajuste incluindo Gb e Tb antes a muito tempo, por isso reconheci mais rápido.

de modo geral a rotina funciona assim

divide o tamanho do arquivo por 1024 e compara com Tb depois Gb Mb Kb, não são essas variaveis tem outro nome lá,

Tb e Gb tem que criar e incluir junto com as outras e são duas rotinas iguais para locais diferentes.

Mas pra que serve esse prog? eu tenho mais de 8.000 filmes em meu servidor.

A função é essa, mas não terminei.


// Formats big size to displayable string (in MB or GB)

function FormatBigSize(Size: comp): ShortString;

  var
    FSize      : Double;
    S          : ShortString;

  begin
    if Size > kBDivider  then
    begin
      FSize := Size;
      FSize := FSize / kBDivider;
      if FSize >= kBDivider  then
      begin
        FSize := FSize / kBDivider;
        if FSize >= kBDivider    then
        begin
          FSize := FSize / kBDivider;
          if FSize >= kBDivider     then
          begin
            FSize := FSize / kBDivider;
            if FSize < 10 then S := Format('%2.2n TB', [FSize]) else S := Format('%2.1n TB', [FSize]);
          end
            else if FSize < 10 then S := Format('%2.2n GB', [FSize]) else S := Format('%2.1n GB', [FSize]);
        end
          else
          begin
            if FSize < 10 then S := Format('%2.2n MB', [FSize])  else S := Format('%2.1n MB', [FSize]);
          end
      end
        else if FSize < 10 then S := Format('%2.2n kB', [FSize]) else S := Format('%2.1n kB', [FSize]);
    end
      else
      begin
        if Size = 0 then S := '0'  else S := Format('%2.0n B', [Size]);
      end;
  FormatBigSize := S;
  end;

//-----------------------------------------------------------------------------
// inserts spaces at thousands, millions etc.

function FormatNumber(Number: longint): ShortString;

  begin
  Result := IntToStr(Number);
  if Result[0] >  #3 then ShortInsert(' ', Result, length(Result) -2);
  if Result[0] >  #7 then ShortInsert(' ', Result, length(Result) -6);
  if Result[0] > #11 then ShortInsert(' ', Result, length(Result)-10);
  end;

//----------------------------------

variáveis


  var
    WinDateFormat, SaveWinDateFormat: (wd_mdy, wd_ymd, wd_dmy, wd_WinShort);
 TBDivider, gBDivider, mBDivider, kBDivider: Integer;

Inicilização delas


//---initialization------------------------------------------------------------

var
  KernelHandle: THandle;

begin
kBDivider := 1024;
mBDivider := kBDivider*1024;
gBDivider := mBDivider*1024;
tBDivider := gBDivider*1024;

alterar uma função de outros as vezes da trabalho, mas é isso , pra converter um numero em extenso é bem parecido.

tem que formatar a saida, o codigo esta junto abaixo da função.

Vai fazendo ai que eu te ajudo.

 

Boa diversão.

Em sábado, 17 de setembro de 2016 às 20:20, gerson carlos de simone disse:

Olá.

Não é ali, eu já fiz esse tipo de ajuste incluindo Gb e Tb antes a muito tempo, por isso reconheci mais rápido.

de modo geral a rotina funciona assim

divide o tamanho do arquivo por 1024 e compara com Tb depois Gb Mb Kb, não são essas variaveis tem outro nome lá,

Tb e Gb tem que criar e incluir junto com as outras e são duas rotinas iguais para locais diferentes.

Mas pra que serve esse prog? eu tenho mais de 8.000 filmes em meu servidor.

A função é essa, mas não terminei.


// Formats big size to displayable string (in MB or GB)

function FormatBigSize(Size: comp): ShortString;

  var
    FSize      : Double;
    S          : ShortString;

  begin
    if Size > kBDivider  then
    begin
      FSize := Size;
      FSize := FSize / kBDivider;
      if FSize >= kBDivider  then
      begin
        FSize := FSize / kBDivider;
        if FSize >= kBDivider    then
        begin
          FSize := FSize / kBDivider;
          if FSize >= kBDivider     then
          begin
            FSize := FSize / kBDivider;
            if FSize < 10 then S := Format('%2.2n TB', [FSize]) else S := Format('%2.1n TB', [FSize]);
          end
            else if FSize < 10 then S := Format('%2.2n GB', [FSize]) else S := Format('%2.1n GB', [FSize]);
        end
          else
          begin
            if FSize < 10 then S := Format('%2.2n MB', [FSize])  else S := Format('%2.1n MB', [FSize]);
          end
      end
        else if FSize < 10 then S := Format('%2.2n kB', [FSize]) else S := Format('%2.1n kB', [FSize]);
    end
      else
      begin
        if Size = 0 then S := '0'  else S := Format('%2.0n B', [Size]);
      end;
  FormatBigSize := S;
  end;

//-----------------------------------------------------------------------------
// inserts spaces at thousands, millions etc.

function FormatNumber(Number: longint): ShortString;

  begin
  Result := IntToStr(Number);
  if Result[0] >  #3 then ShortInsert(' ', Result, length(Result) -2);
  if Result[0] >  #7 then ShortInsert(' ', Result, length(Result) -6);
  if Result[0] > #11 then ShortInsert(' ', Result, length(Result)-10);
  end;

//----------------------------------

variáveis


  var
    WinDateFormat, SaveWinDateFormat: (wd_mdy, wd_ymd, wd_dmy, wd_WinShort);
 TBDivider, gBDivider, mBDivider, kBDivider: Integer;

Inicilização delas


//---initialization------------------------------------------------------------

var
  KernelHandle: THandle;

begin
kBDivider := 1024;
mBDivider := kBDivider*1024;
gBDivider := mBDivider*1024;
tBDivider := gBDivider*1024;

alterar uma função de outros as vezes da trabalho, mas é isso , pra converter um numero em extenso é bem parecido.

tem que formatar a saida, o codigo esta junto abaixo da função.

Vai fazendo ai que eu te ajudo.

 

Boa diversão.

 

Opa, acho que precisava citar seu post, para você ser informado ai :).

 

Att.

 

Druid®.

 

P.S. Favor ler posts acima :).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom imaginei desde o início, ao ler o código, e tentar seguir a lógica, que seria complicado alterar o mesmo para contemplar dados maiores como Giga e Tera bytes, não é apenas uma função para calcular valores menores dividindo-se o valor do tamanho de um arquivo lido em bytes por 1024, como eu suspeitava, o problema está na criação do arquivo QDR, na sua estrutura, que só aceitas valores baixos como integer.

Ao ler as informações da estrutura de uma pasta, um arquivo contendo valores em Giga ou Tera bytes, não pode ser representados por Integer, teria que ser Real, e é ai que está o erro atual do programa, não estava preparado para estes valores de tamanho de arquivos.

 

Druid®

Editado por Druid

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, gerson carlos de simone disse:

bom dia

como você abre o QDR?

a informação sobre o tamanho ele não grava lá, ele lé sempre, nas duas rotinas, uma no evento do mouse e outra na gravação das listas.

realmente ele não está preparado.

 

Desculpe amigo, mas acho que você não entendeu, este programa não é meu, logo como vou saber como ele abre um arquivo QDR?

Na realidade até onde eu pude perceber, pelo pouco que conheço do delphi, neste nível de leitura de arquivos binários, é que ele lê a estrutura de pastas do Windows, para poder carregar as informações para o sistema, ora, se ele no programa inteiro usa integer e não real, ele nunca poderá carregar o valor correto em bits deste arquivo, já que ele dá a opção, como mostrei acima, de visualizar o tamanho de um arquivo em bits, e isto não pode ser representado em tamanhos como Giba e Tera bytes correto?

O que eu preciso é que alguém me ajude a ver onde ele lê estas pastas, e onde deveria haver mudança de integer para real, para que os tamanhos do arquivos atuais sejam armazenados com o valor real em bits e onde mudar para eles serem recuperados em bits; quanto a sua função sim, é só alterar no local onde ela deva existir, onde eu mostrei acima que ele permite "display in KB, MB".

 

Enfim, esperava que alguém, com mais conhecimento que eu pudesse me dizer onde alterar o código, porque fiquei meio perdido para fazer um debug neste código, como já expliquei acima no arquivo texto anexado, espero que você tendo mais conhecimento, me aponte os locais.

 

Att.

 

Druid®.

Editado por Druid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi sim, que o programa não é seu, e que você afirmou que o problema está na criação do arquivo QDR, na sua estrutura, que só aceitas valores baixos como integer, pensei que você tinha visto a estrutura dele com um aplicativo próprio para ele, pra você você saber como abrir, procura pela extensão dele pode ser no google, se não achar o programa associado abre o arquivo com um editor de textos, e analisa a estrutura, eu fiz isso e não encontrei nenhuma referencia ao tamanho.

E não é um arquivo binário, você pode ver a estrutura na unit - UEngineMain.pas, também todas as funções de trabalho com ele.

Eu já mostrei pra você onde as variáveis estão declaradas onde elas são iniciadas as que tem  que acrescentar, onde elas são usadas para fazer a conversão. e como é feita a conversão.

 

Agora espero que você estude um pouco mais, anualize o código, e depois disso se tiver alguma duvida pode perguntar.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×