Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Fokus auf mehrere Komponenten setzen (https://www.delphipraxis.net/187996-fokus-auf-mehrere-komponenten-setzen.html)

Freyr77 22. Jan 2016 09:18

Delphi-Version: 10 Seattle

Fokus auf mehrere Komponenten setzen
 
Hallo miteinander.

Weil ich neu bin eine wichtige Info: Ich bin Azubi zum Anwendungsentwickler (gerade mit den ersten 4 Monaten durch, wenig Vorwissen). Wir arbeiten in unserer Firma ausschließlich mit Delphi 10 Seattle.

Nun programmiere ich gerade in Eigeninitiative einen Dartzähler, der das Schreiben auf Papier bei nicht elektronischen Dartscheiben erspraren soll, und auch selbstständig rechnet. Die Dartscheibe wurde von mir mit Buttons simuliert, also für jedes Feld das man treffen kann ein Button. Die Spielernamen sind in einem Label gespeichert, neben den Spielernamen habe ich jetzt mal einen Radiobutton gesetzt. Für jeden Spieler gibt es noch zwei zusätzliche Labels, einmal für den Punktestand und einmal für die Anzahl der gespielten Runden.

Mein Problem ist der Fokus, und zwar gänzlich. Mir ist bewusst, dass es irgendeine Prozedur in "OnSpielStartButtonClick" sein muss, aber wie schreibe ich die? Der Fokus soll am Anfang auf Spieler1 liegen, nach 3 Würfen soll ein Button gedrückt werden und dann der Fokus auf dem nächsten Spieler und so weiter ...

Wie setzte ich diesen Fokus, der alle Labels des jeweiligen Spielers umschließt, bis der Button gedrückt wird?

Ich wäre euch für Hilfe sehr dankbar. Wenn ihr etwas braucht (Bild der Form oder Code) poste ich das gerne.

Sir Rufo 22. Jan 2016 09:27

AW: Fokus auf mehrere Komponenten setzen
 
Crossposts bitte mit angeben

Jumpy 22. Jan 2016 09:30

AW: Fokus auf mehrere Komponenten setzen
 
Es können afaik nicht mehrere Controls den Fokus haben und ich kann mir auch nicht ganz Vorstellen, wie du das meinst bzw. was du erreichen willst. Deßhalb mal ein genereller Tipp: Versuche die Rundenzahl, die Spielstände der Spieler, die Anzahl und Namen der Spieler und auch wer gerade aktiver Spieler ist nicht in irgendwelchen Controls (Labeln/Edits usw.) der GUI zu merken sondern benutze dafür Variablen und da Delphi ja OOP ist wären auch passende Objekte/Klassen eine feine Sache.

Im allgemeinen spricht man davon, die GUI nicht für die Datenhaltung zu benutzen, sondern nur um eine Repräsentation der Daten (die du anderswo in einer Logik gespeichert hast) für den Nutzer anzuzeigen.

Mögliche Klassen/Objekte könnten sein:
- Spiel
- Spielrunde
- Spieler
- Scoreboard
- ???

Freyr77 22. Jan 2016 09:51

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1327804)
Crossposts bitte mit angeben

Alles klar. Habe das hier gefragt weil die Aktivität der User höher ist.

Sir Rufo 22. Jan 2016 09:56

AW: Fokus auf mehrere Komponenten setzen
 
Ich denke mal der Titel Fokus auf mehrere Komponenten setzen ist etwas unglücklich (zumal sowieso nur Controls den Fokus haben können - sind auch Komponenten aber nicht jede Komponente ist ein Control ;)).

Es geht wohl eher um die Visualisierung welcher Spieler gerade aktiv ist und die Spieler-Visualisierung selber umfasst ein paar Controls für den Spielernamen, Punktestand, etc.

Man kann sich für den Spieler ein Frame erstellen und dieses Frame eben x-mal auf der Form platzieren. Gibt man dem Frame jetzt noch eine Eigenschaft wie z.B. IsCurrent oder IsSelected dann kann man im Setter entsprechend reagieren.
Zitat:

Zitat von Freyr77 (Beitrag 1327806)
Zitat:

Zitat von Sir Rufo (Beitrag 1327804)
Crossposts bitte mit angeben

Alles klar. Habe das hier gefragt weil die Aktivität der User höher ist.

Das "Warum" ist mir schon klar :stupid:

Freyr77 22. Jan 2016 10:54

AW: Fokus auf mehrere Komponenten setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier mal ein (etwas unsauber ausgeschnittenes) Bild, wie die Form Aussieht. Neben "lblspieler1" und "lblspieler2" befinden sich jeweils die Labels für den Punktestand und die gespielten Runden.

