Seite 1 von 2

Fenster durch DLL weitere Gadgets hinzufügen

Verfasst: 21.02.2009 23:49
von [chaos]
Hallo,

wenn ich einem Fenster mit einer DLL weitere Gadgets hinzufügen will, kommt bei der Eventabfrage des betroffenen Fenster ein IMA. Ich weiss auch nicht wo der Fehler liegen soll...

Programm:

Code: Alles auswählen

If OpenWindow(0, 232, 289, 185, 85, "Test",  #PB_Window_SystemMenu | #PB_Window_TitleBar )
  ButtonGadget(0, 5, 5, 70, 25, "Button 1")
  ButtonGadget(1, 5, 55, 70, 25, "Button 2")
      
  ContainerGadget(2, 80, 5, 100, 75, #PB_Container_Flat)
  CloseGadgetList()
  
  OpenLibrary(0, "Test.dll")
  CallFunction(0, "Function", GadgetID(2))
  CloseLibrary(0)
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf
DLL:

Code: Alles auswählen

ProcedureDLL Function(hWndContainer.l)
  UseGadgetList(hWndContainer)
  ButtonGadget(3, 5, 5, 90, 65, "Button 3")
  CloseGadgetList()
EndProcedure


Mag sein, dass die Lösung zu einfach ist und man schon ein paar mehr Befehle braucht um das Problem zu lösen.

Bin für jede Hilfe dankbar.

Verfasst: 22.02.2009 00:45
von PMV
PB verwaltet die Gadgetlist sicher intern und somit ist diese Konstruktion
mit PB-Befehlen nicht möglich. Mich würde es zumindest stark wundern.

Wenn du in der DLL aber mit API arbeitest sollte es schon irgned wie
klappen.

MFG PMV

Verfasst: 23.02.2009 10:22
von saimen
Wie würde denn eine API Funktion aussehen um von einer DLL aus z.b.
text$=Getgadgettext(2) auszuführen?

Verfasst: 23.02.2009 16:38
von HeX0R

Code: Alles auswählen

SendMessage_(GadgetID, #WM_GETTEXT, ...)

Verfasst: 23.02.2009 16:40
von edel
Das geht schon, man muss nur die GadgetListe an die DLL uebergeben.

Beispiel :

DLL

Code: Alles auswählen

Import ""
  PB_Gadget_Objects.integer
EndImport 

Global Text.s

ProcedureDLL InstallGadget(Object)
  PB_Gadget_Objects\i = Object
EndProcedure

ProcedureDLL.s Test(gadget)
  Text = GetGadgetText(gadget)
  ProcedureReturn Text
EndProcedure
Programm :

Code: Alles auswählen

Import "DLL.lib"
  
  InstallGadget(Object)
  Test(gadget)
  
  PB_Gadget_Objects.integer  
EndImport 

InstallGadget(PB_Gadget_Objects\i)

If OpenWindow(0, 0, 0, 230, 90, "Event-Handling Beispiel...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ButtonGadget(0,0,0,0,0,"Halloooo")
  ButtonGadget(1,0,0,0,0,"Huhuhu")
  
  Debug PeekS(Test(1))
  Debug PeekS(Test(0))
  
EndIf
Man muss dann nur aufpassen, da sich die dll und das Programm
dann eine Liste teilen.

Verfasst: 23.02.2009 16:50
von PMV
Stimmt, wenn man die internen Strukturen von PB kennt geht alles ...
:allright:
... aber wer kennt die schon? :?

Ich will hier allerdings noch erwähnen, zur Vollständigkeit :D ...
Ändern sich diese internen Strukturen in einer zukünftigen Version kann das
im schlimmsten Fall zu undefiniertem Verhalten führen. In jedem Fall muss
dieser Codeteil aber wieder angepasst werden an die entsprechenden
neuen Strukturen. Wenn man also nicht selber weis wie man an die
Informationen kommt ist das für ein "größeres" Projekt nicht ratsam, sofern
man anstrebt, immer die aktuellste PB-Version zu nutzen.

MFG PMV

Verfasst: 23.02.2009 20:15
von saimen
beim Ausführen Fehlermeldung:

Zeile 6: Structure not found: integer

Verfasst: 23.02.2009 20:31
von edel
Dann nimm "Long" statt "Integer"

Verfasst: 23.02.2009 20:46
von saimen
Dann bekomme ich bei der Zeile "PB_Gadget_Objects\i = Object" folgende Meldung:
"Structure field not found: i"

Verfasst: 23.02.2009 20:52
von Fluid Byte
\i in \l ändern ...