Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Fenster, welches man nur durch eine Sache schließen kann (https://www.delphipraxis.net/184381-fenster-welches-man-nur-durch-eine-sache-schliessen-kann.html)

Grayknife 21. Mär 2015 00:06

Fenster, welches man nur durch eine Sache schließen kann
 
Hallo liebe DPler :)

Inzwischen bin ich nun schon schön weit mit meinem Schiffe versenken!

Jetzt möchte ich gerne eine Art Pause-Button hinzufügen, also wenn man zum Beispiel kurz auf die Toilette gehen muss, oder sich einen Kaffee holen möchte, oder einen Kuchen, oder eine Tomatensuppe, oder eine Flasche Wein, oder ein Handtuch, und und und :-D

Dazu gibt es für jeden Spieler einen Knopf. Zuvor hat sich jeder Spieler einen Namen ausgesucht, sowie ein Passwort.
Dieses Passwort soll jetzt zur Geltung kommen. Wenn einer der Spieler seinen Pauseknopf betätigt, soll das Spiel angehalten werden, indem sich ein kleines Fenster öffnet, wo man nur sein Passwort eingeben kann und OK drücken kann. Jede Form, dieses Fenster anders zu schließen soll es nicht geben.
Versteht ihr wie ich das meine?
Gibt es sowas wie Inputbox, oder so was ähnliches, was speziell mein Problem lösen kann?

Grüße
Grayknife

Popov 21. Mär 2015 00:46

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Wie du schon richtig lagst - die Inputbox heißt InputBox :D

Delphi-Quellcode:
s := InputBox('Titel', 'Irgendein Text', 'Irgendein Inhalt oder leer');

mm1256 21. Mär 2015 08:11

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Hallo,

"InputBox" wird dir nicht weiter helfen. Es sei denn, du zeigst es in einer Schleife so lange an, bis das Passwort übereinstimmt. Das ist jedoch meiner Meinung nach schlechter Programmierstil und für den/die Spieler auch nicht hilfreich, denn der Abbrechen-Button ist dann zwar vorhanden, aber quasi ohne Funktion.

Was du brauchst ist ein Formular welches du modal anzeigst (ShowModal) wo du

- alle BorderIcons deaktivierst, damit das Fenster nicht mit der Maus geschlossen werden kann

- Das Ereignis "onKeyDown" oder "OnKeyUp" abfängst. Hier musst du verhindern, dass das Formular mit Alt+F4 bzw. Crtl+F4 geschlossen wird. Wenn F4 gedrückt wird, setzt du Key einfach auf $00;

Auf das Formular setzt du ein TEdit und einen Ok-Button. Im OnChange-Ereignis des TEdit setzt du "Enabled" des Buttons auf True, wenn das Passwort übereinstimmt.

Sir Rufo 21. Mär 2015 08:33

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Nur mal so auf die Schnelle:
Delphi-Quellcode:
procedure PasswordForm( const UnlockPassword : string );
var
  LForm : TPasswordForm;
begin
  LForm := TPasswordForm.Create( nil );
  try
    repeat
      LForm.ShowModal;
    until LForm.Password = UnlockPassword;
  finally
    LForm.Free;
  end;
end;

himitsu 21. Mär 2015 09:14

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Vielleicht noch einen Abbrechenbutton mit einbauen, sonst kommt man dort nie wieder raus, außer das ist so gewollt. :lol:

Delphi-Quellcode:
function PasswordForm(const UnlockPassword: string): Boolean;
var
  LForm: TPasswordForm;
begin
  LForm := TPasswordForm.Create(nil);
  try
    //Result := (LForm.ShowModal = mrOK) and (LForm.Password = UnlockPassword); // nur einmal fragen, ohne Schleife
    while (LForm.ShowModal = mrOK) and (LForm.Password <> UnlockPassword) do ;
    Result := (LForm.ModalResult = mrOK) and (LForm.Password = UnlockPassword); // Result := LForm.Password = UnlockPassword;
  finally
    LForm.Free;
  end;
end;

Sir Rufo 21. Mär 2015 09:28

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Zitat:

Zitat von himitsu (Beitrag 1294315)
Vielleicht noch einen Abbrechenbutton mit einbauen, sonst kommt man dort nie wieder raus, außer das ist so gewollt. :lol:

Es ist so gewollt
Zitat:

Zitat von Grayknife (Beitrag 1294291)
Jede Form, dieses Fenster anders zu schließen soll es nicht geben.


himitsu 21. Mär 2015 09:38

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Ich würde das aber eher als "Bug" bezeichnen und dann den Taskmannager bitten es zuzumachen. :oops:

Sir Rufo 21. Mär 2015 09:44

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Zitat:

Zitat von himitsu (Beitrag 1294318)
Ich würde das aber eher als "Bug" bezeichnen und dann den Taskmannager bitten es zuzumachen. :oops:

Wieso ist es ein Bug, wenn die Anforderung genau so lautet? :gruebel:

Man kann sich fragen ob die Anforderung sinnvoll ist, aber ein Anwendungs-Bug ist das definitiv nicht, eher ein Design-Fehler bei der Anforderung :stupid:

himitsu 21. Mär 2015 09:50

AW: Fenster, welches man nur durch eine Sache schließen kann
 
OK, so ausgedrückt klingt es besser. :D

mm1256 21. Mär 2015 10:38

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Na ja, ich denke auch, weder Anwendungs-Bug noch Design-Fehler. Im Gegenteil, finde es als sinnvoll wenn ich als Spieler mal eine Pause (aus welchen Gründen auch immer) einlegen möchte/muss, dann sollen die Mitspieler nicht ohne mich weiter spielen können, und/oder sich irgendwelche anderen Vorteile von meiner Abwesenheit haben.

Grayknife 21. Mär 2015 13:37

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Okey, manches verstehe ich, manches wiederum nicht :-D

Haben Sir Rufos Beispiel und mm1256 was gemeinsam? Also Ist eines Teil vom anderen oder so?

Ich lege also eine neue Form an, die nenne ich PauseForm.
Darein kommt ein Edit und ein Button, der Button ist erst aktivierbar, wenn in der OnChange-Prozedur des Edits, das editfeld mit dem Passwort übereinstimmt. Wenn man auf den Button klickt. schließt sich das Fenster und man kann weiter spielen.
Der Pausebutton beinhaltet nur PauseForm.showmodal ?

@mm1256 wie kann ich denn die Bordericons "deaktivieren" ? (damit ist doch jetzt schließen,minimieren,maximieren gemeint?! )
Und was bedeutet $00 ? :D Ich gehe also wieder im Objektinspektor auf Eigenschaften von der PauseForm und nutze die OnKeyUP und OnKeyDown prozedur oder so?!

@Sir Rufo was muss ich mit dieser Prozedur machen? Die LForm ist sozusagen die PauseForm. Ahh, da steige ich gerade nicht durch <,<
Sorry..:|

mm1256 21. Mär 2015 14:03

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Du bist schon auf der richtigen Spur. Das Beispiel von SirRufo ist so gedacht: Du erstellst in der neuen Form im Interface eine procedure zum Anzeigen der Form.

Bordericons deaktivieren machst du im OI (ObjectInspector) bei den Eigenschaften der Form.

Hinweis/Tipp: Du solltest mal in deinem Profil angeben, mit welcher Delphi-Version du arbeitest.

jaenicke 21. Mär 2015 19:34

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Ich würde es einfach so machen wie wohl 99% aller anderen Spiele:
Einfach den Spielinhalt ausblenden und erst mit dem richtigen Passwort wieder anzeigen.

Wie das konkret bei dir geht, hängt von der Art der Umsetzung ab. Wenn du z.B. die Elemente selbst zeichnest, kannst du das Zeichnen einfach unterbrechen, wenn du visuelle Komponenten wie Shapes missbrauchst, kannst du einfach ein Panel über das ganze Formular davorlegen.

Dann brauchst du auch kein neues Formular mit Sperren für das Schließen oder ähnliches, denn wenn einer der Mitspieler dann das Programm schließt, ist es einfach weg. Aber schummeln geht nicht.

Popov 21. Mär 2015 20:58

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Grayknife

Ich hab spaßeshalber ein Beispiel programmiert. Man kann es so machen, aber auch anders. Wenn du es selber machen willst, dann guck nicht rein, sonst reingucken.

Grayknife 22. Mär 2015 11:56

AW: Fenster, welches man nur durch eine Sache schließen kann
 
@Popov Ja genau so stell ich mir das vor! :) Nur bei dir gibt es auch noch einen Schließenknopf im Pausefenster <,<

Noch mal was anderes, ich habe jetzt alle Bilder mit
Delphi-Quellcode:
Bild.LoadfromFile(ExtractFilepath(ParamStr(0)) + 'Bilder\Bild.bmp');
zugewiesen, so dass ich jedes Bild in einen Unterordner bei der .Exe Datei verschoben habe.
das Klappt auch ganz gut! :)
Nun habe ich mir gedacht, machste das einfach auch mit den Sounds:
Delphi-Quellcode:
sndplaySound(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav',SND_ASYNC or SND_LOOP);
-> Aber da kommt jetzt eine Fehlermeldung: "Inkompatible Typen: 'string' und 'PAnsiChar' "

Habe ich falsch gedacht? Ich habe einfach den Schnipselcode kopiert.
Funktioniert das so gar nicht mit sndplaysound bzw. kann man so nicht auf den Sound im Unterordner zugreifen?

BadenPower 22. Mär 2015 12:16

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Schau Dir doch die Fehlermeldung an, dort steht doch eigentlich schon, was Du tun musst.

Du musst doch nur den String
Delphi-Quellcode:
ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav'
in PAnsiChar umwandeln.

Popov 22. Mär 2015 12:17

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Zitat:

Zitat von Grayknife (Beitrag 1294397)
@Popov Ja genau so stell ich mir das vor! :) Nur bei dir gibt es auch noch einen Schließenknopf im Pausefenster <,<

Du solltest auf den Schließenknopf nicht verzichten, sonst hast du keine Möglichkeit aus dem Spiel auszukommen, wenn du dir z. B. auf dem Weg zu Klo das Bein brichts. Dann bekommt man dein Spiel nur noch über den Taskmanager beendet. Ein Ausstieg sollte es immer geben.

Und zu dem Problem:

Delphi-Quellcode:
sndplaySound(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav',SND_ASYNC or SND_LOOP);
...
Der erste Parameter ist PChar, also musst du dein String Ergebnis auch so umwandeln.
Delphi-Quellcode:
sndplaySound(PChar(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav'),SND_ASYNC or SND_LOOP);
...
Ansonsten kannst du dir das Beispiel hier angucken: http://www.delphipraxis.net/1294363-post7.html Da kommt auch Sound vor.

hathor 22. Mär 2015 13:06

AW: Fenster, welches man nur durch eine Sache schließen kann
 
Die Function lockWindowUpdate ist in der Unit Windows.

Ein PASSWORD-Schutz ist einfach:

Delphi-Quellcode:
var s : String;

procedure TForm1.Button9Click(Sender: TObject);
begin
if Edit1.text='' then Exit;
s:=Edit1.text; // Passwort eingeben und MERKEN !
Edit1.text:='';
 lockWindowUpdate(self.handle); // LOCK
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
if Edit1.text='' then Exit;
if s=Edit1.text then
 lockWindowUpdate(0); // UNLOCK
end;

Sir Rufo 22. Mär 2015 14:31

AW: Fenster, welches man nur durch eine Sache schließen kann
 
@hathor

MS sagt definitiv nein zu deinem Vorschlag
https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Eine Alternative steht auch in der Doku

hathor 22. Mär 2015 18:03

AW: Fenster, welches man nur durch eine Sache schließen kann
 
http://fgaillard.com/2011/02/the-unf...-wm_setredraw/


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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