Autor Beitrag
Moons
Hält's aus hier
Beiträge: 2

WIN XP

BeitragVerfasst: Fr 28.11.08 14:15 
Hallo,
ich muss für die Schule ein Mensch-ärger-dich-nicht-Programm erstellen. Aus vielen weißen Shapes habe ich mir jetzt mein Spielfeld gebastelt. Jetzt war die Idee, dass ich die Shapes durch

shape17.Brush.Color:=222;
shape17.Repaint;

umfärbe, je nachdem, welcher Spieler gerade dran ist (in diesem Fall rot).
Muss ich für jede Shape eine eigene Prozedur schreiben? Die werden nämlich sehr lang, da ich ja bei jeder 6 Varianten brauch (schließlich kann man Zahlen von eins bis sechs würfeln).
Oder geht das irgendwie einfacher?
Liebe Grüße
Moons


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 28.11.2008 um 13:30
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 28.11.08 14:53 
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:

ausblenden 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)

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.


Zuletzt bearbeitet von JayEff am Fr 28.11.08 15:01, insgesamt 2-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 28.11.08 14:55 
Hallo und :welcome:!

Ja, du kannst bestimmte Shapes mit FindComponent über ihren Namen finden zum Beispiel.
So kannst du dann, wenn die durchnummeriert sind, einfach nach dem Shape mit einer bestimmten Nummer suchen, und diese Nummer musst du ja nur um den geworfenen Wert erhöhen.
Moons Threadstarter
Hält's aus hier
Beiträge: 2

WIN XP

BeitragVerfasst: Fr 28.11.08 23:18 
Hallo,
vielen Dank bis hierhin erst einmal. Auch für die Willkommensgrüße :D
Ich denke, ich habe verstanden, was ihr meint. Ich werde es bei der nächsten Gelegenheit (Mittwoch) ausprobieren und dann Bescheid geben, wenn ich noch mal Hilfe benötigen sollte - was bestimmt der Fall sein wird ;)
Liebe Grüße
Moons

EDIT: Und danke für's Verschieben. Ich war mir nicht ganz sicher, wo es hingehört.