Das mit der List hat mich auf eine Idee gebracht.
Ich will aber die Liste versteckt in der Classe haben, somit bin ich auf folgende Lösung gekommen.
Vielleicht könnte man die ObjectList auch unsichtbar in die Classe einbetten, aber ob das Sinn macht ?
Code: Alles auswählen
program project1;
uses
SysUtils;
type
{ TVater }
TVater = class(TObject)
private
const
Licht: integer = 10;
var
Shader: string;
Name: string;
adr: Pointer;
type TVaterList = array of TVater;
class var VaterList: TVaterList;
procedure In_Shader_Schreiben;
public
class procedure InitLicht(l: integer);
constructor Create(n: string);
destructor Free;
end;
{ TVater }
class procedure TVater.InitLicht(l: integer);
var
i: integer;
begin
Licht := l;
for i := 0 to Length(VaterList) - 1 do begin
VaterList[i].In_Shader_Schreiben;
end;
Writeln('---------');
end;
constructor TVater.Create(n: string);
var
l: integer;
begin
Name := n;
adr := Pointer(self);
l := Length(VaterList);
SetLength(VaterList, l + 1);
VaterList[l] := self;
end;
destructor TVater.Free;
var
i: integer;
procedure DeleteA(var A: TVaterList; const Index: cardinal);
var
ALength, i: cardinal;
begin
ALength := Length(A);
if (ALength > 0) and (Index < ALength) then begin
for i := Index + 1 to ALength - 1 do begin
A[i - 1] := A[i];
end;
SetLength(A, ALength - 1);
end;
end;
begin
for i := 0 to Length(VaterList) - 1 do begin
if VaterList[i] = self then begin
DeleteA(VaterList, i);
break;
end;
end;
end;
procedure TVater.In_Shader_Schreiben;
begin
Shader := IntToStr(Licht);
Writeln('Addr: ', integer(adr), ' Name: ', Name);
end;
var
Kind1: TVater;
Kind2: TVater;
Kind3: TVater;
Kind4: TVater;
Kind5: TVater;
begin
Kind1 := TVater.Create('Kind1');
Kind2 := TVater.Create('Kind2');
Kind3 := TVater.Create('Kind3');
Kind4 := TVater.Create('Kind4');
TVater.InitLicht(123); // Bei allen Objecten in Shader schreiben
Kind3.Free;
TVater.InitLicht(123); // Bei allen Objecten in Shader schreiben
Kind5 := TVater.Create('Kind5');
TVater.InitLicht(123); // Bei allen Objecten in Shader schreiben
Kind1.Free;
TVater.InitLicht(123); // Bei allen Objecten in Shader schreiben
Kind2.Free;
Kind4.Free;
Kind5.Free;
TVater.InitLicht(123); // Bei allen Objecten in Shader schreiben
Readln;
end.
Ausgabe:
Code: Alles auswählen
Addr: 2443656 Name: Kind1
Addr: 2443688 Name: Kind2
Addr: 2443720 Name: Kind3
Addr: 2443752 Name: Kind4
---------
Addr: 2443656 Name: Kind1
Addr: 2443688 Name: Kind2
Addr: 2443752 Name: Kind4
---------
Addr: 2443656 Name: Kind1
Addr: 2443688 Name: Kind2
Addr: 2443752 Name: Kind4
Addr: 2443720 Name: Kind5
---------
Addr: 2443688 Name: Kind2
Addr: 2443752 Name: Kind4
Addr: 2443720 Name: Kind5
---------
---------