Autor |
Beitrag |
Shrea
Hält's aus hier
Beiträge: 5
|
Verfasst: 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:
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);
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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Sa 29.10.11 17:46
Du mußt erst eine Instanz von TStar erzeugen
|
|
Shrea 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 29.10.11 17:48
TStar wird davor erzeugt... um genau zu sein "stz" mal.
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
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Sa 29.10.11 17:56
Zeig doch mal den Code wo du TStar erzeugst...
|
|
Shrea 
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 29.10.11 17:57
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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: 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 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: Sa 29.10.11 18:25
|
|
Shrea 
Hält's aus hier
Beiträge: 5
|
Verfasst: 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
      
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)
|
Verfasst: 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).
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
      
Beiträge: 182
Erhaltene Danke: 14
|
Verfasst: 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
|
|