M. Behrendt
2014-04-11 08:31:45 UTC
Hallo!
Mal sehen, ob ich das jetzt verständlich erklären kann:
Ziel ist eine Art Fliessbandsimulation.
Ich habe eine Liste von Maschinen:
var maschinen_liste:Tmaschine;
welche wie folgt definiert sind:
type Tmaschine=class
maschine_nummer:word;
maschine_name:string;
maschine_type:byte;
anzahl_inputs:byte;
anzahl_outputs:byte;
inputliste:array of Tio_put;
outputliste:array of Tio_put;
public
function calc:boolean;
var bereit:boolean;
end;
Ich habe unterschiedliche Maschinentypen, z.B.
Schalter, type=0, anzahl_inputs:=0; anzahl_outputs:=1;
Anzeige, type=1; anzahl_inputs:=1; anzahl_outputs:=0;
Bohrmaschine, type=10, anzahl_inputs:=3; anzahl_outputs:=1;
Schleifmaschine, type=11, anzahl_inputs:=4; anzahl_outputs:=1;
usw.
dabei sind diese Maschinen von Tmasschine abgeleitet:
z.B. ganz trivial
type TSchalter=class(Tmaschine)
const maschine_type=0;
public
constructor create;
end;
oder auch
type Tbohrmaschine=class(Tmaschine)
const maschine_type=10;
public
function aktiviere(I_1,I_2:single):boolean;
constructor create;
end;
unter implementation
constructor TSchalter.create;
begin
anzahl_inputs:=0;
anzahl_outputs:=1;
end;
...
constructor Tbohrmaschine.create;
begin
anzahl_inputs:=2;
anzahl_outputs:=1;
end;
function Tmaschine.aktiviere(I_1,I_2:single):boolean;
begin
calc:=false;
...
if werkstück_fertig then calc:=true;
end;
Soweit.
Nun habe ich auf meiner Form einen Schalter zum aktivieren der ganzen Simulation, soll nur einen Arbeitsschritt machen, also keinen timer o.ä. aktivieren.
procedure TMainFrm.SpeedButton1Click(Sender: TObject);
begin
arbeitsschritt;
end;
mit
procedure arbeitsschritt;
var maschinen_durchzaehler:word;
begin
maschinen_durchzaehler:=0;
repeat
if maschinen_liste[maschinen_durchzaehler].maschinen_type=10 then
begin
maschinen_liste[maschinen_durchzaehler].bereit:=false;
maschinen_liste[maschinen_durchzaehler].aktiviere;
end;
inc(maschinen_durchzaehler);
until maschinen_durchzaehler=length(maschinen_liste);
end;
Meine Frage ist: Wenn ich in Arbeitsschritt die unter Tmaschine deklarierte function aktiviere; aufrufe, wie kann ich dann die Parameter der spezifischen Maschine mitübergeben, die ich z.B. bei Tbohrmaschine.aktiviere(i1,i2,i3,o1) brauche?
Bei bohrmaschine muss ich drei Inputs mitübergeben (Bohrertyp, Drehzahl, Lochtiefe), bei einer Anzeige nur einen Input (Anzeigewert, logisch).
Aber wie bekomme ich die unterschiedliche Zahl und Werte der Parameter in die allgemeinere function aktiviere; des Typs Tmaschine um ihn unter arbeitsschritt aufzurufen?
Selbst mit einem override über die Tmaschine.aktiviere krieg ich doch die Parameter nicht dorthin.
Ich hoffe, das war verständlich.
Weiss einer Rat?
Grüße,
Mike.
Mal sehen, ob ich das jetzt verständlich erklären kann:
Ziel ist eine Art Fliessbandsimulation.
Ich habe eine Liste von Maschinen:
var maschinen_liste:Tmaschine;
welche wie folgt definiert sind:
type Tmaschine=class
maschine_nummer:word;
maschine_name:string;
maschine_type:byte;
anzahl_inputs:byte;
anzahl_outputs:byte;
inputliste:array of Tio_put;
outputliste:array of Tio_put;
public
function calc:boolean;
var bereit:boolean;
end;
Ich habe unterschiedliche Maschinentypen, z.B.
Schalter, type=0, anzahl_inputs:=0; anzahl_outputs:=1;
Anzeige, type=1; anzahl_inputs:=1; anzahl_outputs:=0;
Bohrmaschine, type=10, anzahl_inputs:=3; anzahl_outputs:=1;
Schleifmaschine, type=11, anzahl_inputs:=4; anzahl_outputs:=1;
usw.
dabei sind diese Maschinen von Tmasschine abgeleitet:
z.B. ganz trivial
type TSchalter=class(Tmaschine)
const maschine_type=0;
public
constructor create;
end;
oder auch
type Tbohrmaschine=class(Tmaschine)
const maschine_type=10;
public
function aktiviere(I_1,I_2:single):boolean;
constructor create;
end;
unter implementation
constructor TSchalter.create;
begin
anzahl_inputs:=0;
anzahl_outputs:=1;
end;
...
constructor Tbohrmaschine.create;
begin
anzahl_inputs:=2;
anzahl_outputs:=1;
end;
function Tmaschine.aktiviere(I_1,I_2:single):boolean;
begin
calc:=false;
...
if werkstück_fertig then calc:=true;
end;
Soweit.
Nun habe ich auf meiner Form einen Schalter zum aktivieren der ganzen Simulation, soll nur einen Arbeitsschritt machen, also keinen timer o.ä. aktivieren.
procedure TMainFrm.SpeedButton1Click(Sender: TObject);
begin
arbeitsschritt;
end;
mit
procedure arbeitsschritt;
var maschinen_durchzaehler:word;
begin
maschinen_durchzaehler:=0;
repeat
if maschinen_liste[maschinen_durchzaehler].maschinen_type=10 then
begin
maschinen_liste[maschinen_durchzaehler].bereit:=false;
maschinen_liste[maschinen_durchzaehler].aktiviere;
end;
inc(maschinen_durchzaehler);
until maschinen_durchzaehler=length(maschinen_liste);
end;
Meine Frage ist: Wenn ich in Arbeitsschritt die unter Tmaschine deklarierte function aktiviere; aufrufe, wie kann ich dann die Parameter der spezifischen Maschine mitübergeben, die ich z.B. bei Tbohrmaschine.aktiviere(i1,i2,i3,o1) brauche?
Bei bohrmaschine muss ich drei Inputs mitübergeben (Bohrertyp, Drehzahl, Lochtiefe), bei einer Anzeige nur einen Input (Anzeigewert, logisch).
Aber wie bekomme ich die unterschiedliche Zahl und Werte der Parameter in die allgemeinere function aktiviere; des Typs Tmaschine um ihn unter arbeitsschritt aufzurufen?
Selbst mit einem override über die Tmaschine.aktiviere krieg ich doch die Parameter nicht dorthin.
Ich hoffe, das war verständlich.
Weiss einer Rat?
Grüße,
Mike.