Einzelnen Beitrag anzeigen

Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#6

Re: Allgemeines Problem in meinem Programm/ Threads!?

  Alt 2. Mär 2010, 00:17
Ist natürlich nicht so gut, wenn du unter Zeitdruck bist. Ich versuche trotzdem für dich, ein bisschen Licht ins Dunkle zu bringen ...

Zitat:
Okay, dann muss ich mich jetzt mal ganz dumm stellen. Ich habe schon mal hier irgend eine Frage gestellt und da wurde dann auch von einem Timer geredet. Ich weiß nur nicht, wie ein Timer funktioniert und wozu er im Allgemeinen zu gebrauchen ist. Und von einem Idle-Event habe ich leider auch noch nie was gehört.
Den Timer findest du in der Palette unter "System". Den ziehst du einfach auf deine Form (wie alles andere auch). Im Objektinspektor siehst du dann, dass dieser mehrere Eigenschaften besitzt - die wichtigen wären "Enabled" und "Interval". Nun klickst du auf den Timer doppelt drauf - die Prozedur, die für dich dann generiert wird, wird alle Interval-Millisekunden aufgerufen, wenn Enabled=True ist. Du könntest den Timer zum Beispiel alle 100 MS aktiv werden lassen (deine hinterlegte Prozedur wird dann eben immer in dem Intervall aufgerufen), und dann bestimmte Dinge checken - zum Beispiel ob eine Bombe explodieren müsste. Das mit dem Timer ist zwar nicht optimal, aber wohl mehr als ausreichend.

Und ich habe jetzt erstmal angefangen zu verstehen, wie das mit den Klassen und so funktioniert. Da bin ich auch noch nicht besonders bewandert. Ich bin eben noch ein blutiger Anfänger. Selbst wenn ich schon seit 1 1/2 Jahren programmiere. Ich programmiere erst seit einem halben Jahr intensiv und interessiert, vorher war eben nur im Unterricht so ein par Basics. Deshalb arbeite ich im Moment nur in einer Klasse, und zwar der Form1. Mein Freund sagte mir auch schon, ich sollte mal anfangen, objektorientiert zu arbeiten. Nur glaube ich nicht, dass ich das schaffe, bis Freitag oder Montag umzustellen, zumal ich von dem Thema kaum Ahnung habe. Zeitdruck ist nicht gut, aber es wird sich auf jedenfall auszahlen. Ich versuche das mal im Ansatz zu erklären. Du hast jetzt vermutlich ein paar TImage-Teile auf deine Form gezogen und arbeitest damit. Du benutzt also die Klasse TImage und benutzt Instanzen davon (z.B. deine Bomben, Männchen, Spielfelder..), die für dich automatisch erzeugt werden beim Programmstart (weil du sie per Designer auf die Form gezogen hast). Eine neue Klasse definierst du im "type" Abschnitt ganz oben. Das könnte für eine Bombe so aussehen:

Delphi-Quellcode:
type TBombe = class(TImage)
public
  ExplodierZeit: Cardinal; //Wann macht es Bumm?
end;
Das heißt, dass TBombe ein TImage ist, nur mit der zusätzlichen Eigenschaft "ExplodierZeit".
Damit du später auf die Bomben zugreifen kannst, könntest du dir eine einfache Liste dafür nehmen.
Das könnte dann so in deiner TForm1 aussehen:

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  {...}
  private
    Bomben: TList;
  {...}
end;
Die Liste erzeugst du am besten im OnCreate deiner Form:

Bomben := TList.Create; Jetzt müssen die Bomben natürlich noch erstellt werden. Dafür gehst du dahin, wo die Taste dafür gedrückt wird, und machst folgendes:

Delphi-Quellcode:
var
  Bombe: TBombe;
begin
  Bombe := TBombe.Create(Self); //Bombe erstellen
  Bombe.Parent := Self; //Bombe auf dem Fenster platzieren
  Bombe.Top := 10; //Koordinaten setzen
  Bombe.Left := 10;
  Bombe.Picture.LoadFromFile('bombe.jpg');
  Bombe.Visible := True; //Anzeigen
  Bombe.ExplodierZeit := GetTickCount + 5000; //Achtung: Bombe explodiert in 5 Sekunden!!!
  Bomben.Add(Bombe); // Der Liste hinzufügen, damit späterer Zugriff klappt
end;
Jetzt ist die Bombe da und du weißt immer, welche Bomben es gerade gibt, einfach über die Liste "Bomben". Damit erspart man sich auch später diesen FindComponent() Kram. Jetzt musst du eigentlich nur noch in deinen Timer gehen und dort folgendes machen:

Delphi-Quellcode:
var
  i: Integer;
begin
  for i := 0 to Bomben.Count - 1 do //Alle Bomben die es gibt durchgehen
  begin
    if GetTickCount > TBombe(Bomben[i]).ExplodierZeit then //Zeit erreicht?
      MessageBeep; //Boom, Bombe ist hochgegangen
  end;
end;
Wenn du dich damit nur ein klein bisschen beschäftigt wirds schnell klar. Ich habe jedenfalls auch lange genug ohne OOP gefrickelt und wenn man das irgendwann lernt, ist das wirklich wie eine Erleuchtung
Du könntest deine Klassen noch erweitern - zum Beispiel könntest du eine SpielfeldX und SpielfeldY Koordinate an die Klassen packen, und wenn diese gesetzt werden, wird automatisch Top und Left gesetzt, quasi umgerechnet auf Form-Koordinaten aus Spielfeld-Koordinaten heraus. Eine eigene TMaennchen-Klasse könnte noch den Spielernamen beinhalten, Spielerfarbe, oder sonstwas.

Alles hier ist ungetestet, aber sollte den Ansatz hoffentlich klar machen. Ist ärgerlich unter Zeitdruck zu stehen, aber es lohnt sich auf jedenfall - wenn nicht jetzt, dann hoffentlich irgendwann


Gute Nacht.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat