Bilder nacheinander durch Klick anzeigen lassen.

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Hallo liebe Community,

sorry für die nicht sehr detaillierte Überschrift doch ich bin noch relativ neu in Lazarus.

Zu meinem Problem :

Ich habe einen Image-Button und dort ein Bild eingefügt.

Jetzt möchte ich durch einen Klick auf das Bild ein anderes anzeigen lassen,also mit :

Image1.Picture.LoadFromFile

und jetzt zu meinem Problem :

Ich finde leider nirgendwo einen Befehl,wie ich es machen kann,das bei einem 2. Klick auf das Image wieder ein neues Bild erscheint.

Kann mir jemand von euch vielleicht mit Rat und Tat helfen?

Wäre klasse !

In jedem Fall noch ein schönes,erfolgreiches und gesundheitlich gutes Jahr 2015.

Danke :wink: !

Grüße Toni

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von m.fuchs »

Das kommt darauf an, wie du die Liste der verfügbaren Bilder abgespeichert hast.

Wenn beispielsweise alle Dateinamen in einem Array vorliegen:

Code: Alles auswählen

var
  PictureList: array[0..2] of String =
    ('/home/user1/images/06042012343.jpg',
     '/home/user1/images/01042012342.jpg',
     '/home/user1/images/08042012357.jpg');
Dann brauchst du nur noch eine Variable, die die Nummer des aktuellen Bildes speichert. Nennen wir sie mal ActualPicture.

Und dann kommt folgender Code zum Zuge:

Code: Alles auswählen

procedure TForm1.Image1Click(Sender: TObject);
begin
  Image1.Picture.LoadFromFile(PictureList[ActualPicture]);
  Inc(ActualPicture);
  if ActualPicture > High(PictureList) then
    ActualPicture := Low(PictureList);
end;
  • Du lässt das Bild laden.
  • Der Wert von ActualPicture wird um 1 erhöht. Damit beim nächsten Klick das nächste Bild geladen wird.
  • Du prüfst, ob der Wert von ActualPicture höher als der Maximalwert für das Array PictureList ist.
  • Wenn dem so ist, dann wird ActualPicture auf den Minimalwert für PictureList gesetzt. Damit geht es wieder von vorne los.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

Ich habe einen Image-Button und dort ein Bild eingefügt.
Wen du damit einen BitBtn meinst, kannst du es so machen.

Code: Alles auswählen

procedure TForm1.Image1Click(Sender: TObject);
begin
  Image1.Picture.LoadFromFile(PictureList[ActualPicture]);
 
  BitBtn1.Glyph := Image1.Picture.Bitmap;  // Im BitBtn wird das Bild von Image1 angezeigt.
 
  Inc(ActualPicture);
  if ActualPicture > High(PictureList) then
    ActualPicture := Low(PictureList);
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Vielen Dank :wink: das hat mich schon ein Stück weitergebracht.

Allerdings tuen sich für mich -> entschuldigt mein geringes Verständnis von der Sprache noch ein paar Fragen auf.

a) Das ActualPicture -> schreibe ich das als Variable so : ActualPicture : string; ?

b) Ich habe ein Problem damit den richtigen Pfad einzugeben,habe einige Varianten durchprobiert allerdings findet er nie den Bildpfad.

In meinem Fall wäre der

'/C:/user/dokumente/mygames/outofmap.jpg'

Weitere Versuche :

'/home/user/dokumente/mygames/outofmap.jpg'
'home/user/dokumente/mygames/outofmap.jpg'
'C:/user/dokumente/mygames/outofmap.jpg'

Wäre erneut dankbar für die Unterstützung.

c) Und noch eine neue Frage die sich mir aufgetan hat ->

In meinem Beispiel verwende ich 4 T-Image.

Ich habe mir die IF-Bedingungen durchgelesen und auch teilweise schon einfache mit eigenen Beispielen hinbekommen,allerdings hätte ich gerne eine die Folgendes macht (Sprachlich beschrieben ):

Ich möchte in3 Images dieselben Bilder öffnen,das denke ich ist kein Problem -> dann hätte ich aber gerne Folgendes :

If T-Image 1 zeigt Bild 1 von der Bildliste und If T-Image 2 zeigt Bild 1 von der Bildliste und If T-Image 3 zeigt Bild 1 von der Bildliste Then T-Image 4 soll sein aktuelles Bild ändern.

Funktioniert so etwas? (Entschuldigung für die ungenaue Formulierung.)

Ich danke wieder für eure Zeit und Geduld mein Wirrwarr zu entziffern :wink:

Grüße Toni

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

a) Das ActualPicture -> schreibe ich das als Variable so : ActualPicture : string; ?
nein

Code: Alles auswählen

var
  ActualPicture:integer=0;
  PictureList: array[0..2] of String =
    ('06042012343.jpg',
     '01042012342.jpg',
     '08042012357.jpg');
b) Ich habe ein Problem damit den richtigen Pfad einzugeben,habe einige Varianten durchprobiert allerdings findet er nie den Bildpfad.
Wen die Dateien sich im gleichen Ordner befinden, wie dein Programm, kannst die Pfadangabe weglassen, wie Code oben.

c) versteh ich nicht ganz.

PS: Verwendest du Linux oder Windows ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke :wink: :) ich verwende Windows.

Ich versuche c) nochmal genauer zu beschreiben.

Also ich klick 1x auf T-Image 1 -> dann müsste sich ja das erste Bild in der Liste öffnen.

Also ich klick 1x auf T-Image 2 -> dann müsste sich ja das erste Bild in der Liste öffnen.

Also ich klick 1x auf T-Image 3 -> dann müsste sich ja das erste Bild in der Liste öffnen.

und jetzt suche ich einen IF-Befehl mit dem ich sagen kann,dass wenn ich die obrigen 3 Vorgänge gemacht habe,das Bild von T-Image 4 automatisch wechselt.

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

Hilft dir dies weiter ?

Code: Alles auswählen

var
  image1geklickt: boolean = False;
  image2geklickt: boolean = False;
  image3geklickt: boolean = False;
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Image1Click(Sender: TObject);
begin
  image1geklickt := True;
  if image1geklickt and image2geklickt and image3geklickt then
    BildWechsel;
end;
 
procedure TForm1.Image2Click(Sender: TObject);
begin
  image2geklickt := True;
  if image1geklickt and image2geklickt and image3geklickt then
    BildWechsel;
end;
 
procedure TForm1.Image3Click(Sender: TObject);
begin
  image3geklickt := True;
  if image1geklickt and image2geklickt and image3geklickt then
    BildWechsel;
end;
 
procedure TForm1.BildWechsel;
begin
  // Bitmap austauschen
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke :wink: .

Das kommt der Sache schon nah.

Ich weiß nur nicht inwieweit bei dir der Bildwechsel für welches Bild zählt .

Ich versuche mir jetzt noch eine bessere Formulierung einfallen zu lassen. Schwirren momentan zu viele Ideen im Kopf rum.

Vielleicht geht das auch mit einem Button besser.

Also ich möchte dass wenn ich

a) Drei Bilder angeklickt habe mithilfe des Buttons zurück zu dem "Urbild" also dem voreingestellten bei allen 3 kommen.

Eventuell ist das einfacher :? ?

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

Zeig doch mal den Code, dann sieht man auch eher um was es geht. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von pluto »

Warum sollen in drei Image Komponenten das gleiche Bild angezeigt werden, wenn man auf ein Button klickt?

Das ergibt irgendwie kein Sinn... Du kannst jedoch auch eine TStringList für die Verwaltung nehmen, ist vielleicht einfacher als direkt ein Array...

Code: Alles auswählen

 
var
  FileList:TStringList;
 
OnCreate // Das OnCreate von From1 ist gemeint.
FileList.Add(...); // Z.B. unter Linux '/home/pluto/test1.png' unter Windows geht das anders, weil Windows andere Pfadangeben verwenden z.b. so C:\... da kenne ich aber die Verzeichnisstrukturen nicht.
 
// Ist in diesen Fall eine Methode von TFrom1
procedure TForm1.Load(const aIndex:integer);
[code]
  Image1.Picture.LoadFromFile(PictureList[const aIndex:integer]);
 
Wie du siehst, führen viele Wege nach Rom. Du könntest dir auch eine eigene Klasse erstellen, die Bilder verwalten kann und dann in eine TObjectList einfügen. Aber im Grunde haben alle Methoden eins Gemeinsam....
MFG
Michael Springwald

Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Mathias hat geschrieben:Zeig doch mal den Code, dann sieht man auch eher um was es geht. :wink:
Nun da ist nicht viel mehr Code als ich hier bisher bekommen habe :wink: .

Eventuell hilft es dir wenn ich es Mal an einem Beispiel erkläre was wohl für sowas auch passen könnte.

Also wenn man 4 Bilder + 4 T-Images hat,jedes mit einer Zahl . 1,2,3 und 4.

Einer soll die verdeckten Bilder anklicken in der Reihenfolge 1 bis 4.

Wenn er beispielweise auf die 1 und dann die 2 klickt und dann auf die 4,hätte ich gern das mithilfe einer IF-Bedingung die 3 Images wieder "vereckt" werden bzw. zu einem per Eigenschaft schon vorrausgesetzten Bild wechseln.

Also praktisch wenn er auf Bild 4 klickt.

If Picture 1 and Picture 2 are open, bring Picture 1,2 and 4 back to the first pic.

So verständlicher :o?

@pluto : Danke für die Hilfe aber das ist dann noch komplizierter für mich,auch wenn deine Variante wohl noch besser ist,mir reicht ein array :wink:

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

Wen ich sol lese, hast du Probleme, wie man verschachtelte if-Anweisungen schreibt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von pluto »

Code: Alles auswählen

 
  if (test1) and (test2) and (test3) then begin
    if (testa) then begin
    end;
  end;
 
Alle Variablen sind jetzt vom typ Boolean.
MFG
Michael Springwald

Toni
Beiträge: 18
Registriert: Di 6. Jan 2015, 18:18

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Genau Mathias,

ich habe mich da vorallem im zumwiki belesen aber da sind größtenteils auch nur allgemeine Fälle.

Hast du eine Idee?

@ pluto : Die Grundstruktur verstehe ich zumindestens nur das "Verbinden" nicht,also den Befehl dass nach dem Klick dass Bild auch zurücksetzt. Danke auch für deine Hilfe :wink: und entschuldige wenn ich als noch nichtmal ein Minimum an Lazarus-Verstehender - hier dauernd um Erklärung bitte.

Mathias
Beiträge: 6938
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Mathias »

Reicht dir das als Erklärung ?
True ist eine erfüllte Bedienung. ZB: 2=2
False is eine nicht erfüllte Bedienung. ZB: 2<>2

Code: Alles auswählen

  if (True) and (True) and (True) then begin
    Writeln('1 Erfüllt');
  end;
  if (True) and (False) and (True) then begin  // Wird nie ausgegeben.
    Writeln('2 nicht Erfüllt');
  end;
  if (False) or (False) or (False) then begin  // Wird nie ausgegeben.
    Writeln('3 nicht Erfüllt');
  end;
  if (False) or (True) or (False) then begin
    Writeln('4 Erfüllt');
  end;
  if (True) or ((True) and (False)) then begin
    Writeln('5 Erfüllt');
  end;
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten