unit MVCDemoMain; {$MODE Delphi} { (c) 2000 Marian Aldenhövel Hainstraße 8 53121 Bonn +49 228 6203366 Fax: +49 228 624031 marian@mba-software.de Free: You may use this code in every way you find it useful or fun. Main form for the MVCDemo-Project. See MVCTypes.pas for Details. } interface uses LCLIntf, SysUtils,Classes,Graphics,Controls,Forms,Dialogs, MVCTypes,MVCPanel,StdCtrls,ExtCtrls,VirtualTrees,ComCtrls, Buttons, LResources, vtlogger,ipcchannel; type TfmMVCDemo=class(TForm) pnlControls:TPanel; ImageList1:TImageList; edCaption:TEdit; Label1:TLabel; Label2:TLabel; edSubcaption:TEdit; Label3:TLabel; edIncidence: TEdit; Label4: TLabel; UpDown1: TUpDown; btnAdd: TButton; btnDelete: TButton; cbLive: TCheckBox; timLive: TTimer; procedure FormCreate(Sender:TObject); procedure edCaptionChange(Sender:TObject); procedure TreeViewChange(Sender:TBaseVirtualTree;Node:PVirtualNode); procedure edIncidenceKeyPress(Sender:TObject;var Key:Char); procedure edSubcaptionChange(Sender:TObject); procedure edIncidenceChange(Sender:TObject); procedure btnAddClick(Sender:TObject); procedure btnDeleteClick(Sender: TObject); procedure cbLiveClick(Sender: TObject); procedure timLiveTimer(Sender: TObject); private P:TMVCPanel; FTree:TMVCTree; procedure UpdateFromNode; function FocusedNode:TMVCNode; function CreateDefaultTree:TMVCTree; end; var fmMVCDemo:TfmMVCDemo; implementation function TfmMVCDemo.CreateDefaultTree:TMVCTree; { recurse and curse :-) } var i,j,k:integer; begin Result:=TMVCTree.Create; for i:=0 to 2 do with Result.Root.CreateChild do begin Caption:='Root'; SubCaption:='Number '+IntToStr(i); Incidence:=5+random(30); for j:=0 to 2 do with CreateChild do begin Caption:='Child'; SubCaption:='Number '+IntToStr(j); Incidence:=random(64); for k:=0 to 1 do with CreateChild do begin Caption:='Grandchild'; SubCaption:='Number '+IntToStr(k); Incidence:=random(64); end; end; end; end; procedure TfmMVCDemo.FormCreate(Sender: TObject); begin Logger.Channels.Add(TIPCChannel.Create); Logger.ActiveClasses:=[];//[lcEditLink,lcScroll]; Logger.Clear; P:=TMVCPanel.Create(Self); with P do begin Parent:=Self; Align:=alClient; TreeView.Images:=ImageList1; { Now this is what it's all about: You have a structure - represented here by a call that creates a tree. All you do is assign it to a property of the Viewer, bingo. } FTree:=CreateDefaultTree; Tree:=FTree; P.TreeView.OnChange:=TreeViewChange; P.TreeView.FullExpand(NIL); UpdateFromNode; end; end; procedure TfmMVCDemo.TreeViewChange(Sender:TBaseVirtualTree;Node:PVirtualNode); begin UpdateFromNode; end; procedure TfmMVCDemo.UpdateFromNode; begin if FocusedNode=NIL then begin edCaption.Text:= ''; edCaption.Enabled:= False; edSubCaption.Text:= ''; edSubCaption.Enabled:=False; edIncidence.Text:= ''; edIncidence.Enabled:= False; btnDelete.Enabled:=False; end else begin edCaption.Text:= FocusedNode.Caption; edCaption.Enabled:= True; edSubCaption.Text:= FocusedNode.SubCaption; edSubCaption.Enabled:=True; edIncidence.Text:= IntToStr(FocusedNode.Incidence); edIncidence.Enabled:= True; btnDelete.Enabled:= True; end; end; function TfmMVCDemo.FocusedNode:TMVCNode; begin with P.TreeView do if FocusedNode<>NIL then Result:=MVCNode[FocusedNode] else Result:=NIL; end; procedure TfmMVCDemo.edIncidenceKeyPress(Sender:TObject;var Key:Char); begin if not(Key in ['0'..'9',#8]) then Key:=#0; end; procedure TfmMVCDemo.edSubcaptionChange(Sender:TObject); begin if FocusedNode<>NIL then FocusedNode.SubCaption:=edSubCaption.Text; end; procedure TfmMVCDemo.edCaptionChange(Sender:TObject); begin if FocusedNode<>NIL then FocusedNode.Caption:=edCaption.Text; end; procedure TfmMVCDemo.edIncidenceChange(Sender:TObject); begin try if FocusedNode<>NIL then if edIncidence.Text='' then FocusedNode.Incidence:=0 else FocusedNode.Incidence:=StrToInt(edIncidence.Text); except ShowMessage('Enter a number between 0 and 63'); end; end; procedure TfmMVCDemo.btnAddClick(Sender:TObject); var R:TMVCNode; begin if FocusedNode<>NIL then R:=FocusedNode else R:=FTree.Root; with R do begin R:=CreateChild; R.Caption:='New'; end; end; procedure TfmMVCDemo.btnDeleteClick(Sender: TObject); begin FocusedNode.Free; end; procedure TfmMVCDemo.cbLiveClick(Sender: TObject); begin timLive.Enabled:=cbLive.Checked; end; procedure TfmMVCDemo.timLiveTimer(Sender: TObject); var N:TMVCNode; begin { Change the Incidence-Field of one node on every level in one branch of the tree. } N:=FTree.Root; while Assigned(N) do begin N.Incidence:=5+random(63); if N.ChildCount>0 then N:=N.Child[random(N.ChildCount)] else N:=NIL; end; end; initialization {$i MVCDemoMain.lrs} Randomize; end.