Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Gleiches Image in Array speichern (https://www.delphipraxis.net/94348-gleiches-image-array-speichern.html)

Hamsterpower 20. Jun 2007 11:56


Gleiches Image in Array speichern
 
Das erste Mal, dass mir die SuFu nicht weiter gebracht hat..

Ich habe das Problem, dass ich das gleiche Image mit einer Schleife in ein Array speichern will. Allerdings wird das Image immer weitergeschoben und scheint nur im letzten Arrayfeld auf..

Delphi-Quellcode:
 for x_:=0 to 30 do
  for y_:=0 to 50 do
    begin
      bmpfeld[x_,y_].Bild:=form1.Image4;
      bmpfeld[x_,y_].Bild.Top:=(y_*7+41);
      bmpfeld[x_,y_].Bild.Left:=(x_*7+101);
      bmpfeld[x_,y_].Bild.BringToFront;
      bmpfeld[x_,y_].Bild.Visible:=true;
    end;
Schonmal danke für die Hilfe :)

mkinzler 20. Jun 2007 12:07

Re: Gleiches Image in Array speichern
 
Wie ist der Record deklariert? Was hast du genau vor?

CCRDude 20. Jun 2007 12:24

Re: Gleiches Image in Array speichern
 
Ist ja auch klar, form1.Image4 ist ja nur ein Objekt. Jede Änderung wirkt sich dann auf dasselbe Objekt aus, egal welchen Zeiger auf das (selbe) Objekt Du verwendest.

Willst Du Kopien haben, müsstest Du neue Bilder anlegen (TImage.Create) und denen die Eigenschaften des Originals zuweisen (.Assign).

Ob ein Array aus TImage allerdings eine ideale Lösung wäre, erst recht wenn alle gleich aussehen sollen... beschreib doch mal, was Du vorhast...

Hamsterpower 20. Jun 2007 13:25

Re: Gleiches Image in Array speichern
 
Der Record sieht nur so aus:

Delphi-Quellcode:
  MyImage = record
    Zahl:Integer;
    Bild:TImage;
  end;
Und das Array so:

Delphi-Quellcode:
var Bmpfeld: array[0..30,0..50] of MyImage;
Ich will einen Snakeclon programmieren. Dazu wollte ich ein 30*50 Array anlegen, das mit einem Integerwert die Richtung speichert, die die Schlange genommen hat, als sie durchgekommen ist, und die Image sollten dann die Schlange zusammenbauen, eben auch oft aus dem selben Grundimage.

Ganz am Anfang wollte ich alle Arrayfelder mit einem Hintergrund füllen, deshalb auch diese Schleife.

mkinzler 20. Jun 2007 13:49

Re: Gleiches Image in Array speichern
 
Dann solltest du aber auch kopien des Bildes speichern anstatt referenzen (Zeiger) auf eines oder besser nur die Positionen speichern.

Hamsterpower 20. Jun 2007 13:53

Re: Gleiches Image in Array speichern
 
Und wie lege ich eine Kopie an?

So gehts nicht..

Delphi-Quellcode:
Timage.Create(bmpfeld[1,1].Bild);
bmpfeld[1,1].Bild.Assign(form1.image4);

DeddyH 20. Jun 2007 13:54

Re: Gleiches Image in Array speichern
 
Delphi-Quellcode:
bmpfeld[1,1].Bild := TImage.Create;

Hamsterpower 20. Jun 2007 18:24

Re: Gleiches Image in Array speichern
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
bmpfeld[1,1].Bild := TImage.Create;

[Error] Unit1.pas(128): Not enough actual parameters..

Was muss ich da noch dahinter dran schreiben?

mkinzler 20. Jun 2007 18:37

Re: Gleiches Image in Array speichern
 
Den Owner.
z.B
Delphi-Quellcode:
bmpfeld[1,1].Bild := TImage.Create(Self);

Hamsterpower 20. Jun 2007 18:42

Re: Gleiches Image in Array speichern
 
Und wo wird der festgelegt?

mkinzler 20. Jun 2007 18:43

Re: Gleiches Image in Array speichern
 
Im Parameter, wie ich geschrieben habe

Hamsterpower 20. Jun 2007 18:48

Re: Gleiches Image in Array speichern
 
:wiejetzt:

So?

Delphi-Quellcode:
bmpfeld[1,1].bild := TImage.Create(bmpfeld[1,1].bild);

mkinzler 20. Jun 2007 18:49

Re: Gleiches Image in Array speichern
 
Nein die übergeordnete komponente z.B. die Form (Self)

Hamsterpower 20. Jun 2007 18:54

Re: Gleiches Image in Array speichern
 
Das wäre dann die Form: form1..

