Könnte mir das evtl. jemand erklären?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Könnte mir das evtl. jemand erklären?

Beitrag von PureLust »

Hallo zusammen, ...

ich versuche mich gerade am WebGadget und bin dabei im CodeArchiv auf folgenden Code von freak gestoßen:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 600, 600, "WebBrowser", #PB_Window_ScreenCentered|#PB_Window_SystemMenu) 
  If CreateGadgetList(WindowID(0)) 

    WebGadget(0, 10, 10, 580, 555, "http://www.purebasic.com") 
    WebObject.IWebBrowser2 = GetWindowLong_(GadgetID(0), #GWL_USERDATA)   ; <<< 5. Zeile
    
    TextGadget(1, 10, 570, 100, 20, "", #PB_Text_Border) 
    
    Repeat 
      Event = WindowEvent() 
      
      WebObject\get_Busy(@IsBusy.l)   ; <<<< 12. Zeile - Was ist das bzw passiert hier ???
      If IsBusy 
        SetGadgetText(1, "busy!") 
      Else 
        SetGadgetText(1, "not busy") 
      EndIf 
      
      
      If Event = 0 
        Delay(1) 
      EndIf 
    Until Event = #PB_Event_CloseWindow 

  EndIf 
EndIf
Soweit ich diesen Code verstanden habe, wird ja in der 5. Zeile die Variable WebObject mit der Struktur IWebBrowser2 angelegt und diese dann mit dem Rückgabewert des API-Calls GetWindowLong_() gefüllt.

In Zeile 12 verstehe ich dann überhaupt nichts mehr.
Zuerst sah es für mich aus wie ein Zugriff auf ein Feld der Struktur, die ja in Zeile 5 für die Variable IWebBrowser2 erstellt wurde - aber wieso dann die Klammer (@IsBusy.l) ??? /:->
Und wieso wird der Wert von IsBusy immer wieder aktualisiert, wenn's doch nur ein Zugriff auf ein statisches Structur-Feld ist?

Also ich verstehe da momentan nur Bahnhof. :?

Wäre super nett wenn mir diesbezüglich einer von den Cracks unter Euch ein wenig auf die Sprünge helfen könnte. <)

ThanX, PL.

PS:
Hätte zufällig noch jemand eine Idee wie man in einem WebGadget z.B. den Inhalt (HTML-Quellcode) auslesen, Formularfelder ausfüllen und Buttons klicken könnte? Würde ja vermutlich über GETs und PUTs gehen. Habe diesbezüglich aber im Code-Archiv leider nichts gefunden.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
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

Beitrag von ts-soft »

Der Objectpointer fürs Webgadget wird im Gadget gespeichert, so das der
fortgeschrittene User das Object nutzen kann.

Object wird dem entsprechendem Interface zugeordnet (WebBrowser2) und
kann genutzt werden.

In Zeile 12 wird die Methode get_Busy(@IsBusy.l) aufgerufen, die das
Ergebnis in IsBusy.l speichert, deshalb muß der Pointer zu IsBusy übergeben
werden.

Am besten nochmal das Interface in der IDE mit dem Strukturverzeichnis
ansehen.

Alles klar? :wink:

Gruß
Thomas

// Nachtrag:
Hier mal das Interface, mit benannten Parametern

Code: Alles auswählen

Interface IWebBrowser2 Extends IDispatch ; Web Browser Interface for IE4.
  GoBack()
  GoForward()
  GoHome()
  GoSearch()
  Navigate(URL.p-bstr,Flags.l,TargetFrameName.l,PostData.l,Headers.l)
  Refresh()
  Refresh2(Level.l)
  Stop()
  get_Application(Level.l)
  get_Parent(Level.l)
  get_Container(Level.l)
  get_Document(Level.l)
  get_TopLevelContainer(Level.l)
  get_Type(Level.l)
  get_Left(Level.l)
  put_Left(Level.l)
  get_Top(Level.l)
  put_Top(Level.l)
  get_Width(Level.l)
  put_Width(Level.l)
  get_Height(Level.l)
  put_Height(Level.l)
  get_LocationName(Level.l)
  get_LocationURL(Level.l)
  get_Busy(Level.l);             <<< ---------------------------
  Quit()
  ClientToWindow(pcx.l,pcy.l)
  PutProperty(Property.p-bstr,vtValue.p-variant)
  GetProperty(Property.p-bstr)
  get_Name(Property.l)
  get_HWND(Property.l)
  get_FullName(Property.l)
  get_Path(Property.l)
  get_Visible(Property.l)
  put_Visible(Property.w)
  get_StatusBar(Property.l)
  put_StatusBar(Property.w)
  get_StatusText(Property.l)
  put_StatusText(Property.p-bstr)
  get_ToolBar(Property.l)
  put_ToolBar(Property.l)
  get_MenuBar(Property.l)
  put_MenuBar(Property.w)
  get_FullScreen(Property.l)
  put_FullScreen(Property.w)
  Navigate2(URL.l,Flags.l,TargetFrameName.l,PostData.l,Headers.l)
  QueryStatusWB(cmdID.l)
  ExecWB(cmdID.l,cmdexecopt.l,pvaIn.l,pvaOut.l)
  ShowBrowserBar(pvaClsid.l,pvarShow.l,pvarSize.l)
  get_ReadyState(pvaClsid.l)
  get_Offline(pvaClsid.l)
  put_Offline(pvaClsid.w)
  get_Silent(pvaClsid.l)
  put_Silent(pvaClsid.w)
  get_RegisterAsBrowser(pvaClsid.l)
  put_RegisterAsBrowser(pvaClsid.w)
  get_RegisterAsDropTarget(pvaClsid.l)
  put_RegisterAsDropTarget(pvaClsid.w)
  get_TheaterMode(pvaClsid.l)
  put_TheaterMode(pvaClsid.w)
  get_AddressBar(pvaClsid.l)
  put_AddressBar(pvaClsid.w)
  get_Resizable(pvaClsid.l)
  put_Resizable(pvaClsid.w)
EndInterface
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
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Beitrag von PureLust »

Ahhhhhhh, .... das ist also eins dieser (für mich noch) uminösen Interface.

Habe ich ja immer mal wieder was von gehört (bzw. hier gelesen), aber nie so richtig was zu gefunden bzw. sie verstanden. :roll:

Verstehe ich das also nun richtig, dass Interfaces um Grunde Objekte kapseln - man also durch Interfaces auf die Methoden der Objekte zugreifen kann und "IWebBrowser2" also nicht wie vermutet eine Struktur, sondern ein Interface war?

Und müsste man den großen Petzold dazu bemühen, um eine Auflistung bzw. Beschreibung der diversen Methoden zu bekommen, oder gibt es da evtl. auch noch andere (deutsche?) Quellen?
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
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

Beitrag von ts-soft »

PureLust hat geschrieben: Verstehe ich das also nun richtig, dass Interfaces um Grunde Objekte kapseln - man also durch Interfaces auf die Methoden der Objekte zugreifen kann und "IWebBrowser2" also nicht wie vermutet eine Struktur, sondern ein Interface war?
Nicht war, sondern ist!
PureLust hat geschrieben: Und müsste man den großen Petzold dazu bemühen, um eine Auflistung bzw. Beschreibung der diversen Methoden zu bekommen, oder gibt es da evtl. auch noch andere (deutsche?) Quellen?
Im Petzold findeste, glaube ich, nichts. COM kommt dort nicht vor (bin mir
da aber nicht sicher, aber COM läßt sich mit C kaum nutzen, sondern eher
mit C++, Petzold enthält wohl nur C-Sourcen)

Im PSDK, sowie MSDN wirste fündig (alles english). Deutsche Bücher
wirste suchen müssen.

Da sich das ganze sowieso nur eingeschränkt / schwierig in PB nutzen läßt,
lohnt es wahrscheinlich auch garnicht (es sei denn, Du willst auf C++
umsteigen)

Interfaces kannste Dir auch als Structure von Prototypes vorstellen.

Gruß
Thomas


// Nachtrag:
Guck Dir mal die Beispiele, die ich der ComLib beigefügt habe an, die sind
recht einfach zu verstehen, vor allem wenn man ein bißchen VB-Script
kann.

http://www.purebasic.fr/english/viewtop ... highlight=
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
Antworten