AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit Struktur einer If then

Ein Thema von sexmagic · begonnen am 14. Sep 2007 · letzter Beitrag vom 16. Sep 2007
Antwort Antwort
Seite 1 von 3  1 23      
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#1

Problem mit Struktur einer If then

  Alt 14. Sep 2007, 21:59
Schönen Abend,

ich habe ein Problem mit der Strukturierung meines Programms, derzeit löse ich das Problem mit einer if Kontrollabfrage, leider führt dies zu unschönen nebenerscheinungen.


Hier erstmal der Code:
Delphi-Quellcode:
//Timer
procedure TForm3.Timer1Timer(Sender: TObject);
begin
  if PicCount >= Form1.Memo1.Lines.Count-1 then
    begin
      PicCount := 0;
    end
  else
    begin
      Inc(PicCount);

     if (PicCount mod 5) = 0 then
       begin
          //ShowMessage(IntToStr(PicCount mod 5));
          Fadeout(ExtractFilePath(Application.ExeName)+'TempImage.bmp');
          FadeIn(ExtractFilePath(Application.ExeName)+'HZImage.bmp');
          sleep(2000);
          Fadeout(ExtractFilePath(Application.ExeName)+'HZImage.bmp');
        end
     else
        begin
         Fadeout(ExtractFilePath(Application.ExeName)+'TempImage.bmp');
         JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[PicCount]);
         FadeIn(ExtractFilePath(Application.ExeName)+'TempImage.bmp');
        end;
    end;
end;
Kurze Erklärung:
Ich habe ein Image das heisst TempImage und eins das heisst HZImage, beides sind Bitmaps.
Das Tempimage wird bei jedem Aufruf mit einem Kovertierten JPG dessen Pfad vorher aus einem Memo gelesen wird überschrieben.
Das HZImage ist ein Statisches Bitmap.
Ich möchte gerne das das HZImage nach jedem 5 Bild automatisch eingeblendet wird, das Problem ist das ich die Bilder mit Fadein und Fadeout rein uns raus Fade.

PicCount ist eine Variable die die Zeilenzahl des Memos mit den Bilderpfaden enthält und wird zum hochzählen der Bilder verwendet.

Mein Problem ist jetzt das ich beim ersten durchlauf schonmal ein Fadeout mache da ich das im 2ten durchlauf benötige damit das Image auch ausgefadet wird, das führt dazu das ich erst einen Scharzen Bildschrim habe und dann auf einmal ein Bild ausfaden sehe das auf einmal da ist.
Weiters führt das zu dem Problem das bei Bild 5 Das Bild ausgefadet werden muss, anschliessend das HZImage wieder eingefadet werden muss und dann aber sofort wieder raus da im nächsten durchlauf je das HZImage nicht beartet wird und sonst im Hintergrund stehen bleibt, was leider wieder dazu führt das das HZImage nur kurz angezeigt wird und anschliessend die restliche Timerzeit ein Schwarzer Screen da ist.


Ich hoffe es war verständlich erklärt.

Vielleicht könnte mir jemand helfen eine bessere Lösung zu finden in der das Programm und die ein und Ausblendungen sauber funktionieren, aber mir fehlt die Kreativität.

Danke schon im voraus!
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Problem mit Struktur einer If then

  Alt 14. Sep 2007, 22:26
hm mit dem Sleep Befehl in einem Timer zu arbeiten finde ich grade etwas komisch. Ich würde eher eine Schleife oder einen eigenen Thread benutzen. Kann man dein Problem nicht so lösen:


Delphi-Quellcode:

n:=Memo1.lines.count-1;

for i:=0 to n do
begin
  if i mod 5 = 0 then
    filename:=ExtractFilePath(Application.ExeName)+'HZImage.bmp'
  else
    filename:=ExtractFilePath(Application.ExeName)+'TempImage.bmp';
  
  FadeIn(filename);
  sleep(2000);
  Fadeout(filename);

end;
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Problem mit Struktur einer If then

  Alt 14. Sep 2007, 22:32
Danke für die Antwort!

Das Problem warum ichs nicht in einer Schleife mache ist das das Programm so lange in einer Endlosschleife alle Bilder immerwieder durchgeht bis das Programm beendet wird.

Es geht um eine SlideShow die in einem Schaufenster Bilder abspielen soll.

Darum der Timer, das Sleep hab ich nur eingefügt zum testen.

EDIT:
Habs jetzt mal umgebaut da die Idee mit der Variable eigentlich eine super Lösung ist, leider ist der Timer nicht so ideal vielleicht finden wir da auch noch ne andere Lösung?

Hier mal der aktuelle Code:
Delphi-Quellcode:
//Timer
procedure TForm3.Timer1Timer(Sender: TObject);
var
  ImageFile: string;
