Veränderung des Codes während der Laufzeit

Für Fragen von Einsteigern und Programmieranfängern...
Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Hallo zusammen,
ich möchte in Lazarus "Schiffe versenken" programmieren und habe folgendes Problem:
Um die Schiffe bzw. ihre Position festzulegen, lasse ich ein Panel auf dem Button erscheinen, der gedrückt wurde (Buttons sind hier sozusagen die Spielfelder).
Da somit 100 Buttons existieren, habe ich allen den gleichen Code per On-Cklick Ereignis gegeben, anstatt 100 Prozeduren mit gleichem Inhalt zu erstelllen.
Nun soll der Spieler seinen Flugzeugträger auf dem Spielfeld, durch Klicken von 5 Buttons in einer Reihe, positionieren. Dafür habe ich eine Zählvariable i eingebaut, die bei jedem Klick auf einen Button sich um 1 erhöht.
Darauf hin erscheint ein MessageDLG, in dem der Spieler gefragt wird, ob er seine Positionierung bestätigen möchte.
Nun sollen die weiteren Schiffstypen auf dem Spielfeld untergebracht werden. Da aber in jeder Prozedur der Flugzeugträger aufgeführt ist, wird auch immer wieder das Codefragment zur Positionierung des Flugzeugträgers
durchgenommen. Kann ich diese Stelle während der Laufzeit irgendwie disablen?
Danke im Vorraus!

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

Da somit 100 Buttons existieren, habe ich allen den gleichen Code per On-Cklick Ereignis gegeben, anstatt 100 Prozeduren mit gleichem Inhalt zu erstelllen.

Hast du die Button alles mühsam von Hand platziert, oder hast du diese dynamisch erzeugt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

mit copy & paste eingefügt

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

Wen du die Button dynamisch in einem Array hättest, könntest du die Array in einer Schleife durchgehen, ob alle Boote gesetzt sind.
Ich denke eine Array wirst du sowieso haben, irgendwo muss ja gespeichert sein, wo die Boote sind.

Um die Schiffe bzw. ihre Position festzulegen, lasse ich ein Panel auf dem Button erscheinen,

Wie hast du die Panel in den Button gebracht ?
Vielleicht wäre für deine Zweck auch ein TToggleBox geeignet.

Noch ein Tip, wie du sehr schnell das Spielfeld erstellen kannst, ohne da 100x Copy&Paste. :wink:

Code: Alles auswählen

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
 
  public
    BootButton: array of TToggleBox;
    procedure OnBootClick(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  SetLength(BootButton, 100);
  for i := 0 to Length(BootButton) - 1 do begin
    BootButton[i] := TToggleBox.Create(Self);
    with BootButton[i] do begin
      Tag := i;
      Parent := Self;
      Width := 22;
      Height := 22;
      Left := i mod 10 * 25;
      Top := i div 10 * 25;
      OnClick := @OnBootClick;
    end;
  end;
end;
 
procedure TForm1.OnBootClick(Sender: TObject);
var
  t: integer;
begin
  t := TToggleBox(Sender).Tag;
  BootButton[t].Caption := 'X';
end;
 
end.   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Nixsager
Beiträge: 168
Registriert: Sa 8. Okt 2016, 08:38
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Polska

Re: Veränderung des Codes während der Laufzeit

Beitrag von Nixsager »

Bei VB gibt es die Möglichkeit Objekten den selben Namen zu geben, sie unterschieden sich dann nur durch den Index-Wert.
Gibt es so was nicht für Lazarus? Wer so was nicht sinnvoll?
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Hi,
wie kann ich BitButtons in einem zweiddimensionalem Array deflarieren? Und um nicht später mehrmals zu fragen, kann ich sie dann einfach durch den" x- und y-Wert" des BitButtons ansprechen? Und wie kann ich den Status des BitButtons bestimmen?

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

wie kann ich BitButtons in einem zweiddimensionalem Array deflarieren?

Etwa gleich wie bei der 1D-Array.

Code: Alles auswählen

BootButton: array of array of TToggleBox; 
...
  SetLength(BootButton, 10, 10)


Und um nicht später mehrmals zu fragen, kann ich sie dann einfach durch den" x- und y-Wert" des BitButtons ansprechen?

Ja das geht.

Und wie kann ich den Status des BitButtons bestimmen?

Code: Alles auswählen

  BootButton[4].Checked := True;

Setzt den 5 Button in meinem Beispiel auf True.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Da kriege ich die ganze Zeit die Fehlermeldung "identifier not found "TToggleBox"

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

Du musst den Code noch auf die 2D-Array anpassen.

Code: Alles auswählen

type
  TForm1 = class(TForm)
    ToggleBox1: TToggleBox;
    procedure FormCreate(Sender: TObject);
  private
 
  public
    BootButton: array of array of TToggleBox;
    procedure OnBootClick(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
const
  max: TPoint = (x: 16; y: 7);
 
procedure TForm1.FormCreate(Sender: TObject);
var
  x, y: integer;
begin
  SetLength(BootButton, max.y, max.x);
  for x := 0 to max.x - 1 do begin
    for y := 0 to max.y - 1 do begin
      BootButton[y, x] := TToggleBox.Create(Self);
      with BootButton[y, x] do begin
        Tag := y * max.x + x;
        Parent := Self;
        Width := 22;
        Height := 22;
        Left := x * 25;
        Top := y * 25;
        OnClick := @OnBootClick;
      end;
    end;
  end;
  BootButton[4, 4].Checked := True;
end;
 
procedure TForm1.OnBootClick(Sender: TObject);
var
  t: integer;
begin
  t := TToggleBox(Sender).Tag;
  BootButton[t div max.x, t mod max.x].Caption := 'X';
end;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Hallo,
ich bin gerade dabei dem die Stellung siner Schiffe beizubringen. Habe versucht 2 Zufallszahlen erzeugen zu lassen und diese in die x bzw. y-Werte einzugeben.
Jedoch war es egal, welche Zahl erzeugt wurde, immer wurde der erste Button im array angesprochen. Habe bestimmt einen simplen Fehler gemacht, finde ihn aber leider nicht.
Kann mir wer helfen?

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

Jedoch war es egal, welche Zahl erzeugt wurde, immer wurde der erste Button im array angesprochen.

Wen man dazu noch etwas Code sehen würde, kann man dir eher helfen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Hat sich soeben erledigt.
Trotzdem Danke!

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Hab doch mal wieder eine Frage:
Ich möchte den PC eine Zufallszahl erzeugen lassen und dann soll geprüft werden, ob auf dem BitBtn im array mit dem jeweiligem Index, welcher die Zufallszahl sein soll, ein Bild ist oder nicht. Wie kann ich sozusagen die Zufallszahl dem Tag der BitBtns zuweisen?

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

Re: Veränderung des Codes während der Laufzeit

Beitrag von Mathias »

Verstehe ich es richtig, der Computer soll zufällig die Schiffe generieren ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Minits
Beiträge: 30
Registriert: So 30. Okt 2016, 21:13
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Veränderung des Codes während der Laufzeit

Beitrag von Minits »

Nicht ganz.
Er soll sozusagen tippen, sprich eine zufällige Zahl erzeugen und der Button mit diesem Tag soll überprüft werden, ob ein Bil drauf ist oder nicht.

Antworten