Entwickler-Ecke
Multimedia / Grafik - TList & TImage ?
mau0r - Do 13.03.03 15:52
Titel: TList & TImage ?
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)
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. - 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 - 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. - Mo 17.03.03 15:19
was haste denn dagegen???
haste das mit den Images so gemacht???
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 - 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 - 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:
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.
SMI - 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.
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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!