Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Pointer


Sylvus - Fr 25.09.09 23:57
Titel: Pointer
Hay Leute, bin noch ziemlich ungeübt mit Pointern....darum hier ein ganz simples Problem:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
  TAnzeige = class(TObject)
    Grafik: array[1..8of TImage;
    constructor Create();
    destructor Destruct();
    procedure switch(img: integer);
    procedure erzeuge(pos: TPoint; img_name: string);
  end;

    Anzeige_pointer = ^TAnzeige;
...
  Anzeige_temp:Anzeige_pointer;
...
      Anzeige_temp:=@Anzeige;
      Anzeige_temp^[I] := TAnzeige.Create;
      Anzeige_temp^[I].erzeuge(temp_pos, 'BILD' + inttostr(I));


Wo ist das Problem? Das Problem ist, dass ich folgende Fehlermeldung erhalte:
[DCC Fehler] Unit1.pas(211): E2149 Klasse besitzt keine Standardeigenschaft
Ich weiß aber nicht, was genau falsch ist, vielleicht ist von euch einer so nett und erklärt mir mein Problem :)
DANKE & Grüße Sylvus


jaenicke - Sa 26.09.09 00:28

Naja... du hast einen Pointer auf eine Klasse und versuchst darauf wie auf ein Array zuzugreifen:
user profile iconSylvus hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
      Anzeige_temp:=@Anzeige;
      Anzeige_temp^[I] := TAnzeige.Create;
Standardeigenschaft hieße, dass du auf Anzeige.Grafik[i] auch mit Anzeige[i] zugreifen kannst. Genauso wie bei StringList.Strings[i] und StringList[i].

Ich habe keine Ahnung wozu du hier überhaupt Pointer auf Pointer verwenden willst. Denn schließlich ist eine Variable vom Typ TAnzeige ja bereits ein Pointer. :gruebel:


Sylvus - Sa 26.09.09 17:11

