<그림설명> 본소스 실행시 레지스트리에서 이렇게만 읽어들임
그림과 같이, 제가 한 것은 6개의 주메뉴(제가 path로 설정한 직후의 것들)
만 나옵니다만...원래는 각자가 수십개씩의 서브메뉴가 있고 그 밑에 또 하위
메뉴들이 있습니다. 이것을 물어보니까, while 혹은 for문으로 돌려서 구현하라
하는데요, 아무리 생각해봐도 애초에 단 한번의 읽기로 저 밑의 서브메뉴들
전부를 보여주는 기능이 있을 것 같은데요...
<작성 소스>
procedure TForm1.MenuClick(Sender: TObject); //그림의 menu클릭시에
var
index : integer;
items : string;
itemName : string;
mItem : TMenuItem;
begin
path := '\SOFTWARE\경로1\경로2'; //이 뒤의 경로가 그림의 6개메뉴
//레지스트리의 값을 읽어 온다.
items := GetRegString(path, 'Items', 'nothing');
while items <> '' do
begin
index := pos('|',items)-1;
if index <= 0 then index := length(items);
itemName := copy(items, 1, index);
delete(items,1,index+1); //얻은 itemName과 '|' 삭제
mItem := TMenuItem.Create(Menu);
mItem.Caption := itemName;
mItem.Name := itemName;
menu.Add(mItem);
end;
end;
이렇게 하면, 그림대로는 나옵니다만.. 그 뒤의 서브메뉴들을 부르려면 꼭
while문등을 각각의 경로마다 호출해서 써야하나요? 단번에 모든 서브메뉴들
을 보여주게는 할 수 없을까요?
이런 경우는 for나 while같은 반복문만으로는 결과값을 구하기 힘들죠... 이럴때 쓰이는게 재귀호출입니다. 한번 이용해보세요...
하드디스크에서 디렉토리 목록을 구한다거나 님과 같이 레지스트리 목록을 구한다거나 할 때 쓰이는 방법입니다.
지금 델파이가 없어서 예제를 만들어드리긴 힘들구요... 자료구조책에 보시면 퀵소트나 트리탐색하는 부분을 살펴보시면 될겁니다...
아참 델파이의 TList.Sort도 재귀호출을 해서 퀵소트로 정렬합니다. 델파이 소스 찾아보세요...
^^ 항상 즐코하세요...