Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Bingo Karte (https://www.delphipraxis.net/191307-bingo-karte.html)

Slipstream 1. Jan 2017 13:49

Nur mal so als Idee
 
Man könnte doch auch einfach ein StringGrid nehmen und dort für die amerikanische Variante 5 x 5 Felder oder für die englische Variante 3 x 9 Felder anlegen. In die so entstandenen Zellen schreibt man die Zahlen rein, die man braucht, oder auch einen Jokernamen und kann dann sehr leicht beim Klick auf das StringGrid rausfinden, welchen Wert der Benutzer angeklickt hat. Vor vielen Jahren hab ich das mal so ähnlich bei einem Lottozahlenprogramm gemacht, allerdings mit Grafiken, die beim OnDraw dort reingezeichnet werden. Beim Klick auf eine Zelle wird geprüft, ob die Zelle bereits angeklickt wurde, wenn nein, wird eine zweite Grafik in diese Zelle gemalt, die dunkler ist als Zeichen dafür, dass die aktiviert wurde, und es wird natürlich auch geprüft, wie viele Felder angeklickt werden dürfen je nach Spielart. Das OnClick-Handling sieht dann so aus:
Delphi-Quellcode:
procedure TForm1.StrGrid_SpielDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var
   Zahl : Integer;

begin
  Zahl := SpaltZeilToZahl(ACol,ARow); // in dieser Function wird die Zahl anhand von Spalte und Zeile ermittelt
  if Zahl < 1 then Exit;
  FeldZeichnen(StrGrid_Spiel.Canvas,Rect,Zahl); // diese procedure zeichnet eine bestimmte Grafik in die Zelle
end;
Nun ist Bingo nicht Lotto, hat demnach auch keine feststehende Zahlenreihe von 1-49 und muss da natürlich anders programmiert werden. Man könnte die Zahlenreihe in einem Record speichern, für den man dann ein Array anlegt, nur mal so als Idee.

DeddyH 1. Jan 2017 13:49

AW: Bingo Karte
 
Form1 hat da nichts zu suchen, und Du castest falsch herum. So sollte es klappen (ungetestet, da im Editor getippt):
Delphi-Quellcode:
var
  Pan : string;
  Panel: TPanel;
begin
  if Sender is TPanel then
    begin
      Panel := TPanel(Sender);
      Pan := Panel.Caption;

      If Pan = Ziehung then
        begin
          Panel.Enabled := false;
          Panel.Color := clRed;
        end;
    end;

jurkup 1. Jan 2017 14:51

AW: Bingo Karte
 
Super genau das habe ich gesucht. Vielen Dank.

Eine Frage hab ich noch. Wo muss ich die Allgemeine Procedur den schrieben, die ich dann in den Events der Panels benutze? hab die bis jetzt immer einfach direkt nach der Implementation geschrieben:
Delphi-Quellcode:
implementation

{$R *.lfm}

{ TForm1 }

procedure TestB;
var
  Pan : string;
  Panel : TPanel;
begin
if sender is TPanel then
   Begin
   Panel := TPanel(sender);
   Pan := 'B'+Panel.Caption;

   If Pan = Ziehung then
      begin
      Panel.Enabled := false;
      Panel.Color := clRed;
      end;
   end;
end;
Aber so bekomme ich eine Fehlermeldung wegen dem sender.

DeddyH 1. Jan 2017 15:01

AW: Bingo Karte
 
Schau Dir doch mein Beispiel noch einmal genau an, da gibt es auch keine parameterlose reguläre Prozedur.

DeddyH 1. Jan 2017 17:19

AW: Bingo Karte
 
Zitat:

Zitat von BrightAngel (Beitrag 1357677)
Zitat:

Zitat von DeddyH (Beitrag 1357673)
Ich habe mal ein Beispiel geschrieben [...]

Jetzt die einzelnen Methoden: InitializePanels erzeugt die Panels zur Laufzeit, richtet sie aus und weist ihrer Tag-Eigenschaft eine zufällige Zahl zu. Diese wird auch gleich mit dargestellt.
Delphi-Quellcode:
procedure TForm1.InitializePanels;
[...]
[...]

Anmerkung zur Vollständigkeit: Der Aufruf dieser Funktion besorgt sich (im
Delphi-Quellcode:
TPanel.Create(self)
) Speicher für die Panels. Diesen Speicher solltest du in deinem Destruktor (spätestens) wieder mit
Delphi-Quellcode:
Panel.Free
für jedes einzelne Panel aus dem Array freigeben. Ich weiß, dass das jetzt nicht zur Beantwortung der primären Frage dieses Threads beiträgt... :P

Ich habe damals beigebracht bekommen, dass man am Besten zeitnah für jedes Create, das man schreibt, ein Free spendiert. Vielleicht hilft dir dieser Tipp noch weiter... :thumb:

Brighty

Ich habe diesen Post gerade erst gesehen und antworte darum jetzt erst darauf: die Panels müssen nicht explizit freigegeben werden, da beim Erzeugen das Formular als Owner angegeben wurde. Dieser Owner gibt alle ihm zugeordneten Komponenten automatisch frei, sobald er selbst zerstört wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz