![]() |
Variablen in Objektnamen verwenden?
Hallo
Es geht um folgendes Problem: Ich schreibe gerade ein Memory Spiel mit Delphi. Dabei gibt es 30 Bilder der einzelnen Karten. Nun möchte ich(wenn zwei Karten gezogen wurden, die nicht übereinstimmen) die Karten wieder umdrehen. Derzeit wäre mein einziger Lösungsansatz dafür, dem Array (was die Koordinaten der Karten in der Form darstellt) einen Wert zB 0 zuzuweisen und dann per If then Schleife die Karten wieder zurück zum Deckblatt zu führen. Das Problem an der ganzen Sache ist, dass so bei 30 Bildern mindestens 100 Zeilen entstehen, die weder übersichtlich, noch praktisch sind. Gibt es eine Möglichkeit, zB um eine Variable x:Integer in den Objektnamen einzubringen? Beispiel: Statt bisher Image1.Picture.LoafFromFile(...); möchte ich nun also ImageX.Picture.LoadFromFile(...); Bei google fand ich bisher leider absolut nichts. :( Könnt ihr mir vielleicht helfen? mit freundlich(st)en Grüßen Sluak :P |
AW: Variablen in Objektnamen verwenden?
Schau dir mal FindComponent() an
|
AW: Variablen in Objektnamen verwenden?
Danke. Genau das hab ich mich vor 10 min auch gefragt^^
So könnte es aussehen:
Delphi-Quellcode:
(FindComponent('Image' +IntToStr(choice+1)) as TPicture).LoadFromFile(....);
|
AW: Variablen in Objektnamen verwenden?
Delphi-Quellcode:
Leider kommt dabei bei mir folgende Fehlermeldung: [Fehler] Memory.pas(149): Undefinierter Bezeichner: 'LoadFromFile'
For i:=1 to 30 do
begin (FindComponent('Image'+IntToStr(i)) as TPicture).LoadFromFile('bilder\deckblatt.bmp'); end; |
AW: Variablen in Objektnamen verwenden?
Hallo,
Es muss so aussehen:
Delphi-Quellcode:
Gruß
for i:=1 to 30 do
begin (FindComponent('Image'+IntToStr(i)) as TImage).Picture.LoadFromFile('bilder\deckblatt.bmp'); end; Neutral General |
AW: Variablen in Objektnamen verwenden?
Delphi-Quellcode:
For i:=1 to 30 do
begin TImage(FindComponent('Image'+IntToStr(i)).LoadFromFile('bilder\deckblatt.bmp'); end; |
AW: Variablen in Objektnamen verwenden?
PS: Die Dinger auf dem Formular heißen "TImage" :wink:
|
AW: Variablen in Objektnamen verwenden?
Zitat:
Delphi-Quellcode:
For i:=1 to 30 do
begin (FindComponent('Image'+IntToStr(i)) as TImage).Picture.LoadFromFile('bilder\deckblatt.bmp'); end; |
AW: Variablen in Objektnamen verwenden?
@Neutral General
uuuppps, danke, habe gepennt |
AW: Variablen in Objektnamen verwenden?
Vielen, vielen Dank.
Es funktioniert (wie auch nicht anders zu erwarten :P) EDIT: Geht das auch mit Prozeduren?
Delphi-Quellcode:
Etwas dergleichen habe ich auch 30 mal derzeit in dem Programm stehen.
procedure TForm1.Image1Click(Sender: TObject);
begin BildKlick(1,0,0); Image1.Picture.LoadFromFile('bilder\'+IntToStr(i)+'.jpg'); |
AW: Variablen in Objektnamen verwenden?
Ein anderes Problem bestünde da allerdings noch, deswegen auf Doppelpost (sorry, aber ich glaube, dass ansonsten alle noch davon ausgehen würden, dass das Thema beendet wäre).
Ich habe eine Prozedur erstellt, die eben zB die Karten miteinander vergleicht, Punkte addiert, etc. Jetzt wollte ich eure Tipps anwenden, um die nicht zueinander gehörenden Karten nach 2 Zügen wieder umzudrehen, bzw. gefundene Pärchen zu verstecken. Das ganze sieht dann in etwa so aus (beim zweiten Zug, wenn die Karten verglichen werden):
Delphi-Quellcode:
Nun treten folgende Fehlermeldungen auf:
If Karten[x1,y2]=Karten[x2,y2] then begin
(FindComponent('Image'+IntToStr(Karte1)) as TImage).Picture.Hide; (FindComponent('Image'+IntToStr(Karte2)) as TImage).Picture.Hide; If Spieler=1 then begin PunktzahlS1:=PunktzahlS1+1; TForm1.Label4.Caption:=IntToStr(PunktzahlS1); end else PunktzahlS2:=PunktzahlS2+1; TForm1.Label5.Caption:=IntToStr(PunktzahlS2); end; [Fehler] Memory.pas(181): Undefinierter Bezeichner: 'FindComponent' [Fehler] Memory.pas(182): Operator ist auf diesen Operandentyp nicht anwendbar (Zeile 181 ist in diesem Ausschnitt die zweite Zeile) |
AW: Variablen in Objektnamen verwenden?
Zitat:
Du solltest evnt die Methode umschreiben. Ich weiß nicht ob es jetzt eine saubere Lösung ist oder ob es noch besser geht, aber du könntest den Sender im Bezug auf die Tag Eigenschaft benutzten.
Delphi-Quellcode:
case (Sender as TButton).Tag of
0: choice := 0; 1: choice := 1; 2: choice := 2; 3: choice := 3; end; |
AW: Variablen in Objektnamen verwenden?
Vermutlich hast Du den Code in einer regulären Prozedur oder Funktion stehen. Mach daraus einmal eine Methode des Formulars.
|
AW: Variablen in Objektnamen verwenden?
Zitat:
Gibt es keine andere Möglichkeit? In anderen Prozeduren funktioniert das ganze doch auch, warum also nicht hier? |
AW: Variablen in Objektnamen verwenden?
Anstatt
Delphi-Quellcode:
das hier
procedure MethodenName()
Delphi-Quellcode:
procedure Form1.MethodenName()
|
AW: Variablen in Objektnamen verwenden?
Nicht
Delphi-Quellcode:
sondern
procedure TuWas;
Delphi-Quellcode:
Dazu musst Du dann zusätzlich die Prozedur in der Deklaration des Formulars bekannt machen.
procedure TForm1.TuWas;
Delphi-Quellcode:
type
TForm1 = class(TForm) ... procedure TuWas; ... end; |
AW: Variablen in Objektnamen verwenden?
Zitat:
ich verstehe nicht, wo das Problem liegt: du merkst dir die beiden letzten aufgedeckten Karten - stimmen sie nicht überein, verdeckst du sie wieder. Das gibt doch keine 100 Programmzeilen? Für das Zurückdrehen von 2 bekannten Karten? Gruss Reinhard |
AW: Variablen in Objektnamen verwenden?
Zitat:
Welche Datenstruktur verwendest du denn pro Spielkarte? Wahrscheinlich gar keine; das ist nämlich dein Problem.
Delphi-Quellcode:
Um das Spielfeld anzuzeigen, verwendet man auch keine 64 TImage sondern ein DrawGrid mit Grösse 8 * 8.
type
{ 0=verdeckt (blauer Hintergrund) 1=verdeckt und als 1. Karte markiert (roter Hintergrund) 2=temporär aufgedeckt 3=aufgedeckt } TCardStatus = 0..3; TMemoryCard = record Status : TCardStatus; BildNr : integer; // Zwei Karten mit der gleichen Bildnr sind übereinstimmend Bitmap : TBitmap; // Zeiger auf Bild, optional da eigentlich auch schon über die Bildnr bestimmt end; TCards = array[1..8, 1..8] of TMemoryCard; TBilder = array[1..32] of TBitmap; // 32 Bilder Wenn du die Datenstrukturen von oben verwendest, dann ist das aus- und zudecken kein Problem mehr. |
AW: Variablen in Objektnamen verwenden?
Liste der Anhänge anzeigen (Anzahl: 1)
War "If then Schleife" falsch? :P
Naja, das mit den 100 Zeilen meine ich so, dass ich in meiner aktuellen Prozedur leider nichts mit den TImages machen kann. Soll heißen, dass ich die Überprüfung, ob richtig oder nicht, auf jede einzelne Prozedur machen muss, wenn ich auf ein Bild klicke. Für besseres Verständnis hänge ich das aktuelle Programm einmal an. Leider zeigt er mir derzeit eine Fehlermeldung :evil: EDIT: Fehlermeldungen behoben. Stürzt aber leider derzeit noch ab :( EDIT2: Also den Fehler, waru das Programm abstürzt, habe ich jetzt herausgefunden. Wie im Programm im Anhang zu sehen ist, speichert er leider innerhalb der Prozedur die Variablen nicht, nachdem die Prozedur geschlossen wurde. :( zB Beim ersten Zug fügt er die Koordinaten x1 und y1 hinzu. Beim zweiten Zug (somit zweiter Aufruf der Prozedur), fügt er x2 und y2 hinzu, kennt aber dann x1 und y1 nicht mehr. Brauche dringend Hilfe :( |
AW: Variablen in Objektnamen verwenden?
Ich hab dein Programm mal getestet. Wo und wann genau stürzt denn bei dir was ab?
Kann ich nicht feststellen, vielleicht mache ich auch was falsch. Ich hab in der Prozedur BildKlick die auskommentierte Stelle wieder reingenommen, da stürzt aber auch nichts ab. Von globalen Variablen solltest du Abstand nehmen. Ich habe das mal geändert:
Delphi-Quellcode:
TForm1 = class(TForm)
... public { Public-Deklarationen } // Array 6 x 5 für Kartenzuweisung Karten: array[0..5] of array[0..4] of Integer; x1,x2,y1,y2,Spieler,Zug,PunktzahlS1,PunktzahlS2,Karte_gezogen:integer; // Zug 1 = noch keine Karte gezogen // Punktezahl SX = Punktzahl Spieler X // Karte_gezogen = wurde gezogen (Variable für Übergabe an Pozedur) end; var Form1: TForm1; |
AW: Variablen in Objektnamen verwenden?
Delphi-Quellcode:
der Bereich
procedure TForm1.BildKlick(Nummer,x,y : integer); // Übergabewerte
// Koordinaten der Karte (x,y) // Nummer der Karte (1-30) var Karte1,Karte2:Integer; // erste gezogene Karte = Karten[x1,y1] // Karte1 = Position der Karte in Form1 begin
Delphi-Quellcode:
sorgt für die Schutzverletzungen, nimm die Deklaration mal in den private Bereich mit auf...
var Karte1,Karte2:Integer;
|
AW: Variablen in Objektnamen verwenden?
Zitat:
Also bei mir ist es so gewesen, dass das Programm abstürzte, wenn ein Paar gefunden wurde. Allerdings passierte das nur manchmal und nicht immer. Habe es inzwischen gelöst und das Programm ist fertig. Dazu habe ich ein Array genommen, in dem steht, welche Karten noch nicht gefunden wurden. Dann eben per Schleife das Deckblatt bei einem Spielerwechsel hinzufügen und bei den schon gezogenen mit .hide einfach das Bild vestecken ;) Danke euch allen, eure Tipps haben meine Arbeit wirklich extrem erleichtert. |
AW: Variablen in Objektnamen verwenden?
Zitat:
Zudem wären diese auch nicht instanzunabhängig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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