안녕하세요.
지금 저는 Teeview의 아이템을 ini파일에 저장하려고 하는데, 어떻게 접근해나갈지 도저히모르겠어서요.
지난 번에는 ini파일을 Treeview에 출력하는데 중복노드에 대한 처리부분에서 막혀서 질문을 올려 다른 분의 도움으로 겨우 해결했었어요.
ini파일의 내용을 Treeview에 읽는 것이 해결되었으니 반대로 쓰는 것은 쉽게 해결될줄 알았는데 Treeview를 잘 활용하지 못해서인지 정말!! 처음 접근부터 모르겠어요...
이렇게까지 암담(?)하기는 처음이예요...
제가 지금 하려고 하는 프로그램에 대해 말씀드리면요...
폼이 create되면 ini 파일에 내용을 체크해서 내용이 있으면 ini 파일의 내용을 Treeview에 아래의[결과]에서처럼 출력합니다.
실제 소스로 다시 상세하게 말씀드리면, 이렇습니다.
-----------------------------------
samp.ini
===================================
[TotalCount]
Count=6
[Address]
서울시 강남구 역삼동=XXX.XXX.XXX.XXX;
강원도 강릉시 죽헌동=XXX.XXX.XXX.XXX;
서울시 송파구 오륜동=XXX.XXX.XXX.XXX;
인천시 부평구 부평동=XXX.XXX.XXX.XXX;
강원도 강릉시 초당동=XXX.XXX.XXX.XXX;
부산시 금정구 오륜동=XXX.XXX.XXX.XXX;
--------------------------------------------------------
[결과] samp.ini파일이 위와 같을때 폼생성시 Treeview1출력
=========================================================
서울시
강남구
역삼동
송파구
오륜동
강원도
강릉시
죽헌동
초당동
인천시
부평구
부평동
부산시
금정구
오륜동
-----------------------------------------
이렇게 출력된 Treeview의 Level = 2를 선택하면 해당하는 IPAddress에 접속합니다. (인터넷 익스플로러 실행됨)
이에 대한 코딩은 다음과 같이 하였습니다.
IPAddr : TStringList; // 전역변수로 ini 파일에 있는 각각의 IP Address를 저장.
procedure TForm1.TreeView1Click(Sender: TObject);
var
s : string;
begin
with TreeView1 do
begin
if Selected.Level = 2 then
begin
IPAddr[(Selected.AbsoluteIndex - 2) div 3];
ShowMessage(IPAddr[(Selected.AbsoluteIndex - 2) div 3]);
s := 'http://' + IPAddr[(Selected.AbsoluteIndex - 2) div 3];
shellExecute(handle,'open',pChar(s),nil,'c:',sw_show);
end;
end;
end;
그리고 Treeview의 노드는 폼위에 있는 "입력" 이라는 버튼이 있는데, 여기서 "입력"버튼을 누르면, IP를 입력할수 있는 새로운 창이 뜹니다.
새로운 창에는 다음과 같이 "그룹명", "소그룹명", "단위명",
"IP 주소"를 입력할수 있는 에디트박스가 4개 있습니다. 에디트박스에서 입력한 내용은 Treeview1에 추가됩니다.
------------------------------------------
IP 입력창
==========================================
그룹명 : 서울시
소그룹명 : 서초구
단위명 : 방배동
IP 주소 : XXX.XXX.XXX.XXX
------------------------------------------
이 프로그램을 종료시키면 Treeview의 노드를 위의 samp.ini 처럼 ini 파일에 저장하게 해야하는데 그 ini파일에 저장하는 방법을 모르겠어요.
for i:= 0 to Treeview1.Items.Count do 문에 GetFirstChid,
GetNextChild... 등등의 메소드를 이용하면 되는건지...
동적으로 생성되어 변할수 있는 Treeview의 노드를 ini 파일에 어떻게 저장해야하는지...
그리고, 정말 궁금한게 있는데요... Level의 아이템의 수를 알수 있는 방법이 있나요 ?
위의 [결과]의 Level 2의 노드수는 6개 있잖아요. 그 수를 알수 있는 방법이요 ....
나중에 ini파일에 [TotalCount] 섹션에 Count에 그 값을 넣어주어야 되는데, level에 따른 노드수를 모르겠어요. 혹시 알수 없는건 아니죠 ?
지금 문제를 해결해도 또 다른 문제가 발생할텐데... 앞으로 그 일을 다 어떻게 감당해나갈지...
Treeview의 노드경로까지 ini파일에 저장하는 방법에 대해 다시한번 델선배님들께 도움을 부탁드립니다.
너무 부족한 점이 많아서 일을 진행하다가 멈추기를 여러번 하면서 중도포기를 하고 싶은 마음도 있지만, 제가 도저히 해결되기 불가능한 일을 하려고 하는 것은 아닐꺼라는 희망을 갖고 다시한번 도전해보려고 하니 길잃은 한마리의 델초보에게 따뜻한 관심 가져주세요.
항상 건강하시고 평안하시길 빌며 이만 줄이겠습니다. @--&~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
다음의 소스는 제가 지금까지 한 내용입니다.
전에 질문올렸던 그때와 달라지건 폼의 OnCreate부분의 중복노드찾는 부분이지만 혹시 답변주시는데 도움이 될까해서 다시 올립니다.
//전역변수
IPAddr : TStringList;
ItemCount : Integer;
Function CutStr(var st : String; aLength : Integer) : String;
begin
result := Copy(st,1,aLength);
st := Copy(st,aLength+1,length(st) - aLength);
end;
function TForm1.FindNode( Str : String) : TTreeNode; // 다른 분이 만든 함수
var
CurItem: TTreeNode;
begin
Result := nil; // 이 부분은 제가 추가했습니다.
// 이걸 안하면 뒤에 FindNode함수를 사용할때 에러가 발생하더라구요.
CurItem := TreeView1.Items.GetFirstNode;
while CurItem <> nil do
begin
if CurItem.Text = Str then
begin
Result := CurItem;
exit;
end;
CurItem := CurItem.GetNext;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I, J : Integer;
IniFile: TIniFile;
Fst,Snd,Trd, Section, FName, temp, IP : string;
Sections : TStringList;
ParentNode, ChildNode : TTreeNode;
begin
ItemCount := 0; // 전역 변수
FName := 'c:samp.ini';
Sections := TStringList.Create;
Sections.LoadFromFile(FName);
IniFile := TIniFile.Create(FName); // IniFileName = 사용자 INI 파일명
ItemCount := IniFile.ReadInteger('TotalCount', 'Count', 0);
TreeView1.Items.BeginUpdate;
temp := '';
for I := 0 to Sections.Count - 1 do
begin
Section := Sections[i];
temp := temp + Section;
if Pos(']',temp) <> 0 then CutStr(temp,Pos(']',temp));
end;
IPAddr := TStringList.Create;
for J := 0 to ItemCount-1 do
begin
Fst := IniFile.ReadString('IP Address',temp,CutStr(temp,Pos(' ',temp)-1));
CutStr(temp,1);
Snd := IniFile.ReadString('IP Address',temp,CutStr(temp,Pos(' ',temp)-1));
CutStr(temp,1);
Trd := IniFile.ReadString('IP Address',temp,CutStr(temp,Pos('=',temp)-1));
CutStr(temp,1);
ParentNode := FindNode(Fst);
if (FindNode(Fst) = nil) then
ParentNode := TreeView1.Items.Add(Treeview1.Selected,Fst);
ChildNode := FindNode(Snd);
if (FindNode(Snd) = nil) then
ChildNode := TreeView1.Items.AddChild(ParentNode,Snd);
if (FindNode(Trd) <> nil) and (Uppercase(FindNode(Trd).Parent.Parent.Text) =
Uppercase(FindNode(Fst).Text)) then
ShowMessage('같은 이름이 이미 존재합니다.')
else TreeView1.Items.AddChild(ChildNode,Trd);
IP := CutStr(temp,Pos(';',temp)-1);
IPAddr.Add(IP);
CutStr(temp,1);
end;
TreeView1.Items.EndUpdate;
IniFile.Free;
end;
procedure TForm1.TreeView1Click(Sender: TObject);
var
s : string;
begin
with TreeView1 do
begin
if Selected.Level = 2 then
begin
IPAddr[(Selected.AbsoluteIndex - 2) div 3];
ShowMessage(IPAddr[(Selected.AbsoluteIndex - 2) div 3]);
s := 'http://' + IPAddr[(Selected.AbsoluteIndex - 2) div 3];
shellExecute(handle,'open',pChar(s),nil,'c:',sw_show);
end;
end;
end;
제가 지금 님과 비슷한 형태의 프로그램을 구현중인데요...
전 이미 해결했거든요.. 별 문제가 없더군요.
근데.. 이미 님이 작업한 내용과 제가 작업한 내용은 너무 상이하게 틀려서 님이 구현한 소스를 토대로 답변드리기에는 너무 내용이 길어질것 같구요..
제가 전에 님에게 답변을 드린 내용처럼 TTreeNode의 'Data' Property에 IP정보와 Node의 경로정보를 저장한다면 저장/불러오기 문제는 쉽게 해결됩니다.
전에 제가 보여드린 예제를 보시면 '개포동' 이라는 TTreenode에는 '서울시 XX구 개포동'이라는 데이타가 저장되게 되어 있습니다. 이 정보를 저장하는 구조체에 IP정보를 저장하는 변수만 하나 더 추가시켜서 저장/불러오기 루틴을 구현하면 될듯 합니다.
저 역시도 그렇게 구현을 했더랬습니다.
별 도움도 안되는 말씀 드려서 죄송합니다.
수고하십시오.
-PS-
제 홈페이지도 자랑할께염 ^^ http://www.classmaker.com
여기 오셔도 델파이 관련 게시판이 있어염 ^^