Fórum Consigo gravar o arquivo ini, mas não consigo ler. #316812

20/03/2006

0

Galera blz?

Bom é o seguinte, estou desenvolvendo um player de áudio e vídeo e gostaria de gravar o conteúdo do listbox num arquivo ini.

Fiz esse código aqui:
procedure TFrm_Princ.FormClose(Sender: TObject; var Action: TCloseAction);
var
 Ini: TIniFile;
 X: Integer;
begin
 Application.Terminate;
 Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, ´.ini´ ) );
try
 Ini.WriteInteger( ´Frm_Princ´, ´Top´, Top);
 Ini.WriteInteger( ´Frm_Princ´, ´Left´, Left);
 Ini.EraseSection(´VIDEOS´);
for X := 0 to Frm_ListaFilmes.ListaFilmes.Items.Count -1 do
 Ini.WriteString(´VIDEOS´,´´ +IntToStr(X), Frm_ListaFilmes.ListaFilmes.Items[X]);
finally
 Ini.Free;
end;
end;


Conseguindo gravar o conteúdo do listbox, veja ([b:690ab082e6][Frm_ListaFilmes]
Top=95
Left=407
Caption=Lista de Filmes/Musicas
[Frm_Princ]
Top=95
Left=0
[VIDEOS]
0=Aonde quer que eu vá.mp3
1=Marcelo D2 - Qual é.mp3
2=Ls Jack - Amanhã Não Se Sabe.mp3
3=Paralamas do Sucesso - Me Liga.mp3
4=Não olhe pra trás.mp3[/b:690ab082e6])

Mais não consigo ler.

Eu consegui fazer só essa parte do código
procedure TFrm_Princ.FormShow(Sender: TObject);
var
  Ini: TIniFile;
  X: Integer;
begin
 Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, ´.ini´ ) );
try
 Top     := Ini.ReadInteger( ´Frm_Princ´, ´Top´, 100 );
 Left    := Ini.ReadInteger( ´Frm_Princ´, ´Left´, 100 );
finally
 Ini.Free;
end;
end;
end;

O meu listbox fica em outro formulário, e estou colocando esse código no formulario principal.

Se alguém puder me ajudar ficarei grato.


Vitoreduardo

Vitoreduardo

Responder

Posts

21/03/2006

Paullsoftware

para saber se está granvando e lendo os valores corretamente de um arquivo ini, basta fazer uma nova aplicação e fazer um teste:
Cria o arquivo INI
NomeArquivo := ExtractFilePath(ParamStr(0))+ChangeFileExt(ExtractFileName(ParamStr(0)),´.ini´);
Try
 Ini := TIniFile.Create(NomeArquivo);
With Ini do begin
WriteBool(´Segurança´,´Desligar´,ckShutdown.Checked);//checkbox1
WriteBool(´Segurança´,´Cadastro´,ckCadastro.Checked);//checkbox2
WriteBool(´Segurança´,´Icones´,CkIcones.Checked);//checkbox3
WriteBool(´Opções´,´Iniciar´,ckIniciar.Checked);//checkbox4
WriteBool(´Opções´,´Gerenciador´,CkGerenciador.Checked);//checkbox5
WriteBool(´Opções´,´Barra de Tarefas´,chBarTarefas.Checked);//checkbox6
WriteFloat(´Opções´,´Hora´,EditValorDaHora.Value);
end;
Finally
Ini.Free;
end;


para ler o mesmo arquivo ini:
{
crie essas variaveis globais..
var
Form1 : TForm1;
vShutdown,
vCadastro,
vIcones,
vIniciar,
vGerenciador,
vBar:boolean;
vValorDaHora:Double;
}
procedure LerINIconfig;
var  Ini:TIniFile;
     NomeArquivo:String;
 begin
  NomeArquivo := ExtractFilePath(ParamStr(0))+ChangeFileExt(ExtractFileName(ParamStr(0)),´.ini´);
   Try
    Ini := TIniFile.Create(NomeArquivo);
     With Ini do begin
       vShutdown    := ReadBool(´Security´,´Desligar´,vShutdown);
       vCadastro    := ReadBool(´Security´,´Cadastro´,vCadastro);
       vIcones      := ReadBool(´Security´,´Icones´,vIcones);
       vIniciar     := ReadBool(´Opções´,´Iniciar´,vIniciar);
       vGerenciador := ReadBool(´Opções´,´Gerenciador´,vGerenciador);
       vValorDaHora := ReadFloat(´Opções´,´Hora´,vValorDaHora);
       vBar         := ReadBool(´Opções´,´Barra de Tarefas´,vBar);
     end;
       Finally
        Ini.Free;
   end;// try
end;

eu acho que o seu único problema no código é que quando vc usa [b:0ff53702c4]LEFT[/b:0ff53702c4] e [b:0ff53702c4]TOP[/b:0ff53702c4] são do form ativo... :!:

var
 X: Integer; 
Essa variável não está sendo usada pra nada em sua aplicação :!:
espero ter ajudado :wink:


Responder

Gostei + 0

21/03/2006

Massuda

Para ler a seção VIDEOS, faça algo assim...
var
  Lista: TStringList;
...
  Lista := TStringList.Create;
  Ini.ReadSection(´VIDEOS´, Lista);

  // faz alguma coisa com Lista
