![]() |
Mehrere Objekte in einer Schleife erzeugen
Hi Leute ich würde gern sowas hier machen:
Code:
TLevel1 bis TLevel20 (oder mehr) sind alles Klassen vom Typ TLevel von dem auch das Array ist.
for i := 1 to LevelZahl do
Levels[i] := (TLevel + IntToStr(i)).Create; Geht das irgendwie? |
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:... |
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:
also unterscheiden sich die LevelKlassen schon stark.
if HaveRedKey then OpenDoor(2)
Das mit dem Erstellen kann ich zur Not auch "von Hand" machen also
Code:
aber für die Levelklassen fällt mir nichts anderes ein
Levels[1] := TLevel1.Create;
Levels[2] := TLevel2.Create; Levels[4] := TLevel3.Create; ... |
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; |
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?? |
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. |
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! |
gut ich hab versucht auf die TObjectList umzusteigen
aber bei meinem array konnte ich sagen
Code:
Bei der Liste geht das nicht mehr. brauch ich da ne eigene function, die mir das richtige object und die richtige klasse zurückgibt?
Levels[5].load
|
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. |
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 |
Probleme beim Zugriff auf ein Objektes in der Liste?
Könnte so aussehen:
Delphi-Quellcode:
Man könnte auch eine kleine Objektliste-Klasse bauen und eine eigene Get-Methode coden, aber das führt wohl zu weit.
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; |
AW: Mehrere Objekte in einer Schleife erzeugen
noch eine weitere frage
Ich habe von TImage 27 Objekte und das
Delphi-Quellcode:
so aufzuschreiben 27 mal scheint mir doch sehr unelegant:oops:
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; gäbe es eine möglichkeit alle 27 objekte per forschleife oder ähnliches aufzurufen? |
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]]); |
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 |
AW: Mehrere Objekte in einer Schleife erzeugen
Man darf hier übrigens gern auch eigene Threads eröffnen und muss keine 11 Jahre alten kapern.
|
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
|
AW: Mehrere Objekte in einer Schleife erzeugen
Zitat:
|
AW: Mehrere Objekte in einer Schleife erzeugen
Zitat:
Zitat:
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. |
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; |
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.
|
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; |
AW: Mehrere Objekte in einer Schleife erzeugen
Zitat:
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: |
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