unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, ComCtrls, StdCtrls, ImgList, ExtCtrls;
type
TForm1 = class(TForm)
TreeView1: TTreeView;
Splitter1: TSplitter;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
FolderBtn: TButton;
FileBtn: TButton;
ImageList1: TImageList;
RichEdit1: TRichEdit;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FolderBtnClick(Sender: TObject);
procedure FileBtnClick(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure savetree(t: ttreeview);
procedure loadtree(t: TTreeView);
procedure saveNode(n: TTreeNode);
function findNode(t:TTreeView; id: integer): TTreeNode;
procedure AddItem(aText: string; aIndex: Integer; aParent: TTreeNode);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TItem = class(TObject)
private
fStatus: byte;
fParentID: integer;
fNodeText: string;
fID: integer;
fData: string;
fSaver: TAdoQuery;
fChanged: Boolean;
fSaveImmediate: boolean;
fIsNew: Boolean;
fImageIndex: integer;
procedure SetData(const Value: string);
procedure SetNodeText(const Value: string);
procedure SetParentID(const Value: integer);
procedure SetStatus(const Value: byte);
procedure SetImageIndex(const Value: integer);
protected
procedure Changed; dynamic;
public
constructor Create(aSaver: TAdoQuery; AId, AParentID: integer; AStatus: byte);
constructor LoadFromDataset(aSaver: TAdoQuery);
procedure BeginUpdate;
procedure EndUpdate;
procedure Delete;
procedure Save;
published
property ID: integer read fID write fID;
property ParentID: integer read fParentID write SetParentID;
property ImageIndex: integer read fImageIndex write SetImageIndex;
property Status: byte read FStatus write SetStatus;
property Data: string read fData write SetData;
property NodeText: string read fNodeText write SetNodeText;
end;
{ TItem }
procedure TItem.BeginUpdate;
begin
fSaveImmediate := false;
end;
(*---------------------------------------------------*)
procedure TItem.Changed;
begin
fChanged := True;
if fSaveImmediate then Save;
end;
(*---------------------------------------------------*)
constructor TItem.Create(aSaver: TAdoQuery; AId, AParentID: integer;
AStatus: byte);
begin
inherited Create;
fChanged := False;
fSaveImmediate := True;
fIsNew := True;
fSaver := aSaver;
fID := AID;
fParentID := AParentID;
fStatus := AStatus;
fNodeText := '';
fData := '';
end;
(*---------------------------------------------------*)
procedure TItem.Delete;
begin
//
end;
(*---------------------------------------------------*)
procedure TItem.EndUpdate;
begin
fSaveImmediate := True;
if fChanged then Save;
end;
(*---------------------------------------------------*)
constructor TItem.LoadFromDataset(aSaver: TAdoQuery);
begin
Create(aSaver, 0, 0, 0);
if not aSaver.IsEmpty then
begin
fId := aSaver.FieldByName('ID').AsInteger;
fParentID := aSaver.FieldByName('PARENT').AsInteger;
fStatus := aSaver.FieldByName('STATUS').AsInteger;
fNodeText := aSaver.FieldByName('NAME').AsString;
if aSaver.FindField('DATA') <> nil then
fData := aSaver.FieldByName('DATA').AsString;
fImageIndex := aSaver.FieldByName('IMAGE_INDEX').AsInteger;
fIsNew := False;
end;
end;
(*---------------------------------------------------*)
procedure TItem.Save;
begin
if fIsNew then
fSaver.SQL.Text :=
'insert into tree (parent, name, status, image_index, data) values (:v1, :v2, :v3, :v4, :v5)'
else
fSaver.SQL.Text :=
'update tree set parent = :v1, name = :v2, status = :v3, image_index = :v4, data = :v5 where id = :v6';
fSaver.Parameters.ParamByName('v1').Value := fparentID;
fSaver.Parameters.ParamByName('v2').Value := fNodeText;
fSaver.Parameters.ParamByName('v3').Value := fStatus;
fSaver.Parameters.ParamByName('v4').Value := fImageIndex;
fSaver.Parameters.ParamByName('v5').Value := fData;
if not fIsNew then
fSaver.Parameters.ParamByName('v6').Value := fId;
fSaver.ExecSQL;
if fIsNew then
begin
fSaver.SQL.Text :=
'SELECT id from tree order by id desc';
fSaver.Open;
fId := fSaver.FieldByName('ID').asInteger;
fSaver.Close;
fIsNew := False;
end;
fChanged := False;
end;
(*---------------------------------------------------*)
procedure TItem.SetData(const Value: string);
begin
if fData <> Value then
begin
fData := Value;
Changed;
end;
end;
(*---------------------------------------------------*)
procedure TItem.SetImageIndex(const Value: integer);
begin
if fImageIndex <> Value then
begin
fImageIndex := Value;
Changed;
end;
end;
(*---------------------------------------------------*)
procedure TItem.SetNodeText(const Value: string);
begin
if fNodeText <> Value then
begin
fNodeText := Value;
Changed;
end;
end;
(*---------------------------------------------------*)
procedure TItem.SetParentID(const Value: integer);
begin
if fParentId <> Value then
begin
fParentID := Value;
Changed;
end;
end;
(*---------------------------------------------------*)
procedure TItem.SetStatus(const Value: byte);
begin
if fStatus <> Value then
begin
FStatus := Value;
Changed;
end;
end;
(*---------------------------------------------------*)
procedure TForm1.AddItem(aText: string; aIndex: Integer; aParent: TTreeNode);
var n: TTreeNode;
data: TItem;
parentId: integer;
begin
parentId := 0;
if (aParent <> nil) and (TItem(aParent.Data) <> nil) then
parentId := TItem(aParent.Data).ID;
data := TItem.Create(AdoQuery1, -1, parentId, 0);
data.NodeText := aText;
data.ImageIndex := aIndex;
n := TTreeNode.Create(TreeView1.Items);
n.Text := data.NodeText;
n.ImageIndex := data.ImageIndex;
n.SelectedIndex := data.ImageIndex;
TreeView1.Items.AddNode(n, aParent, aText, data, naAddChild);
end;
(*---------------------------------------------------*)
procedure TForm1.Button1Click(Sender: TObject);
begin
loadTree(treeview1);
end;
(*---------------------------------------------------*)
procedure TForm1.Button2Click(Sender: TObject);
begin
savetree(treeview1);
end;
procedure TForm1.Button3Click(Sender: TObject);
var
node : TTreeNode;
mess, str : string;
key_stat : integer;
begin
Node := Treeview1.Selected;
if Assigned(Node) then
begin
str := Node.Text;
mess := 'Are you sure that you want to delete the';
Case Node.Level of
0 : mess := mess + ' folder : ' +#13+#13 + str + ' ???' +#13+
'All folders, subfolders, items and subitems' +#13+ 'will be permanently deleted !!' +#13;
1 : mess := mess + ' item : ' +#13+#13 + str + ' ???' + #13;
end;
with Application do
begin
NormalizeTopMosts;
key_stat := MessageBox(pchar(mess), ' Confirmation', MB_YESNO);
RestoreTopMosts;
end;
if key_stat = 7 then Exit; // 6 - YES ; 7 - N0
TreeView1.Items.Delete(Treeview1.Selected);
end
else ShowMessage('Select a folder in the treeview first.');
end;
(*---------------------------------------------------*)
procedure TForm1.FileBtnClick(Sender: TObject);
var aText: string;
begin
if (TreeView1.Selected <> nil) and (TreeView1.Selected.ImageIndex = 15) then
begin
if InputQuery('File', 'Enter a file name', aText) then
AddItem(aText, 17, TreeView1.Selected);
end else
ShowMessage('Select a folder in the treeview first.');
end;
(*---------------------------------------------------*)
function TForm1.findNode(t: TTreeView; id: integer): TTreeNode;
var i:integer;
begin
i:=0;
while (i<t.items.count) and (TItem(t.items[i].data).ID<>id) do
inc(i);
if i<t.items.count then result:=t.items[i]
else result:=nil;
end;
(*---------------------------------------------------*)
procedure TForm1.FolderBtnClick(Sender: TObject);
var aText: string;
aParent: TTreeNode;
begin
aParent := nil;
if TreeView1.Selected <> nil then
begin
if TreeView1.Selected.ImageIndex = 15 then
aParent := TreeView1.Selected
else
begin
ShowMessage('Select a folder first');
Exit;
end;
end;
if InputQuery('Folder', 'Enter a folder name', aText) then
AddItem(aText, 15, aParent);
end;
(*---------------------------------------------------*)
procedure TForm1.FormCreate(Sender: TObject);
var
conn_str:string;
begin
conn_str:='provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=';
conn_str:=conn_str+IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename));
conn_str:=conn_str+'test.pkd;';
ADOConnection1.Connected:=False;
ADOConnection1.ConnectionString:=conn_str;
ADOConnection1.Connected:=True;
ADOConnection1.Open;
end;
(*---------------------------------------------------*)
procedure TForm1.loadtree(t: TTreeView);
var
p, n: TTreeNode;
data: TItem;
begin
t.Items.Clear;
ADOQuery1.SQL.Text := 'select * from tree order by parent asc';
ADoQuery1.Open;
while not ADoQuery1.Eof do
begin
data := TItem.LoadFromDataset(AdoQuery1);
p := FindNode(t, data.ParentID);
n := t.items.AddChildObject(p, data.NodeText, data);
n.ImageIndex := data.ImageIndex;
n.SelectedIndex := data.ImageIndex;
AdoQuery1.Next;
end;
AdoQuery1.Close;
end;
(*---------------------------------------------------*)
procedure TForm1.saveNode(n: TTreeNode);
var i, aParent: integer;
item: TItem;
begin
item := TItem(n.Data);
if item <> nil then
begin
item.BeginUpdate;
try
Item.NodeText := n.Text;
aParent := 0;
if (n.Parent <> nil) and (TItem(n.Parent.Data) <> nil) then
aParent := TItem(n.Parent.Data).ID;
Item.ParentID := aParent;
Item.ImageIndex := n.ImageIndex;
finally
Item.EndUpdate;
end;
end;
for i := 0 to n.Count-1 do SaveNode(n.Item[i]);
end;
(*---------------------------------------------------*)
procedure TForm1.savetree(t: ttreeview);
var n: TTreeNode;
begin
n := t.items.getFirstNode;
while n <> nil do
begin
SaveNode(n);
n := n.getNextSibling;
end;
end;
(*---------------------------------------------------*)
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
RichEdit1.Text := '';
if (Node <> nil) and (Node.ImageIndex = 15) then
RichEdit1.Text := TItem(Node.Data).Data;
end;
(*---------------------------------------------------*)
procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var n: TTreeNode;
begin
n := TreeView1.Selected;
if (n <> nil) and (n.ImageIndex = 15) then
begin
TItem(n.Data).fSaveImmediate := False;
TItem(N.Data).Data := RichEdit1.Text;
end;
end;
(*---------------------------------------------------*)
end.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
328:
329:
330:
331:
332:
333:
334:
335:
336:
337:
338:
339:
340:
341:
342:
343:
344:
345:
346:
347:
348:
349:
350:
351:
352:
353:
354:
355:
356:
357:
358:
359:
360:
361:
362:
363:
364:
365:
366:
367:
368:
369:
370:
371:
372:
373:
374:
375:
376:
377:
378:
379:
380:
381:
382:
383:
384:
385:
386:
387:
388:
389:
390:
391:
392:
393:
394:
395:
by: EddieShipmanPosted on 2009-09-01 at 19:28:38ID: 25237751
Ok, what you want to do is get the id from the Data property of the selected item BEFORE it is deleted in the DeleteItemClick and then use the SQL
DELETE FROM tree WHERE id = :id
and pass the id as the parameter and ExecSQL the above.