Autor Beitrag
Dansen
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 user profile iconTino: Titel geändert.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 26.02.03 20:39 
Für Texte haben wir es schon rausbekommen:
ausblenden 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 user profile iconTino: Code-Tags hinzugefügt.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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
ausblenden 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:

ausblenden 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:

ausblenden 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Mi 26.02.03 21:08 
Titel: Re
Tja,
irgentwo müssen diese Bilder ja liegen :D .
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: :arrow:
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 :idea:
Dansen Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Do 27.02.03 14:07 
Hallo!

Habe jetzt mal folgendes gecodet:
ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: 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