Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Problem mit Bilder laden (https://www.delphipraxis.net/112004-problem-mit-bilder-laden.html)

Landfloh 13. Apr 2008 09:03


Problem mit Bilder laden
 
Hallo

Ich habe ein Problem. :!:

Ich habe ein Programm geschrieben mit dem ich eigentlich nur Bilder schnell hitereinander abspielen möchte.

Hier der Quellcode:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var Fortschritt: Integer;
begin
  Fortschritt := Fortschritt + 1;
  if Fortschritt = 1 then
  begin
    Image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Soz1L\Eigene Dateien\Eigene Bilder\X_Wing3.jpg');
  end;
  if Fortschritt = 2 then
  begin
    Image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Soz1L\Eigene Dateien\Eigene Bilder\X_Wing5.jpg');
  end;
  if Fortschritt = 3 then
  begin
    Image1.Picture.LoadFromFile('C:\Dokumente und Einstellungen\Soz1L\Eigene Dateien\Eigene Bilder\X_Wing7.jpg');
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  Timer1.Enabled := true;
end;
Wenn ich das Programm starte gibt es keine Fehlermeldung nur eine Warnung das die Veriable möglicherweise nich initialisiert ist. Aber wenn ich auf den Button kliche passiert nicht?

Kannmir jemand helfen? :?:

Landfloh

Fussball-Robby 13. Apr 2008 09:06

Re: Problem mit Bilder laden
 
Da Fortschritt eine lokale Variable ist, wird sie bei jedem OnTimer-Ereignis neu gesetzt, un da du ihren Wert nicht bestimmst(bzw. nur 1 draufaddierst) ist der Wert unbestimmt(bzw. nicht initialisiert). Am besten bestimmst du Fortschritt im private-Teil der Form als Eigenschaft und setzt es beim OnCreate auf 0.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    Fortschritt: Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
Mfg

Landfloh 13. Apr 2008 09:12

Re: Problem mit Bilder laden
 
Zitat:

Zitat von Fussball-Robby
Da Fortschritt eine lokale Variable ist, wird sie bei jedem OnTimer-Ereignis neu gesetzt, un da du ihren Wert nicht bestimmst(bzw. nur 1 draufaddierst) ist der Wert unbestimmt(bzw. nicht initialisiert). Am besten bestimmst du Fortschritt im private-Teil der Form als Eigenschaft und setzt es beim OnCreate auf 0.
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    Fortschritt: Integer;
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
Mfg

Super! :dancer: Es geht jetzt.
Danke.

DeddyH 13. Apr 2008 09:53

Re: Problem mit Bilder laden
 
Mit case statt der If-Abfragen wäre das Ganze aber übersichtlicher (und AFAIR auch schneller).
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const Pfad = 'C:\Dokumente und Einstellungen\Soz1L\Eigene Dateien\Eigene Bilder\';
begin
  Fortschritt := Fortschritt + 1;
  case Fortschritt of
    1: Image1.Picture.LoadFromFile(Pfad + 'X_Wing3.jpg');
    2: Image1.Picture.LoadFromFile(Pfad + 'X_Wing5.jpg');
    3: Image1.Picture.LoadFromFile(Pfad + 'X_Wing7.jpg');
  end;
end;

Die Muhkuh 13. Apr 2008 09:57

Re: Problem mit Bilder laden
 
Und ganz böse ist die Bilder von einem hardcodierten Pfad zu laden!

Kopiere die Bilder lieber ins Anwendungsverzeichnis Deines Programmes und hole Dir diesen Pfad mittels ExtractFilePath(Application.ExeName);

Fussball-Robby 13. Apr 2008 10:00

Re: Problem mit Bilder laden
 
Außerdem könntest du die Bilder auch von 1 - 3 durchnummerieren, dann bräuchtest du Case garnicht:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var FName: String;
begin
  Inc(Fortschritt);
  FName := ExtractFilePath(ParamStr(0)) + 'X_Wing' + IntToStr(Fortschritt) + '.jpg';
  if FileExists(FName) then
    Image1.Picture.LoadFromFile(Fname);
end;
Mfg

DeddyH 13. Apr 2008 10:06

Re: Problem mit Bilder laden
 
Noch eine Möglichkeit:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const Bilder: array[1..3] of string = ('X_Wing3.jpg','X_Wing5.jpg','X_Wing7.jpg');
begin
  Fortschritt := Fortschritt + 1;
  Image1.Picture.LoadFromFile(ExtractFilePath(ParamStr(0)) + Bilder[Fortschritt]);
  Timer1.Enabled := Fortschritt < 3;
end;
[edit] Eine Klammer vergessen [/edit]

Die Muhkuh 13. Apr 2008 10:09

Re: Problem mit Bilder laden
 
Und dann stellen wir noch sicher, dass auch immer der PathDelimiter dran ist:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
const Bilder: array[1..3] of string = ('X_Wing3.jpg','X_Wing5.jpg','X_Wing7.jpg');
begin
  Fortschritt := Fortschritt + 1;
  Image1.Picture.LoadFromFile(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + Bilder[Fortschritt]);
  Timer1.Enabled := Fortschritt < 3;
end;

DeddyH 13. Apr 2008 10:12

Re: Problem mit Bilder laden
 
Und dann erstellen wir uns eine Funktion, die das für uns übernimmt (kann ja auch ein anderer Pfad sein) und eine weitere, die uns mitteilt, ob das Laden funktioniert hat ;)

Die Muhkuh 13. Apr 2008 10:16

Re: Problem mit Bilder laden
 
Ach, Du bist doch doof. :tongue:

DeddyH 13. Apr 2008 10:17

Re: Problem mit Bilder laden
 
[OT] Aber da steh ich zu :P [/OT]

SaFu 13. Apr 2008 10:49

Re: Problem mit Bilder laden
 
Ich habe mach das immer Mit einer FileListBox

Delphi-Quellcode:
procedure TForm4.Timer2Timer(Sender: TObject);
begin
  if FileListBox1.Items.Count > 0 then
   begin
     if index > FileListBox1.Items.Count -1 then
      index:= 0; //index auf "O" setzen
        FileListbox1.Selected[index]:= true; //Aktuellen index makieren
          bild:= Lowercase(ExtractFileExt(FileListBox1.FileName));

      if (bild = '.jpg') then //Pfad + .jpg
        begin
         ImageBilderanzeige.Picture.LoadFromFile(FileListBox1.FileName);
        end;

       if (bild = '.bmp') then
        begin
         ImageBilderanzeige.Picture.LoadFromFile(FileListBox1.FileName);
        end;

       if (bild = '.gif') then
        begin
         ImageBilderanzeige.Picture.LoadFromFile(FileListBox1.FileName);
        end;

     inc(index); //Index +1
    LabAnzahlBilder.Caption:= 'Bild '+ IntToStr(index)+' von '+ IntToStr(FileListBox1.Items.Count);
   end

   else
    begin
     if Form1.MessageDlgPos2('Es sind keine Bilder vorhanden ',mtInformation,[mbok],self) = mrok then
     Timer2.Enabled:= False;
    end;
 end;
Aber vielleicht gibt es ja bei meinem Code Verbesserungen??

Gruß Sascha

DeddyH 13. Apr 2008 11:43

Re: Problem mit Bilder laden
 
Dialoge in einem Timer-Event finde ich irgendwie suboptimal.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf