![]() |
dynamisch erzeugte Komponenten numbenennen?
Guten morgen Alle!
Ich möchte mehrere Komponenten, die ich zuvor dynamisch per Zufall erzeugt habe, in einem Rutsch umbenennen. Das heißt ich kenne den genauen Name nicht. Wie kann man es machen, dass man nicht jede einzeln umbenennen möchte? Mit einer Schleife. Aber wie? Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
was hindert dich daran beim dynamichen erzeugen einen Namen zu vergeben? Und wozu brauchst du den Namen? Das sinnvollste ist es doch einfach die dynamich erzeugten Komponenten in einem Array oder einer Liste zu speichern womit du sie dann jederzeit wieder ansprechen kannst.
|
Re: dynamisch erzeugte Komponenten numbenennen?
Hi,
ein par mehr Infos sollten schon da sein, aber ich versuche mal spontan eine Antwort zu geben. Alle dynamisch erzeugten Objecte merken (Liste etc.) und dann in einer Schleife umbenennen. Befinden sich alle Objecte in einem Parent kann man sich die Liste spaaren und nutzt FindComponent. Hier läuft gerade ein Thread zu diesem Thema (Performante Lösung gesucht (Labels füllen)! von: Grolle) gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Bin gerade dabei ein Spiel zu machen. Ich habe eine Form auf der ich 120 TImage erzeuge (Bild1…Bild120). Diese kann man abschießen. Das klappt auch. Wenn die Zeit abgelaufen ist und nicht alle abgeschossen wurden, müssen die restlichen gelöscht werden. Es wurden aber nicht alle nach der Reihe, sondern durcheinander abgeschossen. Nehmen wir mal an, Bild1, Bild20, Bild118 und Bild55 sind noch da. Wie bekomme ich diese Namen heraus und kann sie dann, wenn möglich, mit einer Schleife löschen. Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Delphi-Quellcode:
das Bsp. ist sogar fast aus der OH abgekupfert. Suche dort einfach unter ComponentCount. Achte hier nur darauf, dass in diesem Bsp. im Form1 gesucht wird. Wenn sich deine Images auf einer anderen komponente befinden (Owner), dann mußt du natürlich dort suchen.
procedure TForm1.DeleteImages;
var temp : TComponent; I : Integer; begin for I := ComponentCount - 1 downto 0 do begin Temp := Components[I]; if (Temp is TImage) then begin RemoveComponent(Temp); end; end; end; gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
Statt RemoveComponent(Temp) bitte Temp.Free verwenden, sonst wird der Speicher nicht freigegeben.
Grüße vom marabu |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
Hallo oki,
unabhängig von den Tips weiter oben (die sind ja richtig ;) ) Warum führst du keine List der Bilder, für das abschliessen brauchst du das doch eh, oder ? Stichwort Score. Heiko |
Re: dynamisch erzeugte Komponenten numbenennen?
Guten morgen smart!
Allerdings werden dann auch wirklich alle TImage's gelöscht! Wenn du das nicht willst könntst du deinen Bildern einen Namen geben DingensXXX und dann gugn, ob das TImage mit Dingens beginnt ... :gruebel: |
Re: dynamisch erzeugte Komponenten numbenennen?
Oder einfach alle Bilder auf eine Spielfläche (TPanel) und dann das Controls-Array statt des Components-Array benutzen.
|
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Nein, da kann ich einfach die Treffer zählen! Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Das ist eine gute Idee. Das klappt auch prima. Vielen Dank. Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Ich habe das jetzt so gelöst, dass ich erst alle lösche und dann, die ich noch brauche, einfach neu erzeuge. Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
@Heike: Ein Post hätte auch gereicht ;)
...:cat:... |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Wie soll man denn sonnst seinen Beitrags-Zähler hoch bekommen? :P /Duck |
Re: dynamisch erzeugte Komponenten numbenennen?
Du wirfst deine Bildchens beim Erzeugen einfach in eine Liste und kannst die dann einfach abarbeiten. Über den namen auf ein Control/Komponente zu gehen ist ziemlich ... nunja .. krass. ;-)
Falls du auf der Spielfläche tatsächlich nur deine Bilder hast kannst du die Controls rückwärts durchgehen und sie einem nach dem anderen freigeben (sollten dann autom. aus ihrem dem Parent verschwinden). |
Re: dynamisch erzeugte Komponenten numbenennen?
Hi smart,
du kannst immer noch die Eigenschaft Tag dafür nutzen, welche Images gelöscht werden sollen und welche nicht. da du deine images aber zur Laufzeit erzeugst, kannst du dir auch eine eigene Klasse schreiben. Dort kannst du dann ganz einfach deine Eigenschaften einfügen und diese für die abfrage verwenden.
Delphi-Quellcode:
Alle Images, die nicht gelöscht werden dürfen, kannst du so markieren:
type
TShootingImage = class(TImage) public property Deletable : Boolean read FDeletable write FDeletable; end;
Delphi-Quellcode:
und beim löschen folgendes:
MyshootingImage.Deletable := False;
Delphi-Quellcode:
Benötigst du weitere Eigenschaften (darf abgeschossen werden; beim erasten mal, zweiten mal ...) so implementiere sie einfach.
procedure TForm1.DeleteImages;
var temp : TComponent; I : Integer; begin for I := ComponentCount - 1 downto 0 do begin Temp := Components[I]; if (Temp is TShootingImage) then begin IF (Temp as TShootingImage).Deletable then Temp.Free; end; end; end; gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
eine sehr saubere Lösung. Ich muss zugeben, dass ich noch nicht viel mit eigenen Klassen programmiert habe. Ich teste mal Dein Vorschlag. Sieht ja einfach aus. ;-) Gruß Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Hi smart,
Zitat:
also, probier es aus. es lohnt sich. Versuche mal alles was deine Images können müssen in deine Klasse zu schreiben. Also nicht so wie: - Hauptprogramm holt Image; prüft; macht und tut, sondern - Hauptprogramm findet Image und Ruft Methode deines Image auf (wie Image.MacheDies oder Image.MacheDas) Wenn du nicht so richtig weist wie du das machen sollst, dann beschreibe hier die Situation und wir helfen dir mit dem Ansatz. gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
ich versteh immer noch nicht warum man die bilder nicht einfach in eine liste packt beim erzeugen und beim abschießen eines bildes dieses aus der liste entfernt. dann braucht man nur noch diese Liste durchgehen am ende und die restlichen frei geben.
Die Benutzung von FindComponent find ich bissl *krass* Der Name sagt ja schon "Find". Wenn ich ein Auto habe und es irgendwo parke merke ich mir doch auch wo ich es abgestellt hab und spaare mir somit später die halbe Stadt danach abzusuchen.
Delphi-Quellcode:
ImgListe : TList;
[...] //Erzeugen der Images MyImage = TImage.Create(nil); MyImage.Parent := .... .... ImgListe.Add(MyImage); [...] //Abschießen des Images Sender.Free; ImgListe.Remove(Sender); [...] //Freigeben der restlichen Images for i := ImgListe.Count - 1 downto 0 do TObject(ImgListe.Items[i]).Free; |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
Naja, FindComponent hat ja noch keiner benutzt, aber welchen Weg man geht (Liste <-> Kompo-suche) ist sicher vom Rest des Projektes abhängig. Viel interessantrer ist jedoch, dass smart geschmack an OOP bekommt und hier wohl an einer eigenen aufgabenstellung die vorteile begreift. Laß uns mal das zarte Pflänzchen hegen. die Listen bringen wir ihm/ihr dann auch noch bei. (mit den Components ist es doch so schön OOP :spin: ) gruß oki |
Re: dynamisch erzeugte Komponenten numbenennen?
Zitat:
|
Re: dynamisch erzeugte Komponenten numbenennen?
@ SirThornberry
@ oki Ich habe jetzt mal beides getestet. Mit einer Liste und mit eigenen Klassen. Von der Geschwindigkeit her, ist ohne Messung, kein merklicher Unterschied. Beides klappt ausgezeichnet. Mit eigenen Klassen kann man natürlich eine Menge toller Dinge anstellen. Ich war verwundert was man damit so alles machen kann, so dass ich mich gefragt habe, warum ich mich nicht schon ehr damit beschäftigt habe. Ich habe jetzt zwei Programmversionen erstellt. Welche Version ich jetzt letztlich einbaue kann ich erst sagen wenn das Spiel fertig ist. Vielen Dank an Euch. Heike |
Re: dynamisch erzeugte Komponenten numbenennen?
Hi smart,
freut mich dass es funzt und das dir OOP gefällt. an sonsten gilt: "Viele Wege führen nach Rom!" und jeder mag erst mal seine Methode am meisten :zwinker: gruß oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz