Autor Beitrag
Shrea
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 29.10.11 16:45 
Hallo zusammen,
ich als Neuling in Delphi (und im Forum ;)) programmiere derzeit eine Physik.-Simulation.
Dabei habe ich in meiner Klasse "TStar" ein dynamisches Array. Wenn ich die Funktion "SetLenght" nun ausführe kriege ich eine AccessViolation. Zusammengefasst sieht das so aus:

ausblenden volle Höhe Delphi-Quelltext
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:
unit stern;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, global, math;
type
dist = array of extended;

type
  Tstar = class(TFrame)
    Image1: TImage;
  private
  d: dist;

  public
   procedure start(stz:integer);

implementation

procedure TStar.start(stz:integer);
{"stz" liegt eigentlich in der Unit "Gobal" vor welche eingebunden ist}
var
stz: integer;
begin
 stz:= 5;
 setlength(d, stz);
end;

end.


Ich wäre euch sehr dankbar könntet ihr mir mit meinem kleinen Problemchen helfen

Grüße
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Sa 29.10.11 17:46 
Du mußt erst eine Instanz von TStar erzeugen
Shrea Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 29.10.11 17:48 
TStar wird davor erzeugt... um genau zu sein "stz" mal.

ausblenden Delphi-Quelltext
1:
(FindComponent('s'+IntToStr(a)) as TStar).start(stz);					


Damit rufe ich dann die Procedure auf. (Im Debugger sagt er mir das "d" ein nicht verfügbarer Wert ist?!)
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Sa 29.10.11 17:56 
Zeig doch mal den Code wo du TStar erzeugst...
Shrea Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 29.10.11 17:57 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:integer;
.
.
.
for a:=1 to stz do
begin
star:=TStar.Create(form1.TabSheet2);
star.Parent:=Form1.TabSheet2;
star.Name:='s'+inttostr(a);
star.Show;
end;
.
.
.
for a:=1 to stz do
(FindComponent('s'+IntToStr(a)) as TStar).start(stz);
end;
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Sa 29.10.11 18:04 
Ich frage mich, warum du der Methode Start ein stz übergibst und dann noch ein stz lokal deklarierst
Shrea Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 29.10.11 18:06 
Siehe Zeile 23 erster Post. Das habe ich nur zur Veranschaulichung getan damit man weis das "stz" deklariert ist!
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: Sa 29.10.11 18:25 
user profile iconShrea hat folgendes geschrieben Zum zitierten Posting springen:
Siehe Zeile 23 erster Post. Das habe ich nur zur Veranschaulichung getan damit man weis das "stz" deklariert ist!
Das meine ich nicht, sondern :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TStar.start(stz:integer);
{"stz" liegt eigentlich in der Unit "Gobal" vor welche eingebunden ist}
var
stz: integer;
begin
 stz:= 5;
 setlength(d, stz);
end;
Du übergibst der Methode als Parameter das stz, benutzt es aber nicht, sondern setzt dein eigenes stz. Das ist sicher nicht der Fehler, ist aber extrem fehleranfällig. Dazu wäre die genaue Fehlermeldung ( mit der Adresse ! ) recht hilfreich
Shrea Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 29.10.11 18:31 
Die Übergabe habe ich gerade entfernt und die Deklaration auch (Da sie wie gesagt global festgelegt ist). Die Fehlermeldung lautet:

"Im Projekt cluster.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: Zugriffsverletzung bei Addresse 00404D80 in Modul 'cluster.exe'.
Lesen von Adresse 000002C4. Prozess wurde angehalten. Mit Einzelanweisung oder Start forsetzten"
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Sa 29.10.11 18:49 
Hey,

FindComponent kann auch nil liefern. Also ebntweder prupfst du das vorher, oder du baust es bisl um, sodass es etwas sinnvoller (und vorallem schneller) ist. Mach dir ein Array of TStar, das deine Star-Objekte speichert. Und da kannst du dann deine Objekte direkt raus holen. Das mit dem FindComponent funktioniert glaueb nur, wenn du die Objekte in der IDE zusammenklickst (bin mir aber grad net sicher).
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var 
  StarArr: array of TStar;
{...}
SetLength(StarArr, stz)
for a := 0 to High(StarArr) do
begin
  StarArr[i] := TStar.Create(form1.TabSheet2);
  StarArr[i].Parent := Form1.TabSheet2;
  StarArr[i].Name := 's'+inttostr(a);
  StarArr[i].Show;
end;
{...}
for a := 0 to High(StarArr) do
  StarArr[i].start(stz);
end;


MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: So 30.10.11 18:46 
Jetzt habe ich es gesehen :
Wenn der Owner Tabsheet2 ist, so mußt du natürlich auch im Tabsheet2 nachkucken ( FindKomponent vom Tabsheet2 benutzen ), Aber der Bergmann hat recht, ein Array ist schneller und sicherer