| Autor |
Beitrag |
Dansen
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 26.02.03 19:44
Hallo Delphi-Forum User!
Wir suchen eine Möglichkeit, ein Spielfeld auf das Formular zu zaubern. Es soll aus mehreren Bitmaps bestehen (zb. 16x16). Dies soll mit einem StringGrid verwirklicht werden. Dabei dürfen die Bilder nicht von einem bestimmten Verzeicnis abhängen. (also nicht \IMages\ zum Beispiel).
Wir wissen nicht wie wir das lösen sollen. Habt Ihr eine Idee. Wie fügt man Bilder, die irgendwo auf der Platte liegen in StringGrids ein?
MFG Dansen
Moderiert von Tino: Titel geändert.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 26.02.03 20:19
Titel: Re
Hi,
Aber warum nimmt ihr nicht ein TDrawGrid ? Einfach die TDrawGrid.OnDrawCell() Methode dazu benutzen die Bitmaps reinzupainten? Die Dateinamen zu den Bitmaps könnt Ihr ja in einem zweidimensionalen Array sichern, welches dieselben Dimensionen wie das Grid hat.
Grüße
MSCH
|
|
Dansen 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 26.02.03 20:26
Okay, erstmal vielen Dank für deine schnelle Antwort. Wir sind noch neu auf dem Delphi-Sektor. Kannst Du uns sagen wie wir die Bilder da reinladen können? Das wäre total super. Geht das über TImageList?
Vielen Dank schonmal!
MFG Dansen
|
|
Dansen 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 26.02.03 20:39
Für Texte haben wir es schon rausbekommen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| begin DrawGrid1.DefaultDrawing:=FALSE; {damit die Ausgabe nicht bei jedem Mausklick automatisch gelöscht wird!} Rectangle:=DrawGrid1.CellRect(2,2); {Ausgabebereich wählen!} DrawGrid1.Canvas.Brush.Style:=bsClear; {Texthintergrund} DrawGrid1.Canvas.Font.Color:=clRed; {Textfarbe} DrawGrid1.Canvas.TextOut(Rectangle.Left,Rectangle.Top,'TEST'); {Text} DrawGrid1.DefaultDrawing:=TRUE; {fakultativ wieder zurücksetzen!} end |
(ALS ONCLICK EVENT)
WIe läuft das jetzt mit Bildern ???
MFG Dennis
Moderiert von Tino: Code-Tags hinzugefügt.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 26.02.03 20:44
Titel: Re
Hi,
angenommen eine Liste mit 4 Zeilen und 4 Spalten.
(Alle Bespiele aus'm Kopf kann grad nicht verifizieren)erstmal das Array für die Dateinamen
Quelltext 1: 2: 3: 4: 5: 6: 7:
| Var BildFeld : Array[1..4,1..4] of String;
Bilder laden: BildFeld[1,1]:= 'C:\Bild1.bmp'; BildFeld[1,2]:= 'C:\Bild2.bmp'; u.s.w. |
Alternativ gehts auch so:
Quelltext 1: 2: 3: 4: 5: 6:
| Var BildFeld: Array[1..4,1..4] of TBitmap;
Bilder Laden: BildFeld[1,1]:= TBitmap.Create; BildFeld[1,1].LoadFromFile('C:\Bild1.bmp'); |
Version 1 Bild Zeichen:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Main.DrawGrid1DrawCell (Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); Var Bild: TBitmap; begin Bild:=TBitmap.Create; Bild.LoadFromFile(BildFeld[ACol,ARow]); with sender as TDrawGrid do Canvas.Draw(Rect.Left,Rect.Top,Bild); Bild.Free; end; |
Version 2 Bild Zeichen:
Quelltext 1: 2: 3: 4: 5: 6:
| procedure Main.DrawGrid1DrawCell (Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with sender as TDrawGrid do Canvas.Draw(Rect.Left,Rect.Top,Bild[ACol,ARow]); end; |
Sollte funktionieren.
Grüsse
MSCH
|
|
Dansen 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mi 26.02.03 20:48
Hallo!
BOAH, vielen Dank für deine Mühe. Allerdings ist damit die Randbedingung nicht erfüllt, dass die geladenen Bilder nicht von einem festen Verzeichnis abhängig sein dürfen. Hast Du dazu noch eine Idee ???
MFG Dansen
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Mi 26.02.03 21:08
Titel: Re
Tja,
irgentwo müssen diese Bilder ja liegen  .
Also Vielleicht so:
Step one:
Erstelle eine INI-Datei (alternative Registry) und schreibe dort die Verzeichnisse rein:
[PfadeZuBildern]
Count = 3
0=C:\dort\wennWirDort\FeindFort\Logo.bmp
1=C:\hier\wennNochDort\sonstFort\neu.bmp
2=C:\wenn\nichtHier\dannDort\test.bmp
3=\\DieserServer\hostet\Bilder\die\schoen\sind\sustitute.bmp
Step two:
Lade beim Programmstart die IniDatei, lese den Count,
und laufe den durch und lese die Strings, und weisse dem Array
die Dateinamen zu.
ODER:
Beim Programmstart rekursiv die Platte nach Bildern abgrasen und ins Array einlesen.(FindFirst/FindNext/FindClose)
Wichig: Die Dateinamen sollten zumindest beim Programmstart bekannt sein, ansonsten gehts mit dem zeichnen etwas rucklig zu, wenn das Bild erst gesucht wird.
have a lot of fun
MSCH 
|
|
Dansen 
Hält's aus hier
Beiträge: 6
|
Verfasst: Do 27.02.03 14:07
Hallo!
Habe jetzt mal folgendes gecodet:
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: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
| unit U_Leveledit;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls, ExtCtrls;
type Tform_leveledit = class(TForm) drawgrid_edit: TDrawGrid; drawgrid_auswahl: TDrawGrid; btn_laden: TButton; btn_speichern: TButton; btn_ok: TButton; Image1: TImage; procedure FormCreate(Sender: TObject); procedure drawgrid_auswahldrawcell(Sender: TObject; ACol: Integer; Rect: TRect; State: TGridDrawState);
private { Private-Deklarationen }
public { Public-Deklarationen } end;
var form_leveledit: Tform_leveledit; Bildfeld : Array[1..24] of TBitmap; Spielfeld: Array[1..16,1..16] of TBitmap;
implementation
{$R *.dfm}
// Bilder in Auswahlliste laden
procedure Tform_leveledit.FormCreate(Sender: TObject); begin Bildfeld[1] := TBitmap.Create; Bildfeld[1].LoadFromFile('Bilder\busch.bmp');
end;
procedure Tform_leveledit.drawgrid_auswahlDrawCell (Sender: TObject; ACol : Integer; Rect: TRect; State: TGridDrawState); begin with sender as TDrawGrid do Canvas.Draw(Rect.Left,Rect.Top,Bildfeld[1]); end;
end. |
Das funktioniert jetzt, ABER: Wie bekomme ich jetzt das Bild in die Anzeige? Ich schaffe es nicht. Ich will die Prozedur Tform.leveledit.drawgrid_auswahlDrawCell gleich am OnFormCreate starten. Wie mache ich das ? Wenn ich es aufrufe, dann erhalte ich immer die Fehlermeldung "Nicht genügend wirkliche Parameter" Wie ist genau der Aufruf ???
MFG Dennis
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Do 27.02.03 20:03
Titel: verry simple
Hi
inder OnCreate() Methode musst du nicht die Funktion als solches aufrufen sondern:
...
MyDrawGrid.OnDrawCell(MyDrawGrid);
...
So sollte es funzen
MFG
MSCH
|
|
|