Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TComponent (https://www.delphipraxis.net/7315-tcomponent.html)

Knut 8. Aug 2003 23:26


TComponent
 
hi,

hab ne frage wie TImage.Create(...) funktioniert.

also ich schreib z.b.

image := TImage.Create(..

tja was muss ich hier schreiben??
habs mit form1 porbiert klappt aber nicht und mit paintbox1 auch klappt auch nicht zumindest sehe ich mein image nicht!!
hier noch mal mein procedure

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
 stein : TBitmap;
 image : array[0..10] of TImage;
 i : integer;
begin
 for i := 0 to 10 do begin
  stein := TBitmap.Create;
  stein.LoadFromFile('stein.bmp');
  image[i] := TImage.Create(PaintBox1);
  image[i].Picture.Assign(stein);
  image[i].Top := 0;
  image[i].Left := 0;
 end;

end;
knut

Christian Seehase 9. Aug 2003 00:18

Re: TComponent
 
Moin Knut,

mit dem Owner (dem Parameter von TImage.Create) wird die Komponente angegeben, die für die Freigabe der durch TImage belegten Resourcen zuständig ist, d.h.:
Schreibst Du hier z.b. Form1 rein, so wird das dynamisch erzeugte Image erst dann zerstört, wenn Form1 zerstört wird (ausser es geschieht vorher gezielt).
Nimmst Du hingegen nil, so musst Du Dich selber um die Freigabe der Resourcen kümmern.

Sehen kannst Du das Image aber erst, wenn die Eigenschaft Parent gefüllt wurde.
Parent wird für die Fensterverwaltung gebraucht.
Die Angaben zur Position des Images werden relativ zum Parent gewertet.
Beispiel:
Du hast ein Panel dessen Eigenschaften Left und Top beide auf 16 gesetzt werden.
Dem Image wird als Parent dieses Panel zugewiesen.
Jetzt werden Top und Left des Images jeweils auf 8 gesetzt.
Die Position des Images auf dem Formular wäre jetzt 24/24, da die 8 ja relativ zum Panel anzusehen sind, das sich auf 16/16 befindet (16+8=24).

Was in Deinem Codeschnipsel übrigens fehlt ist die Freigabe der Bitmap.
Belegte Resourcen müssen wieder freigegeben werden. Dies kann automatisch geschehen (eben über den Owner), oder muss manuell gemacht werden (wenn der Owner auf nil gesetzt wird, oder keiner angegeben werden kann, wie bei TBitmap).

So könnte es aussehen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
stein : TBitmap;
image : array[0..10] of TImage;
i : integer;
begin
for i := 0 to 10 do begin
  stein := TBitmap.Create;
  try
    stein.LoadFromFile('stein.bmp');
    image[i] := TImage.Create(PaintBox1);
    image[i].Picture.Assign(stein);
    image[i].Top := 0;
    image[i].Left := 0;
  finally
    FreeAndNil(stein)
  end;
end;

end;
So sollte es auch gehen, die Bitmap muss aber nur einmal erzeugt werden

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
stein : TBitmap;
image : array[0..10] of TImage;
i : integer;
begin
  stein := TBitmap.Create;
  try
    for i := 0 to 10 do begin
      stein.LoadFromFile('stein.bmp');
      image[i] := TImage.Create(PaintBox1);
      image[i].Picture.Assign(stein);
      image[i].Top := 0;
      image[i].Left := 0;
    end;
  finally
    FreeAndNil(stein)
  end;
end;
da aber TImage.Picture die Methode LoadFromFile kennt wäre diese Variante wohl besser

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  image : array[0..10] of TImage;
  i    : integer;
begin
for i := 0 to 10 do begin
  image[i] := TImage.Create(PaintBox1);
  image[i].Picture.LoadFromFile('stein.bmp');
  image[i].Parent := PaintBox1;
  image[i].Top := 0;
  image[i].Left := 0;
end;

end;

Knut 9. Aug 2003 00:28

Re: TComponent
 
BIG THX

bin dir echt dankbar. hab delphi in der schule angefangen und da ham wir nur mit ausrechnen und en bisschen blinken was gemacht *gähn*


GROßES LOB an das forum. bin schwer beeindruckt!

Christian Seehase 9. Aug 2003 00:32

Re: TComponent
 
Moin Knut,

da sage ich, in meiner Eigenschaft als Rädchen im Getriebe des Forums:

Danke.

BTW:
Einem Lehrer hab' ich auch schon mal geholfen seine Unterlagen für den Unterricht zu erstellen, da ist die Hilfe auf der anderen Seite ja auch nicht verkehrt ;-)

Knut 9. Aug 2003 01:15

Re: TComponent
 
erstmal ganz viel codeschnipsel:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
 image : array[0..10] of TImage;
 j : integer;
begin
  randomize;
  image[i] := TImage.Create(Form1);
  image[i].Left := Random(Width);
  if i > 0 then begin
   for j:=0 to i do begin
   if (image[i].Left < (image[j].Left + Image[j].Width)) and
      (image[i].left > image[j].Left) and
      (image[i].Top > Image[j].Top) and
      (image[i].Top < (Image[j].Top + Image[j].Height)) then begin
       image[i].Free;
       end
      else
       begin
        image[i].Picture.LoadFromFile('stein.bmp');
        image[i].Parent := Form1;
        image[i].Top := 0;
        Inc(i);
       end;
      end;
      end
     else
      begin
       image[i].Picture.LoadFromFile('stein.bmp');
       image[i].Parent := Form1;
       image[i].Top := 0;
       Inc(i);
      end;
    if i = 10 then timer1.enabled := false;
  end;
sieht ziemlich komisch aus funktioniert auch nicht.
d.h.:den ersten timerdurchlauf, wenn i = 0 macht delphi noch mitaber denn wenn i=1 gibts ViolenceAccess in der if-klausel beider ersten überprüfung!

die sache mit dem j hab ich gemacht, damit ich überprüfen kann ob zwei steine aufeinander liegen.

wahrscheinlich gibts eh ne einfachere möglichkei als arrays. und die ist nicht nur einfacher sondern auch effektiver :cry:

* edt: hab vergessen zu sagen dass i jetz global is weiß nich ob des nötig is?!?
** edt: hab als parent mal paintbox1 und nicht form1 genommen, das hat delphi ein problem dass ich glaub paintbox nicht TwinControl is sindern irgendwas anders(weiß nicht mehr genau)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz