Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Mehrere Images --> Imagex ??? (https://www.delphipraxis.net/192232-mehrere-images-imagex.html)

Maurooon 31. Mär 2017 16:57

Delphi-Version: 7

Mehrere Images --> Imagex ???
 
Hey Community,

ich bin gerade dabei etwas zu programmieren, für das ich mehrere Images benutze. Mit meinen bisherigen Kenntnissen würde ich die entsprechenden Zeilen jetzt X mal kopieren und jeweils die Nummer des Images ändern. Nur muss das doch einfacher gehen. Klar kann ich nicht ImageX schreiben, weil woher will das Programm wissen das X eine Variable ist. Gibt es eine Möglichkeit die Nummer eines Images irgendwie durch eine Art Variable zu ersetzen, damit man die ganze Prozedur nicht X mal kopieren muss? Ich hoffe es ist ansatzweise klar was mein Problem ist.

Hier ein weiterer Erklärungsversuch:

Ich hätte gern sowas wie:

Code:
begin
 for i := 1 to 5 do begin
  Imagei.visible := true;
 end;
end;
statt so:

Code:
begin
 Image1.visible := true;
 Image2.visible := true;
 Image3.visible := true;
 Image4.visible := true;
 Image5.visible := true;
end;
in meinem Fall benutze ich sogar weitaus mehr als 5 Images :D


Ich hoffe mein Problem ist zu genügend erläutert. Vielen Dank schonmal jetzt

Mit freundlichen Grüßen
Maurooon

Der schöne Günther 31. Mär 2017 17:04

AW: Mehrere Images --> Imagex ???
 
Zitat:

Zitat von Maurooon (Beitrag 1366084)
durch eine Art Variable zu ersetzen

Ein "Array of TImage". Ja, einmal musst du alle deine Images da reinstecken.

Aber später kannst du dann genau das sagen was du gerne hättest. nur dass statt "Imagei.visible := true;" dann dort halt "meinImageArray[i].visible := true;" steht.


(Kenne mich mit FreePascal nicht aus, hoffe das ist dort genauso)

DeddyH 31. Mär 2017 17:05

AW: Mehrere Images --> Imagex ???
 
Such mal hier im Forum nach Hier im Forum suchenFindComponent und den möglichen Alternativen dazu.

Maurooon 31. Mär 2017 19:44

AW: Mehrere Images --> Imagex ???
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1366087)
Zitat:

Zitat von Maurooon (Beitrag 1366084)
durch eine Art Variable zu ersetzen

Ein "Array of TImage". Ja, einmal musst du alle deine Images da reinstecken.

Aber später kannst du dann genau das sagen was du gerne hättest. nur dass statt "Imagei.visible := true;" dann dort halt "meinImageArray[i].visible := true;" steht.


(Kenne mich mit FreePascal nicht aus, hoffe das ist dort genauso)

Okay vielen Dank. Könnten Sie mir auch ein Beispiel für die Initialisierung eines ImageArrays zeigen?

LG

Maurooon 31. Mär 2017 20:12

AW: Mehrere Images --> Imagex ???
 
mhmm.... hab das Array nach googlen wie folgt definiert:

Code:
imagearray: array[1..20] of Timage;
und auch jeweils

Code:
imagearray[1] := Image1;
imagearray[2] := Image2;
imagearray[3] := Image3;
imagearray[4] := Image4;
imagearray[5] := Image5;
usw...

nur kriege ich wenn ich z.B. imageaaray[x].left := imagearray[x].left + 1; mache für x := 1 oder so, den error: Identifier idents no member "imagearray"

Jemand eine Lösung? Oder habe ich das Array falsch initialisiert?

a.def 31. Mär 2017 20:13

AW: Mehrere Images --> Imagex ???
 
Vergiss das Array.

=>

Delphi-Quellcode:
 for i := 1 to 5 do // begin in der nächsten Zeile. Das hier ist schließlich DELPHI ;)
  begin
   if Assigned((FindComponent('Image' + SysUtils.IntToStr(i)) as TImage))
    (FindComponent('Image' + SysUtils.IntToStr(i)) as TImage).Visible := True;
  end;
