Ik heb weer een probleempje met frames in Delphi en inmiddels zie ik het probleem niet meer...
Het probleem is als volgt:
Ik heb een programma (inmiddels even een testprogramma gemaakt) waar een basisframe op een form geplaatst is. Dit form heeft een Insert knop waarmee een andere frame wordt geplaatst op het basisframe. De frames worden in een array geplaatst: arrFrames: array of Tfrm_test_frame;.
De insert functie op het form:
Ieder frame heeft ook een eigen verwijder knop waarmee foutieve frames verwijderd kunnen worden:
Nu komt het random voor dat ik access violations krijg door een willekeurig aantal keer op de insert en delete knop te drukken. Ziet iemand misschien wat ik fout doe?
Het testproject (incl. een .exe) is te downloaden van http://rapidshare.de/files/18559045/Frames.zip.html
Het probleem is als volgt:
Ik heb een programma (inmiddels even een testprogramma gemaakt) waar een basisframe op een form geplaatst is. Dit form heeft een Insert knop waarmee een andere frame wordt geplaatst op het basisframe. De frames worden in een array geplaatst: arrFrames: array of Tfrm_test_frame;.
De insert functie op het form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| procedure Tfrm_form.but_insertClick(Sender: TObject);
var
intTemp: integer;
begin
// aantal frames ophogen
Inc(intAantalFrames);
// lengte array aanpassen aan het aantal frames
SetLength(arrFrames, intAantalFrames);
arrFrames[intAantalFrames - 1] := Tfrm_test_frame.Create(Self);
with arrFrames[intAantalFrames - 1] do
begin
Name := 'frm_test_frame' + IntToStr(intAantalFrames);
Parent := Frame21;
Top := 8 + ((intAantalFrames - 1) * 308);
Height := 308
end;
out_array_size.Caption := IntToStr(intAantalFrames);
intTemp := StrToInt(out_aantal_inserts.Caption);
Inc(intTemp);
out_aantal_inserts.Caption := IntToStr(intTemp);
end; |
Ieder frame heeft ook een eigen verwijder knop waarmee foutieve frames verwijderd kunnen worden:
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
| procedure Tfrm_test_frame.but_deleteClick(Sender: TObject);
var
carArrayLength: cardinal;
arrTailElements: cardinal;
I: integer;
intFrameID: integer;
intTemp: integer;
strFrameID: string;
begin
// element verwijderen
strFrameID := AnsiReplaceStr((Sender as TButton).Parent.Name, 'frm_test_frame', '');
if (IsNumeric(strFrameID) = true) then
begin
// bewerking uitvoeren om 't juiste frame te krijgen
intFrameID := StrToInt(strFrameID) - 1;
// frame verwijderen.
frm_form.arrFrames[intFrameID].Free;
frm_form.arrFrames[intFrameID] := nil;
// lengte van de array in variabele carArrayLength plaatsen.
carArrayLength := Length(frm_form.arrFrames);
// controleren of er elementen in de array staan.
Assert(carArrayLength > 0);
// controleren of het te verwijderen item in de grens ligt.
Assert(intFrameID < carArrayLength);
// element finalizen
Finalize(frm_form.arrFrames[intFrameID]);
// aantal elementen achter het te verwijderen element bepalen.
arrTailElements := carArrayLength - intFrameID;
// items achter het te verwijderen element aan de items voor het te verwijderen element plakken.
if arrTailElements > 0 then
move(frm_form.arrFrames[intFrameID + 1], frm_form.arrFrames[intFrameID], SizeOf(Tfrm_test_frame) * arrTailElements);
// element initialiseren
Initialize(frm_form.arrFrames[carArrayLength - 1]);
// array kleiner maken
SetLength(frm_form.arrFrames, carArrayLength - 1);
// nummer van het aantal elementen in de array bijwerken.
Dec(frm_form.intAantalFrames);
frm_form.out_array_size.Caption := IntToStr(frm_form.intAantalFrames);
intTemp := StrToInt(frm_form.out_aantal_deletes.Caption);
Inc(intTemp);
frm_form.out_aantal_deletes.Caption := IntToStr(intTemp);
// frames onder elkaar plaatsen
for I := 0 to frm_form.intAantalFrames - 1 do
begin
// positie aanpassen
frm_form.arrFrames[I].Top := 8 + (I * 232);
frm_form.mem_feedback.Lines.Add('Delete frame(4a): naam frame: ' + IntToStr(I) + ' --> ' + frm_form.arrFrames[I].Name);
// naam aanpassen om dubbele namen te voorkomen.
frm_form.arrFrames[I].Name := 'frm_test_frame' + IntToStr(I + 1);
end;
end;
end;
function Tfrm_test_frame.isNumeric(theValue: string): boolean;
var
numeric: integer;
tested : integer;
begin
// Numerieke waarde testen;
Val(theValue, numeric, tested);
if tested <> 0 then
Result := false
else
Result := true;
end; |
Nu komt het random voor dat ik access violations krijg door een willekeurig aantal keer op de insert en delete knop te drukken. Ziet iemand misschien wat ik fout doe?
Het testproject (incl. een .exe) is te downloaden van http://rapidshare.de/files/18559045/Frames.zip.html
Ik kna 300 woodren pre mniuut tpynen.