You've already forked lazarus-ccr
* Dont cancel edit in WMKeydown under gtk1 (LCL bug 8865) * Cleanup of objects and minimal demos git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@164 8e941d3f-bd1b-0410-a28a-d453659cc2b4
222 lines
5.5 KiB
ObjectPascal
222 lines
5.5 KiB
ObjectPascal
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.
|