Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#47

Re: Allgemeines Problem in meinem Programm/ Threads!?

  Alt 17. Mär 2010, 14:06
Zitat von Simme:
Sorry, war das zu viel?
Eigentlich war das zu wenig, die Deklarationen der global verwendeten Typen und Variablen fehlen.

Dein Projekt ist extrem unübersichtlich, da alles in einer großen Methode steht.
Niemand will sich so etwas gern anschaun.
Du solltest mit Unterfunktionen mit Parametern und Rückgabewerten arbeiten.
Jede Unterfunktion erfüllt dabei genau eine Aufgabe.
Der Namen der Funktion kann die Aufgabe beschreiben.
Beipiel:
Delphi-Quellcode:
function TForm2.GetFeldImage(x, y: Integer): TImage;
begin
  Result := TImage(FindComponent('Feld' + IntToStr(y) + '_' + IntToStr(x)));
end;

function TForm2.SpielerFeldKollision(Spieler: TImage; Feld: TImage): Boolean;
begin
  Result := PtInRect(Feld.BoundsRect, Spieler.p1) or
            PtInRect(Feld.BoundsRect, Spieler.p2) or
            PtInRect(Feld.BoundsRect, Spieler.p3) or
            PtInRect(Feld.BoundsRect, Spieler.p4) or
end;

procedure TForm2.SpielerSieg(Spieler: TImage);
var
  sMsg: string;
begin
  if Spieler = Spieler1 then
    sMsg := Form1.name2 + ' ist tot! ' + Form1.name1 + ' hat gewonnen!'
  else
    sMsg := Form1.name1 + ' ist tot! ' + Form1.name2 + ' hat gewonnen!';

  ShowMessage(sMsg);
  Form1.Visible := True;
  Form1.Panel3.Visible := True;
  tot := True;
  Form2.Close;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
var
  FeldImage: TImage;

{...}

                      FeldImage := GetFeldImage(x_wert + zaehler, y_wert);
                      FeldImage.Picture.LoadFromFile('Bilder&Animationen\rot.bmp');
                      if SpielerFeldKollision(Spieler1, FeldImage) then
                          begin
                            SpielerSieg(Spieler2);
                            BREAK;
                          end;

                      if SpielerFeldKollision(Spieler2, FeldImage) then
                          begin
                            SpielerSieg(Spieler1);
                            BREAK;
                          end;
Das ist doch übersichtlicher und verständlicher als im Vergleich dein Konstrukt und das kommt auch gleich mehrmals vor:

Delphi-Quellcode:
                      TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Picture.LoadFromFile('Bilder&Animationen\rot.bmp');
                      If (((Spieler1.p1.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler1.p1.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler1.p1.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler1.p1.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler1.p2.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler1.p2.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler1.p2.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler1.p2.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler1.p3.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler1.p3.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler1.p3.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler1.p3.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler1.p4.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler1.p4.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler1.p4.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler1.p4.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))) Then
                          begin
                            ShowMessage(Form1.name1 + ' ist tot! ' + Form1.name2 + ' hat gewonnen!');
                            Form1.Visible := True; Form1.Panel3.Visible := True; tot := True;
                            Form2.Close;
                            BREAK;
                          end;
                      If (((Spieler2.p1.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler2.p1.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler2.p1.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler2.p1.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler2.p2.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler2.p2.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler2.p2.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler2.p2.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler2.p3.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler2.p3.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler2.p3.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler2.p3.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))
                        Or ((Spieler2.p4.X < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Width)
                        And (Spieler2.p4.X >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Left)
                        And (Spieler2.p4.Y < TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top + TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Height)
                        And (Spieler2.p4.Y >= TImage(FindComponent('Feld' + IntToStr(y_wert) + '_' + IntToStr(x_wert + zaehler))).Top))) Then
                          begin
                            ShowMessage(Form1.name2 + ' ist tot! ' + Form1.name1 + ' hat gewonnen!');
                            Form1.Visible := True; Form1.Panel3.Visible := True; tot := True;
                            Form2.Close;
                            BREAK;
                          end;
Dein eigentliches Problem ist aber, daß die OnTimer Methode im ProzessMessage rekursiv aufgerufen wird.
Das könnte verhindert werden, z.B. in dem der Timer wärend der Verarbeitung angehalten wird.

Delphi-Quellcode:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  try


  finally
    Timer1.Enabled := True;
  end;
end;
  Mit Zitat antworten Zitat