Seite 1 von 2

(...,ImageID...)

Verfasst: 24.02.2009 20:49
von BginnR
Hi leuts,
ich hab mal so in der PB help gestöbert und bin auf folgenden Befehl gestoßen:
ImageGadget(#Gadget, x, y, Breite, Hoehe, ImageID [, Flags])
Und ich hab mich gefragt, was das ImageID soll.
In der PB help steht schon was darüber aber ich kapier das nicht ganz für was der überhaupt da ist.
Kann mir jemand helfen?
Vielen dank im voraus

Verfasst: 24.02.2009 20:52
von php-freak
Jedes Bild hat eine ImageID! Diese brauchst du für Image Operation!

Und so kriegst du sie raus:

Code: Alles auswählen

ImageID = ImageID(#Image)

Verfasst: 25.02.2009 01:22
von AND51
Alles in PureBasic hat eine sogenannte ID und ein Handle.
  • Die ID ist das, was du bei OpenFile(), CreateImage(), LoadSprite(), CatchSound(), ButtonGadget() und so weiter einsetzen musst.
    Diese Identifikationsnummer hilft PureBasic, die Objekte zu verwalten; PureBasic weiß anhand der Nummern, dass hinter der Nummer 0 ein OpenWindow() und hinter der Nummer 5 ein ListIconGadget() steckt.
    Nicht gleichartige Ressourcen können allerdings die gleiche ID haben. Das heißt im Klartext: Du kannst in deinem Programm ein Bild (LoadImage()), eine geöffnete Datei (ReadFile()) und ein Gadget (z. B. ComboboxGadget()) haben, die alle die ID 3 besitzen. Es ist also kein Problem eine ID mehrmals im Programm zu verwenden, ein Bild mit der ID 3 wird also nicht automatisch gelöscht oder etwa überschrieben, bloß weil du später im Programm eine Datei mit der ID 3 öffnest.
    Anders verhält es sich, wenn du zwei Gadgets, zwei Bilder, zwei Sprites, zwei Fenster oder zwei Dateien hast, denen du die gleiche ID zuweisen möchtest. Dann wird die erste Ressource automatisch freigegeben (also gelöscht) und die zweite Ressource tritt an seine Stelle. Dieses Verhalten, was mir persönlich schon lange bekannt ist und wovon ich auch Gebrauch mache, ist erst heute einem unserer Kollegen hier im Board aufgefallen: http://www.purebasic.fr/german/viewtopi ... 1_ist_cool
  • Das Handle identifiziert jedes Objekt systemweit. Das bedeutet: PureBasic's Objekteverwaltung funktioniert anders, als die vom Betriebssystem. Für das Betriebssystem darf eben kein Bild die gleiche ID haben, wie das Gadget.
    Das hat mehrere Gründe.
    Zum einen funktioniert die interne Objekteverwaltung jeder Programmiersprache anders. In PureBasic ist es nun mal so, dass mehrere nicht gleichartige Objekte gleiche ID haben dürfen, wie oben beschrieben. In einer anderen Programmiersprache ist das vielleicht nicht mehr so. Ein Betriebssystem kann sich aber nicht auf jede Programmiersprache einstellen. Vielmehr muss jede Programmiersprache dem Betriebssystem seine Objekteverwaltung verständlich machen.
    Zum anderen ist dein Programm nicht das einzige, was auf dem Computer ausgeführt wird. Stell dir vor, dein PureBasic Programm wird zwei Mal gestartet und es lädt ein Bild mit der ID 5. Was soll das Betriebssystem denn da denken?
    Deswegen steckt hinter jeder ID ein Handle, also eine Art ID, die aber im ganzen Betriebsystem eindeutig ist. Dein Bild, was du mit LoadImage() lädst, hat also von dir die ID 5 bekommen, aber vom Betriebssystem bekommt es z. B. das Handle 4153958 zugewiesen. Die Zahl 4153958 gehört also zu genau deinem Bild aus dem einen Programm. Es gibt weder eine Datei, noch ein Gadget oder ein Sprite, welches auch dieses Handle hat.
    Dieses Handle wird unter anderem von der API des jeweiligen Betriebssystems gebraucht. Und an das Handle kommst du eben über ImageID(), SpriteID(), ThreadID(), FileID(), und so weiter. Zugegeben — der Name dieser Funktionen ist unglücklich gewählt. Man denkt, diese Funktionen ermitteln die ID, aber die hat man ja bereits. Nein, entgegen dieser ersten Vermutung ermitteln all diese Funktionen das Handle von der jeweiligen ID, die man einsetzt.
    Hinweis: Unter dem sogenannten Betriebssystem "Windows" kann man im "Taskmanager" bei der Registerkarte "Leistung" im Abschnitt "System" sehen, wie viele Handles das Betriebssystem gerade verwaltet. Bei mir sind es gerade 24650, das bedeutet also, dass alle Programme zusammen 24650 Bilder, Gadgets, Fenster und Dateien geöffnet haben. Denn wir wissen ja jetzt: Jeder Knopf, jedes Symbol und jedes Fenster hat ein Handle. Interessant!

In Kurzform:
Die ID identifiziert Objekte nur programmweiter, d. h. innerhalb von PureBasic.
Das Handle identifiziert jedes Objekt systemweit.

Vergleichbar mit:
Dein Name identifiziert dich nur innerhalb deiner Familie;
deine Steueridentifikationsnummer aber deutschlandweit. :mrgreen:

Verfasst: 25.02.2009 01:30
von Kaeru Gaman
@AND

das ist so nicht ganz richtig.

was du oben die ID nennst, ist die Nummer.

die ID wird zurückgeliefert von der Funktion ImageID(Nummer).
sie ist eine eindeutige Objekt-ID, innerhalb von PureBasic.
Also so etwas, wie ein PB-Internes Hanlde, aber nicht das OS-Handle.

zur weiteren Verwirrung, siehe auch hier:
http://www.purebasic.fr/german/viewtopi ... 172#233172

Verfasst: 25.02.2009 01:36
von STARGÅTE
jo wenn PB eine Nummer will, dann steht ja #Image, #Gadget, #File
da
und wenn ImageID oder GadgetID, dort verlangt wird, dann muss auch immer die entsprechende Funktion verwendet werden: ImageID(#Image), GadgetID(#Gadget)

Verfasst: 25.02.2009 01:41
von AND51
Ja das stimmt. Da muss ich euch Recht geben. Das von mir beschriebene System stimmt zwar, aber die Bezeichnung ist nicht 100%ig korrekt. Sorry, diese Bezeichnungen habe ich mir so verinnerlicht und gebrandmarkt.

Dann dürfte aber dieser Abschnitt nicht ganz richtig sein:
Handles und Nummern hat geschrieben:Handles und Nummern

Nummern

[...]

Zum Beispiel geben folgende Event-Funktionen diese ID's zurück:
EventGadget()
EventMenu()
EventWindow()

[...]
Diese Funktionen geben demnach also nicht die ID, sondern die #Nummer des entsprechenden Objektes zurück.

Auf diesen Artikel in der Hilfe möchte ich im Zuge dieser Fragestellung übrigens zum besseren Verständnis hinweisen.

Verfasst: 25.02.2009 01:44
von Kaeru Gaman
Hinweis zur Kenntnis genommen.
schreibs doch mal in den "Schreibfehler"-thread.

Verfasst: 25.02.2009 01:49
von AND51
Ah stimmt, den Threads gibts ja auch noch.

Wirt glaich erledikt und dann ap in di Heia!

Verfasst: 25.02.2009 10:08
von RSBasic
@AND51
:lol: :allright:

Verfasst: 25.02.2009 14:42
von PMV
Hä? ImageID() gibt das OS-Handle zurück ... genau so wie GadgetID(),
WindowID() usw. du bist glaub grad etwas verwirrt, Kaeru o_O

ID = (Identifikations)Nummer, AND51 hat doch recht. :? Das Problem bei
der ganzen sache ist nur, dass die Hilfe bzw. die PureBasic-Befehle nicht
"Handle" sondern immer ID schreiben, obwohl die PB-Nummer auch eine ID
ist.

MFG PMV