![]() |
Das gleiche Bild in 576 Images laden!
Hi,
ich programmiere gerade einen besonderen Editor. Dazu habe ich 4 Felder mit jeweils 12x12 Kästchen. :arrow: 576 images. Da sich im Editor jedes Kästchen einzeln durch anklicken ändern lässt kann ich sie nicht in einen größeren Image zusammenfassen. Nun das große Problem: Beim Start des Editors - OnActivate - möchte ich in jedes Kästchen (Image) das gleiche Bild (z.Bsp: 'C:\Documents and Settings\Tim\My Documents\My Pictures\bild1.bmp) laden. 576 mal
Delphi-Quellcode:
zu schreiben ist ziehmlich :drunken: :pale: :wall: :gruebel: :twisted:
Image1.Picture.LoadFromFile(string) // string ist eine Variable
Geht's nicht leichter? :| |
Re: Das gleiche Bild in 576 Images laden!
du könntest nachdem du im ersten Image dein Bild geladen hast das Bild in die anderem mit "Assigen" kopieren. Ich würde dir allerdings empfehlen das ganze noch zu überarbeiten. Auch wenn du mehre kleine Bilder hast und diese Ändern willst kannst du ein ganzes Bild nehmen. Du kannst dann auf dem großen Bild kleinere Teile mit Copyrect von einem Temppild aus erneuern.
|
Re: Das gleiche Bild in 576 Images laden!
Hi!
Ich glaube, was dir helfen könnte, ist eine for-Schleife in Verbindung mit FindComponent. Such mal hier, da findest du sicher was. Ciao Frederic |
Re: Das gleiche Bild in 576 Images laden!
Hallo,
ich kann mir nicht vorstellen, daß Du 576 einzelne TImage-Komponenten auf dem Formular abgelegt hat, Du wirst sie wohl zur Laufzeit erstellen. Warum deklarierst Du nicht ein Array und speicherst dort die Referenzen auf die TImage-Komponenten? Dann kannst Du mit 3 FOR-Schleifen alle Images direkt erreichen:
Delphi-Quellcode:
Gruß Hawkeye
var i, j, k : Integer;
Bilder : array [1..4, 1..12, 1..12] of TImage; begin // Erzeugen der TImage-Komponenten for i := 1 to 4 do for j := 1 to 12 do for k := 1 to 12 do begin Bilder[i, j, k] := TImage.Create(Self); : end; : // Laden der Bilder for i := 1 to 4 do for j := 1 to 12 do for k := 1 to 12 do Bilder[i, j, k].LoadFromFile ('Bild1.bmp'); end; |
Re: Das gleiche Bild in 576 Images laden!
@hawkeye219
:thumb: Danke - das ist genau was ich brauche :lol: :angel: |
Re: Das gleiche Bild in 576 Images laden!
Du brauchst aber nicht über 500 TImages. Das ganze lässt sich auch wesentlich eleganter und ressourcensparender programmieren.
Du sagst, du willst auf jedes Feld klicken können und dann soll ja irgendwas passieren. Du könntest ein einziges TImage-Objekt nehmen und dann anhand der Mausposition doch abfragen auf welchem "Feld" du dich gerade befindest. |
Re: Das gleiche Bild in 576 Images laden!
Ach ja übrigens - jedes mal loadfromfile könnte auch leicht ressourcen fressen - lieber einmal laden und dann per
![]() |
Re: Das gleiche Bild in 576 Images laden!
So solltest du es besser machen:
Erst lädtst du jede Datei in eine tbitmap-Variable. Diese Bitmaps fasst du in einem Array zusammen:
Delphi-Quellcode:
Dann machst du EIN TImage.
var
bilder:array[0..1000] of tbitmap; i:integer; const dateinamen:array[0..1000] of string = ('c:\bildnummer1.bmp','c:\bildnummer2.bmp',...); begin for i:=0 to 1000 do begin bilder[i]:=tbitmap.create; bilder[i].loadfromfile(dateinamen[i]); end; end; Für dieses TImage schreibst du eine Procedure DISPLAY. Die rufst du auf wenn ein Feld verändert wurde oder die Anzeige aktualisiert werden soll:
Delphi-Quellcode:
Wenn auf das Image geklickt wurde kannst du ja aus den Mauskoordinaten genau den Klickpunkt berechnen:
procedure DISPLAY;
var i,j:integer; newdisplay:tbitmap; begin newdisplay:=tbitmap.create; jetzt mit i und j alle 500 Felder aus dem Bitmap-Array auf das Image kopieren image1.canvas.draw(newdisplay); //Auf das Image die Zusammenstellung des neuen Displays kopieren; Image1.Doublebuffered sollte true sein um flackern zu vermeiden newdisplay.free; end;
Delphi-Quellcode:
prcedure tform1.image1click(x,y:integer);
var KLICKFELDX,KLICKFELDY:integer; begin klickfeldx:=x div 12; klickfeldy:=y div 12; //eventuell muss dies noch verändert werden, da jetzt der niedrigstmögliche Wert eine 0 ist -> +1 dazuschreiben wenn du den Wert erhöhen willst. Außerdem könnte es sein dass der Wert nicht von den Koordinaten des Image abhängt sondern von denen der Form, dann musst du von x noch image1.left und von y image1.top abziehen (das sieht dann so aus: klickfeldx:=(x-image1.left) div 12; end; |
Re: Das gleiche Bild in 576 Images laden!
Abgesehen davon, dass es genau das ist, was ich 2 Posts darüber gesagt habe:
- Was soll der konstante Array? Soll er da nun 576mal den bekloppten Dateinamen reinschreiben? OK, wenn man langeweile hat... :D - Somit brauch er auch nicht 576mal ein Bitmap erzeugen, was ja nun absolut unperfomant ist und unmengen an unnötigen Speicher verbraucht. Er brauch nur das Bild EINMAL laden und kann damit dann EIN TBitmap an den entsprechenden Stellen ausfüllen. - Um die Koordinaten zu erhalten, wo man auf das Image geklickt hat, benutzt man nicht den Code von dir. Dafür gibt es ClientToScreen und ScreenToClient. |
Re: Das gleiche Bild in 576 Images laden!
Delphi-Quellcode:
Hm :(
procedure TForm1.FormActivate(Sender: TObject);
var a, x, y : Integer; Bild : array [1..4, 1..12, 1..12] of TImage; begin for a := 1 to 4 do for x := 1 to 12 do for y := 1 to 12 do begin Bild[a, x, y] := TImage.Create(Self); Bild[a, x, y].Height := 15; Bild[a, x, y].Width := 15; if a = 1 then begin Bild[a, x, y].Top := y * 15 + 1; Bild[a, x, y].Left := x * 15 + 1; end; if a = 2 then begin Bild[a, x, y].Top := y * 15 + 1 + 195; Bild[a, x, y].Left := x * 15 + 1; end; if a = 3 then begin Bild[a, x, y].Top := y * 15 + 1; Bild[a, x, y].Left := x * 15 + 1 + 195; end; if a = 4 then begin Bild[a, x, y].Top := y * 15 + 1 + 195; Bild[a, x, y].Left := x * 15 + 1 + 195; end; end; Bild[1, 1, 1].Picture.LoadFromFile('C:\Program Files\Borland\Delphi6\Projects\MazeMaker\images\none.bmp'); for a := 2 to 4 do for x := 1 to 12 do for y := 1 to 12 do Bild[a, x, y].Picture.Assign(Bild[1, 1, 1].Picture); a := 1; for x := 2 to 12 do for y := 1 to 12 do Bild[a, x, y].Picture.Assign(Bild[1, 1, 1].Picture); x := 1; for y := 2 to 12 do Bild[a, x, y].Picture.Assign(Bild[1, 1, 1].Picture); end; Ich sehe da gar keine Bilder! :wall: :wiejetzt: Was ist da falsch? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 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-2025 by Thomas Breitkreuz