![]() |
Image Visible ?
Hallo Leute
Hab da mal ein kleines Problem Ich hab 6 Images davon sind zb. 4 Visible False, und nun 2 Bilder die Ich laden möchte aber eben in die, die noch zu sehen sind. Also Image 1,3,5,6 sind False also müsste Ich die Bilder in 2 und 4 laden aber das kann ntürlich auch wechseln. 2 False dann 4 Bilder laden. Muss Ich das jetzt alles einzeln Prüfen oder gibt es da eine einfachere Lösung. |
Re: Image Visible ?
Hallo Blackheart,
wenn du Referenzen auf die TImage-Komponenten in ein (statisches oder dynamisches) Array packst, kannst du mit einer einfachen Hilfsroutine den nächsten freien Platz ermitteln:
Delphi-Quellcode:
Du kannst die ganze Verwaltung der Bilder auch in eine Klasse stecken. Diese benötigt nur zwei Methoden: eine zum Hinzufügen von Bildern zur (internen) Liste und die obige Routine zum Ermitteln des nächsten freien Platzes:
var
Images : array [0..5] of TImage; // evtl. dynamisches Array function GetVisibleImage (var aImage: TImage): Boolean; var i : Integer; begin for i := 0 to High(Images) do begin aImage := Images[i]; Result := aImage.Visible; if Result then Exit; end; Result := False; end; var Image : TImage; begin // einmalige Initialisierung des Arrays Images[0] := Image1; ... Images[5] := Image6; // beliebige Anzahl von Tests if GetVisibleImage(Image) then Image.LoadFromFile (...); end;
Delphi-Quellcode:
Gruß Hawkeye
type
TImageManager = class private FImages : array of TImage; public procedure AddImage (aImage: TImage); function GetVisibleImage (var aImage: TImage): Boolean; end; |
Re: Image Visible ?
Vielen Dank Hawkeye219
Das klappt soweit, falls das Image false ist nimmt er das nächste. Nur das er Mir immer nur das letzte Bild "Wuerfel[5]" anzeigt. Wüsste jetzt aber nicht wo da der Fehler liegt.
Delphi-Quellcode:
var
Wuerfel: Array of Integer; i:Integer; begin SetLength(Wuerfel,6); SetLength(Images,6); Images[0] := Image1; Images[1] := Image2; Images[2] := Image3; Images[3] := Image4; Images[4] := Image5; Images[5] := Image6; for i:=0 to 5 do begin Wuerfel[i]:=random(6)+1; Listbox1.Items.Add(IntToStr(Wuerfel[i])); end; if GetVisibleImage(Image) then begin Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[0])+'.bmp'); Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[1])+'.bmp'); Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[2])+'.bmp'); Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[3])+'.bmp'); Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[4])+'.bmp'); Image.Picture.LoadFromFile (ExtractFilePath(Paramstr(0))+IntToStr(Wuerfel[5])+'.bmp'); end; end; |
Re: Image Visible ?
Hast du den Random Generator im onCreate Ereignis der Form mit der Procedur System.randomize; auch inizialisiert?
|
Re: Image Visible ?
Jo hab Ich, aber das hatt ja ansich mit dem Problem nichts zu tun das ist ja nur für den Wuerfel Array das haut ja hin.
Wie Ich das sehe läuft die function von Hawkeye219 den Array ab und bricht dann beim ersten gefundenen freien Platz ab. Berichtigt Mich wenn Ich da was falsch seh.
Delphi-Quellcode:
function GetVisibleImage (var aImage: TImage): Boolean;
var i : Integer; begin for i := 0 to High(Images) do begin aImage := Images[i]; Result := aImage.Visible; if Result then Exit; end; Result := False; end; |
Re: Image Visible ?
Nach meiner Meinung nach bricht er ab, wenn das erste gefundene Image Visible ist.
Außerdem zählt er dabei wohl wegen high() von hinten nach vorne also von 6 nach 0 dadurch zeigt er immer das letzte Bild "Wuerfel[5]" an (wohl wegen Codeoptimierung). Versuche mal folgenden Code.
Delphi-Quellcode:
procedure LoadImage;
var i : Integer; begin for i := Low(Images) to High(Images) do if Images[i].Visible then Images[i].Picture.LoadFromFile(...); |
Re: Image Visible ?
Hallo Leute,
laßt euch nicht durch eine eventuelle Codeoptimierung verwirren. Wenn der Compiler tatsächlich Code erzeugen würde, der die Daten in umgekehrter Reihenfolge liefert, wäre das eine Code-Zerstörung, keine Optimierung. ![]() @Blackheart Du hast meinen Code schon richtig analysiert. Die Funktion sucht das erste sichtbare Image in der Liste und liefert dir einen Zeiger darauf (Variable aImage). Im Erfolgsfall kehrt sie mit dem Rückgabewert True zurück, ansonsten liefert sie den Wert False. In deinem Code lädst du nacheinander 6 Bilder in eine TImage-Komponente. Dies geschieht so schnell, daß nur das letzte Bild zu sehen ist. Vielleicht solltest du etwas ausführlicher beschreiben, was du eigentlich erreichen möchtest. Dann wird es für uns einfacher, dir zu helfen. Gruß Hawkeye |
Re: Image Visible ?
Ist noch etwas schwer mit Mir hab noch nicht viel mit Arrays gemacht.
Ich versuchs mal etwas genauer zu beschreiben. Ich hab Sechs Images drei nebeneinander und drei darunter.
Code:
Bei Klick aufs image wird es ausgeblendet und sieht dann je nachdem
Image1 Image2 Image3
Image4 Image5 Image6 so aus.
Code:
Den Würfel Array hab Ich dann schon so geändert das er nur noch zwei
False False Image3
False Image4 False Bilder lädt aber eben wohin, in dem Fall in Image3 und Image4 also die Bilder sollen immer dahin geladen werden wo sie noch True sind. Das klappt mit deiner function im Prinzip genau richtig aber eben nur für ein Bild. Ich könnte auch sämtliche Möglichkeiten mit if durchprüfen ob false oder true aber das wäre wohl nicht das wahre. Hoffe das war etwas verständlicher :? |
Re: Image Visible ?
Ok, nun wird es etwas klarer.
Zitat:
Vielleicht ist die Sichtbarkeit eines Bildes doch nicht das richtige Kriterium, und du möchtest nur leere TImages mit einem Bild füllen? Gruß Hawkeye |
Re: Image Visible ?
Zitat:
Vielen Dank für deine Mühe, damit sollte Ich weiterkommen. :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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