AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Sowas wie "Sprites" in einer paintbox
Thema durchsuchen
Ansicht
Themen-Optionen

Sowas wie "Sprites" in einer paintbox

Ein Thema von Stephan · begonnen am 5. Nov 2002 · letzter Beitrag vom 5. Nov 2002
Antwort Antwort
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#1

Sowas wie "Sprites" in einer paintbox

  Alt 5. Nov 2002, 19:38
Hi,

hier eine weitere paintbox Frage

also, mein Programm ist ein Netzwerkmonitor der Geräte auf verschiedene Funktionen überwacht. Dabei kann man seinen eigenen Netzwerkplan erstellen, Geräte positionieren, linien zeichnen usw.

Wie kann ich allerdings jetzt realisieren dass wenn man auf die paintbox klickt das Gerät oder Objekt angezeigt wird auf das man klickt?

Gibts vielleicht sowas wie sprites in einer paintbox?

Natürlcih könnte ich bei jedem klick eine SQL Abfrage starten auf welche Koordinaten geklickt wurde. Ist allerdings bei einer linie etc. recht schwer zu testen vorallem hab ich bei einem Gerät nur eine koordinate auf die dann ein frei bestimmbares Bild gezeichnet wird.

Aber wie könnte ich sowas lösen? Mir scheint schon dass eine paintbox bei meinem Programm doch an die Grenzen ihrer Funktionen und performance kommt.
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#2
  Alt 5. Nov 2002, 21:17
Hi Stephan,

die Paintpox ist nur einfach eine Komponente, die nur dafür ausgelegt ist, eine einfache GDI-Zeichenfläche zu bieten, mit Sprites ist das nicht viel, würe ich sagen.

Hie schlägt wohl die Stunde der wirklichen OOP. Mein Vorschlag wäre, eine Sprite-Klasse implementierst und für jedes Objekt, das dargestellt werden soll, eine Instanz erstellst. Dann erstellst du eine Ableitung der Paintbox mit einer TList als Field, in der du die Sprites verwaltest. In der Paint-Routine der Paintbox gehst du die Liste durch und zeichnest die Objekte an die Stelle, auf die sie sollen. Und in der Window-Prozedur kannst du dann auch das WM_LBUTTONDOWN abfragen kannst und, indem du die Liste durchgehst, in der die Objekte und damit deren Positionen drinstehen, herausfinden kannst, auf welches Objekt geklickt wurde und die MAßnahmen einleiten.

MfG,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#3
  Alt 5. Nov 2002, 21:21
Hallo!

Also sowas wie Sprites stellt die PaintBox wohl wirklich nicht zur Verfügung, sie dient ja auch eigentlich nur zum zeichnen. Wenn du immer gleich große Symbole verwendest kannst du ja zB ein zweidimensionales Array anlegen in dem Positionen gespeichert werden. Also mal ein einfaches Beispiel, in dem du was auch immer du anzeigen willst durch strings darstellt (wie du es nun machst ist ja letztendlich egal).
Ist also nun zb ein Symbol an der Position (0,0) auf der PaintBox, dann setzt du in dem Array das entsprechende Feld auf 'Symbol1' , also arrayvar[0,0] := 'Symbol1' (oder sonstwie).
Ich gehe jetzt von 32 * 32 großen Symbolen aus. beim Klick prüfst du dann ob das angeklickte Rasterfeld besetzt ist:

Code:
if arrayvar[x div 32,y div 32] = 'Symbol1' then //tu irgendwas
//x und y sind die Mauskoordinaten
Mit den Linien wirds auch nicht viel schwerer (zumindest wenn diese nur vertikal/horizontal sein können)

Dafür machst du halt ein Array mit jeweils zwei Punkten (x und y Koordinate -> TPoint) pro Feld (also eine Linie pro Feld), dürchläufst dieses mit ner Schleife und prüfst ob die Mauskoordinaten zwischen den Punkten liegen. //so ungefähr


Gruß, Sebastian
  Mit Zitat antworten Zitat
Stephan

Registriert seit: 28. Jun 2002
Ort: Tuttlingen
245 Beiträge
 
Delphi 2007 Professional
 
#4
  Alt 5. Nov 2002, 21:31
Hallo,

hm, es sind leider nicht nur vertikale und horizontale Striche.

Hm, ich denke ich werde mir da wohl was aus der painbox basteln müssen.
Naja, vielleicht könnte ich was mit einem mehrdimensionalen array machen. So müsste ich schon nicht ständig den Datensatz durchgehen. Aber ob das den sooo großen Geschwindigkeitsvorteil bringt? Vorallem müsste ich das array sofort nach der Änderung eines Gerätestatuses aktualisieren. Naja, dafür könnte man ja nen eigenen Thread kreieren

Mein Hauptproblem ist ich brauch am besten auch bei hunderten von Objekten eine gute performance. Sie sollen alle innerhalb kürzester Zeit gezeichnet werden. Was meint ihr? Ist eine solche Geschwindigkeit wirklich problemlos zu realisieren? Alle Daten werden aus einer Datenbank über die BDE geladen. Jedes Objekt hat einen eigenen Datensatz.

Naja, das Programm ist auch Multiuserfähig. Auch da müsste ich bei Änderungen das array aktualisieren.

Ein anderes Problem ist dass die ganze paintbox aufflackert sobald ich sie aktualisiere und alles neu Zeichne. (ich muss ja davor alles löschen vielleicht wurde ja ein Gerät verschoben oder entfernt). Aber wie könnte ich dieses flackern wegbekommen?
viele Grüße

Stephan
  Mit Zitat antworten Zitat
Sebastian Nintemann
(Gast)

n/a Beiträge
 
#5
  Alt 5. Nov 2002, 21:46
Hallo nochmal, das Problem beim flackern tritt auf, sobald du mehr als eine Zeichenaktion auf einmal auf das Canvas machst. Umgeh es indem du auf ein Bitmap zeichnest und dann das Bitmap auf das Canvas. Außerdem (meine Erfahrung, muss nicht immer so sein):
Ich hatte im OnPaint der PaintBox nur die Aktion stehen, das Bitmap aufs Canvas zu zeichnen. In einer Routine wurde dieses Bitmap verändert, um neu zu zeichnen rief ich Repaint auf. Ergebnis: es flackerte. Als ich statt Repaint dann das Bild einfach so neu gezeichnet hab gabs kein Flackern, obwohl im Prinziep in beiden Fällen nur das Bitmap auf das Canvas gezeichnet wurde (mit Draw).

Zur Performance: ein Array mit if-Abfragen durchzulaufen ist nicht sehr zeitaufwändig. Auf das Bitmap zeichnen und dieses erst anschließend auf den Bildschirm zu bringen dürfte auch kein Problem sein.

Zu den Strichen: funktioniert ja im Prinziep genauso, ist nur halt ein bisschen mathelastiger
Du kannst ja auch bei schrägen Linien prüfen ob gegebene Koordinaten auf der Linie liegen

Gruß, Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz