Entwickler-Ecke

Multimedia / Grafik - Bilder in String-Grid laden


Dansen - Mi 26.02.03 19:44
Titel: Bilder in String-Grid laden
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 - 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 - 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 - 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 user profile iconTino: Code-Tags hinzugefügt.


MSCH - 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 - 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 - 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 - Do 27.02.03 14:07

Hallo!

Habe jetzt mal folgendes gecodet:

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