Ich hätte gerne, dass festgelegt wird welcher Spieler gerade spielt (über das Label, falls das geht) und bei Klick auf den z.b. 20er Button die Werte jeweils angepasst werden. Aber eben nur für den Spieler, der gerade dran ist.

Freyr77 22. Jan 2016 10:58

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1327807)
Ich denke mal der Titel Fokus auf mehrere Komponenten setzen ist etwas unglücklich (zumal sowieso nur Controls den Fokus haben können - sind auch Komponenten aber nicht jede Komponente ist ein Control ;)).

Es geht wohl eher um die Visualisierung welcher Spieler gerade aktiv ist und die Spieler-Visualisierung selber umfasst ein paar Controls für den Spielernamen, Punktestand, etc.

Man kann sich für den Spieler ein Frame erstellen und dieses Frame eben x-mal auf der Form platzieren. Gibt man dem Frame jetzt noch eine Eigenschaft wie z.B. IsCurrent oder IsSelected dann kann man im Setter entsprechend reagieren.
Zitat:

Zitat von Freyr77 (Beitrag 1327806)
Zitat:

Zitat von Sir Rufo (Beitrag 1327804)
Crossposts bitte mit angeben

Alles klar. Habe das hier gefragt weil die Aktivität der User höher ist.

Das "Warum" ist mir schon klar :stupid:

Wenn ich den Frame erstellt habe, und ihn bei OnCreate erzeugen lasse, wie spreche ich hier die Komponenten von dem Frame an?

TiGü 22. Jan 2016 11:00

AW: Fokus auf mehrere Komponenten setzen
 
Mein Werbeblocker meldet bilder-upload.eu als Malware-Schleuder.
Bitte hänge den Screenshot einfach hier am Beitrag an.
Siehe Button "Anhänge verwalten" fünf Zentimeter und den "Antworten"-Button.

frankyboy1974 22. Jan 2016 11:17

AW: Fokus auf mehrere Komponenten setzen
 
hallo,

um hervorzuheben welcher Speiler gerade an der Reihe ist, würde ich dessen Label's einfach Fett und ggf. mit einer größeren Schriftart darstellen.

mfg

Freyr77 22. Jan 2016 11:45

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von TiGü (Beitrag 1327816)
Mein Werbeblocker meldet bilder-upload.eu als Malware-Schleuder.
Bitte hänge den Screenshot einfach hier am Beitrag an.
Siehe Button "Anhänge verwalten" fünf Zentimeter und den "Antworten"-Button.

- Beitrag editiert!

Freyr77 22. Jan 2016 12:40

AW: Fokus auf mehrere Komponenten setzen
 
Hat sich erledigt. Bin das Problem völlig falsch angegangen.

Jeder Spieler hat jetzt einen Radio Button, je nachdem welcher aktiviert ist reagiert der Button Klick anders.. danke euch.

Sir Rufo 22. Jan 2016 13:32

AW: Fokus auf mehrere Komponenten setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe da mal auf die Schnelle was zusammengeklopft.

Wie man im Anhang sieht, kann man das recht übersichtlich gestalten.

Freyr77 22. Jan 2016 13:45

AW: Fokus auf mehrere Komponenten setzen
 
Der Code zum Button Click sieht jetzt so aus:

Delphi-Quellcode:
procedure TForm1.btntriple7Click(Sender: TObject);
begin
if rbspieler1.Checked = true then
begin
lblpunktestand1.Caption:=inttostr(strtoint(lblpunktestand1.Caption) - triple7);
lblwuerfe1.Caption := inttostr(strtoint(lblwuerfe1.Caption) + wurf);
end;
if rbspieler2.Checked = true then
begin
lblpunktestand2.Caption := inttostr(strtoint(lblpunktestand2.Caption) - triple7);
lblwuerfe2.Caption := inttostr(strtoint(lblwuerfe2.Caption) + wurf);
end;
end;
@Sir Rufo: Der Computer rastet total aus wenn ich das runterladen will. Spam, Mail, Virus - alles dabei in der Warnung. Schaue es mir Zuhause mal an.

jobo 22. Jan 2016 13:50

AW: Fokus auf mehrere Komponenten setzen
 
Mein Computer bleibt ganz ruhig.
Aber ich seh grad am Counter, dass ich es offenbar gar nicht runtergeladen habe.
Trotzdem spiele ich schon minutenlang Dart.
Das beste für mich, man kann nicht daneben werfen.
:)

Sir Rufo 22. Jan 2016 13:52

