![]() |
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:
Schonmal danke für die Hilfe :)
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; |
Re: Gleiches Image in Array speichern
Wie ist der Record deklariert? Was hast du genau vor?
|
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... |
Re: Gleiches Image in Array speichern
Der Record sieht nur so aus:
Delphi-Quellcode:
Und das Array so:
MyImage = record
Zahl:Integer; Bild:TImage; end;
Delphi-Quellcode:
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.
var Bmpfeld: array[0..30,0..50] of MyImage;
Ganz am Anfang wollte ich alle Arrayfelder mit einem Hintergrund füllen, deshalb auch diese Schleife. |
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.
|
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); |
Re: Gleiches Image in Array speichern
Delphi-Quellcode:
bmpfeld[1,1].Bild := TImage.Create;
|
Re: Gleiches Image in Array speichern
Zitat:
Was muss ich da noch dahinter dran schreiben? |
Re: Gleiches Image in Array speichern
Den Owner.
z.B
Delphi-Quellcode:
bmpfeld[1,1].Bild := TImage.Create(Self);
|
Re: Gleiches Image in Array speichern
Und wo wird der festgelegt?
|
Re: Gleiches Image in Array speichern
Im Parameter, wie ich geschrieben habe
|
Re: Gleiches Image in Array speichern
:wiejetzt:
So?
Delphi-Quellcode:
bmpfeld[1,1].bild := TImage.Create(bmpfeld[1,1].bild);
|
Re: Gleiches Image in Array speichern
Nein die übergeordnete komponente z.B. die Form (Self)
|
Re: Gleiches Image in Array speichern
Das wäre dann die Form: form1..
Delphi-Quellcode:
Aber dann kommt nach dem Compilieren die Fehlermeldung: Cannot assign a TImage to a TImage
bmpfeld[1,1].bild := TImage.Create(form1);
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; |
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 |
Re: Gleiches Image in Array speichern
Wie meinst du das mit nur einer Instanz von TImage?
Und wie kann ich Self festlegen? |
Re: Gleiches Image in Array speichern
Zitat:
Zitat:
|
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:
Und so die Zeile:
var self:^Tform1;
Delphi-Quellcode:
bmpfeld[1,4].bild := TImage.Create(self^);
|
Re: Gleiches Image in Array speichern
self^ != Self
|
Re: Gleiches Image in Array speichern
Bei
Delphi-Quellcode:
(Habs richtiggestellt ;))
bmpfeld[1,4].bild := TImage.Create(self);
kommt die Fehlermeldung: [Error] Unit1.pas(119): Incompatible types: 'TComponent' and 'Pointer' (Hab oben falsch editiert..) |
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);
|
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.. |
Re: Gleiches Image in Array speichern
Du sollst Self nicht selbst nochmal definieren. Das ist bereits definiert!
|
Re: Gleiches Image in Array speichern
Bei mir nicht.. Habe Delphi 7
|
Re: Gleiches Image in Array speichern
Zitat:
|
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. |
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!
|
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. |
Re: Gleiches Image in Array speichern
Aber das hat ja wohl nichts mit dem Self zu tun.
|
Re: Gleiches Image in Array speichern
Wahrscheinlich nicht.. Aber was ist dann in der Zeile:
Delphi-Quellcode:
falsch?
bmpfeld[x_,y_].Bild.Assign(form1.Image4);
|
Re: Gleiches Image in Array speichern
Kann mir das niemand sagen? :cry:
|
Re: Gleiches Image in Array speichern
Zitat:
|
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 21:19 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