Autor |
Beitrag |
Necroion
Hält's aus hier
Beiträge: 10
|
Verfasst: 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.
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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Di 26.08.08 17:21
Ja Form1.SGrid.Canvas.Draw();
_________________ Markus Kinzler.
|
|
Necroion 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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...
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 
Hält's aus hier
Beiträge: 10
|
Verfasst: Mi 27.08.08 11:06
Hmm... habs bei mir reingeboxt klappt aber immer noch nicht, gibt mir ne Zugrifsverweigerung bei
Delphi-Quelltext
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 11:09
Delphi-Quelltext 1:
| Mauer := TImage.Create (nil); |
|
|
Necroion 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Mi 27.08.08 11:26
Gibts die Datei C:\test.bmp überhaupt auf deinem Rechner?
|
|
Necroion 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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 
Hält's aus hier
Beiträge: 10
|
Verfasst: 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.  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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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?!
|
|