AW: Fokus auf mehrere Komponenten setzen
 
Laut VirusTotal meckert da nur einer mit PE:Malware.Generic(Thunder)!1.A1C4 [F]

Freyr77 22. Jan 2016 14:22

AW: Fokus auf mehrere Komponenten setzen
 
Google Chrome mag die Datei nicht und Windows mag die .exe nicht...keine Ahnung warum.

Sir Rufo 22. Jan 2016 14:36

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Freyr77 (Beitrag 1327847)
Google Chrome mag die Datei nicht und Windows mag die .exe nicht...keine Ahnung warum.

Und das wo ich die EXE extra signiert habe ... :wink:

Freyr77 22. Jan 2016 15:04

AW: Fokus auf mehrere Komponenten setzen
 
Wenn jemand sich dazu bereit erklären würde mein Projekt mal zu begutachten, um mir eventuelle Verbesserungsvorschläge zu geben, würde ich es nach Fertigstellung des ersten Spielmodi mal hochladen.:wink:

Sir Rufo 22. Jan 2016 15:07

AW: Fokus auf mehrere Komponenten setzen
 
Schieb das Projekt doch nach http://github.com dann ist das Betrachten und Vorschlagen erheblich einfacher

Bjoerk 22. Jan 2016 15:20

AW: Fokus auf mehrere Komponenten setzen
 
Wenn du Glück hast, baut dir Sir Rufo noch mein DartShape vom Crosspost ein. :)

Freyr77 1. Feb 2016 09:05

AW: Fokus auf mehrere Komponenten setzen
 
So, nun habe ich nach einer Woche mein Programm wieder geöffnet. Was vorher funktioniert hat, funktioniert jetzt nicht mehr so wirklich. Ich versuche vom Hauptmenü mit Hilfe eines Buttons die Unit für den Spielmodus zu öffnen.

Das sieht so aus:

Delphi-Quellcode:
procedure TForm2.btnspielmodus501Click;
var
  Form1: TTSpielmodus501;
begin
Form1:=TTSpielmodus501.Create(self);
if FileExists('C:\Users\BERGMANN\Documents\DartProjekt\Spielmodus501.pas') then begin
  TTSpielmodus501.ShowModal;
  end else begin
    MessageDlg('Spiel konnte nicht gestartet werden', mtError, [mbOK], 0);
  end;
end;
So weit, so gut. Das hat schon immer funktioniert. Es ist auch nichts rot markiert. Jetzt sagt er mir aber beim kompilieren auf einmal :

"Diese Form des Methodenaufrufs ist nur für Klassenmethoden oder Konstruktoren zulässig"

Hat da jemand Lösungsansätze?

Sir Rufo 1. Feb 2016 09:15

AW: Fokus auf mehrere Komponenten setzen
 
Nur eine Instanz kann man mit
Delphi-Quellcode:
ShowModal
zum Anzeigen überreden. Die Klasse selber ist nur die Beschreibung.

Mit Auto kann man nicht fahren, sondern mit dem Auto oder mit deinem Auto (eben etwas Konkretem und nicht mit einer Definition).

Insgesamt sieht das was du dort machst sehr seltsam aus. Wozu prüfst du diese *.pas Datei ab? Das ist eine Anleitung, wie dein Programm gebaut werden soll.

Das ist dann so, dass du dein Auto nur dann benutzen könntest, wenn du auch die Konstruktionspläne besitzt. Hört sich seltsam an :stupid:

Freyr77 1. Feb 2016 09:15

AW: Fokus auf mehrere Komponenten setzen
 
Hat sich erledigt, war mal wieder ein Flüchtigkeitsfehler..

Sir Rufo 1. Feb 2016 09:18

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Freyr77 (Beitrag 1328918)
Hat sich erledigt, war mal wieder ein Flüchtigkeitsfehler..

Auch das Prüfen der *.pas Datei?

Delphi hat einen Compiler und keinen Interpreter. Der Quellcode wird nach der Erstellung von der Anwendung selber nicht mehr benötigt.

Freyr77 1. Feb 2016 09:19

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1328919)
Zitat:

Zitat von Freyr77 (Beitrag 1328918)
Hat sich erledigt, war mal wieder ein Flüchtigkeitsfehler..

Auch das Prüfen der *.pas Datei?

Delphi hat einen Compiler und keinen Interpreter. Der Quellcode wird nach der Erstellung von der Anwendung selber nicht mehr benötigt.

Wie gestalte ich das denn eleganter? Was ich mit dem Code erreichen will ist aber verständlich, oder?