Delphi-Quellcode:
bmpfeld[1,1].bild := TImage.Create(form1);
Aber dann kommt nach dem Compilieren die Fehlermeldung: Cannot assign a TImage to a TImage

Hier der Codeabschnitt:

Delphi-Quellcode:
bmpfeld[1,1].bild:=TImage.Create(form1);
bmpfeld[1,1].Bild.Assign(form1.Image1);
bmpfeld[1,1].Bild.Top:=(21);
bmpfeld[1,1].Bild.Left:=(108);
bmpfeld[1,1].Bild.BringToFront;
bmpfeld[1,1].Bild.Visible:=true;

mkinzler 20. Jun 2007 18:59

Re: Gleiches Image in Array speichern
 
BTW. Du solltest keine feste Referenz auf die Form (Form1) sondern Self nehmen.
Und würde nur einer Instanz von TImage verwenden und nur die Positionen Speichern

Hamsterpower 20. Jun 2007 19:07

Re: Gleiches Image in Array speichern
 
Wie meinst du das mit nur einer Instanz von TImage?
Und wie kann ich Self festlegen?

mkinzler 20. Jun 2007 19:09

Re: Gleiches Image in Array speichern
 
Zitat:

Wie meinst du das mit nur einer Instanz von TImage?
Da die Bilder alle gleich sind, reicht es ja dieses nur einmal im Speicher zu halten.
Zitat:

Und wie kann ich Self festlegen?
Self zeigt auf die eigene Klasse.

Hamsterpower 20. Jun 2007 19:16

Re: Gleiches Image in Array speichern
 
Das mit der Speicheroptimierung mach ich später ;) Hauptsache es läuft mal.

So müsste self stimmen, oder (Hab Zeiger bis jetzt nur in Pascal gemacht..)?

Delphi-Quellcode:
var self:^Tform1;
Und so die Zeile:

Delphi-Quellcode:
bmpfeld[1,4].bild := TImage.Create(self^);

mkinzler 20. Jun 2007 19:18

Re: Gleiches Image in Array speichern
 
self^ != Self

Hamsterpower 20. Jun 2007 19:21

Re: Gleiches Image in Array speichern
 
Bei
Delphi-Quellcode:
bmpfeld[1,4].bild := TImage.Create(self);
(Habs richtiggestellt ;))
kommt die Fehlermeldung:

[Error] Unit1.pas(119): Incompatible types: 'TComponent' and 'Pointer'

(Hab oben falsch editiert..)

mkinzler 20. Jun 2007 19:23

Re: Gleiches Image in Array speichern
 
Nein ich wollte sagen das Self^ was anders als Self ist.
Schreibe einfach das hibn was ich oben schon geschrieben habe:

Delphi-Quellcode:
bmpfeld[1,4].bild := TImage.Create(Self);

Hamsterpower 20. Jun 2007 19:26

Re: Gleiches Image in Array speichern
 
Jep, ich ich jetzt auch gemerkt, hab oben nur noch den falschen Versuch reinkopiert^^
Aber die Fehlermeldung kommt trotzdem..

inherited 20. Jun 2007 19:51

Re: Gleiches Image in Array speichern
 
Du sollst Self nicht selbst nochmal definieren. Das ist bereits definiert!

Hamsterpower 20. Jun 2007 20:09

Re: Gleiches Image in Array speichern
 
Bei mir nicht.. Habe Delphi 7

mkinzler 20. Jun 2007 20:13

Re: Gleiches Image in Array speichern
 
Zitat:

Bei mir nicht.. Habe Delphi 7
Auch in D7. Wo steht dein Code?

Hamsterpower 20. Jun 2007 20:19

Re: Gleiches Image in Array speichern
 
Hier ^^

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls;

const
  x=400;
  y=246;

type
  MyImage = record
    Zahl:Integer;
    Bild:TImage;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Bevel1: TBevel;
    Image1: TImage;
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Richtung:integer=0;
  i:integer=0;
  xk:integer=1;
  yk:integer=1;
  run:boolean;
  start:boolean=false;
  Bmpfeld: array[0..30,0..50] of MyImage;
 // self:Tform1;

implementation

{$R *.dfm}


procedure Kopfposrunter(x,y:integer);
var i,j:shortint;
begin
for i:=0 to 6 do
  for j:=0 to 6 do
    with form1.Image1.Picture.Bitmap.Canvas do
      begin
        Pixels[x+i,y+j] :=form1.Image5.Picture.Bitmap.Canvas.Pixels[i,j];
      end;
end;


procedure Kopfposhoch(x,y:integer);
var i,j:shortint;
begin
for i:=0 to 6 do
  for j:=0 to 6 do
    with form1.Image1.Picture.Bitmap.Canvas do
      begin
        Pixels[x+i,y+j] :=form1.Image4.Picture.Bitmap.Canvas.Pixels[i,j];
      end;
