Performance - gravando configuracoes no modo binario

Top  Previous  Next

// como gravar configurações no modo binario?

// --- antes, como funciona o modo binario?

 

// imagine que voce tenha 4 checkbox e tenha que salvar as 

// configuracoes das checks em arquivo ini.

// o normal seria fazer algo assim:

 

btn_gravar:

 

  with TIniFile.create('arquivo.ini') do

  begin

    if CheckBox1.Checked then

      WriteString('setor''check1''1')

    else  

      WriteString('setor''check1''0');

 

    if CheckBox2.Checked then

      WriteString('setor''check2''1')

    else  

      WriteString('setor''check2''0');

 

    // e assim com todas as checks.

  end;

 

// o problema é que voce pode ter n checks e 

// deve gravar em UM UNICO CAMPO NO INI... é possível?

// a resposta: YES! NÓS TEMOS BANANA!

// o modo binario trabalha com bits (isto todo mundo sabe)

// com ele é possivel em apenas uma unica variavel é possivel

// armazenar n configuracoes do tipo boolean (como no caso de

// nossos checkboxes). 

// para fazer isto basta associar cada checkbox com um bit

// do numero. Exemplo:

 

// Variavel que contem a configuracao = X

 

  X = 0 1 0 0 

      | | | |_ CheckBox1 --- bit 1

      | | |___ CheckBox2 --- bit 2

      | |_____ CheckBox3 --- bit 3

      |_______ CheckBox4 --- bit 4

  

// O binário para 0100 = 4 -> neste caso basta gravar o numero 4

// Se marcado o CheckBox1 e CheckBox4 o binario é 1001 = 9 gravamos o 9.

// Para carrega as informações basta "dessecar" o numero e passar para

// as checkboxs de acordo com seu bit (ativado ou não)

 

// Voce deve estar se perguntando: COMO FAZER ISSO NA PRATICA???

 

// Este exemplo abaixo é de uma tela com 4 Checkboxes e 2 botoes (gravar, ler)

// foi testado e aprovado pelo INMETRO:

 

Uses IniFiles; 

 

procedure TForm1.GravaButtonClick(Sender: TObject);

var

  X: Byte;

begin

  X := 0// zero é nenhum checkbox marcado

  if CheckBox1.Checked then X := X + 1// a cada check é preciso inc o dobro...

  if CheckBox2.Checked then X := X + 2;

  if CheckBox3.Checked then X := X + 4;

  if CheckBox4.Checked then X := X + 8;

 

  // grava o valor de "x" num .ini

  with TIniFile.Create('C:\DADOS.INI') do 

    WriteString('secao''config', IntToStr(X) );

end;

 

procedure TForm1.LeButtonClick(Sender: TObject);

var

  X: Byte;

begin

  // carrega o valor de "x" previamente gravado no .ini

  with TIniFile.Create('C:\DADOS.INI') do 

    X := StrToIntDef(ReadString('secao''config''0'), 0);

 

  // seta tudo para falso

  CheckBox1.Checked := False;

  CheckBox2.Checked := False;

  CheckBox3.Checked := False;

  CheckBox4.Checked := False;

 

  // ATENÇÃO aqui é necessário começar de trás para frente do valor 

  // mais alto = 8, e do checkbox dele = checkbox4

  if X >= 8 then

  begin

    Dec(X, 8);                 // decremente o X neste valor

    CheckBox4.Checked := True;

  end;

 

  if X >= 4 then

  begin

    Dec(X, 4);

    CheckBox3.Checked := True;

  end;

 

  if X >= 2 then

  begin

    Dec(X, 2);

    CheckBox2.Checked := True;

  end;

 

  if X >= 1 then CheckBox1.Checked := True;

end;

 

// that's all folks.

// Se quiser fazer ficar mais HACK em vez de gravar o numero, grave um 

// caracter asc ao inves do numero (isto só é valido para binarios de

// até 8 bits.

// animal né?

 

**  "A mente do homem, uma vez ampliada por uma nova ideia, 

**  jamais retorna a sua dimensao anterior" O. W. Holmes.