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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke für die fixe Antwort :wink: .

Folgendes vermutlich "Leichtes" aber ich komme nicht drauf,hätte ich noch nachzufragen :

a) Da wäre wieder das

const
MyImages: Array[1..2] of String =
('X_A.png', 'X_1.png');


Wo genau gebe ich das denn ein ? Über var?

Ich hatte bisher die MyImages Variable nur unter "var" deklariert.

b) Waren soweit meine anderen Befehle richtig?

Also :

ImageName[1]:=MyImages[1];
Image1.Picture.LoadFromFile(ImageName[1]);
Image.1.Picture.Enabled:=False,


und

if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[3]) then
ShowMessage('Ich habe gewonnen');
?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Toni hat geschrieben:Waren soweit meine anderen Befehle richtig?
Soweit ja, warum du das Image jedoch deaktivierst und wieder aktivierst habe ich nicht verstanden.

Ich fasse mal zusammen (obwohl das eher deine Aufgabe wäre):

- du hast 9 Images
- diese sollen am Anfang "leer" sein
- mit zwei Radiobuttons (RB1, RB2), möchtest du festlegen, welches Bild in ein angeklicktes Image geladen wird
- sobald in 3 (von 9) Images 3 gleiche Bilder geladen wurden, ist das Spiel gewonnen.

Von Anfang an:
Erstelle ein leeres Formular und lege 2 Radiobuttons (von dir gewählt: RB1, RB2) darauf ab. Nun fügst du 9 Images ebenfalls dem Formular hinzu.

Bleiben wir mal bei den gewählten Bezeichnern. Du deklarierst global:

Code: Alles auswählen

var
  ImageName: Array[1..9] of String//aktuell in jeweiliges Image geladenes Bild
 
const
  MyImages: Array[1..2] of String =
    ('X_A.png', 'X_1.png')//möglich ladbare Bilder


Kommen wir zu Punkt 1: "9 Images sollen am Anfang leer sein".
Im Ereignis OnCreate des Formulars würde ich nun definieren, dass die Images leer sind. Würdest du ImageName[1]..[9]:=' '; machen, hätten alle 9 ImageNamen den gleichen Namen (obwohl leer) und das Spiel wäre schon gewonnen. Daher gibst Du jedem ImageNamen einfach eine andere Bezeichnung z.B. ImageName[1]:='NoImage1'; ImageName[2]:='NoImage2'; usw. Oder als Schleife:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i:=1 to 9 do ImageName[i]:='NoImage' + IntToStr(i)//kein Bild ist geladen!
end;


Nun zu Punkt 2: "mit zwei Radiobuttons (RB1, RB2), möchtest du festlegen, welches Bild in ein angeklicktes Image geladen wird". Das hattest Du soweit richtig (das mit dem Enabled:=False hatte ich nicht verstanden), allerdings fehlt noch die Abfrage, ob nun schon das Spiel gewonnen wurde (das machst du am besten in einer separaten Procedure "TesteGewonnen". Die entsprechenden "OnClick"-Ereignisbehandlungsroutinen der Images sehen dann wie folgt aus:

Code: Alles auswählen

procedure TForm1.Image1Click(Sender: TObject);
begin
  if RB1.Checked then
    ImageName[1]:=MyImages[1];
  if RB2.Checked then
    ImageName[1]:=MyImages[2];
 
  if FileExists(ImageName[1]) then  //Testen, ob Bild existiert
    Image1.Picture.LoadFromFile(ImageName[1]);
 
  TesteGewonnen;
end;
 
procedure TForm1.Image2Click(Sender: TObject);
begin
  if RB1.Checked then
    ImageName[2]:=MyImages[1];
  if RB2.Checked then
    ImageName[2]:=MyImages[2];
 
  if FileExists(ImageName[2]) then
    Image2.Picture.LoadFromFile(ImageName[2]);
 
  TesteGewonnen;
end;     
 
...


Nun zu Punkt 3: "sobald in 3 (von 9) Images 3 gleiche Bilder geladen wurden, ist das Spiel gewonnen". Wie zuvor geschrieben, erstellst du für den Test eine separate Procedure "TesteGewonnen". Dazu gehst du in deine Klasse vom Formular z.B. "TForm1" und schreibst in den "private" Teil:

Code: Alles auswählen

  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
...
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
  private
    { private declarations }
    procedure TesteGewonnen;  //<-- diese Procedure und Drückst <Strg> + <Shift> + <c>
  public   

Mit dem drücken der Tastenkombination <Strg> + <Shift> + <c> aktivierst du die Autovervollständigung und es wird eine blanke Procedure mit "begin" und "end" im Implementierungsteil erstellt.

Dort kannst du nun überprüfen, ob 3 gleiche Images vorhanden sind. Z.B.:

Code: Alles auswählen

procedure TForm1.TesteGewonnen;
begin
  if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[3]) then
    ShowMessage('Ich habe gewonnen');
