Eigentlich kein Delphi spezifisches Problem, mehr theoretisch. Ich programmiere gerade an einem Programm zur Simulation von elektrischen Stromkreisen in Delphi. Das Problem ist, dass ich erstmal testen muesste ob selbige geschlossen sind. Meine bisherige Loesung ist vom Minuspool der Battery einfach eine Funktion laufen zu lassen, die dann die selbe Funktion der nachsten Schaltungskomponente aufruft und wenn sie dann irgendwann mal am Pluspool der Battery ankommt true zurueckgibt (all den Weg bis zum Anfang) oder eben false falls es keine naechste Komponente gibt.
Nochmal zur Verdeutlichung:
Code:
[Battery.TestConnection]
Result := Lampe.Ping;
[Lampe.Ping]
if [...] exists then
Result := [...].Ping
else
Result := False;
bis irgendwann wieder
[Battery.Ping]
Result := True;
Geht Klasse, bei Reihenschaltungen natuerlich:
http://img75.imageshack.us/img75/9572/screen1aj7.png
Bei Parallelschaltungen ist das Problem das er sich jedesmal aufteilt, der Ping, und dann immer im Kreis laeft auf der Suche nach einem Rueckgabewert. Der Ping teilt sich auf und teilt sich erneut beim zweiten Multiconnector (Multiplug im Programm genannt), was eine Kettenreaktion ausloesen wuerde (siehe Screen unten). Bisher hab ich es mal so gemacht, dass Verbindungen auf denen bereits gesendet wurde nichts mehr empfangen koennen, damit es nicht staendig abstuerzt, aber ich braechte natuerlich ne richtige Loesung.
http://img514.imageshack.us/img514/2228/screen2ix5.png
Ich hab mal ne Binary des unfertigen Programmes angehaengt damit ihr euch es besser vorstellen koennt.
Hier noch ein paar Codeauszuege wenn auch, da es so offensichtlich nicht geht und ich neue Loesungen suche, nicht unbedingt noetig:
Delphi-Quellcode:
{ A Ping alwas emerges from the negative connector
of a battery throught all the other components
until it reaches the battery's positive connector }
function TPTElectronicComponent.Ping(Sender: TPort): Boolean;
var
I: Integer;
Results: array of Boolean;
begin
// First we need to find the Sender's ID and then
// send the Ping to all Ports with none or the streaming
// attribute. The Sender's attribute will be set to streamed
// and each none will become a streaming
// Prepare the Results
SetLength(Results, Length(ecConnectors));
Sender.Connector.Flag := pfStreamed;
for I := 0 to High(ecConnectors) do
begin
if (ecConnectors[I].Flag = pfNone) then
begin
if ecConnectors[I].Used then
begin
ecConnectors[I].Flag := pfStreaming;
if ecConnectors[I].Used then
begin
Results[I] := ecConnectors[I].Connector.Parent.Ping(ecConnectors[I]);
end;
end;
end;
end;
// Sum up the results
Result := False;
for I := 0 to High(Results) do
begin
Result := (Result or Results[I]);
end;
ecPingOk := Result;
end;
Delphi-Quellcode:
{ Start a ping from the negative connector }
procedure TPTBattery.StartPing;
begin
baOwnTest := True;
if ecConnectors[1].Used then
begin
ecConnectors[1].Connector.Parent.Ping(ecConnectors[1]);
end;
baOwnTest := False;
end;
{ A Ping alwas emerges from the negative connector
of a battery throught all the other components
until it reaches the battery's positive connector }
function TPTBattery.Ping(Sender: TPort): Boolean;
begin
Result := False;
if (Sender.Connector = ecConnectors[0]) and (baOwnTest) then
begin
Result := True;
end
else if Sender.Connector = ecConnectors[0] then
begin
if ecConnectors[1].Used then
begin
Result := ecConnectors[1].Connector.Parent.Ping(ecConnectors[1]);
end;
end;
end;
Hoffe jemand kann mir helfen