AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Image Visible ?

Ein Thema von Blackheart · begonnen am 27. Jan 2007 · letzter Beitrag vom 27. Jan 2007
Antwort Antwort
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#1

Image Visible ?

  Alt 27. Jan 2007, 09:23
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.
Blackheart
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Image Visible ?

  Alt 27. Jan 2007, 10:27
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
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Image Visible ?

  Alt 27. Jan 2007, 12:14
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;
Blackheart
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Image Visible ?

  Alt 27. Jan 2007, 16:51
Hast du den Random Generator im onCreate Ereignis der Form mit der Procedur System.randomize; auch inizialisiert?
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Image Visible ?

  Alt 27. Jan 2007, 17:46
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;
Blackheart
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Image Visible ?

  Alt 27. Jan 2007, 20:31
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(...);
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Image Visible ?

  Alt 27. Jan 2007, 20:56
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
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Image Visible ?

  Alt 27. Jan 2007, 21:16
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
Blackheart
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Image Visible ?

  Alt 27. Jan 2007, 21:54
Ok, nun wird es etwas klarer.

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
  Mit Zitat antworten Zitat
Blackheart

Registriert seit: 4. Mai 2005
846 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Image Visible ?

  Alt 27. Jan 2007, 22:31
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.
Blackheart
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 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