GadgetID bei #PB_Any

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

ts-soft hat geschrieben:Die Structure steht in Gadget.h im Librariy-SDK. Ist auch nur im
Zusammenhang von Libraries, die Gadgets erstellen, sinnvoll einsetzbar.[...]

Erklaer mir mal bitte warum das nur mit Libs sinnvoll waere.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

edel hat geschrieben:
ts-soft hat geschrieben:Die Structure steht in Gadget.h im Librariy-SDK. Ist auch nur im
Zusammenhang von Libraries, die Gadgets erstellen, sinnvoll einsetzbar.[...]

Erklaer mir mal bitte warum das nur mit Libs sinnvoll waere.
Bei welcher Art von Anwendungen ist es denn sonst noch Sinnvoll?
Wird in > 99,9 % aller Anwendungsfälle nicht benötigt
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Was spricht denn dagegen ?

Beispiel :

Code: Alles auswählen

  Structure PBWindow 
    hwnd.l
  EndStructure
  
  Structure PBGadget
    hwnd.l
    *vt
    Userdata.l
  EndStructure
  
  Structure PBImage
    Handle.l 
    cx.w
    cy.w
    d.w 
  EndStructure
  
  Structure Application
    *Window.PBWindow 
    *Image.PBImage 
    *Button1.PBGadget
    *ImageGD.PBGadget 
    Event.l
    delay.l
  EndStructure
  
  Global App.Application
  
  
  App\Window = OpenWindow(#PB_Any,0,0,300,300,"")
  App\delay  = #PB_Default
   
  CreateGadgetList(App\Window\hwnd)
  
  App\image    = CreateImage(#PB_Any,200,100,32)
  
  App\Button1  = ButtonGadget(#PB_Any,10,10,100,25 ,"Button1")
  App\image    = ImageGadget(#PB_Any,10,40,App\image\cx,App\image\cy,App\image\Handle)

  Repeat
    App\Event = WaitWindowEvent(App\delay)
    
    Debug App\Event
    
    If App\Event = #PB_Event_Gadget 
      Select EventGadget()
        Case App\Button1 
          If App\delay = 10
            App\delay = #PB_Default
          Else
            App\delay = 10
          EndIf
      EndSelect 
    EndIf
    
  Until App\Event = #WM_CLOSE
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

Interne PB Strukturen sind nicht dafür gedacht in PB code verwendet zu werden.
Das hat mehrere Gründe:

- Der Inhalt oder die Funktion der Strukturen kann sich jederzeit ändern. Hacks basierend auf internen Informationen sind in
der Vergangenheit oft im Forum geposted worden. Für den Moment funktionieren die ja ganz gut,
aber mit dem nächsten PB Update kommen dann die ganzen Anfragen warum dies oder jenes nicht mehr funktioniert.

- Sie (gut) zu dokumentieren und vorallem up to date zu halten kostet viel Zeit, die wir nicht haben.
Auserdem muss man auch für alles was man dokumentiert auch einen gewissen Grad an Support leisten.
Wir wollen nicht unsere Zeit mit Anfragen/Problemen verschwenden, die Sachen betreffen,
die eigentlich auser uns niemanden angehen.

- Diese Strukturen sind auf jedem OS mit dem PB funktioniert anders.
Ich weis das viele hier außer der Windows Version nichts interessiert, aber das PB
Konzept ist eben das Entwickeln von Programmen für mehrere Systeme, und das
Veröffentlichen dieser Daten steht da im Konflikt dazu.

- Die enthaltenen Informationen sind für normalen PB code nicht von Nutzen.
Sie sind ja nur dazu da, Daten für die PB Funktionen zu speichern, d.h. alles was da drin ist und für
PB code interessant ist, kann auch durch eine PB funktion erhalten werden.

Bestes Beispiel ist dieser Thread hier. Für die gestellte Frage ist die Lösung über die intene
Gadget Struktur absoluter Overkill, weil die GadgetID() funktion genau das gleiche Ergebnis
liefert, und das ist eine einfache, offizielle dokumentierte funktion. Das verwenden der
Struktur direkt ist hier nichts mehr als eine potentielle Problemquelle mit dem nächsten Update.

Die meisten derartigen Hacks die man so in den Foren sieht würden sich mit ein paar mehr
Zeilen auch in reinem PB code lösen. Trotzdem greifen viele (auch Anfänger) zu solchen
codes wenn sie einmal im Forum sind, und wenn es dann nach dem Update nicht mehr
klappt haben sie keine Ahnung wiso.

Der ursprüngliche Gedanke für die dokumentation einiger solcher Strukturen in früheren
Versionen war der das es Programmierern von Userlibs die Chance geben sollte Funktionen
zu schreiben, die mit PB Objekten umgehen können und dabei sich wie PB's eigene Funktionen
verhalten.
Das wurde aber fast gar nicht genutzt, sondern die Informationen wurden eben nur für derartige Hacks verwendet.
Zu welchen Problemen das führt hat man mit dem v4 Update gut gesehen.

Wenn jemand derartige Infos braucht um eine Lib zu schreiben kann er sich gerne direkt
an uns wenden und wir können die benötigten Informationen dann gerne herrausgeben,
aber nicht mehr einfach als eine Liste von Strukturen so wie früher.

@edel:
Ich verstehe den Sinn dieser Art zu programmieren ganz und gar nicht. Für alles was du da machst
gibt es Funktionen in PB. Wozu also das Risiko eingehen das mit dem nächsten Update
gar nichts mehr funktioniert, wenn es doch gar nicht sein muss ?
Der Code den du da geposted hast bräuchte nur geringfügige Änderungen und keine
der Strukturen wäre nötig.
Das ist genau das was wir verhindern wollen, weil es eben nur Probleme schafft und keinen
Nutzen bringt.

Wenn dir die Art wie die PB Objekte gehandhabt werden nicht gefällt, warum dann überhaupt diese
Objekte verwenden und nicht gleich direktes API ?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Leider fehlen in PB noch entsprechende Funktionen, um selber Gadgets zu
registrieren, bzw. um eigene UserLibs zu erstellen. Wenn sowas von Hause
aus unterstützt wäre, bräuchte man die Strukturen nicht und es würde keine
Konflikte geben.

Wäre auf jedenfall wünschenswert, wenns in dieser Richtung offizielle
Erweiterungen geben würde. Solange es die nicht gibt, muß man eben auf
solche Dinge zurückgreifen, obwohl es früher oder später zu problemen
führen kann.

Die Nutzung nur der Syntax wegen, da sehe ich auch keinen Sinn drinn.
Gerade wegen der einfachen einheitlichen Syntax mag ich PB ja :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

@freak
Ich kann deine Argumente zwar nachvollziehen, aber mir macht
dieser Code (zugegeben, er ist etwas uebertrieben) mehr Spass.
Warum sollte ich noch extra eine Funktion bemuehen, wenn die
Informationen doch schon vorhanden sind ...?

Wie gesagt, du hast natuerlich Recht. Ich fuer meinen Teil
poste ja schon gar keinen 'Hallodri-Code' mehr. Solch ein Code
wirft nur zuviel Fragen auf, die ich ja selber kaum beantworten
kann.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Warum sollte ich noch extra eine Funktion bemuehen, wenn die
Informationen doch schon vorhanden sind
:? ... das kann ich nicht nachvollziehen :lol:
Funktionen sind dafür da, um Werte zurück zu geben. Daher ruft man sie
auch auf /:-> ... es handelt sich dabei auch oft einfach nur um einen Wert
der irgend wo im Speicher steht. Damit man sich aber nicht immer darum
kümmern muss, wo er steht, hat man die Funktion. Seit PB 4.0 kann man
natürlich für diesen zweck nun besser Macros benutzt. Aber ansonnsten
ist das gang und gebe. :wink: Du solltest dir deinen "Spaß" schnell wieder
abgewöhnen, sonnst wirst du wohl bald richtigen Spaß mit deinen Codes
haben :lol: (nur nen Tipp :D )

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Code: Alles auswählen

Procedure Test()
  ProcedureReturn 10
EndProcedure

var = 10
var = Test()
Ich hoffe dir faellt auf, dass das Bloedsinn ist ?
Daher schreibe ich es halt lieber so :

Code: Alles auswählen

*win.Long = OpenWindow(-1,0,0,100,100,"")

CreateGadgetList(*win\l)

*button.Long = ButtonGadget(-1,3,3,100,20,"")

Repeat : Until WaitWindowEvent()    = #WM_CLOSE
Was den Spass betrifft so programmiere ich nicht wie Fred, Freak
oder ein PMV es gerne moechten. Und Probleme hatte ich bis jetzt
nur mit '_PB_Gadget_CurrentObject' und PB4. Der Rest funktioniert
so auch unter <V4.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Was ich sehr gut fände wäre eine Doku darüber was eine PB Funktion ist und was ein MAcro ist. zB wäre ien macro für RGB() oder soetwas ja sehr sinnvoll.
Benutzeravatar
Leonhard
Beiträge: 602
Registriert: 01.03.2006 21:25

Beitrag von Leonhard »

freak hat geschrieben:- Die enthaltenen Informationen sind für normalen PB code nicht von Nutzen.
Sie sind ja nur dazu da, Daten für die PB Funktionen zu speichern, d.h. alles was da drin ist und für
PB code interessant ist, kann auch durch eine PB funktion erhalten werden.
Wo bekomme ich den DC- (Device Context) Handle von einer 2D-Zeichnung??? Ich mein mit einer normalen Funktion und nicht mit der Rückgabe von StartDrawing().
Antworten