Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Mehrere TImages mit einer Procedure erstellen (https://www.delphipraxis.net/190432-mehrere-timages-mit-einer-procedure-erstellen.html)

Benni0811 3. Okt 2016 19:25

Mehrere TImages mit einer Procedure erstellen
 
Hallo Zusammen,

Ich programmiere gerade ein Spiel, in dem man sich seine eigen Stadt aufbauen kann. Das ganze auf geschieht auf einem Gitter mit über 500 Quadratischen Feldern. Um nicht für jedes einzelne Feld ein TImage von Hand erstellen zu müssen, habe ich mir überlegt diese erst im Programm zu erstellen. Jetzt meine Frage:
Kann man mit einer Prozedure mehrere TImages erstellen, ohne diese vorher einzeln im Var-Bereich zu deklarieren? den Namen der Bilder würde ich über eine Stringvariable festlegen.

Grüße

mkinzler 3. Okt 2016 19:27

AW: Mehrere TImages mit einer Procedure erstellen
 
Übergabe eines Arrays?

Benni0811 3. Okt 2016 19:32

AW: Mehrere TImages mit einer Procedure erstellen
 
Wie würde das aussehen?

Ich programmiere erst seit 2 monaten mit Pascal und habe noch nie arrays benutzt und mich auch noch nie damit beschäftigt wie diese funktionieren.

Luckie 3. Okt 2016 20:59

AW: Mehrere TImages mit einer Procedure erstellen
 
Dann ist das jetzt die Gelegenheit sich damit zu beschäftigen. Hilfe findest du dazu hier im Forum und auf den einschlägigen Tutorialseiten im Internet.

Aber für die Zukunft: Eine Objektliste mit Objekten, die das TImage und weiter Eigenschaften beinhalten, wäre hier wohl geeigneter.

himitsu 3. Okt 2016 21:12

AW: Mehrere TImages mit einer Procedure erstellen
 
statt einem Array

Delphi-Quellcode:
type
  TMyImagesArray = array of TImages; // TMyImagesArray = TArray<TImages>;

function GibMirWasDasGarantiertInEinemSpeicherleckEndet: TMyImagesArray;
// oder
procedure GibMirWasDasGarantiertInEinemSpeicherleckEndet(var ImagesList: TMyImagesArray);
Besser eine Liste mit OwnsObjects=True
Delphi-Quellcode:
var
  Liste: TObjectList<TImages>;

procedure GibMirWas(ImagesList: TObjectList<TImages>);

PS: Gibt es kein 2DBox Box2D mehr im GetIt?
Bei Google suchendelphi 2d game engine

[edit] Wo kommt Luckie plötzlich her :shock:

Benni0811 4. Okt 2016 17:44

AW: Mehrere TImages mit einer Procedure erstellen
 
Danke für die Antworten, ich habe jetzt eine Objectlist mit verschiedenen Bildern. Ich habe auch herausgefunden, dass man die Bilder mit der Funktion GetItem aufrufen kann. Wie Kombiniere ich das jetzt mit der Erstellung neuer Bilder mit Einer Stringvariable als Bildnamen und unterschiedlichen Koordinaten?

haentschman 4. Okt 2016 17:59

AW: Mehrere TImages mit einer Procedure erstellen
 
Hallöle...:P
Schau dir mal TDictiorary bzw. TObjectDictonary an. Dann macht du dir eine Datenklasse mit dem Bild und den Eigenschaften welche du möchtest. Dann hast du einen KEY welcher das Bild identifiziert... fertsch. :P
http://docwiki.embarcadero.com/Libra...jectDictionary

Beim Arbeiten mit Listen kannst über den Index zugreifen. Bei generischen Listen kriegst du das entsprechende Objekt zurück. :zwinker:

Arbeite dich mal durch. Wenn du fragen hast kann ich notfalls ein Beispiel machen. :zwinker:

Benni0811 5. Okt 2016 13:10

AW: Mehrere TImages mit einer Procedure erstellen
 
Okay ich habe folgende Fragen:

Ich habe mir eine Klasse erstellt mit Eigenschaften des Bilds(Mithilfe von Google). Die sieht so aus:
Code:
type
    TBild = Class
    private
      x,y,Width,Height:Integer;
      Name:String;
    public
      Constructor Init(x,y,Width,Height:Integer; Name:String);
End;
Wie kann ich dem Bild eine Bitmap zuweisen?
Wie übertrage ich die Daten auf ein neues Bild?
Ist die Klasse überhaupt richtig?

Und wie Kombiniere ich das ganze mit der Objectlist?

Wie du siehst bin ich damit etwas überfordert, ich wäre dir für ein kleines Beispiel sehr dankbar.

Edit: Habe gerade gemerkt, dass beim kompilieren die Fehlermeldung: "[dcc32 Fehler] Unit1.pas(14): E2065 Ungenügende Forward- oder External-Deklaration: 'TBild.Init'" erscheint.

haentschman 5. Okt 2016 13:31

AW: Mehrere TImages mit einer Procedure erstellen
 
Hallo...:P

Knapp daneben... :P

Ich zeige es anhand eines Beispieles:
Delphi-Quellcode:
TBlubb = class // der Klassenname ist egal
  private
    FImageContent: TBitmap;
    FImageHeight: Integer;
    FImageName: string;
    FImageWidth: Integer;
  public
    property ImageName: string read FImageName write FImageName; // der Name des Bildes für z.b. die Anzeige etc.
    property ImageContent: TBitmap read FImageContent write FImageContent; // das eigentliche Bild incl. der Originalhöhe etc.
    property ImageHeight: Integer read FImageHeight write FImageHeight; // Höhe des Bildes vom Original abweichend -> muß gesetzt werden
    property ImageWidth: Integer read FImageWidth write FImageWidth; // Breite des Bildes vom Original abweichend -> muß gesetzt werden
    // und so weiter
  end;
Du mußt dir das Tutorial aus dem DT anschauen. Du mußt lernen was Klassen sind, was Propertys sind und wie man das verwendet. :warn: Sonst kommst du auf keinen grünen Zweig.
https://www.delphi-treff.de/tutorial...phi-crashkurs/ ...Klassen ab Seite 8

Wenn du das verstanden hast, können wir mit der Objectliste weitermachen. 8-)
PS: Wenn du Klassen verstanden hast, wirst du auch die Vorteile von Klassen erkennen. :wink:

Benni0811 10. Okt 2016 16:08

AW: Mehrere TImages mit einer Procedure erstellen
 
Ich habe den Crashkurs jetzt gelesen und außerdem der Klasse die Eigenschaften ImageTop und ImageLeft hinzugefügt:
Delphi-Quellcode:
TBild = Class
    private
      FImageContent: TBitmap;
      FImageHeight: Integer;
      FImageName: string;
      FImageWidth: Integer;
      FImageTop: Integer;
      FImageLeft: Integer;
    public
      property ImageName: string read FImageName write FImageName;
      property ImageContent: TBitmap read FImageContent write FImageContent;
      property ImageHeight: Integer read FImageHeight write FImageHeight;
      property ImageWidth: Integer read FImageWidth write FImageWidth;
      property ImageTop: Integer read FImageTop write FImageTop;
      property ImageLeft: Integer read FImageLeft write FImageLeft;
    End;
Außerdem habe ich in einer Procedure den Eigenschaften verschiedene Werte zugewiesen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
Var Test:TBild;
begin
    Key:='Feld'+IntToStr(Feldx)+','+IntToStr(Feldy);
    Test:=TBild.Create;
    Test.FImageName:=Key;
    Test.FImageHeight:=Feldsize;
    Test.FImageWidth:=Feldsize;
    Imagelist1.GetBitmap(0,Test.FImageContent);
end;
Feldx und Feldy sind Variablen zur bestimmeug der Position des Feldes, Feldsize ist die Konstante die die Größe der Felder festlegt.

Wie kombiniere ich das jetzt mit der TObjectlist?

Jim Carrey 10. Okt 2016 16:12

AW: Mehrere TImages mit einer Procedure erstellen
 
Zitat:

Zitat von Benni0811 (Beitrag 1350392)
Wie kombiniere ich das jetzt mit der TObjectlist?

Also ohne Generics (ja, haut mich), müsstest du jetzt eine TObjectList irgendwo erstellen und sie füllen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 MeineObjectList: TObjectList;
 Test: TBild;
begin
 MeineObjectList := TObjectList.Create;

 Key := 'Feld'+IntToStr(Feldx)+','+IntToStr(Feldy);
 Test := TBild.Create;
 Test.FImageName:=Key;
 Test.FImageHeight:=Feldsize;
 Test.FImageWidth:=Feldsize;
 Imagelist1.GetBitmap(0,Test.FImageContent);

 MeineObjectList.Add(Test);

 // Irgendwo musst du dann auch die ObjectListe wieder freigeben.
end;
Ich habe das jetzt nicht getestet aber das müsste doch eigentlich so funktionieren, oder?

haentschman 10. Okt 2016 17:18

AW: Mehrere TImages mit einer Procedure erstellen
 
Moin...:P
Zitat:

Ich habe den Crashkurs jetzt gelesen und außerdem der Klasse die Eigenschaften ImageTop und ImageLeft hinzugefügt:
:thumb: Ein Schritt nach dem Anderen...

Zitat:

Also ohne Generics (ja, haut mich)
...:zwinker: knapp daneben. Warum sollte er nicht die neuen Möglichkeiten nutzen? :P

Delphi-Quellcode:
TForm1 = class(TForm) // bestehend
.
.
private
  MeineObjectList := TObjectList<TBild>; // die Instanz der Liste
public
  constructor Create;
  destructor Destroy; override;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 //MeineObjectList: TObjectList;
 Test: TBild;
begin
 // MeineObjectList := TObjectList<TBild>.Create(True);
 // -> Generics, das True bedeutet das die Listeneinträge von der Liste verwaltet werden (Freigabe)
 // -> Verlagern in den constructor
 Key := 'Feld'+IntToStr(Feldx)+','+IntToStr(Feldy);
 Test := TBild.Create;
 Test.FImageName:=Key;
 Test.FImageHeight:=Feldsize;
 Test.FImageWidth:=Feldsize;
 Imagelist1.GetBitmap(0,Test.FImageContent);

 MeineObjectList.Add(Test);

 // Irgendwo musst du dann auch die ObjectListe wieder freigeben.
end;
... und dann greifst du auf die Liste zu um mit dem Bild (TBild) zu arbeiten...
Delphi-Quellcode:
var
  DasBild: TBild;
begin
  DasBild := MeineObjectList[DeinGewünschterIntex]; // durch die Generics kannst das Object direkt ohne Casten benutzen
end;
... die Listen haben noch weitere Funktionen um auf das Bild zuzugreifen.
http://docwiki.embarcadero.com/Libra...ns.TObjectList
http://docwiki.embarcadero.com/Libra...ctList_Methods

...Freigabe der "MeineObjectList"
Delphi-Quellcode:
constructor Create;
begin
  MeineObjectList := TObjectList<TBild>.Create(True);
end;

destructor Destroy;
begin
  MeineObjectList.Free;
  inherited;
end;

himitsu 10. Okt 2016 17:30

AW: Mehrere TImages mit einer Procedure erstellen
 
Man kann statt der
Delphi-Quellcode:
TObjektList
/
Delphi-Quellcode:
TObjektList<TBild>
auch ein
Delphi-Quellcode:
TObjectDictionary<string,TBild>
verwenden, denn da kann man dann auch noch schöner auf ein bestimmtes Bild zugreifen.

Also statt über den Index, welchen man vorher noch suchen müsste, direkt über den Namen.
Delphi-Quellcode:
//MeineObjectList.Add(Test);
MeineObjectList.Add(Key, Test); // oder MeineObjectList.Add(Test.ImageName, Test);

DasBild := MeineObjectList['DerBildName'];
Oder statt dem Namen direkt die Koordinaten
Delphi-Quellcode:
var MeineObjectList: TObjectDictionary<TPoint,TBild>;

MeineObjectList.Add(Point(FeldY, FeldY), Test);

DasBild := MeineObjectList[Point(HoleY, HoleY)];

Blup 11. Okt 2016 10:30

AW: Mehrere TImages mit einer Procedure erstellen
 
Konstruktoren und Destruktoren sollte man in der Regel überschreiben, nicht neu definieren.
Sonst werden diese nicht aufgerufen.
Dabei auch den richtigen Konstruktor überschreiben und das inherited nicht vergessen.
Delphi-Quellcode:
TForm1 = class(TForm) // bestehend
.
.
private
  MeineObjectList := TObjectList<TBild>; // die Instanz der Liste
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
end;

constructor Create(AOwner: TComponent);
begin
  inherited;
  MeineObjectList := TObjectList<TBild>.Create(True);
end;

destructor Destroy;
begin
  MeineObjectList.Free;
  inherited;
end;


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