자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey XE8 Android에서 ini 파일 관련 문의 드립니다.
2015.12.21 21:38
첫번째 질문입니다.
아래와 같이 1개의 폼(같은 폼)에서 ini파일을 쓰고, 읽어오면 정상적으로 잘 되는데.
2개의 폼(다른 폼)에서 한개는 ini 파일을 쓰고, 또 다른 한개의 폼에서는 ini 파일을 읽어오면
현재 데이터를 읽어오지 못하고 전에 저장된 데이터를 읽어옵니다.
왜 그런건가요?
// Form1 : Main 폼
uses
System.IOUtils, System.IniFiles;
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2.Activate;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.Show;
end;
procedure TForm1.FormShow(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
ShowMessage(iFile.ReadString('Env', 'User', '')); // Form2에서 Edit1.Text의 값이 a이면 b가 출력되고, b이면 a가 출력됨
finally
iFile.DisposeOf;
end;
end;
* 즉, 방금 저장된 값이 출력이 되는것이 아니라 전에 저장된 값이 출력이 됨(Form2 폼에서는 바로 저장된 값이 출력됨)
* 참고 : 이 현상은 2번 이상 실행을 해봐야 문제점을 확인할 수 있습니다.
*ex) 처음에 b입력시 a출력, 다시 실행하여 b입력시 b출력, 다시 실행하여 a입력시 b출력
// Form2 : 서브폼(로그인)
uses
System.IOUtils, System.IniFiles;
{$R *.fmx}
procedure TForm2.Button1Click(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
iFile.WriteString('ENV' ,'User', Edit1.Text); // (Edit1.Text 에서 입력값이 a이면) / (Edit1.Text 에서 입력값이 b이면)
finally
iFile.DisposeOf;
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
ShowMessage(iFile.ReadString('Env', 'User', '')); // (a라고 출력됨) / (b라고 출력됨) -- 정상적으로 잘 출력됨
finally
iFile.DisposeOf;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.free;
end;
===============================================================
두번째 질문입니다.
이번에는 Form2에서 ini 파일을 WriteString하지 않고 직접 ini파일을 생성해서
ini파일 자체를 업로드 하는 법을 알려주세요
제가 해본 방법은
Project > Deployment 메뉴에서 Add files 버튼을 누르고 미리 만들어 놓은 ini 파일을 선택 후에
Platform - [Android]
Remote Path - assets\internal로 수정하고 실행하면 ini파일의 내용을 불러오질 못하더라구요
ShowMessage(iFile.ReadString('Env', 'User', '')); 하면 아무값도 출력이 안됩니다.
ini.WriteString 해서 실행하면 불러오는데 직접 만든 ini파일은 왜 안되는지 모르겠습니다.
Firemonkey XE8 Android에서 ini 파일 관련 문의 드립니다.
2015.12.21 21:38
첫번째 질문입니다.
아래와 같이 1개의 폼(같은 폼)에서 ini파일을 쓰고, 읽어오면 정상적으로 잘 되는데.
2개의 폼(다른 폼)에서 한개는 ini 파일을 쓰고, 또 다른 한개의 폼에서는 ini 파일을 읽어오면
현재 데이터를 읽어오지 못하고 전에 저장된 데이터를 읽어옵니다.
왜 그런건가요?
// Form1 : Main 폼
uses
System.IOUtils, System.IniFiles;
{$R *.fmx}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form2.Activate;
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
Form2.Show;
end;
procedure TForm1.FormShow(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
ShowMessage(iFile.ReadString('Env', 'User', '')); // Form2에서 Edit1.Text의 값이 a이면 b가 출력되고, b이면 a가 출력됨
finally
iFile.DisposeOf;
end;
end;
* 즉, 방금 저장된 값이 출력이 되는것이 아니라 전에 저장된 값이 출력이 됨(Form2 폼에서는 바로 저장된 값이 출력됨)
* 참고 : 이 현상은 2번 이상 실행을 해봐야 문제점을 확인할 수 있습니다.
*ex) 처음에 b입력시 a출력, 다시 실행하여 b입력시 b출력, 다시 실행하여 a입력시 b출력
// Form2 : 서브폼(로그인)
uses
System.IOUtils, System.IniFiles;
{$R *.fmx}
procedure TForm2.Button1Click(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
iFile.WriteString('ENV' ,'User', Edit1.Text); // (Edit1.Text 에서 입력값이 a이면) / (Edit1.Text 에서 입력값이 b이면)
finally
iFile.DisposeOf;
end;
end;
procedure TForm2.Button2Click(Sender: TObject);
var
sPath: string;
iFile: TIniFile;
begin
sPath := TPath.Combine(TPath.GetDocumentsPath, 'Env.ini');
iFile := TIniFile.Create(sPath);
try
ShowMessage(iFile.ReadString('Env', 'User', '')); // (a라고 출력됨) / (b라고 출력됨) -- 정상적으로 잘 출력됨
finally
iFile.DisposeOf;
end;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
Close;
end;
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Self.free;
end;
===============================================================
두번째 질문입니다.
이번에는 Form2에서 ini 파일을 WriteString하지 않고 직접 ini파일을 생성해서
ini파일 자체를 업로드 하는 법을 알려주세요
제가 해본 방법은
Project > Deployment 메뉴에서 Add files 버튼을 누르고 미리 만들어 놓은 ini 파일을 선택 후에
Platform - [Android]
Remote Path - assets\internal로 수정하고 실행하면 ini파일의 내용을 불러오질 못하더라구요
ShowMessage(iFile.ReadString('Env', 'User', '')); 하면 아무값도 출력이 안됩니다.
ini.WriteString 해서 실행하면 불러오는데 직접 만든 ini파일은 왜 안되는지 모르겠습니다.
폼의 이벤트 처리가 조금 이상한 것 같습니다. Form1이 표시 될 때 OnCreate-OnShow-OnActivate 순으로 발생합니다.
그런데 Form1의 OnCreate에서 Form2.Active 가 조금 이상합니다. 그리고 Form2의 Free 도 그렇게 하시면 오류기 발생할 수 있습니다.
Show 화면의 해제는 다음과 같이 코딩하셔야 합니다.
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
일단 이벤트로 처리하지 마시고 Form1에 버튼을 하나 올려 놓으시고 버튼 클릭시 화면을 띄우셔서 ini File을 테스트 해보시기 바랍니다.
Form2 := TForm2.create(Application);
Form2.show;