Autor Beitrag
Johwood
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 75



BeitragVerfasst: Sa 22.05.04 17:26 
Hallo allerseits,
ich bin mir vorweg bewusst, dass meine Frage möglicherweise die Grundkenntnisse von Object Pascal berührt, würde mich aber dennoch über jede Hilfe freuen (Suchfunktion hab ich schon benutzt - gab keine Hilfe; und rumprobiert hab ich auch).

Mein Problem:
Ich möchte eine Klasse oder ein Objekt erstellen, das eine Prozedur enthält.
Anschließend möchte ich ein Array des Objektes erstellen und für jeden Teil des Arrays eine andere Prozedur definieren. Beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
type
  Tbefehl = object
  public
    name : string[8];
    procedure wirkung;
end;

var befehl: array [0..50] of Tbefehl;

procedure befehl[0].wirkung;
begin
  ...
end;

procedure befehl[1].wirkung;
begin
  ...
end;


Dieses Beispiel funktioniert natürlich so nicht, drückt aber hoffentlich aus, was ich erreichen will.

Über jede Hilfe, wie das umzusetzen ist, wäre ich echt dankbar!

Moderiert von user profile iconPeter Lustig (18:54, 22.05.2004): Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von Johwood am Mo 24.05.04 17:32, insgesamt 2-mal bearbeitet
UC-Chewie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: Sa 22.05.04 17:46 
Wenn diese gleich heißen, dann ist folgendes möglich.
Du definierst eine Klasse mit einer abstrakten Methode:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
type
  TMyClass = class
    procedure DoSomething; virtual; abstract;
  end;


Virtuell ist das wichtige dabei, dass sie abstrakt ist, bedeutet nur, dass sie keinen Code ausführt.
Nun erstellst du dir ein paar Abkömmlinge der Klasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TMyFirstSon = class(TMyClass)
    procedure DoSomething; override;
  end;

  TMySecondSon = class(TMyClass)
    procedure DoSomething; override;
  end;
 
  [...]


So, jetzt fülst du dir dein Array:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var
  MyArray: Array[0..x] of TMyClass;
begin
  MyArray[0] := TMyFirstSon.Create;
  MyArray[1] := TMySecondSon.Create;
  [...]


Nun kannst du für jedes Array-Element die Methode DoSomething aufrufen, es wird immer der Code ausgeführt, der in der entsprechenden Klasse vereinbart wurde.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
EUOCheffe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Sa 22.05.04 17:50 
Andere Lösung:

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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
type
  Tbefehl = class(TObject)
  public
    wirkung     : procedure(Str : String);
    constructor Create(Nr : Integer);
  end;

var
  befehl: array [0..2] of Tbefehl;

procedure wirkung0(Str : String);
begin
  ShowMessage('Wirkung0: '+Str);
end;

procedure wirkung1(Str : String);
begin
  ShowMessage('Wirkung1: '+Str);
end;

procedure wirkung2(Str : String);
begin
  ShowMessage('Wirkung2: '+Str);
end;

constructor Tbefehl.Create(Nr : Integer);
begin
  inherited Create;
  case Nr of
    0: wirkung:=@wirkung0;
    1: wirkung:=@wirkung1;
    2: wirkung:=@wirkung2;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Cnt : Integer;
begin
  for Cnt:=0 to High(befehl) do
  begin
    befehl[Cnt]:=Tbefehl.Create(Cnt);
    befehl[Cnt].wirkung('Test');
    befehl[Cnt].Free;
  end;
end;
Johwood Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 75



BeitragVerfasst: Sa 22.05.04 20:57 
Vielen Dank! Funktioniert einwandfrei..