Al eerste even een situatie schets:
Deze code koppelt een Tcomponent aan een TTreeview zodat er gegevens aan de Tnodes in de tree kunnen worden gekoppeld.
Dit is de code uit een volledig werkend testprogje waar je het volgede mee kan:
- Button om een Tree aan te maken.
- Button om de Tree met een paar dummy nodes te vullen.
- 2 TEdits om gegevens aan de nodes te kopplen of gekoppelde gegevens weer te geven.
- Button die de gegevens daadwerkelijk aan de geselecteerd node koppelt.
- Button om het hele zaakje naar ResFile te streamen.
- Button om de gegevens uit de ResFile in de TreeView te streamen.
Ok en dan nu de vraag
De gegevens die aan de nodes gekoppeld zijn worden in de ResFile plaintext opgesalgen. Nu zou het wel eens kunnen zijn dat dit gevoelige info betreft (wachtwoorden e.d.). Ik zou deze dus het liefst willen coderen voor ze opgeslagen worden.
Zelf zat ik er aan te denken om daar een eigen procedure voor te schrijven, maar dan moet ik daar een compleet algorithme voor verzinnen.
Er zijn vast wel betere (lees: makkelijkere
) manieren om te bereiken wat ik wil, toch?
Alvast bedankt!
code:
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
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, comctrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
procedure clickFest(sender: TObject);
public
end;
//Custom TTreeView klasse.
Ttree = class(TTreeview)
private
//Clear procedure van TreeView.
procedure clear;
protected
//Override van std. GetChildren methode.
procedure getchildren(proc: TGetChildProc; root: Tcomponent); override;
//Override van std. Loaded methode.
procedure loaded; override;
end;
//Tinfo klasse om gegevens te koppelen aan de Data property van een TTreeNode
Tinfo = class(Tcomponent)
private
Fs1 : string;
Fs2 : string;
published
property address: string read Fs1 write Fs1;
property phone: string read Fs2 write Fs2;
end;
var
Form1: TForm1;
tree:Ttree;
implementation
{$R *.DFM}
//Aan maken van TreeView als op knop wordt gedrukt.
procedure TForm1.Button1Click(Sender: TObject);
begin
tree := Ttree.create(self);
tree.parent := self;
tree.height := tree.height * 3;
tree.width := tree.width * 2;
tree.OnClick := clickFest;
end;
//Vullen van de TreeView met een aantal Test nodes + gegevens.
procedure TForm1.Button2Click(Sender: TObject);
var
obj: Tinfo;
begin
obj := Tinfo.create(tree);
obj.address := '123 street';
obj.phone := '999335533';
tree.items.AddChildObject(nil, 'hello',obj);
obj := Tinfo.create(tree);
tree.items.AddChildObject(nil, 'world',obj);
end;
//Wegschrijven van de TreeView gegevens naar ResFile.
procedure TForm1.Button3Click(Sender: TObject);
begin
WriteComponentResFile('c:\andyout.dfm', tree);
end;
//Clear procedure van TreeView.
procedure Ttree.clear;
var
i: integer;
begin
for i := ComponentCount - 1 downto 0 do
if components[i].ClassName = 'Tinfo' then
RemoveComponent(components[i]);
for i := items.count-1 downto 0 do
items[i].Delete;
end;
//Inladen van TreeView gegevens vanuit ResFile.
procedure TForm1.Button4Click(Sender: TObject);
begin
tree.clear;
RegisterClasses([Ttree,Tinfo]);
ReadComponentResFile('c:\andyout.dfm', tree);
end;
//Procedure die gegevens gekoppeld aan de Data property van de geselecteerd
//TTreeNode in de bijbehorende Tedit laat zien.
procedure TForm1.clickFest(sender: TObject);
begin
if (tree.selected <> nil) and (tree.selected.data <> nil) then
begin
edit1.text := Tinfo(tree.selected.data).address;
edit2.text := Tinfo(tree.selected.data).phone;
end;
end;
//Overridden GetChildren procedure.
procedure Ttree.getchildren(proc: TGetChildProc; root: Tcomponent);
var
i: integer;
begin
for i := 0 to items.count-1 do
Tinfo(items[i].data).name := '';
for i := 0 to items.count-1 do
begin
Tinfo(items[i].data).name := 'ID'+inttostr(i);
proc( items[i].data );
end
end;
//Overridden Loaded procedure.
procedure Ttree.loaded;
var
i: integer;
begin
for i := 0 to items.count-1 do
items[i].data := findcomponent('ID'+inttostr(i));
end;
//Koppelen van data die ingevoerd is in Tedit velden aan Tinfo klasse.
procedure TForm1.Button5Click(Sender: TObject);
var
info : Tinfo;
begin
if tree.selected is TTreeNode then begin
info := tree.selected.data;
info.address := edit1.text;
info.phone := edit2.text;
end
else beep;
end;
end. |
Deze code koppelt een Tcomponent aan een TTreeview zodat er gegevens aan de Tnodes in de tree kunnen worden gekoppeld.
Dit is de code uit een volledig werkend testprogje waar je het volgede mee kan:
- Button om een Tree aan te maken.
- Button om de Tree met een paar dummy nodes te vullen.
- 2 TEdits om gegevens aan de nodes te kopplen of gekoppelde gegevens weer te geven.
- Button die de gegevens daadwerkelijk aan de geselecteerd node koppelt.
- Button om het hele zaakje naar ResFile te streamen.
- Button om de gegevens uit de ResFile in de TreeView te streamen.
Ok en dan nu de vraag
De gegevens die aan de nodes gekoppeld zijn worden in de ResFile plaintext opgesalgen. Nu zou het wel eens kunnen zijn dat dit gevoelige info betreft (wachtwoorden e.d.). Ik zou deze dus het liefst willen coderen voor ze opgeslagen worden.
Zelf zat ik er aan te denken om daar een eigen procedure voor te schrijven, maar dan moet ik daar een compleet algorithme voor verzinnen.
Er zijn vast wel betere (lees: makkelijkere
Alvast bedankt!