achso, ja war nur für mich, weil ich dachte ich muss das so machen... habs jetzt gerade so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
type

  TAnzeige = class(TObject)
    Grafik: array[1..8of TImage;
    Status: array[1..8of boolean;
    constructor Create();
    destructor Destruct();
    procedure switch(img: integer);
    procedure erzeuge(pos: TPoint; img_name: string);

  end;
    Anzeige_pointer = ^TAnzeige;


      Anzeige_pointer:=@Anzeige[I];
      Anzeige_pointer := TAnzeige.Create;
      Anzeige_pointer^.erzeuge(temp_pos, 'imgN' + inttostr(I));


aber da bekomm ich die Fehlermeldung: '(' erwartet.....
Wäre nett wenn du mir da nochmal hilfst!

Viele Grüße
Sylvus


Tryer - Sa 26.09.09 17:22

user profile iconSylvus hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
      Anzeige_pointer:=@Anzeige[I];                    

Was ist "Anzeige" ?
Warum "ernennst" du einen neuen destructor an Stelle von "Destroy" ?

Grüsse, Dirk


Sylvus - Sa 26.09.09 17:24

mir wurde gesagt, ich muss das so machen :)
Hier mal der "ganze" Code:


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:
var
  Anzeige: array[0..10of TAnzeige;

implementation
uses Unit1;

constructor TAnzeige.Create;
var
  I: Integer;
begin
  inherited Create;
  for I := 1 to 8 do
  begin
    self.Grafik[i] := TImage.Create(Form1);
    self.Grafik[I].Parent := Form1;
  end;
end;

destructor TAnzeige.Destruct;
var
  i: Integer;
begin
  for i := 1 to 8 do
    self.Grafik[i].Free;
  inherited;
end;


Danke für die Hilfe!


Tryer - Sa 26.09.09 17:31

Dann ist Dein "Anzeige_pointer" doch wie bereits gesagt wurde völlig überflüssig.

Delphi-Quelltext
1:
2:
Anzeige[i] := TAnzeige.Create;
Anzeige[i].erzeuge(...)


Sylvus - Sa 26.09.09 17:50

neeee- ich hab da ja verschiedene Arrays... ok es sieht so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Anzeige: array[0..10of TAnzeige;
  AnzeigeS: array[0..10of TAnzeige;
  AnzeigeU: array[0..10of TAnzeige;
  AnzeigeUS: array[0..10of TAnzeige;

 if J = 0 then
      begin
      Anzeige_pointer:=@Anzeige[I];
      Anzeige_pointer := TAnzeige.Create;
      Anzeige_pointer^.erzeuge(temp_pos, 'imgN' + inttostr(I));
 if J = 1 then
      begin
      Anzeige_pointer:=@AnzeigeS[I];
      Anzeige_pointer := TAnzeige.Create;
      Anzeige_pointer^.erzeuge(temp_pos, 'imgS' + inttostr(I));
...


und das wollte ich jetzt kürzer fassen... Danke!
Grüße Sylvus


Tryer - Sa 26.09.09 18:04


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Anzeige: array[0..10of TAnzeige;
  AnzeigeS: array[0..10of TAnzeige;
  AnzeigeU: array[0..10of TAnzeige;
  AnzeigeUS: array[0..10of TAnzeige;

  case J of
    0begin
         Anzeige[I] := TAnzeige.Create;
         Anzeige[I].erzeuge(temp_pos, 'imgN' + inttostr(I));
       end;
    1begin
         AnzeigeS[I] := TAnzeige.Create;
         AnzeigeS[I].erzeuge(temp_pos, 'imgN' + inttostr(I));   
       end;
    ...
  end;

Die Verwendung des Pointers wird mir einfach nicht klar. Kann es sein das da was am Konzept noch nicht stimmt?

Zitat:

Delphi-Quelltext
1:
2:
Anzeige_pointer := @Anzeige[I];
Anzeige_pointer := TAnzeige.Create;

Anzeige_pointer zeigt auf einen Eintrag im Array. Und was passiert dann in der zweiten Zeile, wird da ein TAnzeige erzeugt und an den Pointer zugewiesen oder wird das Element im Array erzeugt?
So wäre es eindeutig (und damit der Zeiger wieder überflüssig):

Delphi-Quelltext
1:
2:
Anzeige_pointer := @Anzeige[I];
Anzeige_pointer^ := TAnzeige.Create;


Sylvus - Sa 26.09.09 18:07

Na ich wollte das:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Anzeige: array[0..10of TAnzeige;
  AnzeigeS: array[0..10of TAnzeige;
  AnzeigeU: array[0..10of TAnzeige;
  AnzeigeUS: array[0..10of TAnzeige;

  case J of
    0begin
         Anzeige[I] := TAnzeige.Create;
         Anzeige[I].erzeuge(temp_pos, 'imgN' + inttostr(I));
       end;
    1begin
         AnzeigeS[I] := TAnzeige.Create;
         AnzeigeS[I].erzeuge(temp_pos, 'imgN' + inttostr(I));   
       end;
    ...
  end;

so schreiben:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
var
  Anzeige: array[0..10of TAnzeige;
  AnzeigeS: array[0..10of TAnzeige;
  AnzeigeU: array[0..10of TAnzeige;
  AnzeigeUS: array[0..10of TAnzeige;

for J:=1 to 4 do begin

case J of
1: pointer:=Anzeige
2: pointer:=AnzeigeS
3: pointer := AnzeigeU ...

         pointer[I] := TAnzeige.Create;
         pointer[I].erzeuge(temp_pos, 'imgN' + inttostr(I));

    ...
  end;
end;


//habs jetzt glaub ich geschafft, trotzdem wenn ihr meint das ist unsinnig dann sagt mir das bitte :) Will ja einen ordentlichen Code!


HelgeLange - Sa 26.09.09 18:10

Du mixt alten Code mit neuem ohne zu wissen, was Du eigentlich machst. Entweder Du willst mit Objekten Arbeiten (Deiner TAnzeige, die 8 TImage hält oder so) oder Du willst mit Arrays arbeiten.


Tryer - Sa 26.09.09 18:11

Du willst also keine Anzeige, sondern ein AnzeigeArray auswählen

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type 
  TAnzeigeArray = Array[0..10of TAnzeige

var
  Anzeige, AnzeigeS: TAnzeigeArray;

..

var 
  AnzArray: TAnzeigeArray;

Case J of
  1: AnzArray := Anzeige;

AnzArray[i] := TAnzeige.Create;