Ik heb de volgende classes:
Volgens mij is er niks mis met deze code. Maar tijdens run-time gaat er iets verkeerd.
Ik heb op mijn form een component staan van het type TComboBoxMultiColumn.
Dus de constructor van TComboBoxMultiColumn wordt aangeroepen. In deze constructor gaat het fout bij het aanmaken van het DropDownForm.
De constructor van de klasse TFormDropDown wordt dus aan geroepen.
Vevolgens staat daar als eerste regel inherited Create(AOwner). Dit zou dus de constructor van de TForm moeten aanroepen. Maar het gekke is dat die de destructor van TComboBoxMultiColumn aanroept.
Hoe kan dat?
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
| unit Unit1;
interface
type
TFormDropDown = class(TForm)
private
...
private
...
protected
...
public
constructor Create(AOwner: TComponent); override;
...
end;
TComboboxMultiColumn = class(TEdit)
private
...
protected
...
public
constructor Create(AOwner: TComponent); override;
published
...
end;
implementation
constructor TFormDropDown.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
...
end;
constructor TComboboxMultiColumn.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle + [csReplicatable];
FButton := TSpeedButton.Create(Self);
FButton.Width := cButtonWidth;
FButtonWidth := cButtonWidth;
FButton.ParentFont := false;
FButton.Glyph.LoadFromResourceName(HInstance, 'IMGARROWDOWN');
FButton.Cursor := crArrow;
FButton.OnClick := ButtonClick;
FButton.OnMouseDown := ButtonMouseDown;
SetButtonBounds;
FButton.Parent := Self;
SetEditRect;
Invalidate;
FDropDown := False;
FDropDownForm := TFormDropDown.Create(Self);
FListViewDropDownList := TListView.Create(FDropDownForm);
with FListViewDropDownList do
begin
ViewStyle := vsReport;
Ctl3D := False;
Align := alClient;
Parent := FDropDownForm;
ParentFont := True;
OnMouseMove := ListView1MouseMove;
with Columns.Add do
Caption := 'Naam';
end;
end;
destructor TComboboxMultiColumn.Destroy;
begin
FButton.Free;
FListViewDropDownList.Free;
FDropDownForm.Free;
inherited Destroy;
end;
end. |
Volgens mij is er niks mis met deze code. Maar tijdens run-time gaat er iets verkeerd.
Ik heb op mijn form een component staan van het type TComboBoxMultiColumn.
Dus de constructor van TComboBoxMultiColumn wordt aangeroepen. In deze constructor gaat het fout bij het aanmaken van het DropDownForm.
De constructor van de klasse TFormDropDown wordt dus aan geroepen.
Vevolgens staat daar als eerste regel inherited Create(AOwner). Dit zou dus de constructor van de TForm moeten aanroepen. Maar het gekke is dat die de destructor van TComboBoxMultiColumn aanroept.
Hoe kan dat?