AGB  ·  Datenschutz  ·  Impressum  







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

Memory Programm

Offene Frage von "abisch"
Ein Thema von KillerMary · begonnen am 10. Mär 2015 · letzter Beitrag vom 14. Jun 2015
Antwort Antwort
Popov
(Gast)

n/a Beiträge
 
#1

AW: Memory Programm

  Alt 13. Jun 2015, 15:54
Allerdings finde ich keine Möglichkeit, die Zellen, ähnlich wie beim StringGrid, einzeln über die Koordinaten anzusprechen.
Ich sitze nun schon ziemlich lange daran und verzweifle langsam. Daher wäre ich über einen rettenden Tipp sehr froh!
Zufällig habe ich vor paar Monaten auch ein Memory Spiel programmiert. Mir ging es da aber weniger um das Spiel selbst, als um das Testen einer Komponente. Das Ganze ist "einfacher" als man denkt, das Problem ist aber wie so oft, dass manche Leute auf einen Lösungsweg fixiert sind und deshalb nicht für neue Ideen bereit sind. Dass ist so wie mit den Leuten die mit ihren Kindern über eine stark befahrene Straße wollen. Man kann denen 100 mal sagen, dass 20 Meter weiter ein Zebrastreifen ist. Die sind auf diese Stelle fixiert und wenn sie nicht ... dann stehen sie da noch heute.

So kompliziert es sich auch anhört, die Lösung ist die eine einzelne Image-Komponente, bzw. die Bitmap drin. Statt sich tagelang mit der DrawGrid zu ärgern, kann man im Bruchteil der Zeit alles die Grid selbst auf der Bitmap erstellen. Es ist einfacher als man denkt, es hört sich nur kompliziert an.

Delphi-Quellcode:
uses
  ShellApi;

const
  Breite = 32;

var
  Matrix: array[0..9, 0..9] of Integer;

//-------------------- Zufälliges Bild erstellen -------------------------------

function ExpandEnv(const s: string): string;
var
  l: Integer;
begin
  l := ExpandEnvironmentStrings(PChar(s), nil, 0);
  SetLength(Result, l - 1);
  ExpandEnvironmentStrings(PChar(s), PChar(Result), l);
end;

function FileIconPath: string;
begin
  Result := ExpandEnv('%SystemRoot%\system32\SHELL32.dll');
end;

function FileIconCount(const FileName: string): Integer;
begin
  Result := 0;
  if FileExists(FileName) then
    Result := ExtractIcon(HInstance, PChar(FileName), $FFFFFFFF);
end;

//Gibt eine Bitmap 32*32 zurück, generiert aus System-Icons
procedure TestBmp(Bmp: TBitmap; Index: Integer);
var
  IconCount: Integer;
  Icon: TIcon;
begin
  Icon := TIcon.Create;
  try
    IconCount := FileIconCount(FileIconPath);
    if FileIconCount(FileIconPath) > 0 then
      Icon.Handle := ExtractIcon(HInstance, PChar(FileIconPath), Random(IconCount));

    Bmp.Canvas.Draw(0, 0, Icon);
  finally
    Icon.Free;
  end;
end;

//--------------------------------- Ende ---------------------------------------

//-------------------------- Eigentliche Prozeduren ----------------------------

procedure TForm1.FormCreate(Sender: TObject);
var
  IconCount: Integer;
  x, y: Integer;

  Bmp: TBitmap;
begin
  IconCount := FileIconCount(FileIconPath);

  with Image1.Picture do
  begin
    Bitmap.Width := 10 * Breite; //0..9 -> 10
    Bitmap.Height := 10 * Breite;
  end;

  for x := 0 to 9 do
    for y := 0 to 9 do
    begin
      Matrix[x, y] := Random(IconCount);

      Bmp := TBitmap.Create;
      try
        Bmp.Width := Breite;
        Bmp.Height := Breite;

        //---Platzierung---
        TestBmp(Bmp, Matrix[x, y]);
        Image1.Picture.Bitmap.Canvas.Draw(x * Breite, y * Breite, Bmp);
      finally
        Bmp.Free;
      end;
    end;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ShowMessageFmt('Koordinate: x = %d; y = %d', [x div Breite, y div Breite]);
end;
  Mit Zitat antworten Zitat
abisch

Registriert seit: 12. Jun 2015
3 Beiträge
 
#2

AW: Memory Programm

  Alt 14. Jun 2015, 15:11
Hallo!
Vielen Dank für Eure Hilfe!
Ich habe Deinen Tipp umgesetzt, SMO. Ich erhalte nun keine Fehlermeldungen mehr, allerdings werden die Bilder immer noch nicht angezeigt. Was meinst Du mit 1-basiert?
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#3

AW: Memory Programm

  Alt 14. Jun 2015, 15:48
Beginnt bei 1 und nicht bei 0.
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#4

AW: Memory Programm

  Alt 14. Jun 2015, 19:34
Hallo!
Vielen Dank für Eure Hilfe!
Ich habe Deinen Tipp umgesetzt, SMO. Ich erhalte nun keine Fehlermeldungen mehr, allerdings werden die Bilder immer noch nicht angezeigt. Was meinst Du mit 1-basiert?
Deine Arrays "Pfad" und "Bilder" haben 0 als Startindex, dein "Memory" Array aber 1. Und die Integer, die im "Memory" Array stehen, sind wohl auch 1-basiert, d.h. Wert 1 = zeige Bilder[0] = Bild1.bmp an. Das ist okay so, nur etwas verwirrend.

Außerdem sehe ich da gerade noch einen Fehler in der Prozedur "PaareFinden": da kommt zweimal "Memory[x,y]" vor, sollte aber Memory[y,x] sein. Denn dein Grid hat ja 5 Spalten und 4 Zeilen und Memory ist als "array [1..4,1..5]" definiert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.342 Beiträge
 
Delphi 12 Athens
 
#5

AW: Memory Programm

  Alt 14. Jun 2015, 20:08
Und warum kommt keiner auf die Idee mal die Bereichsprüfung zu aktivieren?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
abisch

Registriert seit: 12. Jun 2015
3 Beiträge
 
#6

AW: Memory Programm

  Alt 14. Jun 2015, 21:37
Vielen Dank für Eure Hilfe!
  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 06:45 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