Die TStringGrid Komponente stellt keine Möglichkeit zur Verfügung um Spalten oder Zeilen mitten im Grid zu löschen. Folgende Methode ermöglicht das löschen von Spalten:
function DeleteCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
for I := Col to Grid.ColCount - 2 do
for J := 0 to Grid.RowCount - 1 do
Grid.Cells[ I, J ] := Grid.Cells[ I + 1, J ];
Grid.ColCount := Grid.ColCount - 1;
Result := True;
end;
Eine Mögliche Anwendung wäre zum Beispiel das Löschen aller markierten Spalten in einem StringGrid:
procedure TForm1.Spaltelschen1Click(Sender: TObject);
var
I, left, right: integer;
begin
left := StringGrid.Selection.left;
right := StringGrid.Selection.right;
for I := 0 to right - left do
DeleteCol( StringGrid, left );
end;
Um eine neue leere Spalte in ein StringGrid einzufügen hilft folgende Funktion weiter:
function InsertCol( Grid : TStringGrid; Col : Integer ) : boolean;
var
I, j : Integer;
begin
Result := False;
if ( Col < 0 ) or ( Col >= Grid.ColCount ) then Exit;
Grid.ColCount := Grid.ColCount + 1;
for I := Grid.ColCount - 1 downto Col + 1 do
for J := 0 to Grid.RowCount - 1 do
if I <> Col + 1 then
Grid.Cells[ I, J ] := Grid.Cells[ I - 1, J ]
else
Grid.Cells[ I, J ] := '';
Result := True;
end;
Wenn man eine intelligente Methode schreiben möchte um den Inhalt einer TStringgrid Komponente zu aktuallisieren hilft einem diese Komponente nicht viel weiter. Eine Nütliche Funktion ist zum Beispeil das Auffinden einer leeren Spalte um in diese dann neuen Inhalt zu schreiben. Folgende Funktion ermittelt die erste auffindbare leere Spalte in einem StringGrid. Wenn keine leere Spalte gefunden werden kann gibt sie -1 zurück.
function FindEmptyCol( Grid : TStringGrid ) : integer;
var
I, J: Integer;
begin
Result := - 1;
for I := 0 to Grid.ColCount - 1 do
for J := 0 to Grid.RowCount - 1 do
begin
if Grid.Cells[ I, J ] <> '' then break;
if J = Grid.RowCount - 1 then
begin
Result := I;
Exit;
end;
end;
end;
Aufgabe:
Zeichnen Sie ein Petri-Netz, das folgende Aufgabenstellung modelliert:
In einer Fabrikhalle steht ein vollautomatisch arbeitender Aufzug für Paletten. Die Paletten werden vom Erdgeschoss in den ersten Stock befördert. Im Erdgeschoss befindet sich ein Förderband, das jeweils 1 Palette in den Aufzug hinein befördern kann. Ebenso befindet sich dort ein Roboter, der eine neue Palette auf dieses Förderband setzt, sofern es nicht (mehr) mit einer Palette belegt ist. Die Fördereinrichtungen des ersten Stocks brauchen Sie nicht zu modellieren.
Der Roboter hat die folgende Zustände: abgabebereit, Abgabe findet statt, Palette ist abgegeben. Das Förderband ist entweder ein- oder ausgeschaltet. Der Aufzug befindet sich entweder oben oder unten, oder er ist von unten nach oben bzw. von oben nach unten unterwegs.
Ihr Petri-Netz soll so einfach wie möglich sein (unnötig komplizierte Lösungen geben Punktabzug) und trotzdem mindestens die genannten Zustände enthalten. Die Parallelität darf nicht unnötig eingeschränkt werden! Beispielsweise kann der Roboter bereits eine neue Palette aufsetzen, während der Aufzug nach oben fährt. Achten Sie darauf, dass kein Crash passieren kann. Beispielsweise darf das Förderband nur laufen, wenn sich der Aufzug unten befindet. Der Aufzug darf nur in bestimmten Fällen starten, und so weiter. Sind eventuell weitere Zustände notwendig? Zeichnen Sie die Anfangsmarkierung so ein, dass sie einer Situation entspricht, in der sich noch keine Palette im System befindet.
Lösung:
Petrinetz zum öffnen und schließen eines Fensters
Petrinetz für das Aufschließen einer Tür
Verschiedene Beispiele für Nomenklaturen des Hexans, Hexens und Hexins