![]() |
AW: Memory-Spiel: Ideen
Das ist falsch (wenn auch kompilierbar):
Delphi-Quellcode:
Weiter oben schrieb ich zweimal, wie es heißen müsste.
FormSpiel.Image1 := FormSpiel.Image1.Create(FormSpiel);
Da nach der Freigabe die Images sofort neu erstellt und anschließend die Dateien neu in die Images geladen werden, kannst Du Dir die Freigabe und Neuerstellung auch sparen und die Dateien laden. Dabei wird der vorhandene Inhalt der Images eh überschrieben. |
AW: Memory-Spiel: Ideen
Zu dem italienischen Code sage ich jetzt mal nichts :mrgreen:
Das mit dem freigeben vom Image und wieder erzeugen, nur um das Bild dort zu entfernen ... Wenn du einen Bilderrahmen hast und möchtest das Bild tauschen, ist dann auch dein erster Gedanke den Rahmen zu zerschlagen und einen neuen zu kaufen? Möglich ja, aber sinnvoll? |
AW: Memory-Spiel: Ideen
Zitat:
Naja dachte jetzt nicht, dass man das Image überschreiben kann, so wie man eine Textdatei überschreibt. Dachte da fehlen dann Rechte oder so ^^ |
AW: Memory-Spiel: Ideen
Aber jede Wette in einem Monat findest du dich da auch nicht mehr zu recht.
Überschreiben? Rechte? Du lädst doch nur ein anderes Image in die Komponente. Was dachtest du, was du da für Rechte brauchst. PS: Und wenn wir dir helfen sollen, sollten wir uns wohl auch in deinem Code zu recht finden. :roll: Und so unübersichtlich wie der ist, ist das fast ein Ding der Unmöglichkeit. Da scheint der maßen viel redundanter Code zu sein. Man könnte den Code wahrscheinlich um 2/3 kürzen mit Subroutinen und Kapselung in einer Klasse. Den Code zum Erstellen und Platzieren der Images kann man in einer Routine auslagern und schon ist er um 50% kürzer und übersichtlicher. |
AW: Memory-Spiel: Ideen
Wie schon mal erwähnt kann ich mit Klassen persönlich nicht's anfangen. Und ich habe lieber einen längeren Quelltext und ein funktionierendes Programm als ihn zu kürzen und am Ende geht dann gar nichts mehr.
Programmoptimierung kommt am Schluss und nicht mitten drinne. Wenn man gut mit Klassen umgehen kann, dann ist klar das man es kürzen kann, ich kann es nicht ;) ^^ |
AW: Memory-Spiel: Ideen
Programmoptimierung fängt beim Konzept, was es bei dir nicht gibt, und der ersten Zeile Code an. Spart Arbeit, beugt Fehler vor und sorgt für sauberen Code.
Dann wäre das doch das perfekte Projekt, um sich mit Klassen zu beschäftigen. Wenn man natürlich kein Interesse hat was dazu zu lernen und sich weiter zu entwickeln... |
AW: Memory-Spiel: Ideen
Liste der Anhänge anzeigen (Anzahl: 3)
In der Schule hat man sowas dran:
Siehe Bild_1 / Bild_2 / Bild_3 Dieses nennt man dann Komplexaufgabe und das ist das maximalste was zu Klassen dran kommt. Dort sind Klassendiagramme immer gegeben und daraus entwickelt man dann die Klassen-basierte Programmierung mit eigenen Klassen. Mehr ist es nicht. Deshalb kann ich noch nicht mit eigenen Klassen arbeiten, weil das viel komplexer ist als das Komplexaufgaben-Projekt. |
AW: Memory-Spiel: Ideen
Delphi-Quellcode:
lässt sich ändern in
if Paar1GELOESCHT = 0 then
Image1.Enabled := False;
Delphi-Quellcode:
Image1.Enabled := Paar1GELOESCHT <> 0;
Delphi-Quellcode:
-->
if Paar1GELOESCHT = 0 then
Image1.Enabled := True;
Delphi-Quellcode:
Image1.Enabled := Paar1GELOESCHT = 0;
Delphi-Quellcode:
-->
if Paar1GELOESCHT = 0 then
Image1.Enabled := False; if Paar1GELOESCHT = 0 then Image1_1.Enabled := False;
Delphi-Quellcode:
Aus
Image1.Enabled := Paar1GELOESCHT <> 0;
Image1_1.Enabled := Image1.Enabled;
Delphi-Quellcode:
wird
if Paar1GELOESCHT = 0 then
Image1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); if Paar1GELOESCHT = 0 then Image1_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); if Paar1GELOESCHT = 0 then Image9.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); if Paar1GELOESCHT = 0 then Image10.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); if Paar1GELOESCHT = 0 then Image1.Enabled := True; if Paar1GELOESCHT = 0 then Image1_1.Enabled := True;
Delphi-Quellcode:
Selbst ohne Klassen spart man gefühlte 1000 (und mehr) Zeilen ;-)
if Paar1GELOESCHT = 0 then begin
Image1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); Image1_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); Image9.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); Image10.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); Image1.Enabled := True; Image1_1.Enabled := True; end; Und da zur Laufzeit der Wechsel von Kartenvorderseite zur Kartenrückseite und umgekehrt funktioniert, sollte das bei der Initialisierung für ein neues Spiel auch funktionieren, so dass dort die Freigabe und Neuerstellung der Images obsolet sein dürfte. |
AW: Memory-Spiel: Ideen
Ja stimmt, habe das eine mal schon von 14.000 auf 7000 runtergekürzt :) ^^
|
AW: Memory-Spiel: Ideen
Und jetzt das ganze noch in Routinen packen und mit Parametern aufrufen.
Zu den 14.000 Zeilen für ein Memory sage ich jetzt mal nichts. |
AW: Memory-Spiel: Ideen
Der Lehrer ist ein dummy, wenn er die Dokumentation dann nachvollziehen kann, dann ist es ok.
Dem Anwender bleibt der Quelltext ja verborgen. Die Lehrer sagen uns immer das wir trz. noch Schüler sind und keine angestellten Software- Entwickler :P |
AW: Memory-Spiel: Ideen
Es geht nicht um den Anwender. Es geht um dich.
Und warum soll man es als Schüler nicht gescheit lernen? Es geht ja nicht um hochkomplxe Software die du programmieren sollst. Ein einfaches Memory Spiel, sauber programmiert. Und glaub mir, eine saubere Programmierung beugt Fehler vor und hilft Fehler zu finden. Aber wo waren wir jetzt bei deinem Problem stehen geblieben? |
AW: Memory-Spiel: Ideen
Was muss man noch alles := nil setzen?
Auch die Variablen, Timer, Label, Edit usw.?
Delphi-Quellcode:
Wenn man es so hat und vorher durchgespielt hat treten 1000 Fehler auf.
FormSpiel.Image1.Picture := Nil;
FormSpiel.Image1_1.Picture := Nil; FormSpiel.Image2.Picture := Nil; FormSpiel.Image2_1.Picture := Nil; FormSpiel.Image3.Picture := Nil; FormSpiel.Image3_1.Picture := Nil; FormSpiel.Image4.Picture := Nil; FormSpiel.Image4_1.Picture := Nil; FormSpiel.Image5.Picture := Nil; FormSpiel.Image5_1.Picture := Nil; FormSpiel.Image6.Picture := Nil; FormSpiel.Image6_1.Picture := Nil; FormSpiel.Image7.Picture := Nil; FormSpiel.Image7_1.Picture := Nil; FormSpiel.Image8.Picture := Nil; FormSpiel.Image8_1.Picture := Nil; FormSpiel.Image9.Picture := Nil; FormSpiel.Image10.Picture := Nil; |
AW: Memory-Spiel: Ideen
Du muss überhauptnichts auf Nil setzen.
Einfach überall die Werte zuweisen, die für den Beginn eines Spieles erforderlich sind und gut is. Ggfls. weist Du die Werte zu, die Du im Objektinspektor zugewiesen hast, sofern Du dort andere Werte vorgegeben hast, als die von Delphi vergebenen Vorgaben. |
AW: Memory-Spiel: Ideen
Delphi-Quellcode:
Habe ja alle auf Standard zurückgesetzt.
FormSpiel.Image1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg');
FormSpiel.Image1_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image2.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image2_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image3.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image3_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image4.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image4_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image5.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image5_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image6.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image6_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image7.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image7_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image8.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image8_1.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image9.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Image10.Picture.LoadFromFile('\Spielkarten\Rueckseite.jpg'); FormSpiel.Label_Information.Caption := ''; FormSpiel.ProgressBar_Spielfortschritt.Position := 0; FormSpiel.Label_Paare_Gefunden.Caption := '0 / 8'; FormSpiel.Label_PKZ_1.Caption := '0 von 16'; FormSpiel.Label_PKZ_2.Caption := ''; FormSpiel.Image1.Enabled := True; FormSpiel.Image1_1.Enabled := True; FormSpiel.Image2.Enabled := True; FormSpiel.Image2_1.Enabled := True; FormSpiel.Image3.Enabled := True; FormSpiel.Image3_1.Enabled := True; FormSpiel.Image4.Enabled := True; FormSpiel.Image4_1.Enabled := True; FormSpiel.Image5.Enabled := True; FormSpiel.Image5_1.Enabled := True; FormSpiel.Image6.Enabled := True; FormSpiel.Image6_1.Enabled := True; FormSpiel.Image7.Enabled := True; FormSpiel.Image7_1.Enabled := True; FormSpiel.Image8.Enabled := True; FormSpiel.Image8_1.Enabled := True; FormSpiel.Timer_FALSCH.Enabled := False; FormSpiel.Timer_UNAUFGEDECKT.Enabled := False; FormSpiel.Timer_LOESCHEN.Enabled := False; end; Treten aber dann solche Fehler auf: ![]() Die Timer setzen eigentlich alle Variablen zurück. Weiß net woran das liegen soll. |
AW: Memory-Spiel: Ideen
Wo sind da jetzt die Fehler? ich sehe da nur ein Rumgeklicke.
Und die Pfade sind auch sehr bedenklich. Das sind absolute Pfade vom aktuellen Arbeitsverzeichnis. Nur was das Arbeitsverzeichnis ist, ist so ziemlich ein Glücksspiel, dass es das Verzeichnis von deiner Anwendung ist. |
AW: Memory-Spiel: Ideen
Nachtrag. Man könnte auch alle Grafiken zur Entwicklungszeit in eine Imageliste packen. Dann werden sie in die Exe als Ressource einkompiliert.
|
AW: Memory-Spiel: Ideen
Zitat:
Du solltest Dich echt mal mit Array's und Schleifen beschäftigen... |
AW: Memory-Spiel: Ideen
Ich glaube selbst mein NonVCL Memory hat weniger.
|
AW: Memory-Spiel: Ideen
Das hat jetzt noch niemand vorgeschlagen soweit ich gelesen habe, aber man kann sich das ganze neu Erzeugen/Zuweisen der Images doch größtenteils sparen wenn man einfach das alte Spielformular freigibt und neuerstellt. Dann hat man ein komplett frisches Spielformular das genauso funktioniert wie beim ersten Spiel.
Zitat:
Zitat:
Ich hatte damals als ich angefangen habe mit Delphi ähnliche Ansichten, aber heute schäme ich mich fast für meinen alten Quelltext :mrgreen: Aufgeräumter und übersichtlicher Quelltext ist einer der wichtigsten Dinge beim Programmieren. Und das hat nichts mit Anwendern oder Kunden zu tun sondern sowas gönnt man sich selbst. Es ist so viel einfacher sich im Quelltext zurechtzufinden und er ist auch deutlich lesbarer. Dadurch (wie schon von anderen erwähnt) macht man weniger Fehler und es ist auch deutlich einfacher Fehler zu finden und zu beheben wenn sich doch mal einer eingeschlichen hat. Und was Klassen angehen: Du willst Klassen verstehen und benutzen, du weißt es scheinbar nur noch nicht ;) Es macht den Code so viel übersichtlicher und schöner zu lesen (s.o.) und es macht es deutlich einfach später irgendein Feature hinzuzufügen oder etwas zu ändern und je nach Anwendungsfall wirst du hunderte/tausende Zeilen Code sparen können gegenüber reiner prozeduraler Programmierung. Dass du mit Klassen nichts anfangen kannst liegt nur daran, dass du sie nicht verstanden hast bzw. es dir zu anstrengend war Objektorientierung (Klassen) zu lernen ;) Als Programmierer hat man nie ausgelernt. Man kann und muss/sollte immer was Neues lernen, egal wie erfahren man bereits ist. Das gilt gerade dann wenn man so wie du noch am Anfang steht :) |
AW: Memory-Spiel: Ideen
Zitat:
Ja, aber ich habe mir erstmal kleine Ziele gesetzt. Anfangs dachte ich zum Beispiel nie, dass ich eine zufällige Verteilung der Karten hin bekomme. Wir sind 25 Schüler und niemand hat mit Klassen gearbeitet bei seinem Projekt. Wir haben auch noch andere Sachen zu tun kurz vor den Prüfungen als nur dieses eine Projekt zu programmieren. Programmierer helfen sich aber bei komplexen Sachen gegenseitig, wenn sie an eine Grenze stoßen (z.B. die Beseitigung von Bugs in Spielen) |
AW: Memory-Spiel: Ideen
Zitat:
und dann FormSpiel.Create(x???) |
AW: Memory-Spiel: Ideen
Nee.
Delphi-Quellcode:
FormSpiel := TFormSpiel.Create(Application);
|
AW: Memory-Spiel: Ideen
Ok danke, Grobkonzept habe ich ja immer. Scheitert nur dann am Feinkonzept :S
also nicht die Klasse TFormSpiel angesprochen oder (Application) nicht verwendet. Sowas hat man aber auch nie im Unterricht dran, weil man unsere Programme nie neu starten muss. |
AW: Memory-Spiel: Ideen
FormSpiel ist die Instanzvariable (die also die erzeugte Klasseninstanz aufnimmt), TFormSpiel ist die Klasse, die zu erzeugen ist, Create heißt der Konstruktor (also die Methode, die eine neue Instanz zurückgibt) und Application ist der sog. Owner, d.h. das Objekt, das sich um den Speicher der erzeugten Klasse kümmern soll.
|
AW: Memory-Spiel: Ideen
Zitat:
|
AW: Memory-Spiel: Ideen
1) Wie kann ich die Image/s aus der Imagelist rausholen?
2) Ist es egal auf welcher Form die Imagelist ist? 3) Ja oder Nein? Wenn es die dann richtig zam setzt kann man ja "ja" machen...? --------------------------- Confirm --------------------------- Die Dimensionen für Bitmap Benutzername_1.bmp sind größer als die der Bilderliste. In 23 verschiedene Bitmaps aufteilen? --------------------------- Yes No --------------------------- |
AW: Memory-Spiel: Ideen
Zitat:
Zitat:
z.B. indem du die ImageList übergibst oder anderweitig Zugriff auf das Formular mit der ImageList hast. Zitat:
(Alle Bilder in einer Imagelist müssen gleich groß sein) |
AW: Memory-Spiel: Ideen
Beim Hinzufügen der .bmp wird Clcream eingestellt (so soll es auch sein).
Wenn ich das Fesnter zu mache und wieder öffne dann ist CLNone eingestellt. Wie kann ich Clcream beibehalten? |
AW: Memory-Spiel: Ideen
Jetzt habe ich 2 ImageListen auf meiner Form und beim Speichern hängt sich Delphi auf ?!
|
AW: Memory-Spiel: Ideen
Liste der Anhänge anzeigen (Anzahl: 1)
der Post hier hat sich erledigt. geht nur noch um die ImageListen.
|
AW: Memory-Spiel: Ideen
Und was soll uns der Screenshot sagen?
|
AW: Memory-Spiel: Ideen
Ich glaube Delphi hängt sich nicht auf. Du brauchst nur sehr viel Geduld schätze ich.
Wenn du viele oder/und große Bilder in ImageListen lädst geht Delphi etwas in die Knie. Da kannst du nichts machen außer damit Leben oder die Bilder zur Laufzeit aus Dateien lesen statt aus der Imagelist. |
AW: Memory-Spiel: Ideen
Liste der Anhänge anzeigen (Anzahl: 1)
Er scheitert an diesem Bild in .bmp Form.
|
AW: Memory-Spiel: Ideen
Delphi-Quellcode:
Wie macht er die Position der TrackBar nicht? Diese bleibt bei 0 stehen.
if OpenDialog1.Execute then
TimerMusik.Enabled := False; MediaPlayer1.Close; MediaPlayer1.FileName := OpenDialog1.FileName; MediaPlayer1.Open; TimerMusik.Enabled := True; TrackBarMusik.Max := MediaPlayer1.Length; TrackBarMusik.Position := MediaPlayer1.Position; |
AW: Memory-Spiel: Ideen
Nach dem MediaPlayer1.Open steht MediaPlayer1.Position auf 0, folglich auch die Trackbar. Was ist daran verwunderlich? BTW: bist Du sicher, dass der gesamte Code ab der 2. Zeile nicht in einen begin-end-Block gehört?
|
AW: Memory-Spiel: Ideen
Jo stimmt, man klickt danach ja noch bei dem MediaPlayer auf Play ;) ^^
Delphi-Quellcode:
procedure TFormSpiel.Button1Click(Sender: TObject);
begin if OpenDialog1.Execute then begin TimerMusik.Enabled := False; MediaPlayer1.Close; MediaPlayer1.FileName := OpenDialog1.FileName; MediaPlayer1.Open; TimerMusik.Enabled := True; TrackBarMusik.Max := MediaPlayer1.Length; TrackBarMusik.Position := MediaPlayer1.Position; end; end; Bei der Trackbar Bewegung habe ich jetzt im 1. Moment an einen Timer gedacht.
Delphi-Quellcode:
procedure TFormSpiel.TimerMusik2Timer(Sender: TObject);
var i: integer; begin TrackBarMusik.Max := MediaPlayer1.Length; for i := 1 to MediaPlayer1.Length do begin TrackBarMusik.Position := MediaPlayer1.Position+1; end; end; |
AW: Memory-Spiel: Ideen
Delphi-Quellcode:
Es erscheint 00:00:00, der Timer läuft ja dann weiter. Wieso zählt es bei einem Interval von 1 die Zahl nicht rauf ?
private
StartTime: TTime; procedure TFormSpiel.TimerZeitTimer(Sender: TObject); begin LabelZeit.Caption := FormatDateTime('hh:nn:ss',StartTime); end; |
AW: Memory-Spiel: Ideen
Ändert sich denn StartTime?
|
AW: Memory-Spiel: Ideen
Habe erst den Code von Luckie genommen, der geht aber auch nicht.
Delphi-Quellcode:
type
TForm1 = class(TForm) Label1: TLabel; Button1: TButton; Button2: TButton; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } StartTime: TTime; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Timer1.Enabled := True; StartTime := Time; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Label1.Caption := TimeToStr(Time - StartTime); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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