Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dynamisch erzeugte Komponenten numbenennen? (https://www.delphipraxis.net/77796-dynamisch-erzeugte-komponenten-numbenennen.html)

smart 25. Sep 2006 08:15


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

SirThornberry 25. Sep 2006 08:20

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.

oki 25. Sep 2006 08:22

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

smart 25. Sep 2006 08:45

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von SirThornberry
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.

Hallo SirThornberry.

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

oki 25. Sep 2006 08:57

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von smart
Wie bekomme ich diese Namen heraus und kann sie dann, wenn möglich, mit einer Schleife löschen.

Du brauchst die Namen nicht herausbekommen. Suche einfach alle Images und lösche sie.
Delphi-Quellcode:
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;
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.

gruß oki

marabu 25. Sep 2006 09:00

Re: dynamisch erzeugte Komponenten numbenennen?
 
Statt RemoveComponent(Temp) bitte Temp.Free verwenden, sonst wird der Speicher nicht freigegeben.

Grüße vom marabu

oki 25. Sep 2006 09:05

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von marabu
Statt RemoveComponent(Temp) bitte Temp.Free verwenden, sonst wird der Speicher nicht freigegeben.

sorry, das kommt vom abkupfer. Danach wurde in der OH die Kompo in ein Datamodul eingefügt. Ich hab hier schnell kopiert und nicht aufgepaßt. RemoveComponent entfernt die Compo aus dem Owner, gibt sie aber nicht frei. Dank an Marabu.

gruß oki

hoika 25. Sep 2006 09:08

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

TeronG 25. Sep 2006 09:10

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:

marabu 25. Sep 2006 09:17

Re: dynamisch erzeugte Komponenten numbenennen?
 
Oder einfach alle Bilder auf eine Spielfläche (TPanel) und dann das Controls-Array statt des Components-Array benutzen.

smart 25. Sep 2006 10:01

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von hoika
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

Hallo hoika!

Nein, da kann ich einfach die Treffer zählen!

Gruß
Heike

smart 25. Sep 2006 10:06

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von oki
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.

gruß oki

Hallo oki!

Das ist eine gute Idee. Das klappt auch prima. Vielen Dank.

Gruß
Heike

smart 25. Sep 2006 10:10

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von TeronG
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:

Guten morgen TeronG!

Ich habe das jetzt so gelöst, dass ich erst alle lösche und dann, die ich noch brauche, einfach neu erzeuge.

Gruß
Heike

sakura 25. Sep 2006 10:25

Re: dynamisch erzeugte Komponenten numbenennen?
 
@Heike: Ein Post hätte auch gereicht ;)

...:cat:...

smart 25. Sep 2006 10:27

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von sakura
@Heike: Ein Post hätte auch gereicht ;)

...:cat:...

OK, da hast Du Recht. Ich werde mich bessern ;-)

Gruß
Heike

TeronG 25. Sep 2006 10:27

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von sakura
@Heike: Ein Post hätte auch gereicht ;)

:gruebel:
Wie soll man denn sonnst seinen Beitrags-Zähler hoch bekommen? :P /Duck

Elvis 25. Sep 2006 10:31

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

oki 25. Sep 2006 10:34

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:
type
  TShootingImage = class(TImage)
  public
    property Deletable : Boolean read FDeletable write FDeletable;
  end;
Alle Images, die nicht gelöscht werden dürfen, kannst du so markieren:
Delphi-Quellcode:
  MyshootingImage.Deletable := False;
und beim löschen folgendes:
Delphi-Quellcode:
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;
Benötigst du weitere Eigenschaften (darf abgeschossen werden; beim erasten mal, zweiten mal ...) so implementiere sie einfach.

gruß oki

smart 25. Sep 2006 10:42

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von TeronG
Wie soll man denn sonnst seinen Beitrags-Zähler hoch bekommen? :P /Duck

Das wird nicht pro Nachricht, sondern pro Themen gezählt :-)

Gruß
Heike

smart 25. Sep 2006 10:53

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von oki
kannst du dir auch eine eigene Klasse schreiben. Dort kannst du dann ganz einfach deine Eigenschaften einfügen und

Hallo oki,

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

oki 25. Sep 2006 11:08

Re: dynamisch erzeugte Komponenten numbenennen?
 
Hi smart,

Zitat:

Zitat von smart
Ich muss zugeben, dass ich noch nicht viel mit eigenen Klassen programmiert habe. Ich teste mal Dein Vorschlag. Sieht ja einfach aus. ;-)

sieht nicht nur einfach aus, ist es sogar. Das hört sich immer alles nur so wahnsinnig abstrakt an. Am konkreten beispiel ist das dann echt easy und mach auch noch Spaß wenn es super funzt (vorallem, wenn man sieht, wie man sich vorher einen abgebrochen hat mit globalen Variablen im Hauptprogramm usw.).

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

SirThornberry 25. Sep 2006 12:06

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;

oki 25. Sep 2006 12:46

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von SirThornberry
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".

hi,
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

TeronG 25. Sep 2006 12:55

Re: dynamisch erzeugte Komponenten numbenennen?
 
Zitat:

Zitat von oki
hi,
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

Also so ne Liste ist bestimmt schneller/performanter als jedesmal neu zu suchen....

smart 25. Sep 2006 19:46

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

oki 25. Sep 2006 20:01

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