Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Allgemeine Abfrage von Klassen (https://www.delphipraxis.net/156681-allgemeine-abfrage-von-klassen.html)

Matze33 10. Dez 2010 18:02

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?

s.h.a.r.k 10. Dez 2010 18:28

AW: Allgemeine Abfrage von Klassen
 
Hau die Panels eben in eine Liste und iterier über diese Liste?

Delphi-Quellcode:
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;
-- EDIT: Kannst natürlich auch eine Methode
Delphi-Quellcode:
HitTest(ObjectA: TWinControl; ObjectB: TWinControl)
schreiben, die prüft ob sich zwei Objekte überlagern.

-- 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.

Matze33 10. Dez 2010 18:53

AW: Allgemeine Abfrage von Klassen
 
Wie erstelle ich denn eine PanelList?

s.h.a.r.k 10. Dez 2010 18:57

AW: Allgemeine Abfrage von Klassen
 
Das ist nur ein Variablenname ;) Der kann auch xyz heißen. Der Typ ist das wichtige dabei: TObjectList. Das ist eine Liste mit all den Objekten, die du eben da rein wirfst. Somit kannst du drüber iterieren.

Matze33 10. Dez 2010 19:29

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?

s.h.a.r.k 10. Dez 2010 19:43

AW: Allgemeine Abfrage von Klassen
 
Dir fehlt die Unit, in der TObjectList deklariert ist. Bei uses oben muss noch Contnrs dazu.

Matze33 10. Dez 2010 19:58

AW: Allgemeine Abfrage von Klassen
 
Ah OK, danke. Eine Frage noch: Was macht nil? Ist das so was wie decrease?

s.h.a.r.k 10. Dez 2010 20:21

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:
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;
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.

Matze33 10. Dez 2010 21:04

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

s.h.a.r.k 10. Dez 2010 21:15

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:
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;
Aber das reicht dir doch nun endlich, oder? ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
Seite 1 von 2  1 2      

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