Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mehrere Objekte in einer Schleife erzeugen (https://www.delphipraxis.net/3899-mehrere-objekte-einer-schleife-erzeugen.html)

Flogo 4. Apr 2003 15:18


Mehrere Objekte in einer Schleife erzeugen
 
Hi Leute ich würde gern sowas hier machen:

Code:
  for i := 1 to LevelZahl do
    Levels[i] := (TLevel + IntToStr(i)).Create;
TLevel1 bis TLevel20 (oder mehr) sind alles Klassen vom Typ TLevel von dem auch das Array ist.

Geht das irgendwie?

sakura 4. Apr 2003 15:39

Mir ist leider keine Möglichkeit bekannt. Das hört sich aber auch nicht unbedingt nach einem durchdachten Konzept an. Sind die Level denn wirklich alle so unterschiedlich, dass jedes eine eigene Klasse benötigt?

...:cat:...

Flogo 4. Apr 2003 15:47

Ich hab leider keine Idee wie ichs sonst machen soll (das mit den Klassen nicht das mit dem erstellen) in den Klassen steht drin was bei einem Klick passiert (ist für ein Point-n-Klick-Adventure) außerdem sind da alle Variablen von dem Level drin.
Im der Klasse steht also sowas wie

Code:
  if HaveRedKey then OpenDoor(2)
also unterscheiden sich die LevelKlassen schon stark.

Das mit dem Erstellen kann ich zur Not auch "von Hand" machen
also

Code:
Levels[1] := TLevel1.Create;
Levels[2] := TLevel2.Create;
Levels[4] := TLevel3.Create;
...
aber für die Levelklassen fällt mir nichts anderes ein

Touchdown 4. Apr 2003 17:04

Warum einfach wenns auch kompliziert geht.

Versuch mal das und hin und wieder F1 :mrgreen:


Delphi-Quellcode:
Liste : TObjectlist; // irgendwo public
Level : TLevel;     // irgendwo lokal wenn möglich
for i := 0 to sovielLevelwieduhast -1 do
begin
  Level := TLevel.create; / so sind natürlich alle vom gleichen Typ
  Liste.add(Level);
end;

Flogo 4. Apr 2003 17:23

Ich kann nicht alle vom gleichen typ machen weil ja in jedem was anderes passiert (andere Variablen + if verschachtelungen)
Aber mal abgesehen davon was für einen Vorteil hat die ObjectList gegenüber einem array of TOjekt??

Christian Seehase 4. Apr 2003 18:50

Moin Flogo,

eine Idee noch:

Benutze immer die gleich Klasse, und übergebe beim Constructor die erforderliche Nummer als Paramter.

So kannst Du dann innerhalb der Kompo anhand des Parameters entscheiden, was passieren soll.

Das würde vor allem dann Sinn machen, wenn die Masse der Methoden bei allen TLevelXX Klassen ansonsten gleich ist.

Touchdown 4. Apr 2003 21:41

Einfach 'TObjectlist' in Delphi eingeben und F1 drücken, dann siehst du die Vorteile (ich könnte auch copy-paste machen :mrgreen: )

Array of TObject = Prozedurale Programmierung mit dem Deckmantel der OOP! (etwas übertrieben aber stimmt im Grunde). Noch schlimmer sind Records und Co!

Flogo 5. Apr 2003 07:58

gut ich hab versucht auf die TObjectList umzusteigen
aber bei meinem array konnte ich sagen
Code:
Levels[5].load
Bei der Liste geht das nicht mehr. brauch ich da ne eigene function, die mir das richtige object und die richtige klasse zurückgibt?

Touchdown 5. Apr 2003 13:42

Also erstmal, die Hilfe kann man über F1 aufrufen, F1 befindet sich neben der Taste 'ESC'. Da du damit offensichtlich Probleme damit hast hier ein Copy-Paste aus meiner Hilfe :mrgreen:

Mit TObjectList können Sie eine Liste von Objekten speichern und verwalten. Die Komponente stellt Eigenschaften und Methoden für das Hinzufügen, Löschen, Umsortieren, Suchen, Zugreifen und Sortieren von Objekten zur Verfügung. Ist die Eigenschaft OwnsObjects auf true gesetzt (Voreinstellung), verwaltet TObjectList den Speicher seiner Objekte, das heißt, ein Objekt wird freigegeben, wenn sein Index neu zugewiesen wird, wenn es mit der Methode Delete, Remove oder Clear aus der Liste entfernt wird oder wenn die Instanz TObjectList selbst aufgelöst wird.

Flogo 5. Apr 2003 17:18

Ok Ok Ich hab die Hilfe schon gefunden (Die F1 Taste auch. war neben der F2 Taste :wink: )
Aber hast du meinen Thread gelesen??

Code:

Levels.Items[2].load; //Levels ist eine TObjectList
//funktioniert nicht

Levels[2].load; //Hier ist Levels ein Array of TLevel
//funktioniert

Touchdown 5. Apr 2003 18:20

Probleme beim Zugriff auf ein Objektes in der Liste?

Könnte so aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  liste : Tobjectlist;
  i : integer;
  AktuellesLVL : TLVL12;
begin
  for i := 0 to liste.Count -1 do
  begin
    AktuellesLVL := liste[i];
    if AktuellesLVL is TLVL12 then
    begin
      //
    end;
  end;
end;
Man könnte auch eine kleine Objektliste-Klasse bauen und eine eigene Get-Methode coden, aber das führt wohl zu weit.

Kuehter 15. Okt 2014 10:22

AW: Mehrere Objekte in einer Schleife erzeugen
 
noch eine weitere frage
Ich habe von TImage 27 Objekte und das
Delphi-Quellcode:
   for counter := 0 to 2 do
   begin
      case saferend[counter] of
          0: Image1.Picture.Assign(Caller[0]);
          1: Image1.Picture.Assign(Caller[1]);
          2: Image1.Picture.Assign(Caller[2]);
          3: Image1.Picture.Assign(Caller[3]);
          4: Image1.Picture.Assign(Caller[4]);
          5: Image1.Picture.Assign(Caller[5]);
          6: Image1.Picture.Assign(Caller[6]);
          7: Image1.Picture.Assign(Caller[7]);
          8: Image1.Picture.Assign(Caller[8]);
          9: Image1.Picture.Assign(Caller[9]);
          else
          end;
so aufzuschreiben 27 mal scheint mir doch sehr unelegant:oops:

gäbe es eine möglichkeit alle 27 objekte per forschleife oder ähnliches aufzurufen?

mkinzler 15. Okt 2014 10:28

AW: Mehrere Objekte in einer Schleife erzeugen
 
Kommen Werte < 0 oder > 9 vor?

Delphi-Quellcode:
for counter := 0 to 2 do
begin
    Image1.Picture.Assign(Caller[saferend[counter]]);

Kuehter 15. Okt 2014 10:29

AW: Mehrere Objekte in einer Schleife erzeugen
 
ne kommen sie nicht
jedoch ist das problem so wie das bei dir steht die werte sind ja größer als 3 und mit geht es nur darum das ich nicht immer Image?.Picture.Assign Schreiben muss sonder das auslagern kann

DeddyH 15. Okt 2014 10:30

AW: Mehrere Objekte in einer Schleife erzeugen
 
Man darf hier übrigens gern auch eigene Threads eröffnen und muss keine 11 Jahre alten kapern.

Kuehter 15. Okt 2014 10:33

AW: Mehrere Objekte in einer Schleife erzeugen
 
ich sag dir ganz erhlich ich habe mich nicht damit auseinander gesetzt wie man hier threads eröffnet :D

mkinzler 15. Okt 2014 10:48

AW: Mehrere Objekte in einer Schleife erzeugen
 
Zitat:

Zitat von Kuehter (Beitrag 1275979)
ich sag dir ganz erhlich ich habe mich nicht damit auseinander gesetzt wie man hier threads eröffnet :D

Solltest Du aber.

himitsu 15. Okt 2014 12:18

AW: Mehrere Objekte in einer Schleife erzeugen
 
Zitat:

Zitat von mkinzler (Beitrag 1275975)
Kommen Werte < 0 oder > 9 vor?

Du meinst wohl 26. :zwinker:
Zitat:

Zitat von Kuehter (Beitrag 1275974)
Ich habe von TImage 27 Objekte und das

Kann man aber über ein IF gut abfangen.
Delphi-Quellcode:
for counter := 0 to 2 do
  if Caller[saferend[counter]] in [0..26] then // oder so ähnlich
    Image1.Picture.Assign(Caller[saferend[counter]])
  //else
    ;



PS: Falls jemand demnächst mit 100 Objekten ankommt, findet er hier gleich die neue/erweiterte Antwort.

Blup 15. Okt 2014 15:44

AW: Mehrere Objekte in einer Schleife erzeugen
 
Ich vermute hier soll eher das Image selbst variabel sein:
Delphi-Quellcode:
function TMyForm2.GetImage(AIndex: Integer): TImage;
begin
  Result := FindComponent('Image' + IntToStr(AIndex)) as TImage;
  Assert(Assigned(Result), 'Image' + IntToStr(AIndex) + ' nicht gefunden');
end;

Dejan Vu 15. Okt 2014 16:30

AW: Mehrere Objekte in einer Schleife erzeugen
 
Bei 'FindComponent' hast Du das Problem, das beim Umbenennen einer Komponente diese nicht mehr gefunden wird, daher: Finger weg und ab mit den Images in eine Liste bzw ein Array Of TImage.

Kuehter 16. Okt 2014 06:39

AW: Mehrere Objekte in einer Schleife erzeugen
 
ja das image bleibt variable die grund idee ist ja ein symbol rätsel sprich ich brauche jedes mal wenn auf den button gedrückt wird ein neues bild das der neuen zahl zugewiesen wird daher habe ich auch 10 Symbole und 27 image flächen denn die zahlen von 0-9 sind mit den symbolen gemeint.
jetzt ist nur die frage wie man das dynamisch genug hin bekommt.
Deswegen auch die 27 Images wie du meintest habe ich die 10 Bilder bereits in ein Array geladen.

die Zahl die ich habe wird auch als 3 stellige gelesen und wird nachher gesplittet in jede einzelne stelle also 123 = 1 | 2 | 3 und ist das problem Die Variable Counter zählt nur die 3 Stellen hoch die die zahl hat.
Jeddoch brauche ich für die 0-9 die zehn stellen

am besten wäre das

for counter := 0 to 2 do
begin
case saferend[counter] of
0: Image + inttoStr(i).Picture.Assign(Caller[0]);
1: Image + inttoStr(i).Picture.Assign(Caller[1]);
2: Image + inttoStr(i).Picture.Assign(Caller[2]);
3: Image + inttoStr(i).Picture.Assign(Caller[3]);
4: Image + inttoStr(i).Picture.Assign(Caller[4]);
5: Image + inttoStr(i).Picture.Assign(Caller[5]);
6: Image + inttoStr(i).Picture.Assign(Caller[6]);
7: Image + inttoStr(i).Picture.Assign(Caller[7]);
8: Image + inttoStr(i).Picture.Assign(Caller[8]);
9: Image + inttoStr(i).Picture.Assign(Caller[9]);
else
end;

bcvs 16. Okt 2014 06:59

AW: Mehrere Objekte in einer Schleife erzeugen
 
Zitat:

Zitat von Kuehter (Beitrag 1276110)
die grund idee ist ja ein symbol rätsel

OT:
In der deutschen Sprache sind zusammengesetzte Substantive ein Wort (ohne Leerzeichen dazwischen).:warn: Außerdem gehst du sehr sparsam mit Groß-/ Kleinschreibung und Satzzeichen um, mit dem Effekt, dass dein Text sehr schwer zu lesen ist.

Wahrscheinlich WhatsApp-Generation, da braucht man so etwas nicht mehr...:roll:

Kuehter 16. Okt 2014 07:19

AW: Mehrere Objekte in einer Schleife erzeugen
 
ja mit Whatsapp aber auch die Programmierung in Java und C# macht das aus :-D ,denn da am besten das erste immer klein schreiben, sonst erkennt der Kompiler das nicht.
Also Arbeit + neue Rechtschreibhilfe bei Word = Grammatikfall XD


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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