Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Das gleiche Bild in 576 Images laden! (https://www.delphipraxis.net/67550-das-gleiche-bild-576-images-laden.html)

qb-tim 16. Apr 2006 15:41


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:
Image1.Picture.LoadFromFile(string) // string ist eine Variable
zu schreiben ist ziehmlich :drunken: :pale: :wall: :gruebel: :twisted:

Geht's nicht leichter? :|

SirThornberry 16. Apr 2006 15:46

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.

fkerber 16. Apr 2006 15:52

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

Hawkeye219 16. Apr 2006 16:00

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:
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;
Gruß Hawkeye

qb-tim 16. Apr 2006 18:08

Re: Das gleiche Bild in 576 Images laden!
 
@hawkeye219

:thumb:

Danke - das ist genau was ich brauche :lol:

:angel:

Sascha L 16. Apr 2006 18:16

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.

DGL-luke 16. Apr 2006 20:49

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 Delphi-Referenz durchsuchenassign kopieren.

ichbins 16. Apr 2006 21:02

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:
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;
Dann machst du EIN TImage.

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:
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;
Wenn auf das Image geklickt wurde kannst du ja aus den Mauskoordinaten genau den Klickpunkt berechnen:
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;

Sascha L 20. Apr 2006 15:07

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.

qb-tim 22. Apr 2006 17:01

Re: Das gleiche Bild in 576 Images laden!
 
Delphi-Quellcode:
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;
Hm :(

Ich sehe da gar keine Bilder! :wall:

:wiejetzt:

Was ist da falsch?


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:17 Uhr.
Seite 1 von 2  1 2      

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