end;


Komplizierter wird es, wenn du statt nur 3 Images 4 Images auf dem Formular hast. Dann müsstest Du schon mehr Kombinationen testen:

Code: Alles auswählen

procedure TForm1.TesteGewonnen;
begin
  if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[3]) then
    ShowMessage('Ich habe gewonnen');
 
  if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[4]) then
    ShowMessage('Ich habe gewonnen');
 
  if (ImageName[2] = ImageName[3]) and (ImageName[2] = ImageName[4]) then
    ShowMessage('Ich habe gewonnen');
end;


Bei noch mehr Images lohnt es sich, diese Abfrage per Schleife zu machen. Ein Beispiel dafür hatte ich schon weiter oben gepostet gehabt.

So nun hat diese Erklärung etwa die zehnfache Zeit gedauert, als das Ganze in Code zu fassen und hier zu posten. Ich hoffe Dir hilft es!!!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke wieder :wink: ,so sieht es bei mir momentan aus :

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  Buttons, StdCtrls;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    Image5: TImage;
    Image6: TImage;
    Image7: TImage;
    Image8: TImage;
    Image9: TImage;
    Label1: TLabel;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure Image2Click(Sender: TObject);
    procedure Image3Click(Sender: TObject);
    procedure Image4Click(Sender: TObject);
    procedure Image5Click(Sender: TObject);
    procedure Image6Click(Sender: TObject);
    procedure Image7Click(Sender: TObject);
    procedure Image8Click(Sender: TObject);
    procedure Image9Click(Sender: TObject);
 
  private
    { private declarations }
    procedure Sieger;
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
  Bild: Array[1..9] of String;
 
  const
    MeineBilder: Array[1..2] of String =
    ('X_G.png','2026_0.jpg');
 
 
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 image1.Visible:=True;
 image2.Visible:=True;
 image3.Visible:=True;
 image4.Visible:=True;
 image5.Visible:=True;
 image6.Visible:=True;
 image7.Visible:=True;
 image8.Visible:=True;
 image9.Visible:=True;
 
 
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 Image1.Picture.LoadFromFile('heftig.jpg');
 Image1.Enabled:= True;
 Image2.Picture.LoadFromFile('heftig.jpg');
 Image2.Enabled:= True;
 Image3.Picture.LoadFromFile('heftig.jpg');
 Image3.Enabled:= True;
 Image4.Picture.LoadFromFile('heftig.jpg');
 Image4.Enabled:= True;
 Image5.Picture.LoadFromFile('heftig.jpg');
 Image5.Enabled:= True;
 Image6.Picture.LoadFromFile('heftig.jpg');
 Image6.Enabled:= True;
 Image7.Picture.LoadFromFile('heftig.jpg');
 Image7.Enabled:= True;
 Image8.Picture.LoadFromFile('heftig.jpg');
 Image8.Enabled:= True;
Image9.Picture.LoadFromFile('heftig.jpg');
 Image9.Enabled:= True;
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
begin
 Bild[1]:='Bild1'; Bild[2]:='Bild2';
 Bild[3]:='Bild3'; Bild[4]:='Bild4';
 Bild[5]:='Bild5'; Bild[6]:='Bild6';
  Bild[7]:='Bild7'; Bild[8]:='Bild8';
   Bild[9]:='Bild9';
 