...
  Lista.Free;
...todas as strings da seção VIDEOS vão estar em Lista. Para obter o valor do item 0 faça Lista.Values[´0´] (neste caso, ´0´ é a string 0).


Responder

Gostei + 0

21/03/2006

Vitoreduardo

Só to apanhado.

O massuda, blz.

To tentando assim:
procedure TFrm_Princ.FormShow(Sender: TObject);
var
  Ini: TIniFile;
  Lista: TStringList;
begin
 Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, ´.ini´ ) );
try
 Top     := Ini.ReadInteger( ´Frm_Princ´, ´Top´, 100 );
 Left    := Ini.ReadInteger( ´Frm_Princ´, ´Left´, 100 );
 Lista   := TStringList.Create;
 Ini.ReadSection(´VIDEOS´, Lista);
 Ini.ReadString(´Videos´,´Video´,  Lista.Values[´0´]);
finally
 Ini.Free;
 Lista.Free;
end;
end;
end;


Não da erro, mais tb não lê.

A posição do Frm_Princ na tela quando fecho eu consigo ler normal, o problema é com a lista de vídeo mesmo.
Não sei se tem alguma coisa a ver, mais o meu listbox só mostra o nome do vídeo ou da musica Ex: Não olhe pra trás.mp3.
Ele não mostra a lista numerada tipo: 1:Não olhe pra trás.mp3.


Responder

Gostei + 0

21/03/2006

Massuda

... Lista := TStringList.Create; Ini.ReadSection(´VIDEOS´, Lista); ... finally ... Lista.Free; end; ....
Desse jeito, tudo que foi lido em Lista é jogado fora em seguida! O Ini.ReadSection carrega em Lista [b:9921bc5b11]todas[/b:9921bc5b11] as linhas contidas na seção VIDEOS.

... Ini.ReadString(´Videos´,´Video´, Lista.Values[´0´]); ....
Não entendi o que você quer fazer com isso.

Para carregar sua lista num ListBox, use no código ListBox.Items ao invés de Lista (ou seja, não precisa da variavel Lista).


Responder

Gostei + 0

21/03/2006

Vitoreduardo

Ai Massuda, troquei o Lista pelo meu listbox, mais não deu não

Ini.ReadString(´VIDEOS´,´´, Frm_ListaFilmes.ListaFilmes.Items.Values[´0´]);


Agora ta dando o erro na hora de compila
(Access violation at address 0046FED6 in Module).

Frm_ListaFilmes é o nome do Form que tem o listbox com o nome de ListaFilmes.


Responder

Gostei + 0

21/03/2006

Massuda

procedure TFrm_Princ.FormShow(Sender: TObject);
var
  Ini: TIniFile;
  Lista: TStringList;
  I: Integer;
begin
  Ini := TIniFile.Create(ChangeFileExt(Application.ExeName, ´.ini´));
  try
    Top := Ini.ReadInteger(´Frm_Princ´, ´Top´, 100);
    Left := Ini.ReadInteger(´Frm_Princ´, ´Left´, 100);

    Lista := TStringList.Create;
    try
      Ini.ReadSection(´VIDEOS´, Lista);

      Frm_ListaFilmes.ListaFilmes.Items.Clear;
      for I := 0 to Lista.Count - 1 do begin
        Frm_ListaFilmes.ListaFilmes.Items.Add(
          Lista.Values[IntToStr(I)]
        );
      end;
    finally
      Lista.Free;
    end;
  finally
    Ini.Free;
  end;
end;



Responder

Gostei + 0

21/03/2006

Emerson Nascimento

tente assim:
procedure TFrm_Princ.FormShow(Sender: TObject); 
var 
  Ini: TIniFile; 
begin 
  Ini := TIniFile.Create( ChangeFileExt( Application.ExeName, ´.ini´ ) ); 
  try 
    Top     := Ini.ReadInteger( ´Frm_Princ´, ´Top´, 100 ); 
    Left    := Ini.ReadInteger( ´Frm_Princ´, ´Left´, 100 ); 
    Ini.ReadSection(´VIDEOS´, Frm_ListaFilmes.ListaFilmes.Items);
  finally 
    Ini.Free; 
  end; 
end;
[b:8e7b88065b]note que para esse procedimento funcionar será necessário ter o Frm_ListaFilmes criado, senão você receberá a mensagem de Access Violation em tempo de execução.[/b:8e7b88065b]


Responder

Gostei + 0

21/03/2006

Vitoreduardo

O emerson.en blz?

O código que o Massuda passo funcionou + ou -.
Eu coloquei o código no OnShow do Frm_ListaFilmes e alterei essa parte do código
Ini.ReadSection(´VIDEOS/MUSICAS´, Lista)
Para
Ini.ReadSectionValues(´VIDEOS/MUSICAS´, Lista);


Agora to conseguindo ler, só não ta executando o vídeo ou a musica quando eu dou um duplo click nela.

Será que eu tenho que salvar o caminho também.


Responder

Gostei + 0

21/03/2006

Massuda

Será que eu tenho que salvar o caminho também.
Se os arquivos podem estar em qualquer pasta do micro, é melhor salvar o caminho também.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar