![]() |
AW: Memory Programm
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. |
AW: Memory Programm
Zitat:
Die Unterschiede zwischen TImage, TPicture, TGraphic usw. sind verwirrend, nicht nur für Anfänger. ![]() 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; |
AW: Memory Programm
Zitat:
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; |
AW: Memory Programm
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? |
AW: Memory Programm
Beginnt bei 1 und nicht bei 0.
|
AW: Memory Programm
Zitat:
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. |
AW: Memory Programm
Und warum kommt keiner auf die Idee mal die Bereichsprüfung zu aktivieren? :roll:
|
AW: Memory Programm
Vielen Dank für Eure Hilfe! :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 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