end;
 
procedure TForm1.Image1Click(Sender: TObject);
begin
 
 if RadioButton1.Checked=True then
 begin
   Bild[1]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[1]:=MeineBilder[2];
 
    if FileExists(Bild[1]) then
       Image1.Picture.LoadFromFile(Bild[1]);
 
 
 Sieger;
    end;
 
end;
 
procedure TForm1.Image2Click(Sender: TObject);
begin
 if RadioButton1.Checked=True then
 begin
   Bild[2]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[2]:=MeineBilder[2];
 
    if FileExists(Bild[2]) then
       Image1.Picture.LoadFromFile(Bild[2]);
 
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Image3Click(Sender: TObject);
begin
 if RadioButton1.Checked=True then
 begin
   Bild[3]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[3]:=MeineBilder[2];
 
    if FileExists(Bild[3]) then
       Image1.Picture.LoadFromFile(Bild[3]);
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Image4Click(Sender: TObject);
begin
 if RadioButton1.Checked=True then
 begin
   Bild[4]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[4]:=MeineBilder[2];
 
    if FileExists(Bild[4]) then
       Image1.Picture.LoadFromFile(Bild[4]);
 
  Sieger;
 
    end;
 
end;
 
procedure TForm1.Image5Click(Sender: TObject);
begin
  if RadioButton1.Checked=True then
 begin
   Bild[5]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[5]:=MeineBilder[2];
 
    if FileExists(Bild[5]) then
       Image1.Picture.LoadFromFile(Bild[5]);
 
 
   Sieger;
 
    end;
 
end;
 
procedure TForm1.Image6Click(Sender: TObject);
begin
 if RadioButton1.Checked=True then
 begin
   Bild[6]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[6]:=MeineBilder[2];
 
    if FileExists(Bild[6]) then
       Image1.Picture.LoadFromFile(Bild[6]);
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Image7Click(Sender: TObject);
begin
   if RadioButton1.Checked=True then
 begin
   Bild[7]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[7]:=MeineBilder[2];
 
    if FileExists(Bild[7]) then
       Image1.Picture.LoadFromFile(Bild[7]);
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Image8Click(Sender: TObject);
begin
  if RadioButton1.Checked=True then
 begin
   Bild[8]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[8]:=MeineBilder[2];
 
    if FileExists(Bild[8]) then
       Image1.Picture.LoadFromFile(Bild[8]);
 
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Image9Click(Sender: TObject);
begin
  if RadioButton1.Checked=True then
 begin
   Bild[9]:=MeineBilder[1];
 Image1.Enabled:= False;
 end;
 if RadioButton2.Checked=True then
    begin
    Bild[9]:=MeineBilder[2];
 
    if FileExists(Bild[9]) then
       Image1.Picture.LoadFromFile(Bild[9]);
 
 
 Sieger;
 
    end;
 
end;
 
procedure TForm1.Sieger;
begin
 if (Bild[1] = Bild[2]) and (Bild[1] = Bild[3])
 THEN begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[10] = Bild[11]) and (Bild[10] = Bild[12])then
   begin
     Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//2
if (Bild[4] = Bild[5]) and  (Bild[4] = Bild[5]) then
   begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[13] = Bild[14]) and (Bild[13] = Bild[15]) then
   begin
     Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//3
if (Bild[7] = Bild[8])  and (Bild[8] = Bild[9]) then
   begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[16] = Bild[17]) and (Bild[16] = Bild[18]) then
   begin
     Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//4
if (Bild[1] = Bild[4]) and (Bild[1] = Bild[7]) then
   begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[10] = Bild[13]) and (Bild[10] = Bild[16]) then
   begin
    Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//5
if (Bild[2] = Bild[5])  and (Bild[2] = Bild[8]) then
   begin
    Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[11] = Bild[14]) and (Bild[11] = Bild[17]) then
begin
    Label1.Caption:='Spieler 1 hat gewonnen!';
