お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"動的配列を TreeView に展開"






{
フィールドに動的配列とレコード型の入れ子構造をもった変数データを
  ツリービューに展開します
フォームに、ツリービューとラベルを各1枚用意します
}

unit KenMati;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type

    typeMember=record
      Name:string;             //個人の名前
      Age:integer;             //年齢
    end;
    typeSetai=record
      nameSetai:string;          //世帯の名前
      Jinkou:integer;            //世帯の人数
      Member:array of typeMember;//構成員の個別情報
    end;
    typeMati=record
      nameMati:string;         //町の名前
      Jinkou:integer;          //町の人口
      Setai:array of typeSetai;//世帯の個別情報
    end;
    typeKen=record
      nameKen:string;          //県の名前
      Jinkou:integer;          //県の人口
      Mati:array of typeMati;  //町の個別情報
    end;
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private 宣言 }
  public
    { Public 宣言 }

  end;

var
  Form1: TForm1;
  Ken:array of typeKen;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i,j,k,l:integer;
  tLevel:integer;
  tNode : array[0..5] of TTreeNode;
begin
  {  データの設定  }
  setlength(Ken,2);          //2県
  with Ken[0] do begin
    nameKen:='群馬県';
    jinkou:=200000;
    setlength(Mati,3);
    with Mati[0] do begin
      nameMati:='前橋市';
      jinkou:=300000;
    end;
    with Mati[1] do begin
      nameMati:='高崎市';
      jinkou:=200000;
      setlength(Setai,2);
      with Setai[0] do begin
        nameSetai:='出る杭';
        jinkou:=2;
        setlength(Member,jinkou);
        with Member[0] do begin
          name:='良夫';Age:=90;
        end;
        with Member[1] do begin
          name:='良子';Age:=80;
        end;
      end;
      with Setai[1] do begin
        nameSetai:='美辞';
        jinkou:=2;
        setlength(Member,jinkou);
        with Member[0] do begin
          name:='麗句';Age:=190;
        end;
        with Member[1] do begin
          name:='麗子';Age:=1000;
        end;
      end;
    end;
    with Mati[2] do begin
      nameMati:='玉村町';
      jinkou:=10000;
    end;
  end;
  with Ken[1] do begin
    nameKen:='東京都ですよ';
    jinkou:=10000000;
    setlength(Mati,2);
    with Mati[0] do begin
      nameMati:='港区';
      jinkou:=500000;
    end;
    with Mati[1] do begin
      nameMati:='中央区';
      jinkou:=300000;
    end;
  end;
  {   ツリービュー   }
  tLevel:=0;
  for i:=0 to high(Ken) do begin
    tNode[tLevel]:=treeview1.items.add(nil,Ken[i].nameKen);
    tLevel:=tLevel+1;
    for j:=0 to high(ken[i].Mati) do begin
      tNode[tLevel]:=treeview1.items.addchild(tNode[tLevel-1],Ken[i].Mati[j].nameMati);
      tLevel:=tLevel+1;
      for k:=0 to high(ken[i].Mati[j].Setai) do begin
        tNode[tLevel]:=treeview1.items.addchild(tNode[tLevel-1],Ken[i].Mati[j].Setai[k].nameSetai);
        tLevel:=tLevel+1;
        for l:=0 to high(ken[i].Mati[j].Setai[k].Member) do begin
          tNode[tLevel]:=treeview1.items.addchild(tNode[tLevel-1],Ken[i].Mati[j].Setai[k].Member[l].name);
        end;//for l
        tLevel:=tLevel-1;
      end;//for k
      tLevel:=tLevel-1;
    end;//for j
    tLevel:=tLevel-1;
  end;//for i
  label1.caption:='';
  treeview1.showhint:=true;
end;

procedure TForm1.TreeView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  i,j,k,l:integer;
  tNode : TTreeNode;
  msg:string;
begin
  label1.caption:='';
  tnode:=treeview1.getnodeat(x,y);
  i:=-1;j:=-1;k:=-1;l:=-1;
  while tnode<>nil do begin
    label1.caption:=tnode.text+'/'+label1.caption;
    case tnode.Level of
      0:i:=tnode.index;
      1:j:=tnode.index;
      2:k:=tnode.index;
      3:l:=tnode.index;
    end;//case
    tnode:=tnode.parent;
  end;//while
  if l>=0 then
    msg:=inttostr(ken[i].mati[j].setai[k].member[l].age)+' 才'
  else if k>=0 then
    msg:=inttostr(ken[i].mati[j].setai[k].jinkou)+' 人'
  else if j>=0 then
    msg:=inttostr(ken[i].mati[j].jinkou)+' 人'
  else
    msg:=inttostr(ken[i].jinkou)+' 人';
  treeview1.hint:=msg;
end;

end.


98/10/29(木) 19:26 妙義のかたつむり(QWK05270) __@ノ'

Original document by 妙義のかたつむり氏 ID:(QWK05270)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum