![]() |
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 |
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');
|
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. |
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; |
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; |
AW: Fenster, welches man nur durch eine Sache schließen kann
Zitat:
Zitat:
|
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:
|
AW: Fenster, welches man nur durch eine Sache schließen kann
Zitat:
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: |
AW: Fenster, welches man nur durch eine Sache schließen kann
OK, so ausgedrückt klingt es besser. :D
|
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.
|
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..:| |
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. |
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. |
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. |
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:
zugewiesen, so dass ich jedes Bild in einen Unterordner bei der .Exe Datei verschoben habe.
Bild.LoadfromFile(ExtractFilepath(ParamStr(0)) + 'Bilder\Bild.bmp');
das Klappt auch ganz gut! :) Nun habe ich mir gedacht, machste das einfach auch mit den Sounds:
Delphi-Quellcode:
-> Aber da kommt jetzt eine Fehlermeldung: "Inkompatible Typen: 'string' und 'PAnsiChar' "
sndplaySound(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav',SND_ASYNC or SND_LOOP);
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? |
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:
in PAnsiChar umwandeln.
ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav'
|
AW: Fenster, welches man nur durch eine Sache schließen kann
Zitat:
Und zu dem Problem:
Delphi-Quellcode:
Der erste Parameter ist PChar, also musst du dein String Ergebnis auch so umwandeln.
sndplaySound(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav',SND_ASYNC or SND_LOOP);
...
Delphi-Quellcode:
Ansonsten kannst du dir das Beispiel hier angucken:
sndplaySound(PChar(ExtractFilepath(ParamStr(0)) + 'Sound\Spielsound.wav'),SND_ASYNC or SND_LOOP);
... ![]() |
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; |
AW: Fenster, welches man nur durch eine Sache schließen kann
@hathor
MS sagt definitiv nein zu deinem Vorschlag ![]() Eine Alternative steht auch in der Doku |
AW: Fenster, welches man nur durch eine Sache schließen kann
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:09 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