Autor Beitrag
mau0r
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 13.03.03 15:52 
hiho !
auch auf die gefahr hin, dass ähnliche fragen sicher schon aufgetaucht sind.... :D

ich bin momentan am programmieren für ein kleines schulprojekt (ein kleines spiel)

ich bin für den client zuständig...momentan denke ich noch über das ideale spielbrett nach...
btw. in der schule haben wir delphi 3 pro.

mein bisheriger ansatz war es, über TImage-Objekte das Spielbrett zusammenzusetzen. dabei habe ich dann darüber nachgedacht, wie ich es anstelle, dass ich nicht jedes bild einzeln "ansprechen" muss, (da ich ja zur laufzeit auch neue img-sources reinladen muss), sondern über irgend einen index. dabei bin ich in einem buch auf die TList gestossen:

also habe ich folgendes probiert: (die bilder sind bitmaps)

ausblenden 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:
unit text_images;

interface
uses
....
type
PImage = ^AImage;
AImage = record
Image:TImage;
end;
TForm1 = class (TForm);

.....

var
FImages: TList;
Form1: TForm1;
MyImage: PImage;

implementation
{$R *.DFM}

procedure TForm1.FormCreate(Sender:TObject);
begin
FImages:=TList.Create;
New(MyImage);
MyImage^.Image.Picture.Create;
MyImage^.Image.Picture.LoadFromFile('....bild.bmp');
FImages.Add(MyImage);
end;


soweit...so in der art habe ich das aus einem buch entnommen,
meine frage ist nun, bzw. mein problem ist: auf der form wird nix angezeigt etc.
anscheinend klappt das mit der TList, sonst würde er sich ja beschweren, aber es kommt mir so vor, als ob er garnix machen würde, er zeigt ja auch nichts an...

würde mich sehr über hilfe freuen...ich habe leider kA woran das liegt, oder ob er mir überhaupt so die TImage Objekte erstellt.....

mfg
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Do 13.03.03 18:46 
keine direkte Antwort auf die Fragen, aber ich würde anstatt viele Images zu nehmen, wenn du z.B. ein Schachbrett brauchst alle Felder auf 1 Image zeichnen und beim onmousedown-Ereignis überprüfen, auf welches Feld geklickt wurde...
mau0r Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 17.03.03 14:04 
naja, diese zeichentechnik will ich ja gerade umgehen.

meine frage ist einfach nur, wie ich es gebacken kriege, dass die timages (die in der tlist sind) angezeigt werden, und ob die bilder-objekte automatisch erstellt werden, so dass ich auf der form keine bilder selber machen muss...

keiner ne ahnung ?
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Mo 17.03.03 15:19 
was haste denn dagegen???

haste das mit den Images so gemacht???
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var Image1:Timage;
begin
 Image1:=TImage.create(self);
 Image1.width:=***;
 Image1.height:=***;
 Image1.left:=***;
 image1.top:=***;

image1.picture.loadfromfile('C:/asdw.bmp');
end;


müsstest halt nur ein array of Timage machen, wo dann aber natürlich viel zu initialisieren ist ;)
Nightmare_82
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 260



BeitragVerfasst: Mi 19.03.03 16:48 
ich würde mir mal die Komponente TImageList angucken, sonst machst du dir viel zu viel Aufwand.
Dann machst du dir einen 2D-Array mit Indexen auf die Bilder und zeichnest sie in einer doppelten Schleife.
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Mi 19.03.03 17:08 
Ich würde es auch über TImageList. Alternativ geht es auch über Arrays, wobei man hier auf einen Record zurückgreifen könnte. Beispiel:

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:
type
  TBmpXY = Record
    Bmp: TBitmap;
    x: Integer;
    y: Integer;
    //w: Integer; // W braucht man eigentlich nicht, da das Bmp ein Weite hat
    //h: Integer; // H braucht man eigentlich nicht, da das Bmp ein Höhe hat
  end;

