Eigenes OCX Control einbinden

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
3 Beiträge • Seite 1 von 1
3 Beiträge Seite 1 von 1

Eigenes OCX Control einbinden

Beitrag von ewx (Top Expert / 4916 / 332 / 653 ) »
Hallo zusammen!

ich habe es mir als Aufgabe gemacht, ein einfaches OCX-Control in VisualBasic zu schreiben und das in SAP einzubinden.
Ich bin jetzt auch tatsächlich soweit, dass ich
1. Das OCX-Control generieren kann
2. es auch in SAP darstellen kann
Es hapert allerdings an
1. Daten vom OCX zu bekommen
2. Daten ins OCX zu schreiben
3. Auf Events vom OCX-Control zu reagieren.

Ich beschreibe mal im folgenden, was ich bisher gemacht habe:
1. OCX Control generieren
Man benötigt Visual Basic 5.0 CCE. Damit kann man ein neues Projekt beginnen auf Basis "ActiveX". Dann habe ich ein einfaches Listbox-Control auf den Bildschirm gemalt.

Dann im Menü "File - Make Listbox1.OCX" und das OCX-Control ist fertig. Das OCX-File habe ich ins SAPGUI/Frontend-Verzeichnis kopiert.

2. Eigene Klasse
Dann muss man eine eigene Klasse anlegen ZCL_CONTROL z.b., die von CL_GUI_CONTROL erbt. Als Typgruppe habe ich noch CNTL eingetragen.
Methode Constructor redefinieren:
Parameter:
PARENT Type Ref To CL_GUI_OBJECT Container fuer Custom Controls in der Dynpro Area
NAME Type STRING

Code: Alles auswählen.

method constructor.

  data prog_id(80).

  if parent is initial.
    raise error_cntl_create.
  endif.

  class cl_gui_cfw definition load.

* assign prog_id to get the frontend specific control
  if not activex is initial.
    prog_id = 'Listbox.UserControl1'.
  elseif not javabean is initial.
    raise gui_type_not_supported.
  endif.

  if prog_id is initial.
    raise gui_type_not_supported.
  endif.

* Set the window styles of the control when style parameter was not
* set with constructor call.
* For more information on the styles see WIN32 SDK
  data  style type i.
* otherwise the control would be invisible and the mistake would be
* hard to find
  style = cl_gui_control=>ws_visible
          + cl_gui_control=>ws_child
          + cl_gui_control=>ws_clipsiblings.


* Create the control
  call method super->constructor
    exporting
      clsid      = prog_id
      shellstyle = style
      parent     = parent
      lifetime   = lifetime
      name       = name
    exceptions
      others     = 1.

  if sy-subrc <> 0.
    raise error_cntl_create.
  endif.

* register instance at framework
  call method cl_gui_cfw=>subscribe
    exporting
      shellid = h_control-shellid
      ref     = me
    exceptions
      others  = 1.

  if sy-subrc <> 0.
    raise error_cntl_create.
  endif.

* Wenn das OCX-Control eine Eigenschaft "Caption" hat - also z.B. ein Button - dann kann man den Text so setzen:
*CALL METHOD OF H_CONTROL-OBJ 'SetCaption' NO FLUSH
*EXPORTING #1 = 'ENNO'.

* create and initialize dataprovider =>  m_dp_handle
  call function 'DP_CREATE'
    changing
      h_dp             = m_dp_handle
    exceptions
      dp_create_error  = 1
      dp_install_error = 2
      dp_error         = 3
      others           = 4.
  if sy-subrc <> 0.
    raise error_dp_create.
  endif.

endmethod.
WAS ich da gemacht habe, weiss ich nicht... Ich habe mir das Coding von Tron aus dem Thread http://www.aentia-forum.de/viewtopic.php?t=16311 zusammenkopiert...

3. Control einbinden
Dann muss das Control noch eingebunden werden:

Code: Alles auswählen.

data gr_container type ref to cl_gui_custom_container.
data gr_listbox   type ref to zcl_control.
data gv_entries   type string.

start-of-selection.

  call screen 100.

end-of-selection.


*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
module status_0100 output.

  set pf-status '100'.
  perform init_controls.

endmodule.                 " STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
module user_command_0100 input.

  case sy-ucomm.
    when 'BACK'.
      set screen 0.
      leave screen.
  endcase.

endmodule.                 " USER_COMMAND_0100  INPUT

form init_controls.

  if gr_container is initial.

  create object gr_container
    exporting
      container_name              = 'CONTAINER'
    exceptions
      others                      = 6.

   create object gr_listbox
     exporting
       parent                 = gr_container
       name                   = 'Listbox'
     exceptions
       gui_type_not_supported = 1
       error_cntl_create      = 2
       error_dp_create        = 3
       others                 = 4.
   if sy-subrc <> 0.
   endif.


  endif.

  endform.
Conclusion
so. Soweit bin ich jetzt. aber jetzt fehlen mir das Wissen und der Ansatz um dem OCX Leben einzuhauchen.

Kann mir da jemand weiterhelfen?!
Also: Wie weiss ich, welche Events das Control hat? Wenn ich im VB-Editor einen Doppelklick mache, dann wird

Code: Alles auswählen.

Private Sub ListBox1_Click()
End Sub
angelegt.
Aber ist das ein einfacher Klick auf ein Listelement?
Wie mache ich einen Doppelklick auf das Listelement. Unterstützt das Control das überhaupt?
Was muss ich in dem VB-Coding machen, um das Event weiterzugeben, bzw. was muss ich wie in der SAP-Klasse registrieren, um das Event abzufangen?
Die Eigenschaften des Controls kann ich wie folgt ändern:

Code: Alles auswählen.

*CALL METHOD OF H_CONTROL-OBJ 'SetCaption' NO FLUSH
*EXPORTING #1 = 'ENNO'.
Aber wie komme ich an Daten des Controls, z.B. die Liste??
Wie kann ich die Liste aus SAP erweitern/ verändern?

Die Königsklasse wäre natürlich noch, wenn man Drag&Drop-Funktionalität mit einbaute... Aber das spare ich mir erstmal... :-)

Achso... Wozu ich das brauche?? Eigentlich gar nicht. Aber mich interessiert, wie man sowas machen könnte. Und wenn man erstmal ein Grundgerüst hat, dann könnte man vielleicht auch einfache Anwendungsmöglichkeiten finden.
Z.B. könnte ich mir für Anwendungen im Lager vorstellen, dass RIESENKNÖPFE in grün, rot oder Gelb durchaus sinnvoll sind. Oder eine grafische Füllstandsanzeige:
Bild
Screenshots (in umgekehrter Reihenfolge)

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Eigenes OCX Control einbinden

Beitrag von Tron (Top Expert / 1327 / 35 / 333 ) »
Moin,
kurze Rückfrage :
hast Du der Textbox auch die entsprechenden "Eigenschaften" zugeordnet bzw. veröffentlicht?
Beispiel für Eigenschaften der Textbox (TEXT) "Hintergrundfarbe lesen und schreiben".

Code: Alles auswählen.

Option Explicit
Public Property Get BackColor() As OLE_COLOR
    BackColor = UserControl.Text.BackColor
End Property

Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
    If UserControl.Text.BackColor() = New_BackColor Then Exit Property
    UserControl.Text.BackColor() = New_BackColor
    PropertyChanged "BackColor"
End Property
ansonsten wären die Eigenschaften Deiner Textbox nur lokal im Steuerelement.

gruß Tron
<:: XING-Gruppe Tricktresor::>
Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen –
Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen.

Re: Eigenes OCX Control einbinden

Beitrag von ewx (Top Expert / 4916 / 332 / 653 ) »
Moin Tron!

Danke für deine Antwort! Ich habe im Control überhauptgarnix programmiert... Nur gemalt... :-)
Werde dein Coding mal ausprobieren!

Danke und Gruß

Seite 1 von 1

Vergleichbare Themen

16
Antw.
12475
Views
Table Control in Custom Control?
von ralf.wenzel » 29.11.2013 21:21 • Verfasst in ABAP Objects®
21
Antw.
6691
Views
Button einbinden
von reim95 » 14.10.2021 13:54 • Verfasst in ABAP® für Anfänger
1
Antw.
2711
Views
Suchfeld einbinden
von Xaris » 31.05.2006 11:34 • Verfasst in Web-Dynpro, BSP + BHTML
10
Antw.
6714
Views
Einbinden Logo
von christof » 10.02.2018 18:42 • Verfasst in ABAP® für Anfänger
4
Antw.
5137
Views
URL in Smartform einbinden?
von Yllana » 03.12.2007 16:31 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

BAPI zur ABSO?
vor 6 Tagen von DeathAndPain 2 / 913
Materialstammerweiterung: Neuer Reiter
vor 2 Wochen von DeathAndPain gelöst 4 / 1587
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47253
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5165

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

BAPI zur ABSO?
vor 6 Tagen von DeathAndPain 2 / 913
Materialstammerweiterung: Neuer Reiter
vor 2 Wochen von DeathAndPain gelöst 4 / 1587
Ermittlung der Arbeitstage (Mosid)
vor 3 Wochen von Radinator 11 / 47253
LSMW-Problem
vor 4 Wochen von DeathAndPain gelöst 6 / 5165