langsames OnMouseMove
-
Hallo,
ich wollte eine Karte nach oben schieben, sobald die Mouse sich über der Karte befindet. Ich habe es wie folgt probiert, aber es läuft sehr langsam ab. Gibt es eine Alternative?void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { gib_spieler(); if ( X>100 && X<140 && Y>(600-186) && Y<600) { cursor_pos=0; //int Wert für die Karte } ... ...//hier kommen dann die anderen Karten ... }dann zeichne ich die Karten aus einer ImageList:
for (int r=0; r<10; r++) { Graphics::TBitmap* picPtr=new Graphics::TBitmap; ImageList1->GetBitmap(spieler_1[r],picPtr); if (cursor_pos==r) { Image1->Canvas->Draw(100+(r*40),350,picPtr); } else Image1->Canvas->Draw(100+(r*40),400,picPtr); delete picPtr; }
-
Hallo
das Objekt picPtr wird wohl 10 mal pro MouseMove erstellt, beschrieben und gelöscht. Was erwartest du?
Leg dir ein Buffer-Bitmap als Member des betreffenden Forms an, damit bekommst du das ständige new und delete weg (nur noch einmal bei Close- und Hide-Event).
Wenn du noch besser machen willst, lege die einzelnen Bilder statt in eine ImageList gleich in 10 einzelne Bitmaps, am besten in ein (Dynamic)Array. Dann kannst du direkt zeichnen, ohne das Bitmap kopieren zu müßen.bis bald
akari
-
Wie lege ich die Bilder in ein Array? Hast du vielleicht einen kleinen Ansatz?
-
Hallo
Ich würde es so machen :
- Die Bitmaps, die in der Imageliste sind, bindest du es als Ressourcen ein. Dazu öffnest du das BCB-Tool Bildeditor und erstellst eine neue Ressourcendatei (*.res). Dann kannst du mit dem Kontextmenü über "Inhalt" neue Bitmaps erstellen, in die du deine vorhandenen kopierst. Diesen neuen Einträgen gibst du eindeutige Namen (Kontextmenü über Bitmap-Eintrag, Umbennenen), z.B. "Spieler1" bis "Spieler10". Diese Ressourcendatei speicherst du in dem Projektverzeichnis, z.B. unter dem Namen "Spieler.res"
- Im Projekt selber fügst du in dem betreffenden Formular (Bei meinem Beispiel Form1) in den Includes die ZeileUSERC("Spieler.res");hinzu.
- In der Datei Form1.hpp erweiterst du dir Deklaration von Form1 um das Array :protected : DynamicArray<TBitmap *> SpielerBitmap;- Du erstellst für Form1 die Events OnShow und OnHide. In diese schreibst du
void __fastcall TForm1::FormShow(TObject *Sender) { for (int Lv = 0; Lv < 10; Lv++) // 10 = Anzahl der Spieler { SpielerBitmap.Length++; // Array erweitern SpielerBitmap[Lv] = new TBitmap(); // Objekt für neues Bild erstellen SpielerBitmap[Lv]->LoadFromResourceName("Spieler" + IntToStr(Lv +1)); // Bitmap aus Resourcen laden } } void __fastcall TForm1::FormHide(TObject *Sender) { // Alle Bitmap-Objekte aus Array löschen for (int Lv = 0; Lv < SpielerBitmap.Length; Lv++) delete SpielerBitmap[Lv]; SpielerBitmap.Length = 0; // Array zurücksetzen }- Dann kannst du in deiner Funktion die Bitmaps ganz einfach ansprechen :
for (int r=0; r<SpielerBitmap.Length; r++) { if (cursor_pos==r) { Image1->Canvas->Draw(100+(r*40),350,SpielerBitmap[r]); } else Image1->Canvas->Draw(100+(r*40),400,SpielerBitmap[r]); }bis bald
akari
-
akari schrieb:
Die Bitmaps, die in der Imageliste sind, bindest du es als Ressourcen ein.
Und das hätte welchen Vorteil?
TImageList ist doch schon ein supi dynamisches Array, und verfügt über eigene Methoden, das jeweils gewünschte Bild auszugeben.
Die Imagelist kommt eigentlich nur dann nicht in Frage, wenn die Bilder unterschiedlich gross sind, was hier aber offenbar nicht der Fall ist.
-
Hallo
okay, Jansen hat Recht, das mit den Ressourcen ist nicht nötig. Statt TImageList->GetBitmap nimmst du TImageList->Draw und zeichnest direkt in das Ziel-Image.
bis bald
akari
-
Danke für die Anregungen. Da habe ich einiges zu probieren. Es dauert bei mir ein bisschen bis ich alles getestet habe (Bin leider berufstätig und kein Schüler oder Student.)
-
Habe es fertig und wollte mal die Lösung angeben (vielleicht hilft es jemanden):
1. In die Headerdatei:
private: Graphics::TBitmap *spieler_a[32];2. Bilder aus der ImageList ins Array:
void __fastcall TForm1::FormCreate(TObject *Sender) { for (int r=0; r<32; r++) { spieler_a[r]=new Graphics::TBitmap; ImageList1->GetBitmap(r,spieler_a[r]); } }3. Verwenden des Array mit MouseMove ect.
if ( X>460 && X<500 && Y>(600-186) && Y<600) { Image1->Canvas->Draw(100+(9*40),350,spieler_a[9]); }
-
Hallo
jetzt hast du es nicht effizient gamacht (was wohl meine Schuld ist). Entweder du nimmst TImageList ODER ein eigenes Array.
Wie bereits beschrieben, hat die ImageList die Funktion Draw, mit der du ohne Umwege ein Bitmap zeichnen kannst. Dann kannst du das eigene Array wieder weglassen.bis bald
akari
-
Ich habe auch eine ganze Weile nach einer Lösung mit ImageList1->Draw(...); gesucht. Gibt es denn etwas einfaches wie:
ImageList1->Draw(1,x-koordinate,y-koordinate);?
-
Hallo
Aus der Hilfe zu den Methoden der TImageList
Die Methode Draw zeichnet das mit dem Parameter Index angegebene Bild auf der bereitgestellten Zeichenfläche.
void __fastcall Draw(Graphics::TCanvas* Canvas, int X, int Y, int Index, bool Enabled);
Beschreibung
Verwenden Sie die Methode Draw zum Zeichnen eines Bildes auf der Zeichenfläche. Das Bild wird an der Position X, Y in dem Stil gezeichnet, der in der Eigenschaft DrawingStyle festgelegt ist. Wenn der Parameter Enabled auf false gesetzt ist, wird das Bild in Graustufen gezeichnet.
bis bald
akari
-
Ich bekomme es leider nicht hin. Habe jetzt das Problem, daß ich nicht verstehe wie ich ein einzelnes Bild meiner ImageList zugreifen kann. Mir fehlt etwas das Verständnis für diesen Ausdruck: "Graphics::TCanvas* Canvas". Kann mir jemand ein Beispiel für ImageList1->Draw(...) geben?
-
Hallo
ist doch ganz einfach :
for (int r=0; r<SpielerBitmap.Length; r++) { if (cursor_pos==r) ImageList1->Draw(Image1->Canvas,100+(r*40),350,r, true); else ImageList1->Draw(Image1->Canvas,100+(r*40),400,r, true); }bis bald
akari
-
Oh Wunder, es klappt. Vielen Dank!!!

-
Hallo
Wie kann ich ein bmp in ein 2d Array laden?
euer Pate
-
Hallo
Gegenfrage : Wozu brauchst du sowas?
Nimm TBitmap, mit der Eigenschaft TBitmap::Pixels kannst du auch jeden Einzelnen Pixel lesen und schreiben.bis bald
akari
-
um die position auf ein bild zu ermitteln, es wir ein bild angezeigt wo ich die mauspos einlese im array schaue ich dann nach einer bestimmten farbe...
kannst du mir das bitte genauer schreiben
also zb so
TBitmap Array[100][100];
Array[][] = LoadFromFile("\\bild.bmp);
euer pate
-
Schau bitte nochmal nach TBitmap::Pixels. Das ist ein 2D-Array.
-
sorry ich finde nix, in der hilfe gibt es keine eigenschaft pixel.
es gibt nur eine pixelformat, damit kann man das format ändernich sollte vieleicht erwähnen das ich bcb benutze
euer pate
-
Hallo
Nun gut, das muß TBitmap::Canvas::Pixels heißen.
Zugriff also zum BeispielTColor Farbe = Bitmap->Canvas->Pixels[10][5];bis bald
akari
-
ähm
ich sehe das so
das bitmap eine variable von tcolor ist, oder?braucht man eine lib um loadfromfile zu benutzen, irgendwie kennt er das nicht
euer pate