[Delphi] Frames (part 2 :P)

Pagina: 1
Acties:
  • 33 views sinds 30-01-2008

  • Hmmm
  • Registratie: Mei 2003
  • Laatst online: 20-02 12:46
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:

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:08
Door te debuggen, zal je zien wat je fout doet.
De Delphi IDE heeft de mogelijkheid om breakpoints in je code te zetten, en stap voor stap je code uit te voeren. Je zal zien dat je ergens een niet geinitialiseerd stuk geheugen benaderd.
Wellicht wil je een frame verwijderen dat er niet is.

Iig, dit is standaard debug werk, vandaar dat dit topic dicht gaat.

https://fgheysels.github.io/


Dit topic is gesloten.