Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponenten über Befehl erstellen (https://www.delphipraxis.net/81728-komponenten-ueber-befehl-erstellen.html)

rawsoul 2. Dez 2006 19:45


Komponenten über Befehl erstellen
 
N'Abend zusammen!

Ich sitze zur Zeit an einem Game, welches Komplett über TImage visualisiert wird. In diesem Spiel sollen per Tastendruck neue Images gesetzt werden, immer das gleiche. Ich hatte es erst so gelöst, dass ich die maximale Anzahl von Images außerhalb des sichtbaren Bereiches gesetzt habe und dann über den Tastendruck erst auf die definierte Position gesetzt :?

Mein alter Informatiklehrer sagte, man könne Instanzen erzeugen... Ich habe es bereits mit create versucht, jedoch verstehe ich die Syntax nicht :oops:, und die Delphi Hilfe sagt mir, das Thema sei nicht vorhanden.

Kann mir wer entweder ein konkretes Beispiel für create() zeigen, oder möglicher Weise sogar eine komplett andere Idee vorschlagen? ;)

Liebe Grüße,
Frank.

[edit=SirThornberry]Schreibfehler im Titel korrigiert - Mfg, SirThornberry[/edit]

Balu der Bär 2. Dez 2006 19:50

Re: Komponenter über Befehl erstellen
 
Delphi-Quellcode:
var
test: TImage;

....

test := TImage.Create(self);
test.parent := Form1;
test.top := 20;
test.left := 20;
test.picture := ...
Oder guck mal hier: http://www.delphipraxis.net/internal...ct.php?t=91839

rawsoul 2. Dez 2006 20:03

Re: Komponenter über Befehl erstellen
 
Klingt sehr interessant und nachvollziehbar, aber .picture will meinen dateipfad nicht annehmen :(
Wie habe ich ihn denn zu deklarieren?

Balu der Bär 2. Dez 2006 20:04

Re: Komponenter über Befehl erstellen
 
Du musst ein TPicture-Objekt übergeben. ;)

DGL-luke 2. Dez 2006 20:09

Re: Komponenter über Befehl erstellen
 
Test.Picture.LoadFromFile könnte helfen.

rawsoul 2. Dez 2006 20:19

Re: Komponenter über Befehl erstellen
 
Oh ja, das war's, danke :)

Trotz alledem, ich komme nicht weiter :( Sorry dass ich euer Forum mit solchen Fragen 'zumülle'...

Nächstes Problem: Angeblich sei die Parent des Images nicht initialisiert worden, zumindest schmiert mir das Programm beim compilen ab. EAccessViolation im Project1.exe sagt er mir...

Balu der Bär 2. Dez 2006 20:22

Re: Komponenter über Befehl erstellen
 
Was hast du denn als Parent angegeben?

rawsoul 2. Dez 2006 20:22

Re: Komponenter über Befehl erstellen
 
Wie in deinem Beispiel: Form1

Balu der Bär 2. Dez 2006 20:23

Re: Komponenter über Befehl erstellen
 
Heißt dein Formular denn auch Form1? Ansonsten gib mal self an und guck was passiert.

rawsoul 2. Dez 2006 20:27

Re: Komponenter über Befehl erstellen
 
Ja, es heißt Form1. Auch mit self als Parent bekomme ich den gleichen Fehler zurück.

Delphi-Quellcode:
procedure TForm1.keypressTIMERTimer(Sender: TObject);
begin
// helpscreen
  if getAsyncKeyState(vk_f1) < 0 then
  helpimage.visible:=true else
  helpimage.visible:=false;

// marker rechts
  if getasynckeystate(vk_right) < 0 then
    if markerimage.left=768 then markerimage.left:=0 else markerimage.left:=markerimage.left+32;

// marker links
  if getasynckeystate(vk_left) < 0 then
    if markerimage.left=0 then markerimage.left:=768 else markerimage.left:=markerimage.left-32;

// marker hoch
  if getasynckeystate(vk_up) < 0 then
    if markerimage.top=0 then markerimage.top:=448 else markerimage.top:=markerimage.top-32;

// marker runter
  if getasynckeystate(vk_down) < 0 then
    if markerimage.top=448 then markerimage.top:=0 else markerimage.top:=markerimage.top+32;

// cannon setzen
if getasynckeystate(vk_up) < 0 then
    cannon:=timage.create(self); //cannon ist eine globale variable
    cannon.parent:=self;
    cannon.top:=markerimage.top;
    cannon.left:=markerimage.left;
    cannon.picture.loadfromfile('gfx\decal3.bmp');
end;

inherited 2. Dez 2006 20:29

Re: Komponenter über Befehl erstellen
 
ohje, du versuchst mehrmals das selbe Bild zu createn, dann krachts, außerdem hast du begin und end um den if-Befehl vergessen.

rawsoul 2. Dez 2006 20:36

Re: Komponenter über Befehl erstellen
 
Achso ist das ;)

