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 wieder :wink: kennst du auch den Picture-Befehl dafür?

Also ich würde mir dass jetzt folgendermaßen denken,ich habe die 4 Bilder und würde nun in die 3 Bilder immer dieselben Befehle einfügen,weil es 3 Konstellationen gibt mit denen sich das Bild von 4 wechseln/unsichtbar werden lässt lässt:

Ich habe in der Picture-List die Bilder
1. "A" und 2. "B" und füge in T-Image 1-3 den Befehl ein :

If in T-Image 1 picture A is open and in T-Image 2 picture A is open and in T-Image 3 Picture A is open change the picture of T-IMage 4.

oder

If in T-Image 1 picture A is open and in T-Image 2 picture A is open and in T-Image 3 Picture A is open make T-Image 4 invisible.


Könntest du mir da einmal beispielhaft die erste Zeile schreiben?


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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Danke :wink: .

Ich habe jetzt ein bisschen weitergearbeitet und hänge momentan an der Zeile :

if (Image1.Picture.LoadFromFile('X_G.png')) and ((Image2.Picture.LoadFromFile('X_G.png')) and ((Image3.Picture.LoadFromFile('X_G.png')) then
begin
Label1.Caption:='Spieler 2 hat gewonnen!';
end;

Er zeigt mir dauernd folgende Fehlermeldung an :"Fatal : Syntax Error , "(" expected but THEN found

Kann mir jemand sagen wie ich die beheben/umgehen kann?

Weitere/weniger "C"-Zeichen schaffen keine Abhilfe!

Danke!

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Zähl mal die Klammern, ob Du alle Klammern, die Du aufmachst auch wieder zumachst.

PS: Ob wohl die Abfrage, ob drei Images geladen wurden, eine gute Prüfung für ein gewonnenes Spiel ist???

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 »

Habe ich schon war leider nicht der Fehler :| , schon weitere Varianten wie :

if ((Image1.Picture.LoadFromFile('X_G.png')) and ((Image2.Picture.LoadFromFile('X_G.png')) and ((Image3.Picture.LoadFromFile('X_G.png')) then

if ((((Image1.Picture.LoadFromFile('X_G.png'))) and (((Image2.Picture.LoadFromFile('X_G.png'))) and (((Image3.Picture.LoadFromFile('X_G.png'))) then

etc. durchprobiert.

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Ich sehe gerade, dass Picture.LoadFromFile() eine Procedure ist, da geht das sowieso nicht so!!!

Aber wenn es eine boolesche Funktion wäre, was willst Du denn mit den vielen Klammern (2 Klammern hattest Du vergessen zu zu machen!)???

Besser wäre es dann, die unnötigen Klammern einfach weg zu lassen:

Code: Alles auswählen

 if Image1.Picture.LoadFromFile('X_G.png') and Image2.Picture.LoadFromFile('X_G.png') and Image3.Picture.LoadFromFile('X_G.png') then

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 erstmal :wink: .

Hmm wie mache ich das denn dann?

Also dass Lazarus bei 3 gleichen Bildern erkennt,dass jemand gewonnen hat?

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Genau umgekehrt. Du musst mit einem Array z.B.

Code: Alles auswählen

var
  Stimmt: Array[1..3] of Boolean;
...
  if Stimmt[1] and Stimmt[2] and Stimmt[3] then ...
oder anders abfragen, ob ein Spiel gewonnen wurde. Danach lädst Du entsprechende Bilder.

Da ich Dein Programm aber nicht kenne, kann ich Dir auch nicht die optimalste sondern nur eine Möglichkeit nennen.

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 »

Da ich das Programm nicht auf meinem Laptop habe,kann ich es leider derzeit nicht hochladen/kopieren.

Wie weise ich denn den einzelnen "Stimmts" die Bilder hinzu?

Ich habe praktisch 9 Images, sobald ein Image angeklickt wird ändert sich per LFI das Bild und das Image wird disabled.
Bei drei disableden Bildern mit selben Bild soll ein Gewinner angezeigt werden.

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Ok, Du musst ja wissen, welches Bild nach einem Klick geladen werden muss. Du kannst sowas machen:

Code: Alles auswählen

var
  ImageName: Array[1..3] of String;
 
procedure TForm1.Image1Click(Sender: TObject);
begin
  ImageName[1]:='X_G.png';   //Einfach vor dem Laden des Images den Namen in eine Variable speichern und diese dann vergleichen
  Image1.Picture.LoadFromFile(ImageName[1]);
 
  if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[3]) then
    ShowMessage('Ich habe gewonnen');
end;   

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: .

Also müsste ich das dann alle vorhandenen Möglichkeiten die das jeweilige Bild betreffen in das Image.Click einfügen?

Wenn also jemand gewonnen hat wenn :

1,3,4 oder 17,8 aufgedeckt werden, müsste in TForm.Image1.Click folgendes stehen :

ImageName[1]:='X_G.png';
ImageName[3]:='X_G.png';
ImageName[4]:='X_G.png';
ImageName[7]:='X_G.png';
ImageName[8]:='X_G.png';

Kann ich diese Deklarierungen auch gleich als globale Variable machen?


Image1.Picture.LoadFromFile(ImageName[1]);

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

if (ImageName[1] = ImageName[7]) and (ImageName[1] = ImageName[8]) then
ShowMessage('Ich habe gewonnen');

So richtig?

Wenn ich jetzt zwei verschiedene Bilder habe und wie ändere ich denn die Zuweisung?

Also praktisch dass es die 2 Varianten mit dem Bild X_G gibt,aber auch mit einem anderen Bild -> Man klickt also nacheinander 1x X_G,dann das andere Bild.

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Hast Du nun 3 Images oder 9? Hast Du 3 Images und 9 Bilder, die jeweils in eines der Images geladen werden können? Du verwirrst mich, aber ich versuche mal Deine Gedanken zu interpretieren.

Nochmal auf Anfang:
Du hast ...viele Bilder, die Du laden möchtest. Diese würde ich in einem Array als Konstante definieren. Z.B., wenn es 20 sind:

Code: Alles auswählen

const
  MyImages: Array[1..20] of String =
    ('X_A.png', 'X_B.png', 'X_C.png', 'X_D.png', 'X_E.png',
     'X_F.png', 'X_G.png', 'X_H.png', 'X_I.png', 'X_J.png',
     'X_K.png', 'X_L.png', 'X_M.png', 'X_N.png', 'X_O.png',
     'X_P.png', 'X_Q.png', 'X_R.png', 'X_S.png', 'X_T.png');  
Einem anderen Array würde ich die Namen zuweisen, die dann tatsächlich in die Images geladen werden:

Code: Alles auswählen

var
  ImageName: Array[1..9] of String;
Toni hat geschrieben:Also müsste ich das dann alle vorhandenen Möglichkeiten die das jeweilige Bild betreffen in das Image.Click einfügen?
Bei 9 Images, könntest Du für jedes Image einen OnClick-Eventhandler erstellen. In dem jeweiligen Handler weist Du immer den ImageName[1] entsprechend dem Image zu, also Image1 den ImageName[1]:='Mein Bildname.png' oder bei Image2 den ImageName[2]:='Mein Bildname XYZ.png' usw. zu (es geht auch ein Eventhandler für alles Image1..9 zu nutzen, aber das verwirrt Dich glaube ich erstmal). Als zweiten Schritt führst Du eine Procedure/Function aus, die nun, egal welches Image geändert wurde, alle ImageNamen testet, ob 3 davon gleich sind. Z.B. so:

Code: Alles auswählen

procedure TForm1.Image1Click(Sender: TObject);
begin
  ImageName[1]:=MyImages[1]; //ich weiss nicht, wie Du entscheidest, welches Bild geladen wird!
//oder
  ImageName[1]:=MyImages[2];
//oder
  ImageName[1]:=MyImages[IrgendeineZaehlvariable1];  //eine Variable, die im oben defnierten Array einen Wert von 1..20 annehmen könnte
 
  Image1.Picture.LoadFromFile(ImageName[1]);
 
  TesteGewonnen;
end;
 
procedure TForm1.Image2Click(Sender: TObject);
begin
//hier das Gleiche
  ImageName[2]:=MyImages[IrgendeineZaehlvariable2];
  Image2.Picture.LoadFromFile(ImageName[2]);
 
  TesteGewonnen;
end;
 
procedure TForm1.Image3Click(Sender: TObject);
begin
  ImageName[3]:=MyImages[IrgendeineZaehlvariable3];
  Image3.Picture.LoadFromFile(ImageName[3]);
 
  TesteGewonnen;
end;
 
 
...  //usw
 
procedure TForm1.TesteGewonnen;  //nur aus der Kalten geschrieben, daher ungetestet
var
  i, j, Gleich: Integer;
  aImageName: String;
begin
  for i:=1 to 7 do begin
    aImageName:=ImageName[i];
    Gleich:=1;
    for j:=i + 1 to 9 do
      if (ImageName[j] = aImageName) then
      begin
        inc(Gleich);
        if Gleich = 3 then begin
          ShowMessage('Ich habe gewonnen');
          Break;
        end;
      end;
  end;
end;   
Toni hat geschrieben:Kann ich diese Deklarierungen auch gleich als globale Variable machen?
Das Array kann global oder in der Klasse deklariert sein.
Toni hat geschrieben:Wenn ich jetzt zwei verschiedene Bilder habe und wie ändere ich denn die Zuweisung?

Also praktisch dass es die 2 Varianten mit dem Bild X_G gibt,aber auch mit einem anderen Bild -> Man klickt also nacheinander 1x X_G,dann das andere Bild.
Siehe Bsp.

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 für die Mühe :wink:

Also ich habe 9 T-Images und 2 Bilder.

Werde mir das dann heute später richtig durchlesen,bekomme sonst Kompfschmerzen,danke aber nochmals :wink:

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Toni »

Habe leider doch jetzt erst wieder Zeit gefunden.

Also ich habe deine Grundstruktur soweit übernommen.

Als Variablen :
const
MyImages: Array[1..18] of String =
('X_A.png', 'X_A.png', 'X_A.png', 'X_A.png', 'X_A.png',
'X_A.png', 'X_A.png', 'X_A.png', 'X_A.png', 'X_1.png',
'X_1.png', 'X_1.png', 'X_1.png', 'X_1.png', 'X_1.png',
'X_1.png');
- Egal ob das sinnlos aussieht da es nur 2 Bilder sind,hauptsache ich bekomme es irgendwo hin :wink: .

Darunter dann :
var
ImageName: Array[1..18] of String;
Die einzelnen Image.Click,habe ich so gemacht wie von dir empfohlen:
ImageName[1]:=MyImages[1];
Image1.Picture.LoadFromFile(ImageName[1]);
Image.1.Picture.Enabled:=False, //Oder so ähnlich habe das Programm nicht da und versuche es es zurekonstruieren,das funktioniert jedenfalls.
In Ergänzung dazu dazu habe ich noch eine Radiobutton-Formel :

Also :
If RB2 selected then load MyImages[2],if RB1 selected load MyImages[1].

Als Gewinnerprozedur habe ich weitesgehend mein alte,nur mit deinen Ergänzungen umgeändert,also sieht die inetwa folgendermaßen aus :
if (ImageName[1] = ImageName[2]) and (ImageName[1] = ImageName[3]) then
ShowMessage('Ich habe gewonnen');

Allerdings tritt bei mir noch ein großes Problem auf,dazu 2 Fragen :

a) Wie ich gerade beim Lesen bemerkt habe,habe ich bei deinem MyArrac:image das "const" vergessen,könnte das den Fehler beeinflussen?

b) Der eigentlich Fehler :

Ich habe die 9 Image-Buttons von Anfang an auf Enabled:True gesetzt.

Ziel soll sein : Ich selektiere einen Radiobutton und der jeweilige Radiobutton lädt in dem angeklickten TImage ein anderes Bild als der Andere hoch (X_A -> RB1 , X_1 RB2).

Nun habe ich folgende zwei Probleme :

a) Wenn ich ohne einen Radiobutton angeklickt habe und trotzdem auf ein beliebiges TImage klicke,ändert sich das Bild richtigerweise nicht,aber erzeigt mir die Meldung an "Spieler 1 hat gewonnen".
b) Wenn ich einen Radiobutton selektiere,egal ob 1 oder 2 und dann auf einen TImage klicke,ändert sich richtigerweise das Bild in das jeweilige "Radio-Bild" aber er zeigt mir trotzdem an "Spieler 1 hat gewonnen".

Jetzt habe ich mir persönlich überlegt ob es etwas damit zu tuen hat,dass von Anfang an die TImages ein und dasselbe Bild vorgeladen haben -> hilft mir aber auch nicht weiter.


Ich hoffe du findest dich in meinem Wirrwarr zurecht :wink:

Vielen Dank!

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

Re: Bilder nacheinander durch Klick anzeigen lassen.

Beitrag von Michl »

Toni hat geschrieben:Jetzt habe ich mir persönlich überlegt ob es etwas damit zu tuen hat,dass von Anfang an die TImages ein und dasselbe Bild vorgeladen haben
So scheint es zu sein!

Daher musst Du wissen, in welchem Image, welches Bild geladen ist. Daher hatte ich Dir empfohlen, zu jedem Image (9 an der Zahl) eine String-Variable (also auch 9) zu erstellen, die den jeweiligen Namen des geladenen Bildes enthält. Daher sollte statt
Toni hat geschrieben:var
ImageName: Array[1..18] of String;
das Array eher so aussehen:

Code: Alles auswählen

var
ImageName: Array[1..9] of String;  //hier wird gespeichert, welches Bild gerade geladen bzw. angezeigt wird
Toni hat geschrieben:const
MyImages: Array[1..18] of String =
('X_A.png', 'X_A.png', 'X_A.png', 'X_A.png', 'X_A.png',
'X_A.png', 'X_A.png', 'X_A.png', 'X_A.png', 'X_1.png',
'X_1.png', 'X_1.png', 'X_1.png', 'X_1.png', 'X_1.png',
'X_1.png');
sollte bei zwei Bildern eher so aussehen:

Code: Alles auswählen

const
  MyImages: Array[1..2] of String =
    ('X_A.png', 'X_1.png');
PS: Falls es ein Spiel werden soll, dann kannst Du per Zufall den Images 1 bis 9 jeweils MyArray[1] oder MyArray[2] zuweisen (also zuerst ImageName[1..9], dann in Image1 bis Image9 entsprechend laden).

Code: Alles auswählen

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

Antworten