Q&A

  • TreeView에서 하위 경로명....
안녕하세요.
태풍피해는 없으신지요.

procedure TForm1.Button1Click(Sender: TObject);
var
    FoundNode : string;
begin
    FoundNode := Edit1.Text;
    SearchNode(FoundNode);
end;

procedure TForm1.SearchNode(const NodeName: string);
var
    Node: TTreeNode;
begin
    Node := TreeView1.Items.GetFirstNode;
    repeat
        if Node.Text = NodeName then
            ListBox1.Items.Add('Absolute Index: ' + IntToStr(Node.AbsoluteIndex));
    until Node = nil;
end;

function TForm1.GetItemPath(Node: TTreeNode): string;
begin
    Result := '';
    if Node <> nil then
    begin
        Result := Node.Text;
        while Node.Parent <> nil do
        begin
            Node := Node.Parent;
            Result := Node.Text + '->' + Result;
        end;
    end;
end;

위의 소스는 최용일 님이 제공해 주신 겁니다.
root
    가
       라
          A
             B
                I
             C

    나
       A
         D
           H
    다
       바
         A
           E
             G
           F

위와 같이 트리뷰가 구성되어 있을때,  아래와 같은 결과가 나오도록 즉, 에디트에 입력한 텍스트를 가지고 와서 트리뷰에서 검사해서 경로명을 보여주는 루틴입니다. 이걸 이용해서 하위(자식노드들의 경로명)노드의 경로들을 나타내려고 하는데, 좀 막히네요.

만약 에디트 창에 'A'를 입력했다면,
현재 위 루틴의 결과는 다음과 같이 나옵니다.
root -> 가 -> 라 -> A
root -> 나 -> A
root -> 다 -> 바 -> A

그런데, 이 루틴을 바꿔서 하위노드의 경로명을 얻는데 쓰려고 합니다.
다음과 같은 결과가 나오도록...
A -> B -> I
A -> C
A -> D -> H
A -> E -> G
A -> F

그래서...일단 다음과 같이 고쳤는데... 역시나... -.-;
function TForm1.GetItemPath(Node: TTreeNode): string;
begin
    Result := '';
    if Node <> nil then
    begin
        Result := Node.Text;
        while Node.HasAsParent(Node) = true do
        begin
            Node.HasAsParent(Node);
            Result := Node.Text + ' -> ' + Result;
        end;
    end;
end;