begin
  if PicCount >= Form1.Memo1.Lines.Count-1 then
    begin
      PicCount := 0;
    end
  else
    begin
      Inc(PicCount);

     if (PicCount mod 5) = 0 then
        ImageFile := ExtractFilePath(Application.ExeName)+'HZImage.bmp'
     else
        ImageFile := ExtractFilePath(Application.ExeName)+'TempImage.bmp';
     end;

    JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[PicCount]);
    FadeIn(ImageFile);
    sleep(2000);
    Fadeout(ImageFile);
  end;
Das Problem ist jetzt noch das die Bilder nur Kurz angezeigt werden und dann der Screen bis zum nächten Timeraufruf schwarz ist.

Jedenfalls nochmal vielen Dank für die genial einfache Idee mit der Variabl, warum ist mir das nicht selbst eingefallen
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 13:31
Du solltest auf jedenfall von dem Timer wegkommen. Der ist für solche Aufgaben ziemlich ungeeignet!!!
Okay, die simpelste Lösung wäre vielleicht, wenn du ein Application.processmessages einbaust, um der Anwendung zeit zu geben, ihre Systembefehle zu verarbeiten.

Delphi-Quellcode:
n:=Memo1.lines.count-1;

for i:=0 to n do
begin
  if i mod 5 = 0 then
    filename:=ExtractFilePath(Application.ExeName)+'HZImage.bmp'
  else
    filename:=ExtractFilePath(Application.ExeName)+'TempImage.bmp';
 
  JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[PicCount]);
  FadeIn(filename);
  sleep(2000);
  application.processmessages;
  Fadeout(filename);

end;
Probier das mal aus, wenn das nicht so funktioniert, wie du es haben willst, würde ich einen Thread vorschlagen.

Nochwas: Ich hab so ein bisschen das Gefühl, dass deine JpegToBmp Funktion aus einem JPG File ein Bitmap file macht und dann immer auf der Festplatte abspeichert. Du kannst auch direkt im Speicher das JPG zu einem Bitmap konvertieren, das geht a) schneller und b) hast du hinterher keine Überflüssigen Dateien auf deiner Platte:

Delphi-Quellcode:
//zu der uses deklaration im kopf kommt hinzu:
uses jpeg;

//[...]
function JPEGtoBMP(filename:string):tbitmap;
var jpeg:TJPEGImage;
    bmp:TBitmap;
begin
 jpeg:=TJPEGImage.Create;
 bmp:=TBitmap.Create;
 try
   jpeg.LoadFromFile(Filename);
   bmp.Assign(jpeg);
 finally
   freeandnil(jpeg);
 end;
result:=bmp;
end;
Aufrufen kannst du das ganze z.B. so:

Delphi-Quellcode:
 bmp:=JPEGtoBMP(Form1.Memo1.Lines[PicCount]);
//jetzt hast du in bmp direkt das in ein bmp konvertierte JPEG Bild im Speicher und kann damit basteln

Grüße
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 14:33
Hallo,

kannst du mir vielleicht erklären warum ein Timer hier nicht ideal ist, ich dachte das ist genau der richtige Einsatz für einen Timer?

Wenn du meinst das es wesentlich besser ist mit einer Schleife zu arbeiten dann werd ich das natürlich umbauen.

Ich habe im linken oberen Eck ein Image platziert das wie ein TV Logo angezeigt werden soll, wenn ein Image ein oder aus Fadet dann blinkt das ganz grässlich kann es sein das das auch mit dem Timer zusammen hängt?

Danke für deine Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 14:52
ich hab übrigens meinen Post oben nochmal etwas editiert, mit noch ein paar tips!

Der Timer ist wegen deinem "sleep" etwas schlecht. Der Timer wird in festen intervallen aufgerufen. Durch das sleep kann es theoretisch passieren, dass dein Timer zum zweiten mal aufgerufen wird, obwohl der erste Aufruf des Timers noch gar nicht fertig abgearbeitet ist, sprich das bild noch nicht fertig herausgefaded ist.

Wenn du es unbedingt mit einem Timer machen willst, dann bitte das "sleep" weg. Möglich wäre auch sowas hier, allerdings bekomme ich dann wieder haue von den Forumscracks hier, die meinen, das wäre "unschön" programmiert:

Delphi-Quellcode:
private
 Imagefile:string;
 PicCount:integer;
 
//[...]

procedure TForm3.Timer1Timer(Sender: TObject);
begin
if PicCount > 0 then
      Fadeout(ImageFile);

  if PicCount >= Form1.Memo1.Lines.Count-1 then
      PicCount := 1
  else
      Inc(PicCount);

  if (PicCount mod 5) = 0 then
   ImageFile := ExtractFilePath(Application.ExeName)+'HZImage.bmp'
  else
   ImageFile := ExtractFilePath(Application.ExeName)+'TempImage.bmp';
  end;

    JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[PicCount]);
    FadeIn(ImageFile);

  end;

Als sauber programmiert würde ich das betrachten, wenn du das Bild einmal von der Festplatte lädst, dann reinfadest, wartest und OHNE das bild nochmal von der Festplatte zu laden wieder rausfadest...

