Nun du kannst das alles in einer einzigen Prozedur auslagern. Hierzu schreibst du deine Prozedur für ein einziges shape, aber anstatt Shape1
(oder ähnliches) zu schreiben, arbeitest du mit eine übergebenen Parameter "Sender". Ich bin mir nicht sicher wie du das meinst, deine Änderung der Farbe findet vermutlich im onMouseDown-Event statt, oder? (Da shapes ja kein onClick haben) Das sähe dann so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| procedure TForm1.Shape1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin (Sender as TShape).Brush.Color := clRed; (Sender as TShape).Repaint; end; |
Zur Erklärung: Sender ist das Objekt, welches das Event ausgelöst hat. Nun musst du Delphi sagen, dass es sich um ein TShape handelt, damit du auf die Eigenschaften die einzigartig für's Shape sind, zugreifen kannst. Daher das "as TShape".
Da ich nicht genau weiß, wie du das machst: Du könntest auch bloß das umfärben in eine Prozedur auslagern, das funktioniert genauso, dann übergibst du der Prozedur eine TShape Variable.
Da Delphi-Intern Objekte ja Pointer sind, brauchst du, soweit ich weiß, keinen var-Parameter daraus zu machen, aber das nur als Randbemerkung.
Edit: Ach ja. Für den fall, dass es sich um's onMouseDown oder vergleichbares handelt, musst du allen anderen Shapes auch die selbe Prozedur zuweisen. Shapes markieren (mehrere gleichzeitig sollten gehen), Object Inspector auf "Ereignisse" umschalten, onMouseDown finden und in der Drop-Down Liste die entsprechende Prozedur heraussuchen. Hierbei werden nur die Prozeduren angezeigt, die auch genau auf das Event passen. Es muss eine Methode sein (glaube ich), also Teil eines Objekts (Das erkennst du daran, dass du sie durch z.B.
procedure TForm1.MyProcedure(blah) implementierst) und sie muss den gleichen Kopf haben wie das entsprechende Event. In unserem Fall muss die Prozedur also ein Sender: TObject, ein Button: TMouseButton, ein Shift: TShiftState und zwei Integers X und Y in der Parameterliste haben. Die Namen sind hierbei glaube ich egal, was die Reihenfolge betrifft bin ich mir nicht sicher.)
Edit: Ja, FindComponent ist auch eine Lösung, das wäre der Ansatz, wenn du die Änderung nicht im onMouseDown durchführst. Das sähe dann entweder so aus: TShape(FindComponent('Shape1')) oder wie bei mir (FindComponent('Shape1') as TShape)
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.