Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Bild in StringGrid
Necroion - Di 26.08.08 17:15
Titel: Bild in StringGrid
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.
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
Narses: Delphi-Tags hinzugefügtModeriert von
Narses: Topic aus Multimedia / Grafik verschoben am Di 26.08.2008 um 20:32
mkinzler - Di 26.08.08 17:21
Ja Form1.SGrid.Canvas.Draw();
Necroion - 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.
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 - 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)
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 - Mi 27.08.08 11:06
Hmm... habs bei mir reingeboxt klappt aber immer noch nicht, gibt mir ne Zugrifsverweigerung bei
iKilledKenny - Mi 27.08.08 11:09
Delphi-Quelltext
1:
| Mauer := TImage.Create (nil); |
Necroion - 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?
iKilledKenny - Mi 27.08.08 11:26
Gibts die Datei C:\test.bmp überhaupt auf deinem Rechner?
Necroion - 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 - 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 - Mi 27.08.08 11:44
Jupp, sry... Die Fehlermeldung vorhin wegen dem ".bmp" lag daran das die Graphic nicht richtig konvertiert wurde.
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 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 - 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 - 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...
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
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 - 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?!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!