Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Variablen in Objektnamen verwenden? (https://www.delphipraxis.net/159272-variablen-objektnamen-verwenden.html)

Sluak 21. Mär 2011 11:32

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

mkinzler 21. Mär 2011 11:34

AW: Variablen in Objektnamen verwenden?
 
Schau dir mal FindComponent() an

pustekuchen 21. Mär 2011 11:41

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(....);

Sluak 21. Mär 2011 11:51

AW: Variablen in Objektnamen verwenden?
 
Delphi-Quellcode:
For i:=1 to 30 do
begin
(FindComponent('Image'+IntToStr(i)) as TPicture).LoadFromFile('bilder\deckblatt.bmp');
end;
Leider kommt dabei bei mir folgende Fehlermeldung: [Fehler] Memory.pas(149): Undefinierter Bezeichner: 'LoadFromFile'

Neutral General 21. Mär 2011 11:52

AW: Variablen in Objektnamen verwenden?
 
Hallo,

Es muss so aussehen:

Delphi-Quellcode:
for i:=1 to 30 do
begin
  (FindComponent('Image'+IntToStr(i)) as TImage).Picture.LoadFromFile('bilder\deckblatt.bmp');
end;
Gruß
Neutral General

Bummi 21. Mär 2011 11:53

AW: Variablen in Objektnamen verwenden?
 
Delphi-Quellcode:
For i:=1 to 30 do
begin
TImage(FindComponent('Image'+IntToStr(i)).LoadFromFile('bilder\deckblatt.bmp');
end;

Neutral General 21. Mär 2011 11:54

AW: Variablen in Objektnamen verwenden?
 
PS: Die Dinger auf dem Formular heißen "TImage" :wink:

WM_CLOSE 21. Mär 2011 11:54

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von Sluak (Beitrag 1090020)
Delphi-Quellcode:
For i:=1 to 30 do
begin
(FindComponent('Image'+IntToStr(i)) as TPicture).LoadFromFile('bilder\deckblatt.bmp');
end;
Leider kommt dabei bei mir folgende Fehlermeldung: [Fehler] Memory.pas(149): Undefinierter Bezeichner: 'LoadFromFile'

tausch das aus:

Delphi-Quellcode:
For i:=1 to 30 do
begin
(FindComponent('Image'+IntToStr(i)) as TImage).Picture.LoadFromFile('bilder\deckblatt.bmp');
end;

Bummi 21. Mär 2011 11:57

AW: Variablen in Objektnamen verwenden?
 
@Neutral General

uuuppps, danke, habe gepennt

Sluak 21. Mär 2011 12:01

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:
procedure TForm1.Image1Click(Sender: TObject);
begin
BildKlick(1,0,0);
Image1.Picture.LoadFromFile('bilder\'+IntToStr(i)+'.jpg');
Etwas dergleichen habe ich auch 30 mal derzeit in dem Programm stehen.

Sluak 21. Mär 2011 12:28

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:
  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;
Nun treten folgende Fehlermeldungen auf:

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

pustekuchen 21. Mär 2011 12:33

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von Sluak (Beitrag 1090027)
Vielen, vielen Dank.
Es funktioniert (wie auch nicht anders zu erwarten :P)

EDIT: Geht das auch mit Prozeduren?

Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
begin
BildKlick(1,0,0);
Image1.Picture.LoadFromFile('bilder\'+IntToStr(i)+'.jpg');
Etwas dergleichen habe ich auch 30 mal derzeit in dem Programm stehen.


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;

DeddyH 21. Mär 2011 12:35

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.

Sluak 21. Mär 2011 12:46

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von DeddyH (Beitrag 1090038)
Mach daraus einmal eine Methode des Formulars.

Das bedeutet? :?:

Gibt es keine andere Möglichkeit?
In anderen Prozeduren funktioniert das ganze doch auch, warum also nicht hier?

pustekuchen 21. Mär 2011 13:00

AW: Variablen in Objektnamen verwenden?
 
Anstatt
Delphi-Quellcode:
procedure MethodenName()
das hier
Delphi-Quellcode:
procedure Form1.MethodenName()

DeddyH 21. Mär 2011 13:00

AW: Variablen in Objektnamen verwenden?
 
Nicht
Delphi-Quellcode:
procedure TuWas;
sondern
Delphi-Quellcode:
procedure TForm1.TuWas;
Dazu musst Du dann zusätzlich die Prozedur in der Deklaration des Formulars bekannt machen.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  ...
  procedure TuWas;
  ...
  end;

Reinhard Kern 21. Mär 2011 14:06

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von Sluak (Beitrag 1090009)
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.

Hallo,

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

shmia 21. Mär 2011 18:31

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von Sluak (Beitrag 1090009)
...und dann per If then Schleife die Karten wieder zurück ...

Aaaaaah - er hat If then Schleife gesagt 8-)

Welche Datenstruktur verwendest du denn pro Spielkarte?
Wahrscheinlich gar keine; das ist nämlich dein Problem.

Delphi-Quellcode:
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
Um das Spielfeld anzuzeigen, verwendet man auch keine 64 TImage sondern ein DrawGrid mit Grösse 8 * 8.
Wenn du die Datenstrukturen von oben verwendest, dann ist das aus- und zudecken kein Problem mehr.

Sluak 21. Mär 2011 19:13

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 :(

divBy0 22. Mär 2011 06:09

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;

Bummi 22. Mär 2011 06:45

AW: Variablen in Objektnamen verwenden?
 
Delphi-Quellcode:
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
der Bereich
Delphi-Quellcode:
var Karte1,Karte2:Integer;
sorgt für die Schutzverletzungen, nimm die Deklaration mal in den private Bereich mit auf...

Sluak 22. Mär 2011 09:48

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Zitat von Bummi (Beitrag 1090178)
der Bereich
Delphi-Quellcode:
var Karte1,Karte2:Integer;
sorgt für die Schutzverletzungen, nimm die Deklaration mal in den private Bereich mit auf...

Und was genau bewirkt das ganze? :?:

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.

mkinzler 22. Mär 2011 09:52

AW: Variablen in Objektnamen verwenden?
 
Zitat:

Und was genau bewirkt das ganze?
In deinem Fall waren es lokale Variablen der Methode, diese werden am Ende eines Durchlaufs wieder freigegeben.
Zudem wären diese auch nicht instanzunabhängig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz