GUI-Splitter binden? Thema ist als GELÖST markiert

Getting started ... Alles für einen gelungenen Start.
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

GUI-Splitter binden?

Beitrag von abapnewbie (ForumUser / 24 / 12 / 0 ) » 07.09.2020 16:31
Hallo,

ich würde gerne drei Elemente auf meinem Dynpro anzeigen lassen. Dabei habe ich den CL_GUI_SPLITTER_CONTAINER benutzt und habe den folgenden Aufbau erreicht:

Element 1
- Splitter
ALV 1
- Splitter
ALV 2

Jetzt ist es so, dass ALV 1 und ALV 2 ja jeweils in einer eigenen Row sind. Dadurch entsteht der horizontale resizing Balken dazwischen, den ich gerne weg hätte. Mein Ziel ist, dass ich Element 1 so anpassen kann, dass beide ALV's verschwinden, ohne dabei zuerst ALV 2 und dann ALV 1 zu resizen.

Code: Alles auswählen.

container->set_row_sash( id = 2
                            type = cl_gui_splitter_container=>type_movable
                            value = cl_gui_splitter_container=>false ).
Hat mit leider nicht geholfen. Dadurch wird ALV 2 z.B einfach nur starr und lässt sich gar nicht bewegen.

Habe ich eine Möglichkeit, die zwei unteren rows miteinander zu verbinden oder sogar in einen gemeinsamen Container zu verpacken?


Re: GUI-Splitter binden?

Beitrag von ewx (Top Expert / 4246 / 200 / 449 ) » 07.09.2020 16:38
mach mal ein Screenshot. Ich verstehe nicht, was du meinst.
Was ist "Element 1"?
abapnewbie hat geschrieben:Mein Ziel ist, dass ich Element 1 so anpassen kann, dass beide ALV's verschwinden, ohne dabei zuerst ALV 2 und dann ALV 1 zu resizen.
Warum musst du ALV2 und ALV1 resizen, damit sie verschwinden?

Re: GUI-Splitter binden?

Beitrag von abapnewbie (ForumUser / 24 / 12 / 0 ) » 07.09.2020 17:42
ewx hat geschrieben:
07.09.2020 16:38
mach mal ein Screenshot. Ich verstehe nicht, was du meinst.
Was ist "Element 1"?
abapnewbie hat geschrieben:Mein Ziel ist, dass ich Element 1 so anpassen kann, dass beide ALV's verschwinden, ohne dabei zuerst ALV 2 und dann ALV 1 zu resizen.
Warum musst du ALV2 und ALV1 resizen, damit sie verschwinden?
Hallo, vielen Dank für die Antwort!

Da ich mittlerweile zu Hause bin, werde ich versuchen das ganze noch mal schriftlich zu erklären. Ansonsten kann ich gerne nachträglich noch Screenshots einfügen.

Grundsätzlich möchte ich folgendes erreichen:

In meinem Programm bilde ich einen Graphen und eine zugehörige ALV-Tabelle ab. Diese waren zuvor in einem Container der Klasse cl_gui_easy_splitter_container und konnten somit voneinander getrennt werden. Durch den Regler in der Mitte, kann man dann entsprechend die Bildfläche anpassen, also z.B. nur den Graphen anzeigen lassen, nur die ALV-Tabelle oder in der Mitte davon.

Das Problem entsteht jetzt dadurch, dass ich in der ALV-Tabelle eine feste Zeile habe, die ich gerne immer angezeigt haben möchte. Die soll immer ganz oben sein, egal ob der Anwender sortiert oder filtert. Mir gefällt die Umsetzung und Handhabung dieser Zeile allerdings nicht. Da es aber sonst keine Möglichkeit gibt, die Zeile in der ALV zu fixieren, war meine Idee eine zweite ALV-Tabelle mit entsprechend nur einer Zeile aufzubauen.

Demnach trennt sich der Aufbau dann in:

Container für den Graphen
horizontaler Regler/Splitter
Container für die ALV Tabelle mit einer Zeile
horizontaler Regler/Splitter
Container für die Haupt-ALV Tabelle

Dies konnte ich im ersten Schritt dadurch erreichen, dass ich den Hauptcontainer als Objekt der Klasse cl_gui_splitter_container deklariert habe und die drei anzuzeigende Komponenten dann jeweils einer Row zugewiesen habe.

Soweit so gut... Das Problem nun ist allerdings, dass wenn der Anwender wie gewohnt den obersten Regler bedient, geht dieser immer nur bis zum unteren Regler. Das bedeutet, dass man nun zwei Regler bedienen muss, was unhandlich ist.

Als nächstes habe ich versucht, innerhalb des Splitter-Containers einen Easy-Splitter einzubauen und die ALV's dort zu integrieren. Dies kommt meiner Vorstellung schon näher, ist aber noch keine vollständige Lösung. Leider sehe ich keine Möglichkeit, innerhalb der Klasse cl_gui_easy_splitter_container den Splitter auszublenden. Gibt es hier eine Möglichkeit?

Es wäre super, wenn ich den Regler ausschalten könnte, sodass man nur einen Regler hat mit dem man die ALV's gemeinsam verschieben kann. Ist sowas möglich?

Re: GUI-Splitter binden?

Beitrag von black_adept (Top Expert / 3412 / 66 / 656 ) » 07.09.2020 17:49
Es ist möglich eine Zeile zu fixieren. Man muss allerdings die Events anpassen und nachdem der User sortiert,gefiltert etc hat explizit noch mal die fixierte Zeile nach ganz oben schieben.
viewtopic.php?t=1942
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: GUI-Splitter binden?

Beitrag von ewx (Top Expert / 4246 / 200 / 449 ) » 07.09.2020 18:45
Dann versuche mal den CL_GUI_SPLITTER_CONTAINER.
Hier kannst du drei "Zeilen" definieren und den Splitter fixieren.
Dadurch kannst du eine "feste" Zeile anzeigen. Diese hat jedoch keinen Bezug zu dem anderen Grid. Heißt: wenn der Anwender die Spalten verschiebt ober die Breite ändert, passiert das nur in einem Grid.

Mein Vorschlag:
  • eine feste Zeile oben
  • nach jedem "enter" wird das Layout von oben nach unten kopiert. (Leider gibt es wohl kein Event, dass man abfangen kann, wenn die Spalten geändert wurden...)

Code: Alles auswählen.

PARAMETERS test.

CLASS my_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
  PUBLIC SECTION.
    METHODS set_resize_cols_public
      IMPORTING
        res TYPE i.
ENDCLASS.

CLASS my_grid IMPLEMENTATION.
  METHOD set_resize_cols_public.
    set_resize_cols( res ).
  ENDMETHOD.
ENDCLASS.

CLASS diagram DEFINITION.
  PUBLIC SECTION.
    METHODS constructor
      IMPORTING
        resize_cols TYPE i
        container   TYPE REF TO cl_gui_container.
    METHODS set_data
      IMPORTING
        country TYPE land1.
    METHODS copy
      IMPORTING
        from TYPE REF TO cl_gui_alv_grid.
    DATA grid TYPE REF TO my_grid.
  PROTECTED SECTION.
    DATA data TYPE STANDARD TABLE OF t005t.
ENDCLASS.

CLASS diagram IMPLEMENTATION.
  METHOD constructor.

    grid = NEW #( i_parent = container ).
    IF resize_cols = 0.
      DATA(no_header) = abap_true.
    ENDIF.

    grid->set_table_for_first_display(
      EXPORTING
         i_default                     = space
         i_structure_name              = 'T005T'
         is_layout                     = VALUE lvc_s_layo( smalltitle = abap_true
                                                           no_toolbar = abap_true
                                                           no_headers = no_header
                                                           no_hgridln = abap_true
                                                           no_vgridln = abap_true )
      CHANGING
        it_outtab                      = data
      EXCEPTIONS
        invalid_parameter_combination  = 1
       program_error                   = 2
        too_many_lines                 = 3
        OTHERS                         = 4  ).

    grid->set_resize_cols_public( resize_cols ).

  ENDMETHOD.

  METHOD set_data.

    IF country IS INITIAL.
      SELECT * FROM t005t INTO TABLE @data WHERE spras = @sy-langu.
    ELSE.
      SELECT * FROM t005t INTO TABLE @data WHERE land1 = @country AND spras = @sy-langu.
    ENDIF.

    grid->refresh_table_display( ).

  ENDMETHOD.

  METHOD copy.

    from->get_frontend_fieldcatalog(
      IMPORTING
        et_fieldcatalog = DATA(lt_fcat_from) ).

    grid->set_frontend_fieldcatalog( lt_fcat_from ).
    grid->refresh_table_display( 
      i_soft_refresh = abap_true 
      is_stable = value #( 
        col = abap_true 
        row = abap_true ) ).

  ENDMETHOD.

ENDCLASS.



INITIALIZATION.

  DATA(docker) = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom ratio = 40 ).
  DATA(splitter) = NEW cl_gui_splitter_container( parent = docker rows = 2 columns = 1 ).
  splitter->set_row_sash(
        EXPORTING
        id                = 1
        type              = cl_gui_splitter_container=>type_sashvisible
        value             = cl_gui_splitter_container=>false ).

  splitter->set_row_mode( mode = cl_gui_splitter_container=>mode_absolute ).

  splitter->set_row_height( id = 1 height = 40 ).

  splitter->set_border( border =  gfw_false ).

  DATA(dia01) = NEW diagram( resize_cols = 1 container = splitter->get_container( row = 1 column = 1 ) ) .
  dia01->set_data( 'DE' ).

  DATA(dia02) = NEW diagram( resize_cols = 0 container = splitter->get_container( row = 2 column = 1 ) ).
  dia02->set_data( space ).

AT SELECTION-SCREEN.
  dia02->copy( dia01->grid ).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
abapnewbie


Re: GUI-Splitter binden?

Beitrag von abapnewbie (ForumUser / 24 / 12 / 0 ) » 11.09.2020 10:37
ewx hat geschrieben:
07.09.2020 18:45
Dann versuche mal den CL_GUI_SPLITTER_CONTAINER.
Hier kannst du drei "Zeilen" definieren und den Splitter fixieren.
Dadurch kannst du eine "feste" Zeile anzeigen. Diese hat jedoch keinen Bezug zu dem anderen Grid. Heißt: wenn der Anwender die Spalten verschiebt ober die Breite ändert, passiert das nur in einem Grid.

Mein Vorschlag:
  • eine feste Zeile oben
  • nach jedem "enter" wird das Layout von oben nach unten kopiert. (Leider gibt es wohl kein Event, dass man abfangen kann, wenn die Spalten geändert wurden...)

Code: Alles auswählen.

PARAMETERS test.

CLASS my_grid DEFINITION INHERITING FROM cl_gui_alv_grid.
  PUBLIC SECTION.
    METHODS set_resize_cols_public
      IMPORTING
        res TYPE i.
ENDCLASS.

CLASS my_grid IMPLEMENTATION.
  METHOD set_resize_cols_public.
    set_resize_cols( res ).
  ENDMETHOD.
ENDCLASS.

CLASS diagram DEFINITION.
  PUBLIC SECTION.
    METHODS constructor
      IMPORTING
        resize_cols TYPE i
        container   TYPE REF TO cl_gui_container.
    METHODS set_data
      IMPORTING
        country TYPE land1.
    METHODS copy
      IMPORTING
        from TYPE REF TO cl_gui_alv_grid.
    DATA grid TYPE REF TO my_grid.
  PROTECTED SECTION.
    DATA data TYPE STANDARD TABLE OF t005t.
ENDCLASS.

CLASS diagram IMPLEMENTATION.
  METHOD constructor.

    grid = NEW #( i_parent = container ).
    IF resize_cols = 0.
      DATA(no_header) = abap_true.
    ENDIF.

    grid->set_table_for_first_display(
      EXPORTING
         i_default                     = space
         i_structure_name              = 'T005T'
         is_layout                     = VALUE lvc_s_layo( smalltitle = abap_true
                                                           no_toolbar = abap_true
                                                           no_headers = no_header
                                                           no_hgridln = abap_true
                                                           no_vgridln = abap_true )
      CHANGING
        it_outtab                      = data
      EXCEPTIONS
        invalid_parameter_combination  = 1
       program_error                   = 2
        too_many_lines                 = 3
        OTHERS                         = 4  ).

    grid->set_resize_cols_public( resize_cols ).

  ENDMETHOD.

  METHOD set_data.

    IF country IS INITIAL.
      SELECT * FROM t005t INTO TABLE @data WHERE spras = @sy-langu.
    ELSE.
      SELECT * FROM t005t INTO TABLE @data WHERE land1 = @country AND spras = @sy-langu.
    ENDIF.

    grid->refresh_table_display( ).

  ENDMETHOD.

  METHOD copy.

    from->get_frontend_fieldcatalog(
      IMPORTING
        et_fieldcatalog = DATA(lt_fcat_from) ).

    grid->set_frontend_fieldcatalog( lt_fcat_from ).
    grid->refresh_table_display( 
      i_soft_refresh = abap_true 
      is_stable = value #( 
        col = abap_true 
        row = abap_true ) ).

  ENDMETHOD.