코드 좀 봐 주세요.
그럼 감사합니다.
2  COMMENTS
  • Profile
    최용일 2002.09.03 09:41
    안녕하세요. 최용일입니다.

    아래와 같이 해보세요... 좀 더 많이 책보고 VCL에 대해서 공부하셔야 할듯...

    SubNode는 값이 한두개가 아니기 때문에 스트링리스트에 넣어서 반환하도록 했습니다...

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        ListBox1.Items.Clear;
        SearchNode2(ListBox1.Items, 'A');
    end;

    procedure TForm1.GetSubItemsPath(StrList: TStrings; const NodeName: string; Node: TTreeNode);
    var
        Index: Integer;
    begin
        if Node.HasChildren then
        begin
            for Index := 0 to Node.Count - 1 do
                GetSubItemsPath(StrList, NodeName + '->' + Node[Index].Text, Node[Index]);
        end
        else
        begin
            StrList.Add(NodeName);
        end;
    end;

    procedure TForm1.SearchNode2(StrList: TStrings; const NodeName: string);
    var
        Node: TTreeNode;
    begin
        Node := TreeView1.Items.GetFirstNode;
        repeat
            if Node.Text = NodeName then
                GetSubItemsPath(ListBox1.Items, Node.Text, Node);
            Node := Node.GetNext; // <<< 이거 빼먹으셨던데... 이거 없으면 무한루트돕니다...
        until Node = nil;
    end;

    ^^ 항상 즐코하세요...

  • Profile
    sunny 2002.09.03 14:29
    감사합니다.
    당장 이렇게 해결하는것만이 최선의 방법은 아닌줄 압니다.
    열심히 노력하겠습니다.

    그럼 감사합니다. 수고하세요
    • 전원보
    • 2002.09.03 10:09
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박장용
      2002.09.03 19:44
      텍스트 파일에 한정된다면 Memo나 RichEdit로 읽어 들이시는게 편합니다.   RichEdit1.Lines....
    • 세균맨
      2002.09.03 19:43
      글쎄요.....특정문자의 인덱스라면 구분자를 말씀하시는 것인지..... 모르겠군요.... 만약 구분자를 말씀...
    • 마니산
    • 2002.09.03 08:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.09.03 09:19
      안녕하세요. 최용일입니다. 1입니다. 둘다 정수형이고 Byte에서 Integer로 형변환할때 절대 범위를 넘는...
    • sunny
    • 2002.09.03 08:26
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.09.03 09:41
      안녕하세요. 최용일입니다. 아래와 같이 해보세요... 좀 더 많이 책보고 VCL에 대해서 공부하셔야 할듯....
    • sunny
      2002.09.03 14:29
      감사합니다. 당장 이렇게 해결하는것만이 최선의 방법은 아닌줄 압니다. 열심히 노력하겠습니다. 그럼...
    • 최용일
      2002.09.03 09:44
      안녕하세요. 최용일입니다. File메뉴에서 프로젝트를 저장하세요... 임의로만든 프로젝트폴더에... ...
    • 한창훈
    • 2002.09.03 07:14
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.09.03 23:02
      PL/SQL을 구현해야 하지만 파라독스에서 지원이 되는지는 정확히 모르겠습니다. (오라클등등의 대용량 DB...
    • 배창석
      2002.09.18 08:08
      델파이 소스가 있는 디렉토리의 경로에 '('등의 특수문자가 포함되어있는 지 확인해보세요... 있다면, 제...
    • 이추형
      2002.09.04 01:19
      BDE에서 설정한 Alias name이 'Oracle_DB'인지 확인하시기 바랍니다. 혹 다른이름으로 되어 있는건 아닌지...
    • goodlsw
    • 2002.09.03 05:26
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 한원희
      2002.09.03 05:51
      안녕하세요. 한원희입니다. 캐럿의 위치를 구하기 위해서는 GetCaretPos 라는 API를 사용하시면 됩니다....
    • 김상수
    • 2002.09.03 04:58
    • 8 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2002.09.03 05:19
    • 김상수
      2002.09.03 05:25
    • 임형호
      2002.09.03 10:37
    • 김상수
      2002.09.03 19:23
    • 임형호
      2002.09.03 22:03
    • 김상수
      2002.09.04 01:45
    • 임형호
      2002.09.04 05:43
    • • • •
    • 한원희
      2002.09.03 05:38
      안녕하세요. 한원희입니다. 서브클래싱이나 윈도우 후킹을 하면 가능할 것 같습니다. 좀 복잡하니까, ...
    • ㄴ ㅏ ㅁ ㅑ
      2002.09.03 19:57
      먼저 답변 감사드립니다 ^o^ procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;  &...
    • 한원희
      2002.09.03 23:49
      안녕하세요. 한원희입니다. 아쉽게도 VK_BACK는 네비게이션 키로 분류되어 있어서 방향키 등과 같이 Key...
    • 임형호
      2002.09.03 05:15
      keypress에서는 잘 모르겠구요. keydown이벤트에서는 if key=46 then   key = 0; ...
    • 김상수
    • 2002.09.03 04:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 임형호
      2002.09.03 04:41
      예.. 콤보박스로 그렇게 하면 됩니다.
    • 한원희
      2002.09.03 06:23
      안녕하세요. 한원희입니다. 아래 코드에서 약간 이해가 안가는 부분이 있는데, 수신측에서 데이터의 전...
    • 홍성락
      2002.09.03 06:10
      hsr/////////////////////////////////////////////////// 간단히 DBGrid에 연결된 PopupMenu가 열리는 시...
    • 델파이사랑
      2002.09.03 20:51
      ....^^....^^....^^
    • 고지범
      2002.09.03 03:25
      지나가던 얼큰입니다. 제 생각에는 델파이나 VC++ 이나 가장 좋은 것은 Update Handler 를 이용하는 것이 ...
    • 짱아
    • 2002.09.03 00:55
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이추형
      2002.09.03 01:21
      TStringGrid.Cells 의 ACol과 ARow를 Loop 돌면서 파일 하나하나 처리 하셔야 할것 같습니다. .. 가장 쉬...
    • 짱아
      2002.09.03 02:37
      ㅡㅡ; 자세히점.. 갈켜 주시겠어염...
    • 고부열
      2002.09.03 03:30
      해당 폼의 버튼 속성중이 Default 가 true로 되어있더군요. 제 친구중에 델파이의 거의 달인이 있는데...
    • 고지범
      2002.09.03 03:44
      클클... 추카합다... 그런 일두 ^^
    • 고지범
      2002.09.03 01:28
      지나가던 얼큰입다. 잘 되는 데요??? KeyDown Event 에서 다음과 같이 하믄... 잘 올라오던디... procedu...
    • 이추형
      2002.09.03 01:28
      procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState); beg...
    • 고부열
      2002.09.03 01:32
      답변 감사드립니다. // -- 아래는 제가 작성한 소스 코드입니다.       ...
    • 고지범
      2002.09.03 02:11
      윽... MDI child 에서두 잘 들어가 지는 데... 무엇이 다른지 모르겠군요... 테스트를 편하게 하기 위해서...
    • 고부열
      2002.09.03 02:57
      저도 델파이로 프로그램을 3년전부터 하고 있지만 이런 경우는 처음이네요... 아마도... 폼이 생성되...
    • 이경모
    • 2002.09.03 00:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 세균맨
      2002.09.03 00:19
      기본적을 원도우에서 지원하는 Port가 있읍니다.. telnet은 23 port, ftp 21 port를 사용하고 있죠. ...
    • 허진
    • 2002.09.02 23:32
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김용운
      2002.09.10 09:15
      제가 조직도 컴포넌트를 개발하고 있는데 현재는 DB에 있는 자료를 화면에 디스플레이 하는 기능과, 미리...
    • 이추형
      2002.09.03 01:35
      EInvalidOp is the exception class for undefined floating-point operations. Description : EInvali...
    • 이원상
    • 2002.09.02 23:16
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 고지범
      2002.09.03 01:23
      external 이라는 키워드를 생각해보시길 바랍니다. C/C++ 과 비교해서 생각해보면 (잘 모르셔두 상관은 ...
    • 이원상
      2002.09.03 02:33
      성의 있는 답변 너무 감사합니다. 이해하는데 많은 도움이되었습니다. 그리구 동적으로 할당한 이유는 이 ...
    • 고지범
      2002.09.03 03:42
      음 지나가던 얼큰입다... ㅋㅋ 호접한 답변이 도움이 되었다니 넘 기쁩다. ^_____^ 정적할당과 동적할당...
    • 한원희
      2002.09.03 06:38
      안녕하세요. 한원희입니다. TCP를 이용하시는 것이라면, 잘못된 데이터의 전송에 대한 고려를 하지 않으...