Ik heb even een ranzig testprojectje in elkaar gedraaid om te laten zien waarom ik het nogal lastig vond om interfaces op te slaan in lijstjes, zonder dat ze out of scope gingen en dus niet meer werkten. Omdat ik graag iets nieuws leer, pleur ik het hier even neer, in de hoop dat er wat opbouwend commentaar op kan komen... misschien begrijp ik het allemaal gewoon verkeerd, en dat zou zomaar heel goed kunnen
Delphi:
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
| type
ITestIntf = interface
function GetTestValue: string;
procedure SetTestValue(aValue: string);
end;
TTestObject = class(TInterfacedObject, ITestIntf)
private
FTestValue: string;
public
function GetTestValue: string;
procedure SetTestValue(aValue: string);
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
FList: TList;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{ TTestObject }
function TTestObject.GetTestValue: string;
begin
result := FTestValue;
end;
procedure TTestObject.SetTestValue(aValue: string);
begin
FTestValue := aValue;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(FList);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
testIntf: ITestIntf;
begin
testIntf := TTestObject.Create;
testIntf.SetTestValue('hoi' + IntToStr(FList.Count));
FList.Add(TObject(testIntf));
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i : integer;
begin
for i := 0 to FList.Count - 1 do begin
ShowMessage(ITestIntf(FList.Items[i]).GetTestValue);
end;
end; |
Als ik in dit project 2x op Button1 klik worden er (naar ik hoopte) 2 interfaces bewaard in de TList (ook geprobeerd met TObjectList, to no avail). Klik ik op Button2, dan wil ik dus 2x een msgbox zien: eerst hoi0, dan hoi1. Wie schetst mijn verbazing als ik de eerste keer een msgbox zie zonder enige tekst, en daarna bij de tweede een access violatie om den oren krijg.
Ik heb in regel 72 de cast naar ITestIntf ook veranderd in TTestObject, maar dan crasht ie bij de eerste al.
Waarom ik dit dus post: TS wil een stuk of wat objecten vanuit verschillende andere objecten kunnen benaderen, en er is gesuggereerd dat dmv interfaces de refcount > 0 blijft en daardoor het object pas vrijgegeven wordt als het laatste gebruikende object de reference vrijgeeft. Ik heb aangegeven dat ik hiermee slechte ervaringen had, hierbij mijn slechte ervaring
Gaarne reactie van de mensen die mij ofwel naar Stichting Korrelatie doorverwijzen (waarvoor dank

) ofwel weten waarom dit wel zou moeten werken of wat je moet wijzigen om dit concept te laten werken. Lijkt me dat TS daar dan weer mee uit de voeten kan.
Overigens was de laatste opmerking van Tomatoman over het messaging mechanisme natuurlijk gewoon een mooi voorstel. Alleen werkt dat alleen als de lifetime van de aanmaker van het object langer is dan die van het gecreëerde object, want een object kan zichzelf toch (nog) niet freeën