ENDCLASS.



INITIALIZATION.

  DATA(docker) = NEW cl_gui_docking_container( side = cl_gui_docking_container=>dock_at_bottom ratio = 40 ).
  DATA(splitter) = NEW cl_gui_splitter_container( parent = docker rows = 2 columns = 1 ).
  splitter->set_row_sash(
        EXPORTING
        id                = 1
        type              = cl_gui_splitter_container=>type_sashvisible
        value             = cl_gui_splitter_container=>false ).

  splitter->set_row_mode( mode = cl_gui_splitter_container=>mode_absolute ).

  splitter->set_row_height( id = 1 height = 40 ).

  splitter->set_border( border =  gfw_false ).

  DATA(dia01) = NEW diagram( resize_cols = 1 container = splitter->get_container( row = 1 column = 1 ) ) .
  dia01->set_data( 'DE' ).

  DATA(dia02) = NEW diagram( resize_cols = 0 container = splitter->get_container( row = 2 column = 1 ) ).
  dia02->set_data( space ).

AT SELECTION-SCREEN.
  dia02->copy( dia01->grid ).
Hallo,

vielen Dank für die Hilfe! Hat mir ziemlich geholfen. Allerdings habe ich noch ein Problem. Dadurch, dass meine ALV Tabelle größer ist, als der Screen-Bereich, entstehen bei beiden ALV's voneinander unabhängige Scrollbalken. Ich habe hier lange recherchiert und habe keine Möglichkeit gefunden da einzugreifen. Gibt es hier eine Möglichkeit, die Breite der Sub-Container größer zu stellen, sodass dann quasi ein Scrollbalken entsteht, statt zwei?

Re: GUI-Splitter binden?

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 11.09.2020 11:48
abapnewbie hat geschrieben:
11.09.2020 10:37
Dadurch, dass meine ALV Tabelle größer ist, als der Screen-Bereich, entstehen bei beiden ALV's voneinander unabhängige Scrollbalken. Ich habe hier lange recherchiert und habe keine Möglichkeit gefunden da einzugreifen. Gibt es hier eine Möglichkeit, die Breite der Sub-Container größer zu stellen, sodass dann quasi ein Scrollbalken entsteht, statt zwei?
Das geht nur im Träger-Dynpro indem du den Custom Control-Bereich im Dynpro (dort wo am Ende CL_GUI_CUSTOM_CONTAINER platziert wird) auf die Größe deiner Grids setzt. Der Scrollbalken entsteht dann im Dynpro und nicht im Splitter bzw. den Grids.
Hier ist aber noch zu sagen, dass die maximale Breite bei 255 Zeichen liegt.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abapnewbie

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: GUI-Splitter binden?

Beitrag von ewx (Top Expert / 4246 / 200 / 449 ) » 11.09.2020 12:31
abapnewbie hat geschrieben:
11.09.2020 10:37
Dadurch, dass meine ALV Tabelle größer ist, als der Screen-Bereich, entstehen bei beiden ALV's voneinander unabhängige Scrollbalken.
argh. das ist tatsächlich blöd. da habe ich nicht dran gedacht.
Ich hatte das Thema bei blogs.sap.com noch mal aufbereitet.
Die Spaltenbreite wird hier bei jedem ENTER angepasst.
Aber über den horizontalen Scrollbalken bin ich nicht gestolpert.

Ich wüsste auch nicht, dass man die sichtbaren Spalten setzen kann. Beim Tree gibt es eine Option "assure visible" (oder so ähnlich), um sicher zu stellen, dass ein bestimmter Knoten sichtbar ist.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
abapnewbie


Re: GUI-Splitter binden?

Beitrag von abapnewbie (ForumUser / 24 / 12 / 0 ) » 14.09.2020 11:11
a-dead-trousers hat geschrieben:
11.09.2020 11:48
abapnewbie hat geschrieben:
11.09.2020 10:37
Dadurch, dass meine ALV Tabelle größer ist, als der Screen-Bereich, entstehen bei beiden ALV's voneinander unabhängige Scrollbalken. Ich habe hier lange recherchiert und habe keine Möglichkeit gefunden da einzugreifen. Gibt es hier eine Möglichkeit, die Breite der Sub-Container größer zu stellen, sodass dann quasi ein Scrollbalken entsteht, statt zwei?
Das geht nur im Träger-Dynpro indem du den Custom Control-Bereich im Dynpro (dort wo am Ende CL_GUI_CUSTOM_CONTAINER platziert wird) auf die Größe deiner Grids setzt. Der Scrollbalken entsteht dann im Dynpro und nicht im Splitter bzw. den Grids.
Hier ist aber noch zu sagen, dass die maximale Breite bei 255 Zeichen liegt.
Wie ist es denn mit dem cl_gui_custom_container=>default_screen?

