Autor Beitrag
ImbaPanda
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 18:42 
Also mein Problem sieht wie folgt aus.
Ich schreibe gerade ein Mathe Programm und habe mir einen Typ angelegt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Type
TRichtungsvektor=Record
    xRichtung:Real;
    yRichtung:Real;
    zRichtung:Real;
  End;  
  TStuetzvektor=Record
    xRichtung:Real;
    yRichtung:Real;
    zRichtung:Real;
  End;
  TGerade=Record
    Name:String[255];
    Stuetzvektor:TStuetzvektor;
    Richtungsvektor:TRichtungsvektor;
  End;

und die entsprechende Variable, da ich ja mehrere benötige(halt mehrere Geraden)

ausblenden Delphi-Quelltext
1:
Gerade:Array[1..25] Of TGerade;					


Nun Versuche ich zu überprüfen, ob eine Gerade(Record) schon voll also besetzt ist. Dazu folgender Quelltext:

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:
32:
33:
34:
procedure TFrmKomponentenPalette.GeradeErzeugenClick(Sender: TObject);
Var
 x:Integer; //Laufvariable
begin
x:=1;
Repeat
 If Gerade[x].Name=''
   Then GeradeVerfuegbar:=True
   Else x:=x+1;
Until GeradeVerfuegbar Or (x=25);
If GeradeVerfuegbar
  Then If Modus='2-Punkte-Form'
         Then
          Begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xBGerade.Text) - StrToFloat(xAGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yBGerade.Text) - StrToFloat(yAGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zBGerade.Text) - StrToFloat(zAGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
          End
         Else
          Begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xUGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yUGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zUGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
          End
  Else ShowMessage('Die Kapazität der Geraden ist erreicht.');
end;


Letztere Abfragen dienen dazu dem Record neue Werte zu geben, falls noch nicht vorhanden.

Doch das funktioniert nicht so richtig und der kommt mit dem Typ nicht klar.
ErrorMessage ist immer "Klasse bestitzt keine Standarteigenschaft"

Falls jemand eine Idee hat immer her damit^^.
Schonmal im voraus danke.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 27.05.07 18:58 
In welcher Zeile?

_________________
Markus Kinzler.
ImbaPanda Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 19:04 
der meckert schon in der zeile
If Gerade[x].Name=''
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 27.05.07 19:10 
Wie ist Gerade deklariert (Array?)?

_________________
Markus Kinzler.
ImbaPanda Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 19:52 
ja ich habe zuerst nen typ deklariert.
TGerade=Record
.
.
.

mit den verschiedenen Eigenschaften halt.

Da ich aber mehr Variablen von diesem Typ brauche(mehrere Geraden) habe ich eine Variable vom Typ Array gemacht
Gerade:Array[1..25] Of TGerade

nur der kommt damit irgendwie nicht klar
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 27.05.07 19:53 
Und wo?

_________________
Markus Kinzler.
ImbaPanda Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 19:59 
also hier nochma die deklaration:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
Type
TRichtungsvektor=Record
    xRichtung:Real;
    yRichtung:Real;
    zRichtung:Real;
  End;
  TStuetzvektor=Record
    xRichtung:Real;
    yRichtung:Real;
    zRichtung:Real;
  End;
  TGerade=Record
    Name:String[255];
    Stuetzvektor:TStuetzvektor;
    Richtungsvektor:TRichtungsvektor;
  End;

und den dazu gehörigen Array:
ausblenden Delphi-Quelltext
1:
2:
Var
Gerade:Array[1..25] Of TGerade;

beim kompilieren zeigt der mir halt immer an "Klasse besitzt keine Standarteigenschaft"
und springt in folgende Zeile:

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:
32:
33:
34:
procedure TFrmKomponentenPalette.GeradeErzeugenClick(Sender: TObject);
Var
 x:Integer; //Laufvariable
begin
x:=1;
Repeat
 If Gerade[x].Name=''                               <--------  HIER!!!!!!!!!
   Then GeradeVerfuegbar:=True
   Else x:=x+1;
Until GeradeVerfuegbar Or (x=25);
If GeradeVerfuegbar
  Then If Modus='2-Punkte-Form'
         Then
          Begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xBGerade.Text) - StrToFloat(xAGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yBGerade.Text) - StrToFloat(yAGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zBGerade.Text) - StrToFloat(zAGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
          End
         Else
          Begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xUGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yUGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zUGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
          End
  Else ShowMessage('Die Kapazität der Geraden ist erreicht.');
end;


Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 27.05.07 20:03 
Funktioniert der Zugriff auf andere Felder des Record? Nenne mal die Eigenschaft Name um.

_________________
Markus Kinzler.
ImbaPanda Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 20:16 
also ich habe mal den namen des Arrays geändert.
hab jetzt:
DieGerade:Array[1..25] Of TGerade

das funktioniert. kann sein dass der mit den Namen durcheinander gekommen ist. Nochmal vielen dank
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 27.05.07 20:19 
Heißt die Unit zufäliig genauso?

_________________
Markus Kinzler.
ImbaPanda Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 98

Windows XP/Vista
Delphi 7 Professional/ Rad Studio 2009
BeitragVerfasst: So 27.05.07 20:26 
nein die heißt anders. Kann aber sein das der Probleme hatte weil der Typ TGerade hieß und die Variable Gerade. vllt lags daran. aber egal ich habs geschafft^^ nochmal danke
hkk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: Mi 30.05.07 07:14 
hallo. ich hab einen kleinen tipp, wie die ganze abfrage vllt. etwas übersichtlicher gestalten kannst: benutze doch einfach eine for-schleife. das würde dann so aussehen:

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:
32:
33:
procedure TFrmKomponentenPalette.GeradeErzeugenClick(Sender: TObject);
Var
  i:Integer;  //als Lauf-/Zählervariable wird normalerweise i verwendet
begin
  for i := 1 to 25 do begin
    if Gerade[i].Name='' then 
    begin
      GeradeVerfuegbar:=True;
      Break;   //dies beendet die schleife, wenn eine nicht verwedete Gerader gefunden wird
    end;
  if GeradeVerfuegbar then
    if Modus='2-Punkte-Form' then
    begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xBGerade.Text) - StrToFloat(xAGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yBGerade.Text) - StrToFloat(yAGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zBGerade.Text) - StrToFloat(zAGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
          End
    else
    begin
          Gerade[x].Stuetzvektor.xRichtung:=StrToFloat(xAGerade.Text);
          Gerade[x].Stuetzvektor.yRichtung:=StrToFloat(yAGerade.Text);
          Gerade[x].Stuetzvektor.zRichtung:=StrToFloat(zAGerade.Text);
          Gerade[x].Richtungsvektor.xRichtung:=StrToFloat(xUGerade.Text);
          Gerade[x].Richtungsvektor.yRichtung:=StrToFloat(yUGerade.Text);
          Gerade[x].Richtungsvektor.zRichtung:=StrToFloat(zUGerade.Text);
          Gerade[x].Name:=GeradenName.Text;
    end;
  else ShowMessage('Die Kapazität der Geraden ist erreicht.');
end;


Du solltest außerdem darauf achten, alle schlüsselwörter (was der editor fett schreibt) klein zuu schreiben, und bei if-anweisungen das then in die gleiche zeile zu übernehmen, wenn dann aber ein begin-end-block kommt, den in der nächsten zeile zu beginnen. sind so ein paar konventionen zur übersichtlichkeit

~HKK
chrisw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 439
Erhaltene Danke: 3

W2K
D7
BeitragVerfasst: Mi 30.05.07 09:20 
Ich denke Du musst das Array initialisieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
  for i := 1 to 25 do
  begin
    with Gerade[i] do
    begin
      Name := '';
      Stuetzvektor.X := 0;;
      Stuetzvektor.Y := 0;;
      Stuetzvektor.Z := 0;;
      Richtungsvektor.X := 0;
      Richtungsvektor.Y := 0;
      Richtungsvektor.Z := 0;
  end;

_________________
Man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug.
hkk
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 64

Win XP Pro, Win ME, openSUSE 10.2, Ubuntu 7.xx; Firefox 2 (en-US)
D7 Pers, D3 Prof
BeitragVerfasst: Mi 30.05.07 10:32 
eigentlich muss er in diesm fall nur den strin (Name) initialisieren, da er auf die andern nur zugreifen würde, wenn dieser nicht leer wäre.

allerdings hatte er vorher bereits geschrieben, dass es funktioniert