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