Code: Alles auswählen.

create object mo_container
  EXPORTING
    link_dynnr              = '7000'     " Dynpro-Nummer
    link_repid              = sy-repid    " Reportname
*    shellstyle              =     " Fenster-Style
*    left                    =     " Links
*    top                     =     " Oben
*    width                   =     " Breite
*    height                  =     " Hoehe
*    metric                  = CNTL_METRIC_DYNPRO    " Metrik
*    align                   = 15    " Alignment
    parent                  = cl_gui_custom_container=>default_screen    " Parent Container
    rows                    = 2    " Anzahl zu zeigender Zeilen
    columns                 = 1    " Anzahl zu zeigender Spalten
*    no_autodef_progid_dynnr =     " dont autodefine progid and dynnr?
*    name                    =     " Name
*  EXCEPTIONS
*    cntl_error              = 1
*    cntl_system_error       = 2
*    others                  = 3
  .
IF sy-subrc <> 0.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
*            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
Wenn ich hier mit dem Parameter "width" rumspiele, ändert sich gar nichts. Ist das so, weil die Einstellungen vom Parent-Element dann vererbt werden? Gibt es überhaupt die Möglichkeit, meinen mo_container größer zu machen als das parent Element?

Re: GUI-Splitter binden?

Beitrag von a-dead-trousers (Top Expert / 3504 / 113 / 910 ) » 16.09.2020 07:26
abapnewbie hat geschrieben:
14.09.2020 11:11
Wie ist es denn mit dem cl_gui_custom_container=>default_screen?
Der "legt" sich über das gesamte Dynpro. Damit kannst du dann zwar etwas größer werden als 255 Zeichen, aber gleichzeitig können keine anderen Elemente (Eingabefelder usw.) auf dem Bildschirm dargestellt werden.
abapnewbie hat geschrieben:
14.09.2020 11:11
Wenn ich hier mit dem Parameter "width" rumspiele, ändert sich gar nichts. Ist das so, weil die Einstellungen vom Parent-Element dann vererbt werden?
Wofür es die "width" hier gibt kann ich nur vermuten, weil sie, wie du ja schon festgestellt hast, keine Änderung bewirkt. Bei den GUI-Controls in SAP gibt es einen Design- und einen Runtimemode. In ersterem werden die Control mit einem Raster dargestellt, damit man sich beim platzieren irgendwie leichter tut. Hier würde eine Angabe der Breite Sinn machen. Der Runtimemode ist das was man normal sieht und hier passen sich die Controls an die maximal Höhe bzw. Breite an.
abapnewbie hat geschrieben:
14.09.2020 11:11
Gibt es überhaupt die Möglichkeit, meinen mo_container größer zu machen als das parent Element?
Nope. Es wird hier immer ein "Bereich" für eine externe Darstellung reserviert. Grob gesagt, "zeichnet" der SAP-Gui in diesem Bereich nicht hinein und überlässt das komplett den OCX-Controls. Schön sieht man das, wenn man z.B. ein eigenes Control entwickelt hat und "vergisst" auf die Windows-Message WM_PAINT zu reagieren. Dann sieht man in dem Bereich schön die Artefakte aus anderen Fenstern.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abapnewbie

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Seite 1 von 1

Aktuelle Forenbeiträge

NAST in Smartforms
vor 20 Stunden von L0w-RiDer 2 / 23
Zuordnen einer HU zu einer Lieferung
vor 20 Stunden von SayAndre 8 / 4970
Append mehrer Zeilen mit VALUE #
vor 21 Stunden von Romaniac gelöst 11 / 5951
Funktionsbaustein ALSM_EXCEL_TO_INTERNAL_TABLE
vor 21 Stunden von Romaniac gelöst 7 / 2047

Vergleichbare Themen

ALV Splitter Scrollbalken
von Assassin » 25.08.2008 10:48
Container Splitter und Tabstrip
von Lukas R. » 27.01.2017 07:10
Andruck Splitter Container
von marc.luebeck » 28.10.2014 08:13
REUSE Splitter Container?
von Kleenmex » 18.06.2008 10:07
Split Container / Splitter
von dawns » 21.03.2007 14:52