Autor Beitrag
Necroion
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 26.08.08 17:15 
Hi ihr netten Helfer da drausen...
Meine Augen sind schon ganz müde vom Suchen für eine Lösung, für mein Problem.

Ich habe ein Sgrid indem ich zahlen eingefügt habe, provisorisch färbte ich gewisse felder ein z.B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for x := 1 to 20 do begin                 
for y := 1 to 20 do begin
    with Form1.SGrid.Canvas do begin
      if Form1.SGrid.Cells[x,y] = '4' then
      if (ARow = y) and (ACol = x) then begin
        Brush.Color:=clPurple;
        FillRect(Rect)

jetzt möchte ich aber gerne das dort ein icon oder bmp angezeigt wird, ist das überhaupt möglich (ich hoffe es) währe toll wenn jemand der dies weiss oder weiss wo die Lösung zu finden ist dies mir zeigen könnt

MfG Necroion

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Di 26.08.2008 um 20:32
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Di 26.08.08 17:21 
Ja Form1.SGrid.Canvas.Draw();

_________________
Markus Kinzler.
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 08:42 
Danke für die rasche und einfache Angwort.
Hmm hab jetzt hier was probiert, was aber immer noch nicht ganz funzt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm2.Mauererstellen;
var Mauer:TMetafile;
begin
   for x := 1 to 20 do begin                  
   for y := 1 to 20 do begin
    with Form1.SGrid.Canvas do begin
      if Form1.SGrid.Cells[x,y] = '4' then
      if (ARow = y) and (ACol = x) then begin
        Mauer:=TMetafile.Create;
        Mauer.LoadFromFile('C:\mauer ziegel.wmf');
        Form1.SGrid.Canvas.Draw(x,y,Mauer);
end;
end;
end;
end;
end;


Und zwar bleibt er mir immer beim Mauer.LoadFromFile('C:\mauer ziegel.wmf');
stehen mit der Meldung:
"Im Projekt Project1.exe ist eine Exception der Klasse EInvalidGraphic mit der Meldung 'Metadatei ist ungültig' aufgetreten."
Heisst dies das meine Datei ungültig ist? Kann das sein?
Mfg Necroion
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 10:32 
Probiers doch erstmal mit einer Bitmap/JPeg. Ausserdem solltest du das Malen von Zellen in das dazugehörige Event verlagern, in deinem Fall also in TForm1.SGridDrawCell. Zu guter Letzt sollte man ein solches Bild, das beim Malen immer wieder gebraucht wird, nicht in der Malroutine selbst erzeugen, sondern als Member von z.B. Form1 halten und beim Malen nur benutzen. Ausserdem das Freigeben nicht vergessen, sonst gibts Speicherlecks.

Zu aller Letzt könntest du mal über eine andere Quellcode-Formatierung nachdenken... 8)

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
TForm1 = class (TForm)
private
  FMauer : TImage;
  {..}

procedure TForm1.FormCreate
    (Sender: TObject);

begin
  FMauer.Create (nil);
  FMauer.Picture.LoadFromFile ('C:\test.bmp');
end;

procedure TForm1.FormDestroy
    (Sender: TObject);

begin
  FMauer.Free;
end;

procedure TForm1.SGridDrawCell
    (Sender: TObject; 
     ACol, 
     ARow: Longint; 
     Rect: TRect; 
     State: TGridDrawState);

begin
  SGrid.Canvas.FillRect (Rect);
  if SGrid.Cells[ACol,ARow] = '4' then
    SGrid.Canvas.Draw(Rect.Left,Rect.Top,FMauer.Picture.Graphic);
end;


Der Code ist aus dem Kopf ohne Delphi geschrieben, keine Haftung für Syntaxfehler :-)
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 11:06 
Hmm... habs bei mir reingeboxt klappt aber immer noch nicht, gibt mir ne Zugrifsverweigerung bei

ausblenden Delphi-Quelltext
1:
Mauer.Create(nil);					
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 11:09 
ausblenden Delphi-Quelltext
1:
Mauer := TImage.Create (nil);					
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 11:19 
Hehe THX jetzt funzt es.
Ein Problem gibt es aber leider immer noch und zwar zeigt es mir das Bild nicht an. Die Zelle ist einfach Leer. Könnte dies daran liegen dass das Bild zu gross ist (sollte zwar eigentlich nicht der Fall sein) oder an was könnte nun dies liegen?


Zuletzt bearbeitet von Necroion am Mi 27.08.08 11:28, insgesamt 1-mal bearbeitet
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 11:26 
Gibts die Datei C:\test.bmp überhaupt auf deinem Rechner?
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 11:29 
Jupp die Datei gibt es und dieses Problem konnte nun auch gelöst werden aber die Zeilen sind leider immer noch leer...
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 11:30 
Schön wäre zu erfahren, wie du das Problem gelöst hast. Außerdem kann ich in meiner Glaskugel nicht erkennen, warum deine Zeilen leer sind. Dafür solltest du vielleicht doch nochmal ein bischen Code posten...
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 11:44 
Jupp, sry... Die Fehlermeldung vorhin wegen dem ".bmp" lag daran das die Graphic nicht richtig konvertiert wurde.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
  private
    Mauer:TImage;
    ...
procedure TForm1.SGridDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  for x := 1 to 20 do begin                  //Mauern ohne Schatten
  for y := 1 to 20 do begin
    with Form1.SGrid.Canvas do begin
      if Form1.SGrid.Cells[x,y] = '4' then
      if (ARow = y) and (ACol = x) then begin
        Form1.SGrid.Canvas.Draw(x,y,Mauer.Picture.Graphic);
        FillRect(Rect);
  end;
  end;
  end;
  end;
  end;

procedure TForm1.FormCreate(Sender: TObject);  
begin
  Mauer:=TImage.Create(nil);
  Mauer.Picture.LoadFromFile('C:\test.bmp');
end;
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 11:59 
Warum hast du im DrawCell diese for-Loop drin? Dieses Event wird für jede Zelle einzeln aufgerufen, die Position der Zelle bekommst du über die Parameter ACol/ARow. Dort kannst du prüfen, eine '4' drin steht. Siehe einen meiner früheren Posts.

Wo schreibst du überhaupt eine '4' in die Zelle(n)?
Hast du das Event im ObjectInspector dem Grid gesetzt?
Necroion Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 27.08.08 12:15 
Das DrawCell ist per ObjectInspector erzeugt worden.
Warum ich einen for-Loop benutzt habe kann ich dir nicht genau sagen. Ich selbst bin noch nich so ganz bewandert mit Delphi und gewisse Dinge muss ich noch lernen. :D learning by doing.

Habe es nun geändert...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.SGridDrawCell(Sender: TObject; ACol, ARow: Integer;  
  Rect: TRect; State: TGridDrawState); 
begin
    SGrdFeld.Canvas.FillRect (Rect);
    if SGrdFeld.Cells[ACol,ARow] = '4' then
    Form1.SGrdFeld.Canvas.Draw(xM,yM,Mauer.Picture.Graphic);
end;



"4" gebe ich zum Beispiel per ButtonClick ein

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.BtClick(Sender: TObject)
  for xM := 8 to 12 do begin
   SGrdFeld.Cells[xM,9]:=IntToStr(4);
  end;
iKilledKenny
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Mi 27.08.08 12:21 
Funktionierts denn nun?

Wenn nicht, dann zeige bitte mal den kompletten Code. Wenn die DrawCell-Routine per ObjectInspector erzeugt wurde, dann hast du zumindest mal nachträglich das Grid umbenannt?!