end;
//6
if (Bild[3] = Bild[6]) and (Bild[3] = Bild[9]) then
   begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[12] = Bild[15])  and (Bild[12] = Bild[18]) then
   begin
    Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//7
if (Bild[1] = Bild[5]) and (Bild[1] = Bild[9]) then
   begin
     Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[10] = Bild[14]) and (Bild[10] = Bild[18]) then
   begin
     Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
//8
if (Bild[3] = Bild[5]) and (Bild[3] = Bild[7]) then
   begin
    Label1.Caption:='Spieler 2 hat gewonnen!';
   end;
if (Bild[12] = Bild[14]) and (Bild[12] = Bild[16]) then
   begin
     Label1.Caption:='Spieler 1 hat gewonnen!';
   end;
end;
 
 
 
end.                                                   


Leider funktioniert es immer noch nicht richtig.

a) Selektiere ich RB1 und klicke auf ein Bild passiert gar nichts.
b) Selektiere ich RB2 und klicke auf ein Bild verändert es sich richtig, aber die Meldung "Spieler 1 hat gewonnen" kommt.
Zuletzt geändert von Lori am Mo 9. Feb 2015, 18:24, insgesamt 1-mal geändert.
Grund: Bitte den richtigen Highlighter verwenden.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Ich denke, ich habe dir genug Infos gegeben. Ansonsten siehe http://www.lazarusforum.de/viewtopic.php?p=74566#p74566

Anbei das, wie ich es oben erklärt und von dir verstanden hatte, etwas verkürzt. K.A., ob dir das was hilft, weil verstehen musst du es ja von selbst :wink:
Dateianhänge
BspSieheOben.zip
(6.59 KiB) 51-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke :wink: allerdings habe ich ein Problem mit dem Beispiel,sobald ich es öffne zeigt es mir überhaupt nix an d.h die gesamte Projekt.lpi ist leer,weder TForm noch sonst irgendwas.

Liegts bei mir?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Unter Projekt -> Formulare -> Form1 auswählen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von theo »

Habe in einem Android Tutorial einen guten Hinweis gelesen:

Note: Just as much as you’re training in programming syntax and frameworks, it’s important to train yourself to have a successful programming mindset — one that won’t accept file X not found as a final answer. 90% of this mindset is simply training yourself to keep trying till you find a solution.


Ich bin mir nicht sicher, ob die Form der Hilfe wie sie in diesem Thread stattfindet zur selbständigen Lösungssuche anregt.
Mir scheint, so lernt man vor allem beim kleinsten Widerstand ins Forum zu posten, und am Ende kommt einem noch nicht mal mehr in den Sinn, eine Datei zu öffnen. :wink:

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

theo hat geschrieben:Ich bin mir nicht sicher, ob die Form der Hilfe wie sie in diesem Thread stattfindet zur selbständigen Lösungssuche anregt.
Ich hatte eine Möglichkeit zur Problemlösung ausführlich gepostet und gehofft er fragt, wenn er etwas zum Ansatz nicht versteht. Da das nicht der Fall ist, habe ich auch keine weitere Lust. Das Projekt an sich, wird ihm tatsächlich wenig nützen, wenn er den Code nicht lesen kann.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von theo »

Michl hat geschrieben:
theo hat geschrieben:Ich bin mir nicht sicher, ob die Form der Hilfe wie sie in diesem Thread stattfindet zur selbständigen Lösungssuche anregt.
Ich hatte eine Möglichkeit zur Problemlösung ausführlich gepostet und gehofft er fragt, wenn er etwas zum Ansatz nicht versteht. Da das nicht der Fall ist, habe ich auch keine weitere Lust. Das Projekt an sich, wird ihm tatsächlich wenig nützen, wenn er den Code nicht lesen kann.


War nicht persönlich gemeint. Ich habe in diesem Fall nur relativ schnell bemerkt, dass der TE sich vielleicht erst einmal hinter die Bücher klemmen sollte.
viewtopic.php?p=74566#p74566
Und danach kam auch keine Hoffnung mehr auf... :wink:

Antworten