[Delphi 4] Coderen en wegschrijven van gegevens in resfile

Pagina: 1
Acties:
  • 149 views sinds 30-01-2008
  • Reageer

  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 00:27
Al eerste even een situatie schets:

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 ;)) manieren om te bereiken wat ik wil, toch?

Alvast bedankt!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je zou de standaard Zlib functies kunnen gebruiken om de stream eerst te compressen en het daarmee onleesbaar te maken. Of maakt zelf een simpele XOR functie. Of je kijkt even op www.torry.ru naar componenten/code die encryptie uitvoeren voor je.

We adore chaos because we like to restore order - M.C. Escher


  • Kwistnix
  • Registratie: Juni 2001
  • Laatst online: 00:27
Yup, die site had ik net nadat ik dit poste van iemand op IRC gekregen.
Heb daar even 2 encryptie packs gedownload. Daar ga ik morgen eens mee stoeien :)
Bedankt iig!