Sir Rufo 1. Feb 2016 09:30

AW: Fokus auf mehrere Komponenten setzen
 
Ich kann nur raten, was du da möchtest.

Du willst prüfen, ob es diesen Spielmodus 501 gibt.

Wenn es den allerdings nicht gibt, dann gibt es auch keine Klasse
Delphi-Quellcode:
TSpielmodus501
und du kannst das Programm gar nicht erstellen.

Freyr77 1. Feb 2016 09:41

AW: Fokus auf mehrere Komponenten setzen
 
Der Button in TForm2 soll das OnCreate von der unit Spielmodus501(TForm1) öffnen.

Also das ist quasi die Auswahl, dass man diesen Spielmodus spielen will. Danach erfolgt die Eingabe der Namen und dann starte das ganze.

Er kompiliert das ganze auch so, wenn ich allerdings auf den Button drücke sagt er mir jetzt Zugriffsverletzung bei Adresse 00000000..

Sir Rufo 1. Feb 2016 09:44

AW: Fokus auf mehrere Komponenten setzen
 
Dafür reicht
Delphi-Quellcode:
procedure TForm2.btnspielmodus501Click;
var
  Form1: TTSpielmodus501;
begin
  Form1 := TTSpielmodus501.Create( self );
  Form1.ShowModal;
end;
Ich weiß nur nicht, ob du mit dieser lokalen Variablen glücklich wirst ... aber das wirst du dann schon sehen ;)

Zitat:

Zitat von Freyr77 (Beitrag 1328927)
Er kompiliert das ganze auch so, wenn ich allerdings auf den Button drücke sagt er mir jetzt Zugriffsverletzung bei Adresse 00000000..

Ich wette mal, dass du in
Delphi-Quellcode:
TTSpielmodus501
auf die Variable
Delphi-Quellcode:
Form1
zugreifen möchtest ...

Ersetze das dort einfach mal mit
Delphi-Quellcode:
Self
.

Freyr77 1. Feb 2016 11:09

AW: Fokus auf mehrere Komponenten setzen
 
Delphi-Quellcode:
procedure TTSpielmodus501.SiegerSpieler1;
begin
  if (lblpunktestand1.Caption < inttostr(1)) then
  ShowMessage('spielername1' + 'hat das Spiel gewonnen.');
  end;
Nächstes Problem: Ich habe jetzt diese Prozedur geschrieben, um zu sehen ob es funktioniert. Habe sie in OnCreate eingebunden. Es passiert allerdings NICHTS wenn der Punktestand auf 0 geht.

frankyboy1974 1. Feb 2016 13:47

AW: Fokus auf mehrere Komponenten setzen
 
hallo,

Zitat:

Habe sie in OnCreate eingebunden. Es passiert allerdings NICHTS wenn der Punktestand auf 0 geht.
Es reicht nicht wenn du die Methode einmalig im OnCreate aufrufst, du musst Sie schon bei jeder Änderung des Punktestandes neu aufrufen.

mfg

Freyr77 1. Feb 2016 14:50

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von frankyboy1974 (Beitrag 1328968)
hallo,

Zitat:

Habe sie in OnCreate eingebunden. Es passiert allerdings NICHTS wenn der Punktestand auf 0 geht.
Es reicht nicht wenn du die Methode einmalig im OnCreate aufrufst, du musst Sie schon bei jeder Änderung des Punktestandes neu aufrufen.

mfg

Ach ja, klar... :shock: Danke für den Hinweis :thumb:

Freyr77 2. Feb 2016 08:17

AW: Fokus auf mehrere Komponenten setzen
 
Neue Frage, auf die ich bei Google nichts finde:

Der aktuelle Punktestand wird in einem Label ausgegeben. Wenn jetzt der Spieler die Punktzahl 0 "überworfen" hat, also ins Minus rutscht, soll das Programm eine entsprechende Meldung ausgeben (wie das geht ist mir bekannt) und den Wert wieder auf den letzten Wert zurücksetzen, der vor den 3 Würfen existiert hat.

Ich habe eine globale Variable für den Punktestand, allerdings wird in der Berechnung nur das Label direkt angesprochen und nicht die Variable.

Wie speicher ich diesen Wert, damit ich Ihn anschließend zurücksetzen kann?

Danke :wink:

Sir Rufo 2. Feb 2016 08:46

AW: Fokus auf mehrere Komponenten setzen
 
Zitat:

Zitat von Freyr77 (Beitrag 1329030)
Neue Frage, ...

=> neuer Thread (in dem du auf diesen Thread verlinken kannst/solltest)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:31 Uhr.

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