Ich würde das Ganze aber eher über eine TObjectList<TImage> machen.

Maurooon 31. Mär 2017 20:19

AW: Mehrere Images --> Imagex ???
 
Zitat:

Zitat von a.def (Beitrag 1366102)
Vergiss das Array.

=>

Delphi-Quellcode:
 for i := 1 to 5 do // begin in der nächsten Zeile. Das hier ist schließlich DELPHI ;)
  begin
   if Assigned((FindComponent('Image' + SysUtils.IntToStr(i)) as TImage))
    (FindComponent('Image' + SysUtils.IntToStr(i)) as TImage).Visible := True;
  end;
Ich würde das Ganze aber eher über eine TObjectList<TImage> machen.

Das ist mir viel zu kompliziert ehrlich gesagt. Könnten Sie mir das näher erklären oder eine etwas leichtere Variante vorschlagen? Mit FindComponent oder SysUtils habe ich noch nie gearbeitet.

a.def 31. Mär 2017 20:22

AW: Mehrere Images --> Imagex ???
 
Dann nehmen Sie am besten meinen Vorschlag wie oben. Da kann eigentlich nichts schiefgehen und allemal besser als ein Array ist es auch.
Delphi-Quellcode:
 for i := 1 to 5 do
  begin
   if Assigned((FindComponent('Image' + SysUtils.IntToStr(i)) as TImage)) // "SysUtils." kann auch weggelassen werden
    (FindComponent('Image' + SysUtils.IntToStr(i)) as TImage).Visible := True;
  end;
Rand-Info: die Zählung eines Arrays beginnt bei 0. Ein Array ist also 0-basiert. Das erste Element in einem Array steuert man mit [0] an, nicht [1].

Maurooon 31. Mär 2017 20:37

AW: Mehrere Images --> Imagex ???
 
Zitat:

Zitat von a.def (Beitrag 1366104)
Dann nehmen Sie am besten meinen Vorschlag wie oben. Da kann eigentlich nichts schiefgehen und allemal besser als ein Array ist es auch.
Delphi-Quellcode:
 for i := 1 to 5 do
  begin
   if Assigned((FindComponent('Image' + SysUtils.IntToStr(i)) as TImage)) // "SysUtils." kann auch weggelassen werden
    (FindComponent('Image' + SysUtils.IntToStr(i)) as TImage).Visible := True;
  end;
Rand-Info: die Zählung eines Arrays beginnt bei 0. Ein Array ist also 0-basiert. Das erste Element in einem Array steuert man mit [0] an, nicht [1].

Okay, habe es hinbekommen. Vielen lieben Dank! Verstehen tue ich das zwar nicht hunterprozentig und in Ihrem Quelltext fehlt das then :P aber dafür war ich clever genug :D Was genau macht dieses Assigned und dieses FindComponent jetzt?

a.def 31. Mär 2017 20:42

AW: Mehrere Images --> Imagex ???
 
Blöd ausgedrückt prüft Assigned ob das Objekt, das man prüft, zugewiesen (also nicht nil) wurde oder nicht.
FindComponent sucht ein Objekt mit dem Namen den man als String übergeben hat. Hier werden also "Image1" bis "Image5" übergeben.
"as TImage" behandelt das gefundene Objekt dann wie ein TImage soweit ich weiß aber das geht sicher noch viel schöner und vorallem besser.

Man könnte das Ergebnis auch in eine Variable zwischenspeichern dann wird es schöner:

Delphi-Quellcode:
var
 aImg: TImage;
begin
 // ...

 for i := 1 to 5 do
  begin
   aImg := (FindComponent('Image' + SysUtils.IntToStr(i)) as TImage);

   if Assigned(aImg) then
    aImg.Visible := True;
  end;
Aber ich betone: ich bin kein Profi und hier schlummern bestimmt Exceptions :P
Wenn man aber seine Image1...5 alle korrekt als TImage hat sollte es keine Fehler geben.
Wenn ich natürlich einen TButton habe der Image1 heißt wäre das doof.


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