var
  Form1: TForm1;
  BmpXY: array[0..20] of TBmpXY;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 20 do begin
    BmpXY[i].Bmp := TBitmap.Create;
    x := 0;
    y := 0;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 20 do BmpXY[i].Bmp.Free;
end;


So kann man wunderbar seine Bitmaps verwalten und auch die Koordinate haben. Den Record kannst du noch um weitere Werte erweitern.

Allerdings braucht man es nicht. Guck dir das KlickTris Beispiel in OpenSource Sparte an. Da wird einfach mit zwei Zeilen berechnet welche Bitmap von dem 160 gemeint ist.

_________________
Popov
SMI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106

Win95-2003 / Debian / Suse
D1/D3/D6/D7
BeitragVerfasst: Do 20.03.03 03:29 
Hallo

Ich glaube du hast Tlist falsch verstanden. Es ist eine Art Speicherverwaltung. Es stammt noch aus den Zeiten inden Borland Dynamischen Array vermied.

In der "klassischen" Porgrammierung ist ein Array ein reservierter zusammenhängender Speicherbereich. Ein a :Array[0...2] of Integer sind 3 à 4 bytes zusammenhängender Speicher. Mit dem Aufruf
a[1] wird die Anfangsspeicherstelle + 1*4 bytes angesprungen. Der Vorteil dieser Methode ist, dass man nur die Anfangsposition kennen muss um ein Eintrag des Speichers direkt anzuspringen. Der Nachteil ist wenn ein Eintrag gelöscht werden soll, dann müssen alle einträge nach vorne wandern.

Daher gibt es neben Array auch Listen. Bei einer List hat jeder Eintrag eine ForwardPointer sowie einen BackwardPointer, der auf das vorherige bzw. nächste Element der Liste zeigt. Wenn man hier einen Eintrag löscht, wird nur der Backward Pointer des vorherigen Elements und der Forward Pointer des nächsten Elements geändert. Daher können die Einträge, im gegensatz zu einem Array wild im Speicher veteilt sein. Der Nachteil ist hier wenn das 3 Element angesprochen wird. Muss zuerst der erste Eintrag angesprungen werden dort auf den Forward Pointer zugegriffen werden und mit dessen Hilfe auf das 2. Element. Vom 2 Element kommt man wiederum zum 3.


Ich habe dir daher ein Beispiel geschieben, wie man in TList Bitmaps ablegt und sie auch wieder aufruft.



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:
57:
58:
var
  Form1: TForm1;
  FImages : TList;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
 Bitmap :TBitmap;

begin
FImages:=TList.Create;

Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('D:\test.bmp');
FImages.Add(Bitmap);
//Adresse des Bitmaps in TList sichern!

Bitmap:= TBitmap.Create;
Bitmap.LoadFromFile('D:\test2.bmp');
FImages.Add(Bitmap);
//Adresse des Bitmaps in TList sichern!

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Image1.Picture.Bitmap:=FImages.Items[1];
end;

procedure TForm1.Button3Click(Sender: TObject);
VAr 
 bmp: TBitmap;
begin
  Image1.Picture.Bitmap:=FImages.Items[0];
  // Da jedes Objekt ein Pointer ist kann man gewissen 
  // ebensogut folgende Zeile verwenden:
  //  bmp := FImages.Items[0];
  // Wichig ist, das Objekt Bmp nicht via create zuerzeugt, da man 
  // ihm eigentlich nur sagen muss wo im Speicher das gewünschte 
  // Bitmap liegt.
    
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i:integer;
Bitmap: TBitmap;
begin
For i:=0 to FImages.Count-1 DO
BEGIN
 bitmap:= FImages.Items[i];
 bitmap.free;
 FImages.Items[i]:=NIL;
END;
 FImages.Free;
end;

_________________
Wenn es im Jahre 1879 schon Computer gegeben hätte, würden diese vorausgesagt haben, daß man infolge der Zunahme von Pferdewagen im Jahre 1979 im Pferdemist ersticken würde.
(John C. Edwards, brit. Zukunftsforscher)