Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Image Visible ? (https://www.delphipraxis.net/85199-image-visible.html)

Blackheart 27. Jan 2007 09:23


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.

Hawkeye219 27. Jan 2007 10:27

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:
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;
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:

Delphi-Quellcode:
type
  TImageManager = class
  private
    FImages : array of TImage;
  public
    procedure AddImage (aImage: TImage);
    function GetVisibleImage (var aImage: TImage): Boolean;
  end;
Gruß Hawkeye

Blackheart 27. Jan 2007 12:14

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;

bitsetter 27. Jan 2007 16:51

Re: Image Visible ?
 
Hast du den Random Generator im onCreate Ereignis der Form mit der Procedur System.randomize; auch inizialisiert?

Blackheart 27. Jan 2007 17:46

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;

bitsetter 27. Jan 2007 20:31

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(...);

Hawkeye219 27. Jan 2007 20:56

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. Hier kann man nachlesen, daß tatsächlich alles mit rechten Dingen zugeht. Auch in der DP findet man diverse Threads, in denen über dieses Thema diskutiert wird.

@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

Blackheart 27. Jan 2007 21:16

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:
Image1   Image2   Image3
Image4   Image5   Image6
Bei Klick aufs image wird es ausgeblendet und sieht dann je nachdem
so aus.

Code:
False    False    Image3
False    Image4    False
Den Würfel Array hab Ich dann schon so geändert das er nur noch zwei
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 :?

Hawkeye219 27. Jan 2007 21:54

Re: Image Visible ?
 
Ok, nun wird es etwas klarer.

Zitat:

Zitat von Blackheart
Ich könnte auch sämtliche Möglichkeiten mit if durchprüfen ob false oder true aber das wäre wohl nicht das wahre.

Das brauchst du auch nicht, das macht ja die Funktion GetVisibleImage bereits. Du mußt nur für jeden Würfel die Funktion erneut aufrufen, damit sie dir den nächsten freien Platz (das nächste sichtbare Bild) liefert. Aber hier hast du jetzt ein logisches Problem: wenn du das TImage nach dem Laden einer Bilddatei nicht versteckst (Visible := False), dann findet es die Funktion beim nächsten Aufruf wieder, da es ja noch sichtbar ist. Somit würde ein neuer Ladebefehl das zuvor geladene Bild überschreiben.

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

Blackheart 27. Jan 2007 22:31

Re: Image Visible ?
 
Zitat:

Zitat von Hawkeye219
Aber hier hast du jetzt ein logisches Problem: wenn du das TImage nach dem Laden einer Bilddatei nicht versteckst (Visible := False), dann findet es die Funktion beim nächsten Aufruf wieder, da es ja noch sichtbar ist. Somit würde ein neuer Ladebefehl das zuvor geladene Bild überschreiben.

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

Jetzt ist der Groschen gefallen, das ist aber auch manchmal...
Vielen Dank für deine Mühe, damit sollte Ich weiterkommen. :thumb:


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