end;


procedure Kopfposrechts(x,y:integer);
var i,j:shortint;
begin
for i:=0 to 6 do
  for j:=0 to 6 do
    with form1.Image1.Picture.Bitmap.Canvas do
      begin
        Pixels[x+i,y+j] :=form1.Image2.Picture.Bitmap.Canvas.Pixels[i,j];
      end;
end;

procedure Kopfposlinks(x,y:integer);
var i,j:shortint;
begin
for i:=0 to 6 do
  for j:=0 to 6 do
    with form1.Image1.Picture.Bitmap.Canvas do
      begin
        Pixels[x+i,y+j] :=form1.Image3.Picture.Bitmap.Canvas.Pixels[i,j];
      end;
end;

procedure Weiter;
var x_,y_:integer;
begin
bmpfeld[1,4].bild := TImage.Create(self);
bmpfeld[1,4].Bild.Assign(form1.Image4);
            bmpfeld[1,4].Bild.Top:=(21);
            bmpfeld[1,4].Bild.Left:=(81);
            bmpfeld[1,4].Bild.BringToFront;
            bmpfeld[1,4].Bild.Visible:=true;


  while run=true do
  begin
    if (xk<x-7) and (richtung=3) then xk:=xk+7;
    if (yk<y-7) and (richtung=2) then yk:=yk+7;
    if (xk>1) and (richtung=1) then xk:=xk-7;
    if (yk>1) and (richtung=4) then yk:=yk-7;
    case richtung of
      1: kopfposlinks(xk,yk);
      2: kopfposrunter(xk,yk);
      3: kopfposrechts(xk,yk);
      4: kopfposhoch(xk,yk);
    end;
    sleep(10);


    Application.ProcessMessages;
  end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if chr(Key) = 'A' then
    Richtung := 1;
  if chr(Key) = 'S' then
    Richtung := 2;
  if chr(Key) = 'D' then
    Richtung := 3;
  if chr(Key) = 'W' then
    Richtung := 4;
  if chr(Key) = 'Q' then
    run:=false;
  if Key = VK_ESCAPE then
    begin
      run:=false;
      form1.close;
    end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
x_,y_:integer;
begin
  Image1.Width := x;
  Image1.Height := y;
  Image1.Picture.Bitmap.PixelFormat := pf24bit;
  Image1.Picture.Bitmap.Width := x;
  Image1.Picture.Bitmap.Height := y;

  if start=false then
    begin
      start:=true;
      form1.Bevel1.Width:=x+2;
      form1.Bevel1.Height:=y+2;
{      for x_:=0 to 30 do
        for y_:=0 to 50 do
          begin
            bmpfeld[x_,y_].Bild:=form1.Image3;
            bmpfeld[x_,y_].Bild.Top:=(y_*7+10);
            bmpfeld[x_,y_].Bild.Left:=(x_*7+10);
            bmpfeld[x_,y_].Bild.BringToFront;
            bmpfeld[x_,y_].Bild.Visible:=true;
          end;     }
      form1.Bevel1.Visible:=true;
    end;
  run:=true;
  weiter;

end;

end.

inherited 20. Jun 2007 20:56

Re: Gleiches Image in Array speichern
 
self steht dir in allen Funktionen, die Member von Form1 sind, zur verfügung. In TForm1.Button1Click gibt es self sicher!

Hamsterpower 20. Jun 2007 21:26

Re: Gleiches Image in Array speichern
 
Stimmt :)

Aber die Fehlermeldung: Cannot assign a TImage to a TImage ist trotzdem noch da, sobald das Programm zum entsprechenden Codeabschnitt kommt.

mkinzler 20. Jun 2007 21:28

Re: Gleiches Image in Array speichern
 
Aber das hat ja wohl nichts mit dem Self zu tun.

Hamsterpower 20. Jun 2007 21:47

Re: Gleiches Image in Array speichern
 
Wahrscheinlich nicht.. Aber was ist dann in der Zeile:
Delphi-Quellcode:
bmpfeld[x_,y_].Bild.Assign(form1.Image4);
falsch?

Hamsterpower 22. Jun 2007 09:44

Re: Gleiches Image in Array speichern
 
Kann mir das niemand sagen? :cry:

mkinzler 22. Jun 2007 09:50

Re: Gleiches Image in Array speichern
 
Zitat:

Kann mir das niemand sagen? Crying or Very sad
Doch du weigerst dich ja aber hardneckig die Tipps anzunehmen

Hamsterpower 22. Jun 2007 10:30

Re: Gleiches Image in Array speichern
 
Sry, bin dämlich :wall:

Mache es jetzt mit Paintbox und alles klappt wunderbar :D

Danke für die Bemühungen :thumb:


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