AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Allgemeine Abfrage von Klassen
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemeine Abfrage von Klassen

Ein Thema von Matze33 · begonnen am 10. Dez 2010 · letzter Beitrag vom 11. Dez 2010
Antwort Antwort
Seite 1 von 2  1 2      
Matze33

Registriert seit: 25. Aug 2010
38 Beiträge
 
Delphi 6 Personal
 
#1

Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 18:02
Sorry für den Titel, hatte keine bessere Idee

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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 18:28
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 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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)

Geändert von s.h.a.r.k (10. Dez 2010 um 18:51 Uhr)
  Mit Zitat antworten Zitat
Matze33

Registriert seit: 25. Aug 2010
38 Beiträge
 
Delphi 6 Personal
 
#3

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 18:53
Wie erstelle ich denn eine PanelList?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#4

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 18:57
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Matze33

Registriert seit: 25. Aug 2010
38 Beiträge
 
Delphi 6 Personal
 
#5

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 19:29
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?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#6

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 19:43
Dir fehlt die Unit, in der TObjectList deklariert ist. Bei uses oben muss noch Contnrs dazu.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Matze33

Registriert seit: 25. Aug 2010
38 Beiträge
 
Delphi 6 Personal
 
#7

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 19:58
Ah OK, danke. Eine Frage noch: Was macht nil? Ist das so was wie decrease?
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#8

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 20:21
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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Matze33

Registriert seit: 25. Aug 2010
38 Beiträge
 
Delphi 6 Personal
 
#9

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 21:04
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.)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

AW: Allgemeine Abfrage von Klassen

  Alt 10. Dez 2010, 21:15
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 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