Fenster durch DLL weitere Gadgets hinzufügen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
[chaos]
Beiträge: 9
Registriert: 04.08.2006 14:40
Wohnort: Ludwigshafen
Kontaktdaten:

Fenster durch DLL weitere Gadgets hinzufügen

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Beitrag von saimen »

Wie würde denn eine API Funktion aussehen um von einer DLL aus z.b.
text$=Getgadgettext(2) auszuführen?
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Code: Alles auswählen

SendMessage_(GadgetID, #WM_GETTEXT, ...)
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Beitrag von saimen »

beim Ausführen Fehlermeldung:

Zeile 6: Structure not found: integer
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Dann nimm "Long" statt "Integer"
Benutzeravatar
saimen
Beiträge: 172
Registriert: 26.01.2005 10:44
Wohnort: Passau
Kontaktdaten:

Beitrag von saimen »

Dann bekomme ich bei der Zeile "PB_Gadget_Objects\i = Object" folgende Meldung:
"Structure field not found: i"
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

\i in \l ändern ...
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten