Seite 1 von 1

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

Verfasst: 28.07.2013 16:25
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

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

Verfasst: 28.07.2013 16:41
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. :?

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

Verfasst: 28.07.2013 16:49
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

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

Verfasst: 28.07.2013 17:12
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

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

Verfasst: 28.07.2013 17:23
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