AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bingo Karte

Ein Thema von jurkup · begonnen am 1. Jan 2017 · letzter Beitrag vom 1. Jan 2017
Antwort Antwort
BrightAngel

Registriert seit: 13. Mär 2007
130 Beiträge
 
#1

AW: Bingo Karte

  Alt 1. Jan 2017, 12:05
Hey! Willkommen in der DP!
Ich weiß, du bist vermutlich einfach erleichtert, dass das jetzt so läuft; aber es gibt noch eine elegantere Lösung. Du "suchst" jetzt quasi jedes Panels anhand seines Namens.

TPanel(Form1.FindComponent('Panel'+p))
Einfachere Zugriffe auf deine Panels bekommst du, wenn du Referenzen zu deinen Panels in einem Array oder einer Liste speicherst.

Delphi-Quellcode:
var
fPanels : Array[0..24] of TPanel; // beispiel array
Warum ist diese Lösung schöner als die "FindComponent"-Lösung?
1. wegen der Typsicherheit: mit TPanel() versuchst du die Instanz die du mit FindComponent erhälst auf den Typ TPanel zu casten. Problem: Du kannst im Allgemeinen nicht sicher sein, dass es sich bei deiner Instanz tatsächlich um eine Instanz oder ein Derivat von TPanel handelt!
(Stelle dir einfach vor, da hat jemand in geistiger Umnachtung ein TButton oder so "Panel20" genannt. Dann kannst du da gegen die Wand laufen, weil ein TButton kein TPanel ist; zugegeben: das Beispiel ist etwas konstruiert...)

2. Zugriff: findComponent braucht intern String Vergleiche, um die passende Instanz zu finden. In einem Array auf das du direkt mit dem richtigen Index zugreifst geht das quasi sofort! (ist schneller)

Ich hoffe, ich konnte Dir helfen!

Brighty
Do you have the email of god??? --- I have to tell him that I'm happy to be born!

Geändert von BrightAngel ( 1. Jan 2017 um 12:20 Uhr)
  Mit Zitat antworten Zitat
jurkup

Registriert seit: 31. Dez 2016
6 Beiträge
 
#2

AW: Bingo Karte

  Alt 1. Jan 2017, 12:43
Vielen Dank. Das ist ja noch besser.

Ich stehe schon vor dem nächsten Problem.

Ich möchte, dass bei einem Klick auf ein Panel geprüft wird ob die Zahl mit der gezogenen übereinstimmt.
Ist es möglich eine Allgemeine Procedure zu schreiben, bei der ich nicht das Panel genau angeben muss (also Form1.Panelx.Caption) sondern sagen kann, dass geklickte Panel soll geprüft werden?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#3

AW: Bingo Karte

  Alt 1. Jan 2017, 12:46
Im OnClick-Ereignis jedes Panels wird Dir dieses im Sender-Parameter mitgegeben. Du kannst also eine allgemeine Ereignisbehandlungsroutine dafür schreiben und jedem Panel zuweisen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jurkup

Registriert seit: 31. Dez 2016
6 Beiträge
 
#4

AW: Bingo Karte

  Alt 1. Jan 2017, 12:59
Im OnClick-Ereignis jedes Panels wird Dir dieses im Sender-Parameter mitgegeben. Du kannst also eine allgemeine Ereignisbehandlungsroutine dafür schreiben und jedem Panel zuweisen.
Wie würde das in etwa aussehen? Ich wüsste jetzt nicht, wie ich die Information in die Anweisung bekomme.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#5

AW: Bingo Karte

  Alt 1. Jan 2017, 13:05
Ich habe mal ein Beispiel geschrieben (da ich Deine Delphi-Version nicht kenne, vorsichtshalber in Delphi 7). Zunächst die Definition des Formulars:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FPanels: array[1..5, 1..5] of TPanel; // 5 Reihen zu je 5 Panels
    procedure InitializePanels; // Initialisierungsroutine zum Befüllen des Arrays
    procedure DoOnPanelClick(Sender: TObject); // Ereignishandler für das OnClick jedes Panels
  public
    { Public-Deklarationen }
  end;
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;
const
  PANELWIDTH = 40; //Kantenlänge jedes Panels
var
  x, y: integer;
  ALeft, ATop: integer;
  Panel: TPanel;
begin
  ATop := 10;
  for y := Low(FPanels) to High(FPanels) do
    begin
      ALeft := 10;
      for x := Low(FPanels[y]) to High(FPanels[y]) do
        begin
          Panel := TPanel.Create(self);
          Panel.Parent := self;
          Panel.Left := ALeft;
          Panel.Top := ATop;
          Panel.Width := PANELWIDTH;
          Panel.Height := PANELWIDTH;
          Panel.Tag := Random(99) + 1;
          Panel.Caption := IntToStr(Panel.Tag);
          Panel.OnClick := DoOnPanelClick;
          FPanels[x, y] := Panel;
          inc(ALeft, PANELWIDTH);
        end;
      inc(ATop, PANELWIDTH);
    end;
end;
Jetzt der zugewiesene Handler für das OnClick (Methode DoOnPanelClick):
Delphi-Quellcode:
procedure TForm1.DoOnPanelClick(Sender: TObject);
begin
  if Sender is TPanel then
    ShowMessage(IntToStr(TPanel(Sender).Tag));
end;
Und im OnCreate-Ereignis des Formulars wird der Zufallsgenerator angeworfen und die InitializePanels-Methode aufgerufen.
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  InitializePanels;
end;
Hilft Dir das weiter?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jurkup

Registriert seit: 31. Dez 2016
6 Beiträge
 
#6

AW: Bingo Karte

  Alt 1. Jan 2017, 13:17
Das hätte mir sehr viel Arbeit beim erstellen gespart.

Mein Problem war eigentlich, dass bei dem Klicken eines Panels geprüft werden soll, ob die Caption mit der aktuellen gezogenen Zahl übereinstimmt. Also einfach testen, ob "Ziehung" und Form1.Panelx.Caption übereinstimmen. Und das möglichst so, dass ich nicht für jedes der 25 Panels den Ganzen Code wiederholen muss.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#7

AW: Bingo Karte

  Alt 1. Jan 2017, 13:22
Das wäre dann in meinem Beispiel innerhalb von DoOnPanelClick, statt des ShowMessage dann halt auf Gleichheit prüfen und entsprechend reagieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Slipstream
(Gast)

n/a Beiträge
 
#8

Nur mal so als Idee

  Alt 1. Jan 2017, 13:49
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz