Gültigkeit von Konstanten bzw. Nummern statt ID's

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Gültigkeit von Konstanten bzw. Nummern statt ID's

Beitrag von Daffy0815 »

Hallo,

ich habe hier ein ganz merkwürdiges Phänomen!
Da ich das mit den Nummern bzw. ID's ziemlich verwirrend und teilweise auch etwas inkonsequent finde hame ich versucht den folgen Code von ID's auf Nummern umzustellen.

Erst mal der lauffähige Code mit ID's:

Code: Alles auswählen

EnableExplicit

Declare.i _MenuItemWidth(WindowID.i, MenuID.i, MenuItemNumber.i)
Declare.i _MenuItemsWidth(WindowID.i, MenuID.i)

#WindowNumber = 1
#MenuNumber = 1


If OpenWindow(#WindowNumber, 0, 0, 400, 70, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If CreateMenu(#MenuNumber, WindowID(#WindowNumber))
    MenuItem(0, "Datei")
    MenuItem(1, "Bearbeiten")
    MenuItem(2, "Hilfe")
  EndIf
  
  ResizeWindow(#WindowNumber,#PB_Ignore,#PB_Ignore, _MenuItemsWidth(WindowID(#WindowNumber), MenuID(#MenuNumber)), #PB_Ignore)
 
  Debug "Breite von MenuItem ''Datei'': " + _MenuItemWidth(WindowID(#WindowNumber), MenuID(#MenuNumber), 0)
  Debug "Breite von MenuItem ''Bearbeiten'': " + _MenuItemWidth(WindowID(#WindowNumber), MenuID(#MenuNumber), 1)
  Debug "Breite von MenuItem ''Hilfe'': " + _MenuItemWidth(WindowID(#WindowNumber), MenuID(#MenuNumber), 2)
  Debug "Breite aller MenuItems: " + _MenuItemsWidth(WindowID(#WindowNumber), MenuID(#MenuNumber))
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Procedure _MenuItemWidth(WindowID.i, MenuID.i, MenuItemNumber.i)
  Protected WinRect.rect
  Protected MenuRect.rect
  Protected MenuItemXPos.i
  Protected MenuItemWidth.i
 
  GetWindowRect_(WindowID.i, WinRect.rect) 
  GetMenuItemRect_(WindowID.i, MenuID.i, MenuItemNumber.i, MenuRect.rect)
 
  MenuItemXPos.i = MenuRect.rect\Left - WinRect.rect\Left
  MenuItemWidth.i = MenuRect.rect\Right - MenuRect.rect\Left
 
  ProcedureReturn MenuItemWidth.i
EndProcedure

Procedure _MenuItemsWidth(WindowID.i, MenuID.i)
  Protected MenuItemCounter.i
  Protected MenuItems.i
  Protected MenuItemsWidth.i
 
  MenuItems.i = GetMenuItemCount_(MenuID.i)-1
 
  For MenuItemCounter.i = 0 To MenuItems.i
    MenuItemsWidth.i + _MenuItemWidth(WindowID.i, MenuID.i, MenuItemCounter.i)
  Next
 
  ProcedureReturn MenuItemsWidth.i * 1.05834
EndProcedure
Und nun das Gleiche mit Nummern:

Code: Alles auswählen

EnableExplicit

Declare.i _MenuItemWidth(WindowNumber.i, MenuNumber.i, MenuItemNumber.i)
Declare.i _MenuItemsWidth(WindowNumber.i, MenuNumber.i)
Declare.i _CreateMenu(MenuNumber.i, WindowNumber.i)

#WindowNumber = 1
#MenuNumber = 1


If OpenWindow(#WindowNumber, 0, 0, 400, 70, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  If _CreateMenu(#MenuNumber, #WindowNumber)
    MenuItem(0, "Datei")
    MenuItem(1, "Bearbeiten")
    MenuItem(2, "Hilfe")
  EndIf
                           
  ResizeWindow(#WindowNumber, #PB_Ignore, #PB_Ignore, _MenuItemsWidth(#WindowNumber, #MenuNumber), #PB_Ignore)
 
  Debug "Breite von MenuItem ''Datei'': " + _MenuItemWidth(#WindowNumber, #MenuNumber, 0)
  Debug "Breite von MenuItem ''Bearbeiten'': " + _MenuItemWidth(#WindowNumber, #MenuNumber, 1)
  Debug "Breite von MenuItem ''Hilfe'': " + _MenuItemWidth(#WindowNumber, #MenuNumber, 2)
  Debug "Breite aller MenuItems: " + _MenuItemsWidth(#WindowNumber, #MenuNumber)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Procedure _MenuItemWidth(WindowNumber.i, MenuNumber.i, MenuItemNumber.i)
  Protected WinRect.rect
  Protected MenuRect.rect
  Protected MenuItemXPos.i
  Protected MenuItemWidth.i

  GetWindowRect_(WindowID(WindowNumber.i), WinRect.rect) 
  GetMenuItemRect_(WindowID(WindowNumber.i), MenuID(MenuNumber.i), MenuItemNumber.i, MenuRect.rect)
 
  MenuItemXPos.i = MenuRect.rect\Left - WinRect.rect\Left
  MenuItemWidth.i = MenuRect.rect\Right - MenuRect.rect\Left
 
  ProcedureReturn MenuItemWidth.i
EndProcedure

Procedure _MenuItemsWidth(WindowNumber.i, MenuNumber.i)
  Protected MenuItemCounter.i
  Protected MenuItems.i
  Protected MenuItemsWidth.i
 
  MenuItems.i = GetMenuItemCount_(MenuID(MenuNumber.i))-1
 
  For MenuItemCounter.i = 0 To MenuItems.i
    MenuItemsWidth.i + _MenuItemWidth(WindowID(WindowNumber.i), MenuID(MenuNumber.i), MenuItemCounter.i)
  Next
 
  ProcedureReturn MenuItemsWidth.i * 1.05834
EndProcedure

Procedure _CreateMenu(MenuNumber.i, WindowNumber.i)
  ProcedureReturn CreateMenu(MenuNumber.i, WindowID(WindowNumber.i))
EndProcedure

Kann mir jemand verraten warum das nicht funktioniert?

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8838
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Gültigkeit von Konstanten bzw. Nummern statt ID's

Beitrag von NicTheQuick »

Irgendwie sehe ich den Unterschied zwischen den beides Codes bis auf _CreateMenu() nicht. Bin wohl blind.
Und was meinst du vor allem mit Nummern bzw. IDs? Wie definierst du beides? Testen kann ich es ohne Windows leider gerade nicht. Ich hab jetzt gedacht du willst von statischen IDs auf dynamische IDs (#PB_Any) wechseln, aber das scheinst du nicht zu meinen. :?
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Gültigkeit von Konstanten bzw. Nummern statt ID's

Beitrag von Daffy0815 »

@NicTheQuick

Hab den Fehler gerade selbst gefunden!

Statt

Code: Alles auswählen

MenuItemsWidth.i + _MenuItemWidth(WindowID(WindowNumber.i), MenuID(MenuNumber.i), MenuItemCounter.i)
muss es

Code: Alles auswählen

MenuItemsWidth.i + _MenuItemWidth(WindowNumber.i, MenuNumber.i, MenuItemCounter.i)
heißen.

Gemeint habe ich etwas anderes:

Mich stört das einerseits Funktionen mit (selbst vergebenen) Nummern parametriert werden und dann wieder anderen Funktionen die "ID" der Parameter übergeben wird.

Ein gutes Beispiel dafür ist "CreateMenu".

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
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

Re: Gültigkeit von Konstanten bzw. Nummern statt ID's

Beitrag von ts-soft »

Mich stört das aber eher weniger, ich benötige dieses Feature sehr oft :wink:

Manche PB-Funktionen erwarten ein Handle, also z.B. WindowID(0), somit lassen sich diese auch
per API nutzen, weil es für API-Objekte ja keine PB_ID gibt.

Hat also seinen Grund, warum das so ist.

Gruß
Thomas
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
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: Gültigkeit von Konstanten bzw. Nummern statt ID's

Beitrag von Daffy0815 »

@ts-soft

Das ist mir schon klar!
Aber das Eine schließt das Andere doch nicht aus!

Ich finde es einfach übersichtlicher prinzipiell immer die von mir via Enumeration vergebene PB_ID zu verwenden und bei Bedarf in den Proceduren die einen Handle benötigen diesen dann mittels xxxxID(PB_ID) zu bilden.
Ausserdem werden die Aufrufe solcher Prozeduren wesentlich kürzer!

Gruß

Daffy
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten