(...,ImageID...)

Anfängerfragen zum Programmieren mit PureBasic.
BginnR
Beiträge: 39
Registriert: 06.12.2008 19:44
Kontaktdaten:

(...,ImageID...)

Beitrag 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
PB 3.30
PB 4.30 Demo
php-freak
Beiträge: 536
Registriert: 07.02.2009 18:08

Beitrag 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)
PureBasic 4.30 (x86)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Hinweis zur Kenntnis genommen.
schreibs doch mal in den "Schreibfehler"-thread.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ah stimmt, den Threads gibts ja auch noch.

Wirt glaich erledikt und dann ap in di Heia!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

@AND51
:lol: :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten