Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringGrid Image [Mehrfach Zuweisen] (https://www.delphipraxis.net/140825-stringgrid-image-%5Bmehrfach-zuweisen%5D.html)

Serdradox 26. Sep 2009 21:38


StringGrid Image [Mehrfach Zuweisen]
 
Mein Problem ist, wie im Titel schon angedeutet, dass ich ein Image welches sich in einem StringGrid befindet "mehrfach" zuweisen möchte.
Zum Verständniss:
Es soll ein einfaches "Lotto"-Programm werden bei dem man seine Lottozahlen eintragen kann.

Komplett
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids;

type
  TForm1 = class(TForm)
    strgrdLottozahlen: TStringGrid;
    procedure strgrdLottozahlenDrawCell(Sender: TObject; ACol,
      ARow: Integer; Rect: TRect; State: TGridDrawState);
    procedure FormCreate(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  BitmapFeld,BitmapKreuz: TBitmap;
implementation

{$R *.dfm}

{Anfang: Funktion die überprüft ob eine "bestimmte" Spalte ausgewählt ist}
function IsCellSelected(StringGrid: TStringGrid; X, Y: Longint): Boolean;
begin
  Result := False;
  try
    if (X >= StringGrid.Selection.Left) and (X <= StringGrid.Selection.Right) and
      (Y >= StringGrid.Selection.Top) and (Y <= StringGrid.Selection.Bottom) then
      Result := True;
  except
  end;
end;
{Ende: Funktion die überprüft ob eine "bestimmte" Spalte ausgewählt ist}

procedure TForm1.strgrdLottozahlenDrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);
var
{Normale-Variablen}
i,j,n,m:Integer;
begin
BitmapFeld := TBitmap.Create;
BitmapFeld.LoadFromFile('Bilder/LottoFeld.bmp');
BitmapFeld.TransparentColor := clWhite;
BitmapFeld.Transparent := True;

BitmapKreuz := TBitmap.Create;
BitmapKreuz.LoadFromFile('Bilder/LottoKreuz.bmp');
BitmapKreuz.TransparentColor := clWhite;
BitmapKreuz.Transparent := True;

for n:= 1 to 7 do
for m:= 1 to 7 do
begin
If IsCellSelected(strgrdLottozahlen,n,m) = True
then
strgrdLottozahlen.Canvas.StretchDraw(strgrdLottozahlen.CellRect(n,m),BitmapKreuz);
end;

for i := 1 to 7 do
for j := 1 to 7 do
begin
strgrdLottozahlen.Canvas.StretchDraw(strgrdLottozahlen.CellRect(i,j),BitmapFeld);
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
x,y,z:Integer;
begin
z:=0 ;

for x := 1 to 7 do
for y := 1 to 7 do
begin
z:= z+1;
strgrdLottozahlen.Cells[y,x] := IntToStr(z);
end;

end;
end.
Das Grundproblem liegt in diesem Codebereich:
Delphi-Quellcode:
for n:= 1 to 7 do
for m:= 1 to 7 do
begin
If IsCellSelected(strgrdLottozahlen,n,m) = True
then
strgrdLottozahlen.Canvas.StretchDraw(strgrdLottozahlen.CellRect(n,m),BitmapKreuz);
end;
Da es nur das Kreuz setzt, wenn man die Spalte ausgewählt hat. Sobald man eine andere Spalte anklickt verschwindet das vorherige Kreuz [was nach dem Code Aufbau auch verständlich ist]. Mir würde schon ein "Ansatz" genügen, da ich ja gerne selbst das Projekt zur Vollendung bringen möchte.

Frage: Wie kann ich mehrere StringGrid Spalten auswählen, in denen dann auch die Kreuze [Lotto 6 aus 49] angezeigt bekommt.

MfG
Serdradox

taaktaak 26. Sep 2009 23:41

Re: StringGrid Image [Mehrfach Zuweisen]
 
Moin, Moin.
Joo, einen Denkansatz kann man wohl geben: Du schreibst 2x alle 49 Zellen; beim 2ten mal überschreibst du wieder alle Kreuze, die du kurz vorher ausgegeben hast. Daher sind keine Kreuze zu sehen.

Aber du verwendest das OnDraw() auch grundsätzlich falsch, da es automatisch für das Zeichnen jeder einzelnen Zelle aufgerufen wird; d.h. die Schleifen sind in OnDraw() überflüssig und falsch!

Also: In aCol und aRow wird dir gesagt, welche Zelle gerade gezeichnet werden soll. Aufgrund dieser Information musst du entscheiden entweder ein Kreuz oder eine leere Zelle auszugeben!


Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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 by Thomas Breitkreuz