Seite 2 von 2

Verfasst: 19.08.2006 16:48
von #NULL
@konne,
mich würde mal einfach so interessieren, was du machen willst, bzw wozu du das benötigst.

Verfasst: 19.08.2006 17:35
von mk-soft
In der DLL das Gadget mit der ID #PB_Any erzeugen und auf die zurückgegebene ID in der Event Schleife reagieren.

EDIT: Siehe Hilfe -> UseGadgetList(WindowID)

FF :wink:

Verfasst: 19.08.2006 18:00
von Konne
Ich möchte ein Program schreiben und will es den Pure Leute einfach machen mitzuentwickeln so das es ein großes Komunity Projekt werden kann, ohne dass jeder sourcecodes irgendwo reinfrickeln muss.
Ich habe mir dedacht dass sowas doch einfach möglich sein sollte.

Verfasst: 19.08.2006 19:13
von mardanny71
@Konne

Schöne Idee
Aber es wäre mit Sicherheit einfacher, sich stattdessen auf Regeln zum Einfügen von Quellcode zu einigen bzw diese Vorzugeben.
Zum Beispiel, jeder Autor liefert seinen Code als *.pbi und declariert die Prozeduren in der Hauptdatei, mit entsprechender Kommentierung.

Solange nur in PB Entwickelt wird, wäre das mit Sicherheit einfacher

grüsse an alle
mardanny71

Verfasst: 19.08.2006 20:36
von mk-soft
Habe mal ausprobiert ein Fenster aus einer DLL zu erzeugen.
Fenster wird zwar erstellt aber das Eventhandling funktioniert nicht ???

FF :wink:

Verfasst: 19.08.2006 23:58
von Konne
Nunja ich glaube ich habe die Lösung gefunden. Ist zwar hochklassig Api aber nur für mich und nicht für die Leute die dann süäter Toolbars oder so für das Programm entwickeln wollen.
Vielleicht stelle ich mal bald ne ganz frühe Beta ins Forum.
Schau mal wie sich dass noch streckt Zeitmäßig.

Verfasst: 20.08.2006 02:20
von mardanny71
@mk-soft

Ich denke, die Anwendung ist der Boss, soll heissen das alle Ereignisse an die *.exe und nicht an die *.dll gesand werden.

Vieleicht kannst Du mit der Beschreibung zu WindowEvent() in der Hilfe was daraus machen.

grüsse an alle
mardanny71

Verfasst: 20.08.2006 11:40
von mk-soft
Ich glaube es liegt da ran das die Fensterevents an das Mainprog nicht durchkommen da die dll eine eigene Instance ist

Main:

Code: Alles auswählen

Enumeration
  #Menu_Sub1
  #Menu_Sub2
  #Menu_Sub3
  #Menu_Exit
EndEnumeration

If OpenLibrary(0, "Sub1Dll.dll") = 0
  End
EndIf



;- Main
If OpenWindow(0, 0, 0, 640, 480, "Main")

  CreateMenu(0, WindowID(0))
    MenuTitle("&Datei")
    MenuItem(#Menu_Sub1,  "Sub 1")
    MenuItem(#Menu_Sub2,  "Sub 2")
    MenuItem(#Menu_Sub3,  "Sub 3")
    MenuBar()
    MenuItem(#Menu_Exit,  "Be&enden")
  Exit = 0
  ;- Hauptschleife
  Repeat
    event   = WaitWindowEvent()
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    Select event
      Case #PB_Event_Menu                       ; ein Menü wurde ausgewählt
        Select menu
          Case #Menu_sub1
            Debug CallFunction(0, "OpenSubWindow", WindowID(0))
          Case #Menu_sub2
          
          Case #Menu_sub3
          
          Case #Menu_Exit
            Exit = 1
        EndSelect
      Case #PB_Event_Gadget                     ; ein Gadget wurde gedrückt
      Case #PB_Event_CloseWindow                ; das Schließgadget vom Fenster wurde gedrückt
        Exit = 1
      Case #PB_Event_Repaint                    ; der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen) 
      Case #PB_Event_SizeWindow                 ; das Fenster wurde in der Größe verändert
      Case #PB_Event_MoveWindow                 ; das Fenster wurde verschoben
      Case #PB_Event_ActivateWindow             ; das Fenster wurde aktiviert (hat den Fokus erhalten)
      Case #PB_Event_SysTray                    ; das SysTray wurde aktiviert
    
    EndSelect
    
    r1 = CallFunction(0, "WindowSubEvent", event, window, menu, type)
       
  Until Exit
EndIf
DLL:

Code: Alles auswählen

Global WinID

ProcedureDLL OpenSubWindow(Parend)

  If  WinID = 0
    WinID = OpenWindow(#PB_Any, 40,40, 400,280, "Sub 1", #PB_Window_SystemMenu)
    SetParent_(WinID, Parend)
    CreateStatusBar(0, WindowID(WinID))
      AddStatusBarField(100)
      AddStatusBarField(100)
      AddStatusBarField(100)
      AddStatusBarField(100)
      
  EndIf
  
  ;SetWindowLong_(WinID, #DWL_DLGPROC, GetWindowLong_(Parend, #DWL_DLGPROC))
  ProcedureReturn WinID

EndProcedure

ProcedureDLL WindowSubEvent(Event, Window, Menu, Type)

  If WinID = 0
    ProcedureReturn -1
  EndIf
  
  StatusBarText(0, 0, Str(Event))
  StatusBarText(0, 1, Str(Window))
  StatusBarText(0, 2, Str(Menu))
  StatusBarText(0, 3, Str(Type))
  
  Select event
    Case #PB_Event_Menu                       ; ein Menü wurde ausgewählt
    Case #PB_Event_Gadget                     ; ein Gadget wurde gedrückt
    Case #PB_Event_CloseWindow                ; das Schließgadget vom Fenster wurde gedrückt
      CloseWindow(WinID)
      WinID = 0
    Case #PB_Event_Repaint                    ; der Fensterinhalt wurde zerstört und muss neu gezeichnet werden (nützlich für 2D Grafik-Operationen) 
    Case #PB_Event_SizeWindow                 ; das Fenster wurde in der Größe verändert
    Case #PB_Event_MoveWindow                 ; das Fenster wurde verschoben
    Case #PB_Event_ActivateWindow             ; das Fenster wurde aktiviert (hat den Fokus erhalten)
    
  EndSelect
  
  ProcedureReturn 0
  
EndProcedure
FF :wink:

Verfasst: 21.08.2006 10:05
von Konne
Genaugenommen ist Eventhandling mit dlls kein problem, es ist nur PB's Eventhandling, dass durch seine IDs das ganze kaputt macht. Was ich gerade mache ist einen neuen Eventhandler zu schreiben.

Verfasst: 21.08.2006 17:42
von Kiffi
Konne hat geschrieben:es ist nur PB's Eventhandling, dass durch seine IDs das ganze kaputt macht.
versuch mal das PlugIn-Beispiel von Danilo:

http://www.purebasic.fr/german/viewtopic.php?t=3423

Grüße ... Kiffi