![]() |
Wie kann ich auf Komponenten zugreifen,deren Index variabel.
Wie kann ich auf Komponenten zugreifen,deren Index variabelel ist ? Das ist meine ganze Frage.
Ich weiss leider nicht, nach was ich suchen sollte im Forum, also seid bitte nicht sauer, falls das hier schon 1000x irgnedwo steht. Zu meinem Problem: - ich habe eine Procedure, die in ein Image rein zeichnet - diese Prozedur bekommt über den Parameter 'imageSender' (integer) den Index der Imagekomponenten, in der ich zeichnen will (es gibt insgesamt 9 TImage) - wie kann ich nun auf diese zugreifen? Beispiel: ich will in Image1 zeichnen ... Aufruf erfolgt über DrawSymbol(1); In der Prozedure DrawSymbol soll quasi Image1.Canvas.MoveTo/LineTo/etc. durchgeführt werden, allerdings nicht immer in Image1! Ich habe es mit: Image+imageSender+.Canvas probiert, aber es ging leider nicht ... :gruebel: |
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
|
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Cool, erstmal schon vielen Dank für den Tipp.
Nun habe ich die Linie: TImage(FindComponent('Feld' + intToStr(imageSender))).Canvas.LineTo(Feld1.Width, Feld1.Height); Diese funktioniert auch soweit gut, allerdings will ich ja auch noch Feld1.Width und Feld1.Height mit dem übergegebenen Index bestimmen. Jedoch würde ich dann das alles nochmals ineinander schachteln müssen, was sehr lang wäre. Ist es möglich, dies abzukürzen? |
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Habs gerade recht eilig, aber kurz:
Delphi-Quellcode:
with TImage(FindComponent('Feld' + intToStr(imageSender))) do Canvas.LineTo(Width, Height);
|
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Zitat:
|
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
So, ich habe jetzt deinen Tipp beachtet und es klappt damit auch soweit.
Code:
Nun ist mein Problem dass clickImage alles weitergibt wie es soll und die Procedure DrawSymbol auch alles dann richtig ausführt.
procedure TForm1.ImageClick(Sender: TObject);
begin if actualPlayer = 2 then Player2Draw else begin if Sender = Feld1 then DrawSymbol(Feld1) else if Sender = Feld2 then DrawSymbol(Feld2) else if Sender = Feld3 then DrawSymbol(Feld3) else if Sender = Feld4 then DrawSymbol(Feld4) else if Sender = Feld5 then DrawSymbol(Feld5) else if Sender = Feld6 then DrawSymbol(Feld6) else if Sender = Feld7 then DrawSymbol(Feld7) else if Sender = Feld8 then DrawSymbol(Feld8) else if Sender = Feld9 then DrawSymbol(Feld9); end; if actualPlayer = 1 then actualPlayer := 2 else if actualPlayer = 2 then actualPlayer := 1; end; procedure TForm1.Player2Draw; var randomfield: integer; begin randomize; repeat randomfield := random(8) + 1; until(fields[randomfield] = 0); DrawSymbol(Feld+randomfield); end; procedure TForm1.DrawSymbol(imageSender: TObject); begin TImage(imageSender).Canvas.Pen.Width := 5; if(fields[TImage(imageSender).Tag] = 0) then begin if actualPlayer = 1 then begin TImage(imageSender).Canvas.Pen.Color := clRed; TImage(imageSender).Canvas.MoveTo(0, 0); TImage(imageSender).Canvas.LineTo(TImage(imageSender).Width, TImage(imageSender).Height); TImage(imageSender).Canvas.MoveTo(TImage(imageSender).Width, 0); TImage(imageSender).Canvas.LineTo(0, TImage(imageSender).Height); end else begin TImage(imageSender).Canvas.Pen.Color := clBlue; TImage(imageSender).Canvas.Ellipse(5, 5, (TImage(imageSender).Width - 5), (TImage(imageSender).Height - 5)); end; fields[TImage(imageSender).Tag] := actualPlayer; end else showmessage('Dieses Feld ist bereits gesetzt'); end; Allerdings will ich nun in der Proce Player2Draw per Zufall bestimmen lassen, in welches Feld er zeichnen soll. Wie kann ich das dann an die DrawSymbol übergeben? mit 'DrawSymbol(Feld+randomfield);' geht es nicht. |
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Zitat:
Delphi-Quellcode:
procedure TForm1.ImageClick(Sender: TObject);
begin if actualPlayer = 2 then begin Player2Draw actualPlayer:=1; end else begin DrawSymbol(Sender) actualPlayer := 2 end; end; Zitat:
2.
Delphi-Quellcode:
[EDIT]Noch schneller :mrgreen: :
DrawSymbol(FindComponent('Feld'+IntToStr(Randomfield)));
Delphi-Quellcode:
oder wäre hier
actualPlayer:=Integer(Odd(actualPlayer))+1;
Delphi-Quellcode:
doch schneller?
:=actualPlayer mod 2 +1
|
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Argh, mit der Imageclick Procedure Funktion hast du natürlich Recht!! Das ist noch aus vorigen Zeiten übernommen, wo ich dies anders zu regeln versuchte, aber ich wette ich hätte da nie mehr dran gedacht, das zu ändern. Danke ...
Das mit FindComponent funzt super! Danke!!!! Den Rest versteh ich nicht ... :rolleyes: |
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Moin!
Ein wenig Erklärungsversuche
Delphi-Quellcode:
procedure TForm1.ImageClick(Sender: TObject);
begin if actualPlayer = 2 then begin Player2Draw; actualPlayer:=1; end else begin DrawSymbol(Sender); // Sender enthält ja das Image was geklickt wurde. Nur die Eigenschaften von TImage hast du nicht, // da Sender hier als TObject definiert ist. Dabei hilft dann ein TypeCast ( Sender As TImage ). actualPlayer := 2; end; end; Zitat:
Und FormCreate (also das OnCreate bei deiner Form) wird nur einmalig aufgerufen und daher ist dies ein guter Platz für solche Dinge (@other: ausser die Form wird selber per Hand öfters erstellt, ich weiss...)
Delphi-Quellcode:
Als Erklärung:
:=actualPlayer mod 2 +1
Dein aktueller Spieler wird der Rest der ganzzahligen Division durch 2 zugewiesen. Das Ergebnis kann dadurch nur 0 oder 1 sein. Ein Rest der ganzzahligen Division durch 2 ist immer 0 bei einer geraden Zahl und 1 bei einer ungeraden Zahl. Damit ist immer ein Wert zwischen 0 und 1 gewährleistet. Da du aber mit 1 und 2 arbeitest, wird einfach auf das Ergebnis eine 1 hinzuaddiert und wir kommen auf Zahlen 1 und 2 - immer im Wechsel - mit jedem Aufruf. MfG Muetze1 |
Re: Wie kann ich auf Komponenten zugreifen,deren Index varia
Ahh, cool. Das muss ich jetzt erst einmal verarbeiten. :)
Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz