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
Benutzerbild von himitsu
himitsu

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

AW: Memory Programm

  Alt 20. Mär 2015, 10:10
Sonst würden ja Andere auch ständig mit Hilfe überschüttet, nur weil sie einen weiblichen Avatar oder einen weiblich klingenden Nickname besitzen.
sakura

Interessant wäre, ob sie sich wenigstens bedankt haben, wo sie es hier ja noch nicht gemacht haben.
(sind nun bestimmt verschreckt und trauen sich nicht mehr oder werden eh nie wieder was mit Delphi zu tun haben)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Memory Programm

  Alt 20. Mär 2015, 10:59
Ich muss euch noch mal zur Ordnung rufen! Bleibt bitte beim Thema.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Memory Programm

  Alt 20. Mär 2015, 14:38
Interessant wäre, ob sie sich wenigstens bedankt haben, wo sie es hier ja noch nicht gemacht haben.
Ja... Ich denke das kommt noch...

Ich muss euch noch mal zur Ordnung rufen! Bleibt bitte beim Thema.
Sir ja Sir!

Das Thema - was war nochmal das Thema... Ach richtig...

Memory ist a recht einfach zu programmieren...

Drei Sachen werden in der Schule scheinbar nicht beigebracht...

1. Arbeiten mit TImage(Sender)
2. Arbeiten mit dem Tag Feld
3. Programmablauf mit mehreren Fenstern.

Danach ist Memory na nur ein paar Zeilen Source...

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

AW: Memory Programm

  Alt 20. Mär 2015, 14:52
Drei Sachen werden in der Schule scheinbar nicht beigebracht...
Wundert mich nicht ... bei mir wurde damals nicht ein einziges Mal das Wort Objekt in den Mund genommen
  Mit Zitat antworten Zitat
KillerMary

Registriert seit: 10. Mär 2015
19 Beiträge
 
#5

AW: Memory Programm

  Alt 29. Mär 2015, 09:34
So, einmal zur Aufklärung.
Ich kann nichts für die Kompetenz meiner Lehrerin.
Dass wir in 2 Jahren Delphi nur das einfache Grundgerüst gelernt haben und nun keine "Profis" und
all Wissende sind tut mir auch leid.
Das ist ein Gymnasium mit 90 Minuten Informatik in einer Woche.
Und im Grunde haben wir nur ein Jahr wirklich mit Delphi programmiert.

SO und ich danke Mavarik das er uns geholfen hat und sich die Zeit genommen hat.
Ich danke euch allen, aber leider konnte ich durch unser Unwissen nicht viel davon verwenden.

Weiter zu sagen ist, dass wir uns das wahrscheinlich wirklich nicht gut überlegt haben, ja das gebe ich zu.
Wir haben beide aber nicht gedacht, dass es SO kompliziert ist.

Und falls ihr es wissen wollt, es ist für Mavarik etwas in Planung. Meine Freundin und ich setzen uns noch mal mit ihm in Kontakt, leer geht er für seine Hilfe und Zeit nicht aus.

Und das wir nicht mehr geschrieben haben liegt einfach daran, dass wir im Vorprüfungsstress waren und nicht weil ich irgendeine Angst haben.
Ihr könnt Frauen gegenüber gerne Vorurteile haben, aber leider wisst ihr nicht genau was wir gelernt haben und alles auszuzählen teilt euch unseren Wissensstand auch nicht mit.

Aber danke für alle Mühen.
  Mit Zitat antworten Zitat
abisch

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

AW: Memory Programm

  Alt 12. Jun 2015, 19:33
Hallo alle zusammen,
ich habe ein ähnliches Problem. Beim Programmieren des Memorys habe ich einige Schwierigkeiten, vor allem mit der DrawGrid-Komponente.
Bisher habe ich mit Hilfe von Schleifen jedem meiner 10 Bilder Koordinaten und eine "ID" zugeordnet (das ganze zwei Mal, um Paare zu erzeugen).
Nun möchte ich die Bilder in das DrawGrid laden (jede der 20 Zellen soll am Ende ein Bild beinhalten). 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!

Hier mein bisheriger Quelltext:

Code:
var Memory    : array [1..4,1..5] of Integer;
    Pfad   : array [0..9] of String
    = ('Bild1.bmp', 'Bild2.bmp', 'Bild3.bmp', 'Bild4.bmp', 'Bild5.bmp', 'Bild6.bmp',
        'Bild7.bmp', 'Bild8.bmp', 'Bild9.bmp', 'Bild10.bmp');
     Bilder    : array [0..9] of TImage;


procedure BilderLaden;
var i : Integer;
begin
  for i := 0 to 9 do
  begin
    Bilder[i] := TImage.Create(nil);
    Bilder[i].Picture.LoadFromFile(Pfad[i])
  end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DrawGrid1.ColCount:=5;
DrawGrid1.RowCount:=4;
DrawGrid1.FixedCols:=0;
DrawGrid1.FixedRows:=0;
end;

procedure PaareFinden;
var i,x,y,Zaehler : Integer;
begin
i:=1;
Randomize;
while i<=10 do
begin
Zaehler:=0;
  while Zaehler < 3 do
    begin
      x:=Random(5)+1;
      y:=Random(4)+1;
        if Memory[x,y]=0 then
          begin
            Memory[x,y]:=i;
            Zaehler:=Zaehler+1
          end;
    end;
  i:=i+1;
 end;
end;

procedure KartenZuordnen;              // und ab hier wird es problematisch..
var i : Integer;
    Memory    : array [1..4,1..5] of Integer;
begin
PaareFinden;
for i:= 1 to 10 do
Memory[i]:=(DrawGrid1.Cells[x,y]);     // in Anlehnung an das StringGrid
end;
end.
  Mit Zitat antworten Zitat
SMO

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

AW: Memory Programm

  Alt 12. Jun 2015, 22:16
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!
Hallo! So etwas gibt's beim DrawGrid nicht. Stattdessen musst du einen Handler für das "OnDrawCell" Event schreiben. Also im visuellen Designer das DrawGrid auswählen, dann im Objektinspektor zu den Events und "OnDrawCell" doppelklicken. Außerdem würde ich für die Bilder kein TImage nehmen, sondern TPicture oder TBitmap. TImage ist nämlich eine visuelle Komponente, also ein GUI, das du ebenso wie einen Button oder ein DrawGrid auf einer Form platzieren kannst. Aber für deine Zwecke ist das ja gar nicht nötig!
Die Unterschiede zwischen TImage, TPicture, TGraphic usw. sind verwirrend, nicht nur für Anfänger. Hier eine kurze Erklärung auf Englisch.

Da deine Bilder alle Bmp-Dateien sind, nehmen wir am besten TBitmap. Sieht dann ungefähr so aus:

Delphi-Quellcode:
var
  Memory: array [1..4,1..5] of Integer;
  Bilder: array [0..9] of TBitmap;

procedure BilderLaden;
var i : Integer;
begin
  for i := 0 to 9 do
  begin
    Bilder[i] := TBitmap.Create;
    Bilder[i].LoadFromFile(Pfad[i]);
  end
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
  State: TGridDrawState);
var
  BildNr: Integer;
begin
  // Das DrawGrid hat keine festen Zellen (FixedCols=0, FixedRows=0), sonst müssten
  // wir das hier bei den Koordinaten berücksichtigen.

  // Das Bild ermitteln, das zur aktuellen Zelle (ACol, ARow) gehört
  // Memory-Array hat 1-basierte Koordinaten
  BildNr := Memory[ARow + 1, ACol + 1];

  // Bild auf die Zelle malen (BildNr ist 1-basiert?)
  DrawGrid1.Canvas.StretchDraw(Rect, Bilder[BildNr - 1]);
  // oder: DrawGrid1.Canvas.Draw(Rect.Left, Rect.Top, Bilder[BildNr - 1]);
  end;
end;
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

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
 
#9

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
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 05:19 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