Autor Beitrag
Sylvus
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 17:22 
user profile iconSylvus hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
      Anzeige_pointer:=@Anzeige[I];					

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

Grüsse, Dirk
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Sa 26.09.09 17:24 
mir wurde gesagt, ich muss das so machen :)
Hier mal der "ganze" Code:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 17:31 
Dann ist Dein "Anzeige_pointer" doch wie bereits gesagt wurde völlig überflüssig.
ausblenden Delphi-Quelltext
1:
2:
Anzeige[i] := TAnzeige.Create;
Anzeige[i].erzeuge(...)
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Sa 26.09.09 17:50 
neeee- ich hab da ja verschiedene Arrays... ok es sieht so aus:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 18:04 
ausblenden 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:
ausblenden 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):
ausblenden Delphi-Quelltext
1:
2:
Anzeige_pointer := @Anzeige[I];
Anzeige_pointer^ := TAnzeige.Create;
Sylvus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 195



BeitragVerfasst: Sa 26.09.09 18:07 
Na ich wollte das:
ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 735
Erhaltene Danke: 6

Windows 7
Delphi7 - Delphi XE
BeitragVerfasst: 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.

_________________
"Ich bin bekannt für meine Ironie. Aber auf den Gedanken, im Hafen von New York eine Freiheitsstatue zu errichten, wäre selbst ich nicht gekommen." - George Bernhard Shaw
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Sa 26.09.09 18:11 
Du willst also keine Anzeige, sondern ein AnzeigeArray auswählen
ausblenden 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;