![]() |
Allgemeine Abfrage von Klassen
Sorry für den Titel, hatte keine bessere Idee :D
Also ich habe ein Bild als Spielfigur, das ich steuern kann in alle Richtungen. Da ich mit Schwerkraft spielen möchte, brauche ich eine Abfrage, ob die Figur auf einem Hindernis (dafür nehme ich Panels) steht oder nicht. Einzeln kann man das ja leicht ermitteln (if Image1.Top+Image1.Height=Panelx.Top Then ...), aber kann ich auch das irgendwie allgemein machen, sodass ich also nicht für jedes Panel das schreiben muss? |
AW: Allgemeine Abfrage von Klassen
Hau die Panels eben in eine Liste und iterier über diese Liste?
Delphi-Quellcode:
-- EDIT: Kannst natürlich auch eine Methode
var
PanelList : TObjectList; i : Integer; pn : TPanel; begin PanelList.Add(TPanel.Create(nil)); PanelList.Add(TPanel.Create(nil)); PanelList.Add(TPanel.Create(nil)); for i := 0 to PanelList.Count - 1 do begin pn := TPanel(PanelList[i]); // und hier dann eben der Vergleich oder whatever. end; end;
Delphi-Quellcode:
schreiben, die prüft ob sich zwei Objekte überlagern.
HitTest(ObjectA: TWinControl; ObjectB: TWinControl)
-- EDIT2: Du solltest dir mal den Unterschied zwischen einer Instanz der Klasse und der Klasse selbst aneignen, fällt mir gerade auf ;) Eine Klasse ist nur die Definition, was für Eigenschaften und Methoden eine Instanz später mal hat. z.B. gibt es TMensch als Klasse mit den Eigenschaft Name, Adresse, Geburtstag etc. Armin und Matze wären Instanzen dieser Klasse. Teilweise verwendet man auch Objekt als Synonym zu Klasse. Nun solltest den Titel deines Threads besser wählen können. |
AW: Allgemeine Abfrage von Klassen
Wie erstelle ich denn eine PanelList?
|
AW: Allgemeine Abfrage von Klassen
Das ist nur ein Variablenname ;) Der kann auch xyz heißen. Der Typ ist das wichtige dabei:
![]() |
AW: Allgemeine Abfrage von Klassen
Oh ja Mist, mein Fehler^^
Er zeigt jetzt aber in der Zeile, wo ich PanelList deklariere "Undeclared identifier: 'TObjectList'" als Fehlermeldung an. Hab nichts verändert, woran kann das liegen? |
AW: Allgemeine Abfrage von Klassen
Dir fehlt die Unit, in der TObjectList deklariert ist. Bei uses oben muss noch Contnrs dazu.
|
AW: Allgemeine Abfrage von Klassen
Ah OK, danke. Eine Frage noch: Was macht nil? Ist das so was wie decrease?
|
AW: Allgemeine Abfrage von Klassen
What? Nein. Muss hier doch etwas weiter ausholen ;) Aber eines noch vorweg: Eine Frage, ein Thread. Denn diese Frage hat an sich nichts mehr mit dem vorher gefragten Thema zu tun.
Delphi-Quellcode:
So, nun zu dem Code. Das was ich oben geschrieben habe, weißt du hoffentlich nocht, also was eine Klasse und was eine Instanz der Klasse ist. Nun ist es so, dass wenn du eine Instanz erzeugst (Aufruf des Konstruktors Create), dann wird das Objekt im Speicher (RAM) angelegt. Die Verwaltung im Speicher wird ja via Adressen gehandelt. In der Variable Person wird quasi die Adresse des erzeugten Objekts gespeichert, sodass du Zugriff drauf hast. Aber was ist eigentlich *vor* dem Create-Aufruf? Da zeigt Person auf nil, d.h. auf "nichts" -- in anderen Sprachen heißt das Ding NULL. Bei FreeAndNil wird das Objekt welcher sich hinter der, in der Variable Person gespeicherten Adresse verbirgt, freigegeben, d.h. der Speicher wird frei. Gleichzeitig zeigt nun Person auf nil, d.h. auf einen fest definierten Wert, der angibt, dass Person eben auf keine Instanz zeigt.
type
TMensch = class(TObject) { Eigenschaften und Methoden (public/private) } end; var Person : TMensch; begin Person := TMensch.Create(); try Person.Name := 'Matze'; Person.Alter := 18; Person.FahreNachMuenchen(); finally FreeAndNil(Person); end; end; |
AW: Allgemeine Abfrage von Klassen
Okaaay, ich glaube, ich hab das einigermaßen verstanden.
Wenn wir jetzt zur ursprünglichen Frage zurückgehen. Wenn ich jetzt an den Top-Wert der Panels in PanelList will, was geb ich dann an? (Noch mal danke, für deine Mühe.) |
AW: Allgemeine Abfrage von Klassen
Nun ja, es kommt drauf an, wie du vor gehst. Ich gehe mal davon aus, dass du alle Panels direkt in Delphi auf die Form setzt, oder? Dann kannst du es folgendermaßen machen:
Delphi-Quellcode:
Aber das reicht dir doch nun endlich, oder? ;)
type
TForm1 = class(TForm) { das übeliche Gedöns halt... } private FPanelList : TObjectList; function HitTest(ObjA, ObjB: TControl): Boolean; end; implementation procedure TForm1.Create({...}); begin // Liste für alle Panels erzeugen FPanelList := TObjectList.Create(nil); // Liste füllen FPanelList.Add(Panel1); FPanelList.Add(Panel2); FPanelList.Add(Panel3); { usw... } end; procedure TForm1.Destroy(); begin // Freigeben der Liste nicht vergessen! FreeAndNil(FPanelList); end; // Diese Methode prüft, ob ObjA oder ObjB sich schneiden. Wie das geht musst // dir aber schon überlegen ;) Schwer ists ja nicht. function TForm1.HitTest(ObjA, ObjB: TControl): Boolean; begin Result := ObjA.Left < ObjB.Left { etc pp blub bla... } end; { und irgendwo anders kann du dann eine for-Schleife nutzen und folgendes machen. Nur musst du schon selbst wissen, wo genau, da du ja die Anwendung baust. } var Panel : TPanel; i : Integer; begin for i := 0 to FPanelList.Count - 1 do begin Panel := TPanel(FPanelList[i]); // Nur zum Beispiel: Wenn der Spieler ein Panel erwischt hat, dann wird // die Highscore nach oben gezählt... if HitTest(Player, Panel) then Inc(HighscoreCounter); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:19 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