//edit: Ich kann das Bild öfters Createn. Ich denke, es lag an der Geschwindigkeit des Timers(50 ms), damit wahr wohl der Debugger überfordert ;) edit\\

Das begin / end ist nun wirklich ne doofe Sache gewesen *kopfaufdentischschlag*.

Jetzt funktioniert es super, danke Jungs und Mädels :)

[offtopic]Find's erstaunlich, wie schnell man hier beholfen ist, und das ohne, dass jemand sagt 'Ist doch Kinder*k*a*c*k*e'. So kenn ich's von anderen Foren[/offtpic]

Balu der Bär 2. Dez 2006 20:37

Re: Komponenter über Befehl erstellen
 
Zitat:

[offtopic]Find's erstaunlich, wie schnell man hier beholfen ist, und das ohne, dass jemand sagt 'Ist doch Kinder*k*a*c*k*e'. So kenn ich's von anderen Foren[/offtpic]
Das macht dieses Forum aus. :love: ;)

inherited 2. Dez 2006 20:43

Re: Komponenter über Befehl erstellen
 
WHAAAA Balu hat ein neuen Avatar :duck: (OT)^^
Die Nettigkeit wird durch folgendes hervorgerufen:
-Nette User
-Nette Moderatoren die alles löschen was nicht nett ist^^
-Ein netter Admin der jeden zusammen****** der nicht nett ist->unnetter user geht oder wird zum netten user xD

DGL-luke 2. Dez 2006 20:51

Re: Komponenter über Befehl erstellen
 
Zitat:

Zitat von rawsoul
//edit: Ich kann das Bild öfters Createn.

Datt is aber gar nicht gut. Wenn du einen Konstruktor aufrufst, gibt er dir den Zeiger (die Speicheradresse, wo das Objekt liegt, sozusagen dein einziger Angreifpunkt) des Objekts zurück. Den speicherst du dir in Test. Wenn du jetzt eine neue Instanz auf test erstellst, verlierst du die alte - si wird zwar immer noch da sein, aber du hast keine Chance, sie wiederzuholen, um auf sie zuzugriefen oder sie zu löschen (OK, es geht über Owner.FindComponent). Und das ist schlecht. Das Objekt liegt dann nämlich - auch wenn du es schon lange nicht mehr brauchst - nutzlos im Speicher und verbraucht Arbeitsspeicher.

rawsoul 3. Dez 2006 00:14

Re: Komponenter über Befehl erstellen
 
Zitat:

Zitat von inherited
WHAAAA Balu hat ein neuen Avatar (OT)^^
Die Nettigkeit wird durch folgendes hervorgerufen:
-Nette User
-Nette Moderatoren die alles löschen was nicht nett ist^^
-Ein netter Admin der jeden zusammen****** der nicht nett ist->unnetter user geht oder wird zum netten user xD

*grins*

Zitat:

Zitat von DGL-luke
Datt is aber gar nicht gut. Wenn du einen Konstruktor aufrufst, gibt er dir den Zeiger (die Speicheradresse, wo das Objekt liegt, sozusagen dein einziger Angreifpunkt) des Objekts zurück. Den speicherst du dir in Test. Wenn du jetzt eine neue Instanz auf test erstellst, verlierst du die alte - si wird zwar immer noch da sein, aber du hast keine Chance, sie wiederzuholen, um auf sie zuzugriefen oder sie zu löschen (OK, es geht über Owner.FindComponent). Und das ist schlecht. Das Objekt liegt dann nämlich - auch wenn du es schon lange nicht mehr brauchst - nutzlos im Speicher und verbraucht Arbeitsspeicher.

hm... also sollte ich jede instanz / jede komponente die ich erzeuge anders nennen, oder wie habe ich das zu sehen?

inherited 3. Dez 2006 10:04

Re: Komponenter über Befehl erstellen
 
Ja, am Besten mit einem Dynamischen Array
Delphi-Quellcode:
var
  Bilderchen: Array of TImage;

...

if getasynckeystate(vk_up) < 0 then
begin
  SetLength(Bilderchen, High(Bilderchen)+2);
  bilderchen[high(Bilderchen)]:=timage.create(self);
  with bilderchen[high(bilderchen)] do
  begin
    parent:=self;
    top:=markerimage.top;
    left:=markerimage.left;
    picture.loadfromfile('gfx\decal3.bmp');
  end;
end;

rawsoul 3. Dez 2006 13:44

Re: Komponenter über Befehl erstellen
 
Super, danke für den Tipp!

Es funktioniert so zwar super, aber schlau werde ich daraus trotzdem nicht, und ich möchte behaupten, das hilft mir nicht sehr viel weiter. Die einzelnen Befehle seien in der OH wieder nicht zu finden, sagt mir Delphi :(
Magst du den Codeschnipsel vielleicht kommentieren? *liebguck*

Lg,
Frank.

inherited 3. Dez 2006 14:03

Re: Komponenter über Befehl erstellen
 
Naja, weil du es bist^^
Allerdings musst du mir noch sagen, was du nicht verstehts. Was Arrays sind? was das mit dem with x do ist oder was?

rawsoul 3. Dez 2006 14:12

Re: Komponenter über Befehl erstellen
 
Hehe :mrgreen:

Arrays sind - soweit ich weiß - Variablen, welche in begrenzten Bereichen gelten. Falls ich mich irre, bitte korrigieren.
Jetzt verstehe ich nicht so ganz, was genau dynamische Arrays genau sind und wie das with x do zu verstehen ist. Ist's ne Schleife?

Den Teil mit
Delphi-Quellcode:
SetLength(Bilderchen, High(Bilderchen)+2);
habe ich auch noch nicht ganz verstanden. Vergrößert er den Bereich des Arrays um 2?

inherited 3. Dez 2006 14:56

Re: Komponenten über Befehl erstellen
 
AAAlso:
Arrays: http://www.dsdt.info/tutorials/crashkurs/?page=6 ;)

Delphi-Quellcode:
  with bilderchen[high(bilderchen)] do
  begin
    parent:=self;
    top:=markerimage.top;
    left:=markerimage.left;
    picture.loadfromfile('gfx\decal3.bmp');
  end;
ist das gleiche wie

Delphi-Quellcode:
  bilderchen[high(bilderchen)].parent:=self;
  bilderchen[high(bilderchen)].top:=markerimage.top;
  bilderchen[high(bilderchen)].left:=markerimage.left;
  bilderchen[high(bilderchen)].picture.loadfromfile('gfx\decal3.bmp');
und spart Zeit^^

high liefert das höchste elemnt eines Arrays

rawsoul 3. Dez 2006 15:07

Re: Komponenten über Befehl erstellen
 
Super, danke !

Das heißt, es wird jedem Element aus dem Array einen anderer Namen gegeben?
Wie kann ich dann später darauf zurückgreifen? Ich habe nämlich vor, die einzelnen Images später wieder destroyen zu lassen

SirThornberry 3. Dez 2006 16:20

Re: Komponenten über Befehl erstellen
 
Du hast ein Array wo jedes Element eines deiner Images ist. Wie zerstört man ein normales Object? mit ".Free". Wenn nun jedes Array Element ein Object ist liegt es doch mehr als nah wie man es zerstört.

rawsoul 3. Dez 2006 16:51

Re: Komponenten über Befehl erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Merci!

Das ist mein aktueller Stand.

Noch ein Problem...
Delphi-Quellcode:
procedure TForm1.enemyTIMERTimer(Sender: TObject);
begin
  repeat
    begin
      Setlength(enemy1, high(enemy1)+2);
      enemy1[number]:=timage.create(self);
      with enemy1[number] do
        begin
          parent:=self;
          left:=0;
          picture.loadfromfile('gfx\enemy2.bmp');
          transparent:=true;
          top:=2*raster+random(64);
        end;
      number:=number+1
    end
    until number=stage*2
end;
Sobald ich den Timer aktiviere, hängt sich die exe auf. Was stimmt da schon wieder nicht?

//edit
Hat sich erledigt, der Buffer war überlastet... :lol:

xZise 3. Dez 2006 20:29

Re: Komponenten über Befehl erstellen
 
Was sollen wir jetzt mit der exe machen?

rawsoul 3. Dez 2006 20:56

Re: Komponenten über Befehl erstellen
 
Gar nichts ;)
Wollte euch bloß einen Einblick davon verschaffen, was ich vor habe...


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