Aber funktionieren sollte es natürlich auch so

Nochmal Grüße
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#7

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 15:11
im übrigen, solltest du in deinem onTimer ereignis erst mal den timer disablen und zum schuss wieder enablen.. dann biste auf der sicheren seite.
  Mit Zitat antworten Zitat
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 15:15
WOW Da komm ich ja schon fast nichtmehr hinterher.

Also meine JPGtoBMP Funktion speichert das Kovertierte File immer über das TempImage.bmp das hol ich mir dann immer.

Ich muss ds nicht zwingend mit einem Timer machen war mir als Anfänger nur der einfachste und schnellste Weg um das zu realisieren.

Ich hab das nun versucht in eine Schleife umzubauen, das haut aber nicht ganz hin komischwerweise habe ich in Zähler i eine riesen zahl drin.
Hier mal der Code des Form.Show indem ich das reingebaut habe.

Delphi-Quellcode:
procedure TForm3.FormShow(Sender: TObject);
var
  ImageFile: string;
  n, i: integer;
begin
    n:= Form1.Memo1.Lines.Count-1;
    ShowMessage(inttostr(i) + '< i to n >' + inttostr(n));
    for i:=0 to n do
      begin

        //----------------------------------------------------------------------
        if PicCount >= Form1.Memo1.Lines.Count-1 then
          PicCount := 0
        else
          Inc(PicCount);

        //----------------------------------------------------------------------
        if i mod 5 = 0 then
          ImageFile:=ExtractFilePath(Application.ExeName)+'HZImage.bmp'
        else
            ImageFile:=ExtractFilePath(Application.ExeName)+'TempImage.bmp';


        //----------------------------------------------------------------------
            JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[PicCount]);
            FadeIn(ImageFile);
            sleep(8000);
            Application.ProcessMessages;
            Fadeout(ImageFile);
      end;
end;
Im der Message steht nun "4551088 < i to n > 17"
Woher kommt diese Zahl in i, ist die Schleife nun so oft durchgelaufen, es wurde kein Bild angezeigt.


EDIT:
Der Timer ist doch disabled und wird erst beim Aufrufs des Form3 aus Form1 aktiviert.
Oder verstehe ich dich falsch?
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 15:20
Dein showmessage mit dem i steht vor der schleife, d.h. deine variable i ist noch gar nicht initialisiert und hat noch irgendeinen wert, den sie bekommen hat, als ihr ein stückchen speicher zugewiesen worden ist.

schieb das showmessage mal in die schleife rein, dann siehst du, dass i richtig läuft

nochwas: du brauchst doch gar kein piccount mehr, oder?

Delphi-Quellcode:
procedure TForm3.FormShow(Sender: TObject);
var
  ImageFile: string;
  n, i: integer;
begin
    n:= Form1.Memo1.Lines.Count-1;

    for i:=0 to n do
      begin
    
        ShowMessage(inttostr(i) + '< i to n >' + inttostr(n));
    
       //----------------------------------------------------------------------
        if i mod 5 = 0 then
          ImageFile:=ExtractFilePath(Application.ExeName)+'HZImage.bmp'
        else
          ImageFile:=ExtractFilePath(Application.ExeName)+'TempImage.bmp';


        //----------------------------------------------------------------------
            JpegToBmp(Form1.Edit1.Text + Form1.Memo1.Lines[i]);
            FadeIn(ImageFile);
            sleep(8000);
            Application.ProcessMessages;
            Fadeout(ImageFile);
      end;
end;
Grenzgänger meint, dass du verhinden kannst, dass der Timer aufgerufen wird, solange das OnTimer Ereignis vom vorherigen aufruf des Timers noch nicht abgearbeitet ist. Die idee is cool Aber auch nicht wirklich sauber

Grüße
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Problem mit Struktur einer If then

  Alt 15. Sep 2007, 15:34
Haste recht , aber die Schleife rennt nur einmal durch dann freest das Programm.

Hab mal mit dem Debugger durchgezapt, es rennt eine Endlosschleife in der Fading schleife:
Delphi-Quellcode:
for x := 0 to (Bitmap.Width - 1) do
          begin
            Row[x].rgbtRed := (step * BaseRow[x].rgbtRed) shr 5;
            Row[x].rgbtGreen := (step * BaseRow[x].rgbtGreen) shr 5; // Fading //
            Row[x].rgbtBlue := (step * BaseRow[x].rgbtBlue) shr 5;
          end;
Vielleicht stimmt was mit dem Bildinformationen nicht die das Fading bekommt und nun versucht der etwas zu faden was er nicht hinbekommt oder sowas.

Eigentlich ist an dem Auslesen des Bildes ja nichts verändert worden und auch das Faden ist noch beim alten.

Piccount benötige ich somit nicht mehr unbedingt ich brauch aber trotzdem etwas womit ich den Zeiger wieder auf 0 Stellen kann sobald er das letzte Bild erreicht hat da das ja als Endlosschleife laufe soll.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 15:09 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