Detecting a changed field

I have many fields on a form that are display only and one field, COMMENTS, that can be updated. I have a SAVE button which I would like to disable until the COMMENTS field has changed. If they start typing, for example, the button is enabled. Is there any way of doing this?

The only trigger that runs as soon as the first keystroke is applied is the On-Lock trigger on the block. You could start out with the button disabled, and then in the on-lock trigger, lock the record, then enable the button.

Similar Messages

  • Issue while changing fields in a fillable form PDF (Acrobat 10.1.4 Pro)

    Good Afternoon!
    This is my first time posting here, so forgive me if this is in the wrong place.
    I am an IT technician trying to support a user who is trying to change a PDF into a fillable form using Acrobat 10.1.4.  She is trying to use the wizard as shown in the image below:
    When she uses this function, Acrobat goes through and automatically detects all possible fields and creates them for her.  Below is an image of the result:
    What she is trying to do is change some of the field types - specifically, she wants to change the box next to "Adult/non-college request" to a check box.  She right clicks on this field to change it, and when she does, Acrobat simply closes.  No error comes up, and she is not given the option to save the document - when she opens it again, it is an ordinary PDF.  In addition, if she creates the form, and then only tries to save the form (without trying to change the fields), Acrobat again simply closes itself.  However, she is able to manually create fillable fields if she does not use the wizard at all, and the document functions normally.
    Any help with this issue would be most appreciated.

    Save early and often.
    I would save the result right after the wizard has made its errors.
    One needs to delete the form field and then manually add the correct type of field. If you want that check box and the next to be mutually exclusive, one gives them the same name and sets the export value for each check box to a unique value.
    I edit forms by opening the "Tools => Forms => Edit fields".
    How to create editable PDF form fields
    I do not like the wizards and create forms by adding all form fields manually according to my planned form design.

  • Changing field length of a standard field in standard table VBEP

    Hi,
    Please advice the possibility and the possible repercussions of changing field lengths in a standard table. Table in concern is VBEP.
    Thanks & Rgds,
    Pradeep

    No you cannot change the field length
    thanks
    G. Lakshmipathi

  • How to find out Last Changed Fields for a line item of a PO

    Dear All,
    Pls let me know is there any FM or procedure to find the last changed fields for each line item of a PO. I should be able to get the details on the basis of Last changed Date. Can u pls guide me in this?

    Hello,
    Check the table CDHDR,CDPOS for PO items,
    Check this code:
    REPORT ZV_GET_LATEST_SO .
    DATA: BEGIN OF ITAB OCCURS 0,
            OBJECTCLAS TYPE CDHDR-OBJECTCLAS,
            OBJECTID TYPE CDHDR-OBJECTID,
            CHANGENR TYPE CDHDR-CHANGENR,
            USERNAME TYPE CDHDR-USERNAME,
            UDATE TYPE CDHDR-UDATE,
            UTIME TYPE CDHDR-UTIME,
            TCODE TYPE CDHDR-TCODE,
            TABNAME TYPE CDPOS-TABNAME,
            TABKEY TYPE CDPOS-TABKEY,
            FNAME TYPE CDPOS-FNAME,
            CHNGIND TYPE CDPOS-CHNGIND,
          END OF ITAB.
    TABLES: CDHDR,CDPOS.
    DATA: LT_CDHDR LIKE CDHDR OCCURS 0 WITH HEADER LINE,
    LT_CDPOS LIKE CDPOS OCCURS 0 WITH HEADER LINE.
    *REFRESH AUSG.
    CLEAR CDHDR.
    CLEAR CDPOS.
    CDHDR-OBJECTCLAS = 'EINKBELEG'.
    CDHDR-OBJECTID   = '0000001784'.  " Purchase order number
    **SELECT A~OBJECTCLASS A~OBJECTID A~CHANGENR A~USERNAME A~UDATE A~UNAME
    **B~TCODE
    **B~TABNAME B~TABKEY B~FNAME B~CHNGIND INTO TABLE ITAB FROM CDHDR AS A
    **INNER JOIN CDPOS AS B ON A~OBJECTCLASS = B~OBJECTCLASS
    **                         A~OBJECTID    = B~OBJECTID
    **                         A~CHANGENR    = B~CHANGENR
    **                    WHERE OBJECTCLAS = 'VERKBELEG'
    **                      AND OBJECTID = '0000001784'.
    *SELECT * FROM CDPOS INTO TABLE LT_CDPOS WHERE OBJECTCLAS = 'VERKBELEG'
    *                                    AND OBJECTID = '0000001784'.
    *IF NOT LT_CDPOS[] IS INITIAL.
    *  SELECT *
    *  INTO   TABLE LT_CDHDR
    *  FROM   CDHDR
    *  FOR    ALL ENTRIES IN LT_CDPOS
    *  WHERE  OBJECTCLAS = LT_CDPOS-OBJECTCLAS
    *  AND    OBJECTID = LT_CDPOS-OBJECTID
    *  AND    CHANGENR = LT_CDPOS-CHANGENR.
    *ENDIF.
    **  SORT ITAB BY OBJECTCLAS ODJECTID DESCENDING.
    *LOOP AT ITAB.
    *  WRITE: ITAB-UDATE."ITAB-UNAME.
    *ENDLOOP.
    *--- Interne Tabellen -------------------------------------------------
    DATA: BEGIN OF ICDSHW OCCURS 50.       "Ausgabeaufbereitung
            INCLUDE STRUCTURE CDSHW.       "Zwischendatei
    DATA: END OF ICDSHW.
    CALL FUNCTION 'CHANGEDOCUMENT_READ_HEADERS'
         EXPORTING
              DATE_OF_CHANGE    = CDHDR-UDATE
              OBJECTCLASS       = CDHDR-OBJECTCLAS
              OBJECTID          = CDHDR-OBJECTID
              TIME_OF_CHANGE    = CDHDR-UTIME
              USERNAME          = CDHDR-USERNAME
         TABLES
              I_CDHDR           = LT_CDHDR
         EXCEPTIONS
              NO_POSITION_FOUND = 1
              OTHERS            = 2.
    LOOP AT LT_CDHDR.
      CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS'
        EXPORTING
    *   ARCHIVE_HANDLE                = 0
          CHANGENUMBER                  = LT_CDHDR-CHANGENR
    *   TABLEKEY                      = '00000000 '
    *   TABLENAME                     = ' '
    * IMPORTING
    *   HEADER                        =
       TABLES
         EDITPOS                       = ICDSHW
    *   EDITPOS_WITH_HEADER           =
    * EXCEPTIONS
    *   NO_POSITION_FOUND             = 1
    *   WRONG_ACCESS_TO_ARCHIVE       = 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.
      LOOP AT ICDSHW.
        IF ICDSHW-TABKEY+3(10) = '0000001784'
           AND ICDSHW-TABKEY+13(6) = '000001'.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
    Vasanth

  • How to change field VBAK-CMNUP using VA02

    Hi EXPERTS,
    How to change field VBAK-CMNUP (Date of next credit check of document) using VA02?
    Seems it is hard to find it on the screen of VA02.
    Thanks in advance.

    Hi,
    Check these notes:
    Note 635727 - VBAK is filled with date only if block is set
    Note 588649 - Next date (CMNGV) - meaning and function
    Regards,
    Eduardo
    PD: I forgot the Note 588649 - Next date (CMNGV) - meaning and function.
    Edited by: Eduardo Hinojosa on Jun 11, 2009 11:39 AM

  • Changing fields color in CL_GUI_ALV_GRID using class

    Hi,
    I've written a lot of posts but still I have problem with changing color for CL_GUI_ALV_GRID.
    I have class ZKSL_CL_4_17_ALV_GRID_OO with 3 methods : SELECT, HANDLE_DBL_CLICK AND DISPLAY_ALV
    I want to change fields color every time I double click on IT.
    METHOD SELECT.
       DATA:
             lt_sflight                TYPE TABLE OF           zkslt_sflight,
             ls_layout                 TYPE                    lvc_s_layo,
             lr_custom_container       TYPE REF TO             cl_gui_custom_container,
             lr_my_class               TYPE REF TO             zksl_cl_4_17_alv_grid_oo.
       SELECT *  FROM zkslt_sflight  INTO TABLE mt_sflight
          WHERE carrid    = iv_carrid AND
              ( fldate    IN it_date  OR
                price     IN it_price OR
                planetype IN it_type )
    CALL FUNCTION 'Z_KSL_SCREEN'.
    ENDMETHOD.
    from FM z_ksl_screen i call screen 400 and from status_400 output  I call method DISPLAY_ALV
    METHOD display_alv.
       DATA:
              lr_custom_container       TYPE REF TO             cl_gui_custom_container,
              lt_sflight                TYPE TABLE OF           zkslt_sflight,
              lt_catalog                TYPE STANDARD TABLE OF  lvc_s_fcat,
              ls_catalog                LIKE LINE OF            lt_catalog,
              ls_layout                 type                    slis_layout_alv,
              lr_my_class               TYPE REF TO             zksl_cl_4_17_alv_grid_oo.
       CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
         EXPORTING
           i_structure_name = 'ZKSLT_SFLIGHT'
         CHANGING
           ct_fieldcat      = lt_catalog[].
    ************BULID LAYOUT
       ls_layout-no_input = 'X'.
       ls_layout-colwidth_optimize = 'X'.
       ls_layout-totals_text       = 'Totals(201)'.
       ls_layout-info_fieldname    = 'LINE_COLOR'.
       IF mr_gui_alv_grid IS INITIAL.  "-----------------------------------if----------------------&
         CREATE OBJECT: lr_custom_container
           EXPORTING
             container_name = 'DISPLAY',
             lr_my_class.
         CREATE OBJECT mr_gui_alv_grid
           EXPORTING
             i_parent = lr_custom_container.
         SET HANDLER lr_my_class->handle_dbl_click FOR mr_gui_alv_grid.
         CALL METHOD mr_gui_alv_grid->set_table_for_first_display
           EXPORTING
             i_structure_name = 'ZKSLT_SFLIGHT'
            is_layout        =   ls_layout
             i_save           = 'A'
           CHANGING
             it_outtab        = Mt_sflight
             it_fieldcatalog  = lt_catalog.
       ELSE.     "-------------------------------------------------ELSE---------------------&
         mr_gui_alv_grid->refresh_table_display( ) .
       ENDIF.
    ENDMETHOD.
    In handler i am trying to change fields color and call method display sending new out_table
    CALL METHOD me->display_alv
         CHANGING
           ct_fieldcat = lt_fieldcat.
    Please give me some easy advice how to do that.
    thank you in advice.

    Thank you Klaus for your reply,
    The problem is that I need to make this using classes.
    I tried to make my structure data with LVC_T_SCOL as you wrote,
    a field of table type LVC_T_SCOL in the structure of your output table
    DATA BEGIN OF lt_data. 
           INCLUDE STRUCTURE sflight.
           DATA cellcolors  TYPE lvc_t_scol .
       DATA END OF lt_data.
    TYPES: BEGIN OF mtt_tab.
    *         INCLUDE STRUCTURE ZKLST_sflight.  " I get error that I cannot use ref to abap dic
               INCLUDE TYPE ZKSLT_SFLIGHT.
               TYPES: cellcolors  TYPE lvc_t_scol ,
                 END OF mtt_tab.
    After making type mtt_tab
    i declare data   lt_tab                    TYPE STANDARD TABLE OF  mtt_tab.
    and when I try to copy table mt_sflight (it is atribut of calss) like below
    LOOP AT mt_sflight INTO ls_mt .
    *   READ TABLE lt_tab INDEX sy-tabix ASSIGNING <ls_tab>.
    *   MOVE-CORRESPONDING <ls_mt> TO <ls_tab>.
    *    UPDATE lt_tab FROM TABLE mt_sflight.
         MOVE-CORRESPONDING ls_mt to lt_tab.
       ENDLOOP.
    I am getting error "lt_tab is not internal str or table with header"
    Can you help me with this? 

  • In sets (t-code GS01-04): How to change Field name

    HI,
    I have created sets for rule in validation by t-code GS01. Where I have given Tbale name BSEG and Field name KOSTL(Cost Center No). Now, I want to change field name SAKNR (GL NO) instead of cost center. When I am trying to change field name t-code GS02, there is field name is in display mode and no way to change it.
    As I have lot of entries in each set, so that creation of new sets is very hard job again. Further when I trying to create new sets by reference it didnt change the table name and field name.
    Please provide me a solution.
    Khalid

    Hi,
    Hope it is not possible, logically total field is changing and the dependent entrie will not stay as it is. I don't think this is possible.
    Eventhough the values are same but the fields are different.
    VVR

  • Changing Field Labels of module pool screen dynamically

    Hi All,
    Can anybody tell me how to change field label of text field in dialog screen dynamically.
    The Screen/Transaction is standard one.
    I have created a Enhancement point for this change in one of PBO module's subroutine for this screen.
    This Field label is defined as a 'Text' field only. We can't change it any more as it is standard one.
    Can anybody tell me the solution for the same.
    I have to change this label value as per some validations and its corresponding text field value will remain as is.
    Thanks,
    Deep.

    Hello,
    I think it is not possible, but try changing the name by Looping on screen table on PBO,
    Bye
    Gabriel

  • How to change field text in standard trasaction

    Hi,
    In XD01 transaction i need to change the standard field label, How difficult/easy is it to change field label of a SAP standard field? Is there any other way to change the screen text. please let me know.
    regards
    Jaya

    Hi Jaya,
    You can change the label on the screen directly - BUT this would be a modification.
    There is a way to change field labels without a modification, but that has to be done on the data element level.
    For that just find out the data element that is referenced and create a Text Enhancement for that Data Element which is NOT a modification.
    - Goto transaction CMOD
    - Choose Menu 'Goto'
    - 'Text Enhancements'
    - 'Keywords'
    - 'Change'
    - Put in the data Element Name and confirm
    - You'll have the possibility to change the Label texts for
         Short, Medium and Long Field Label
         Heading
         Short Description
    - Make your Changes and save
    - Done
    Where ever that data element is referenced you'll see your own text.
    Hope that helps,
    Michael

  • Change field value in a table, based on another field value in the same row (for each added row)

    Please Help, I want to change field value in a table, based on another field value in the same row (for each added row)
    I am using this code :
    <HTML>
    <HEAD>
    <SCRIPT>
    function addRow(tableID) {
    var table = document.getElementById(tableID);
    var rowCount = table.rows.length;
    var row = table.insertRow(rowCount);
    var colCount = table.rows[0].cells.length;
    for(var i=0; i<colCount; i++ ) {
    var newcell = row.insertCell(i);
    newcell.innerHTML = table.rows[1].cells[i].innerHTML;
    switch(newcell.childNodes[0].type) {
    case "text":
    newcell.childNodes[0].value = "";
    break;
    case "checkbox":
    newcell.childNodes[0].checked = false;
    break;
    case "select-one":
    newcell.childNodes[0].selectedIndex = 0;
    break;}}}
    function deleteRow(tableID) {
    try {var table = document.getElementById(tableID);
    var rowCount = table.rows.length;
    for(var i=0; i<rowCount; i++) {
    var row = table.rows[i];
    var chkbox = row.cells[0].childNodes[0];
    if(null != chkbox && true == chkbox.checked) {
    if(rowCount <= 2) {
    alert("Cannot delete all the rows.");
    break;}
    table.deleteRow(i);
    rowCount--;
    i--;}}}catch(e) {alert(e);}}
    </SCRIPT>
    </HEAD>
    <BODY>
    <INPUT type="button" value="Add Row" onClick="addRow('dataTable')" />
    <INPUT type="button" value="Delete Row" onClick="deleteRow('dataTable')" />
    <TABLE id="dataTable" width="350px" border="1">
    <TR>
    <TD width="32"></TD>
    <TD width="119" align="center"><strong>Activity</strong></TD>
    <TD width="177" align="center"><strong>Cost</strong></TD>
    </TR>
    <TR>
    <TD><INPUT type="checkbox" name="chk"/></TD>
    <TD>
    <select name="s1" id="s1">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
    </select>
    </TD>
    <TD><input type="text" name="txt1" id="txt1"></TD>
    </TR>
    </TABLE>
    </BODY>
    </HTML>

    Hi,
    Let me make sure u r working with table control.
    First u have to create a event(VALIDATE) to do the validation.
    Inside the event,
    1. First get the current index where user has pointed the curson
    2. Once u get the index read the internal table with index value.
    3. Now u can compare the col1 and col2 values and populate the error message.
    1. DATA : lo_elt TYPE REF TO if_wd_context_element,
                   l_index type i.
    lo_elt = wdevent->get_context_element( name = 'CONTEXT_ELEMENT' ).
         CALL METHOD LO_ELT->GET_INDEX( RECEIVING  MY_INDEX = l_index.
    above code should be written inside the event.
    Thanks,

  • Buyer not able to change fields of SC in sourcing cockpit in SRM 7.0

    Hi
    We are on SRM 7.0 , SP 07 . We are in classic mode.
    Buyer is not able to change fields of shopping cart in sourcing cockpit like delivery date and quantity . He is able to add supplier and create PO . Even when he creates draft PO , he is not able to edit the fields of shopping cart like delivery date and quantity. Is it a standard Bug , is their any OSS SAP Note for this
    Regards
    Ashish

    As per SAP Standard BUYER can only vendor and Enter price and create  a follow on document.
    Buyer does not have a control to edit other data.
    Buyer wants to they can do it in ME21N ..PO
    not in the shopping cart

  • Change field contents

    Hi...
    How can I change field contents in ABAP New debugger..?
    Thanks,
    Naveen.I

    Hi,
    There a column named Change...beside the field(Pencil mark).
    Double click on it,
    field content will change to editable mode...
    change the content and hit ENTER.

  • Get value of changed field of create_decision_popup window in lineedit mode

    Hi there,
    i'm calling a create_decision_popup popup in lineedit mode.
    So i could edit the values of the selected line.
    How could i acces the value of the changed fields after closing the popup window in the event_sel event.
    Here my code:
    v_popup = comp_controller->window_manager->create_decision_popup( iv_title = 'Window title'
                                                                        iv_selection_mode    = 'LINEEDIT'
                                                                        iv_display_table     = gt_table
                                                                        iv_visible_columns   = lt_visible_columns
                                                                        iv_visible_row_count = lv_row_count ).
    v_popup->set_on_close_event( iv_event_name = 'event_sel' iv_view = me ).
    v_popup->open( ).
    DATA: lr_outputnode TYPE REF TO  cl_bsp_wd_context_node.
    lr_outputnode ?= v_popup->get_context_node( 'OUTPUTNODE' )
    Thanks,
    Regards TomSd

    You want to edit the selected value from popup, so first populate the selected row in table and then edit in the table.
    Open the popup using :
    CALL METHOD me->comp_controller->window_manager->create_decision_popup
           EXPORTING
             iv_title             = 'Route'
             iv_description       = 'Route' 
             iv_selection_mode    = 'SINGLE'
             iv_visible_row_count = '10'
             iv_display_table     = gt_route
             iv_visible_columns   = lt_table
           RECEIVING
             rv_result            = gr_popup.
    gr_popup->set_on_close_event( iv_event_name = 'DEC_POPUP_CLOSED' iv_view = me ).
    gr_popup->open( ).
    Now on close event i.e. DEC_POPUP_CLOSED write the code to transfer the selected row into the table.
    lv_outputnode ?= gr_popup->get_context_node( 'OUTPUTNODE' ).
    lv_index = lv_outputnode->get_selectedrowindex( ).
         IF lv_index IS NOT INITIAL.
           READ TABLE gt_route INTO ls_route INDEX lv_index.
           lr_col ?= me->typed_context->zroute->collection_wrapper.
           CREATE DATA lr_tab_data.
           CREATE OBJECT lr_valuenode
             EXPORTING
               iv_data_ref = lr_tab_data.
           lr_valuenode->set_properties( is_attributes = ls_route ).
           lr_col->add( EXPORTING iv_entity    = lr_valuenode ).
           REFRESH: gt_route.
           CLEAR: gr_popup.
    endif.
    Now you can see the selected row in your table view and the popup will be closed.
    To make the row editable go to htm page on which table view is created, and then modify
    editMode              = "ALL"
    in  <chtmlb:configCellerator>

  • Detect Note Changes in MIDI Sequencer

    Hi all,
    I&rsquo;m trying to detect when the MIDI Sequencer changes notes using some kind of a listener to detect when the note changes occur. My example program is able to detect the end of the sequence and I&rsquo;d like to be able to detect note changes and print a message in a similar way. Here is my example code.
    import javax.swing.*;
    import javax.sound.midi.*;
    public class SequencerTestApplet extends JApplet
        public void init()
            SequencerTest seqTest = new SequencerTest();
            seqTest.play();
            System.out.println("Print from init()");
    class SequencerTest
        Sequencer sequencer=null;
        Sequence seq=null;
        Track track=null;
        public SequencerTest()
            try
            {   sequencer = MidiSystem.getSequencer();
                sequencer.open();
                // detect END OF SEQUENCE
                sequencer.addMetaEventListener(
                    new MetaEventListener()
                    {   public void meta(MetaMessage m)
                        {  if (m.getType() == 47) System.out.println("SEQUENCE FINISHED");
                sequencer.setTempoInBPM(40);
                seq = new Sequence(Sequence.PPQ, 16);
                track = seq.createTrack();
            catch (Exception e) { }
        public void play()
            try
            {    // NOTE 1
                ShortMessage noteOnMsg = new ShortMessage();
                noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
                track.add(new MidiEvent(noteOnMsg, 0));
                ShortMessage noteOffMsg = new ShortMessage();
                noteOffMsg.setMessage(ShortMessage.NOTE_OFF, 0, 60, 93);
                track.add(new MidiEvent(noteOffMsg, 16));
                // NOTE 2
                ShortMessage noteOnMsg2 = new ShortMessage();
                noteOnMsg2.setMessage(ShortMessage.NOTE_ON, 0, 68, 93);
                track.add(new MidiEvent(noteOnMsg2, 16));
                ShortMessage noteOffMsg2 = new ShortMessage();
                noteOffMsg2.setMessage(ShortMessage.NOTE_OFF, 0, 68, 93);
                track.add(new MidiEvent(noteOffMsg2, 32));
                sequencer.setSequence(seq);
                sequencer.start();
            catch (Exception e) { }
    }In this program the init() method starts the sequencer through the play() method and then continues on so that the &ldquo;print from init()&rdquo; statement is printed from the init() method while the sequencer is still playing. Then after the sequencer is finished, it uses the MetaEventListener to detect the end of the sequence and print the &ldquo;sequence finished&rdquo; message. I&rsquo;d like to be able to make it also detect when the sequence changes notes in a similar way... Start the sequence and move on, but then be able to detect each time a note change occurs and print a message.
    Since I am putting the notes at specific midi ticks (multiples of 16, or &ldquo;quarter notes&rdquo;) I could poll the Sequencer using getTickPosition() to see if the Sequencer&rsquo;s tick position matches a particular multiple of 16. However, the problem with this is it would lock up the program since it would be constantly polling the sequencer and the program wouldn&rsquo;t be able to do anything else while the Sequencer is playing (and I also have a loop option for the Sequencer so that would lock up the program indefinitely).
    Here&rsquo;s what I&rsquo;ve found out and tried so far...
    I read in this [this tutorial|http://java.sun.com/docs/books/tutorial/sound/MIDI-seq-adv.html] on the java sun site (under &ldquo;Specifying Special Event Listeners&rdquo;) that The Java Sound API specifies listener interfaces for control change events (for pitch-bend wheel, data slider, etc.) and meta events (for tempo change commands, end-of-track, etc.) but it says nothing about detecting note changes (note on/off). Also in the [EventListener API|http://java.sun.com/j2se/1.3/docs/api/java/util/class-use/EventListener.html] (under javax.sound.midi) it only lists the ControllerEventListener and the MetaEvenListener.
    I also read here that MIDI event listeners listen for the end of the MIDI stream, so again no info about detecting note changes.
    It seems like the sequencer should have some way of sending out messages (in some fashion) when these note changes happen, but I&rsquo;m not sure how or even if it actually does. I&rsquo;ve looked and looked and everything seems to be coming back to just these two types of listeners for MIDI so maybe it doesn&rsquo;t.
    To be sure the MetaEventListener doesn&rsquo;t detect note changes I changed the MetaMessage from:
    public void meta(MetaMessage m)
    {    if (m.getType() == 47) System.out.println("SEQUENCER FINISHED");
    }to:
    public void meta(MetaMessage m)
    {    System.out.println("" + m.getType());
    }so that it would print out all of the MetaMessages it receives. The only message that printed was &ldquo;47&rdquo; which indicates the end of the sequence. So the MetaEventListener doesn&rsquo;t appear to do what I need it to do.
    I realize this is a rather odd problem and probably not many people have had the need to do something like this, but it never hurts to ask. If anyone has any suggestions on how to solve this problem it would be greatly appreciated.
    Thanks,
    -tkr

    Tekker wrote:
    As another idea, since I can't do it with a listener like I originally wanted to, would adding a separate thread to poll the sequencer and send an interrupt when it matches a particular midi tick be a good route to try? My thinking is this essentially act kind of like a listener by running in the background and reporting back when it changes notes.Yep, that worked! :)
    import javax.swing.*;
    import javax.sound.midi.*;
    public class ThreadTestApplet extends JApplet
         public void init()
              ThreadTest threadTest = new ThreadTest();
              threadTest.play();
              MIDIThread thread = new MIDIThread(threadTest.sequencer);
              thread.start();
              System.out.println("  Print from init() 1");
              try { Thread.sleep(1000); } catch (InterruptedException ie) {}
              System.out.println("  Print from init() 2");
              try { Thread.sleep(1000); } catch (InterruptedException ie) {}
              System.out.println("  Print from init() 3");
              try { Thread.sleep(1000); } catch (InterruptedException ie) {}
              System.out.println("  Print from init() 4");
    class ThreadTest
         Sequencer sequencer=null;
         Sequence seq=null;
         Track track=null;
         public ThreadTest()
              System.out.println("Sequencer Started");
              try
              {     sequencer = MidiSystem.getSequencer();
                   sequencer.open();
                   // detect END OF SEQUENCE
                   sequencer.addMetaEventListener(
                        new MetaEventListener()
                        {  public void meta(MetaMessage m)
                             {     if (m.getType() == 47) System.out.println("SEQUENCER FINISHED");
                   sequencer.setTempoInBPM(40);
                   seq = new Sequence(Sequence.PPQ, 16);
                   track = seq.createTrack();
              catch (Exception e) { }
         public void play()
              try
              {     // NOTE 1
                   ShortMessage noteOnMsg = new ShortMessage();
                   noteOnMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
                   track.add(new MidiEvent(noteOnMsg, 0));
                   ShortMessage noteOffMsg = new ShortMessage();
                   noteOffMsg.setMessage(ShortMessage.NOTE_OFF, 0, 60, 93);
                   track.add(new MidiEvent(noteOffMsg, 16));
                   // NOTE 2
                   ShortMessage noteOnMsg2 = new ShortMessage();
                   noteOnMsg2.setMessage(ShortMessage.NOTE_ON, 0, 68, 93);
                   track.add(new MidiEvent(noteOnMsg2, 16));
                   ShortMessage noteOffMsg2 = new ShortMessage();
                   noteOffMsg2.setMessage(ShortMessage.NOTE_OFF, 0, 68, 93);
                   track.add(new MidiEvent(noteOffMsg2, 32));
                   sequencer.setSequence(seq);
                   sequencer.start();
              catch (Exception e) { }
    import javax.sound.midi.*;
    public class MIDIThread extends Thread
         Sequencer sequencer=null;
         long midiTick=0;
         long midi_progressionLastChord=32;
         boolean print = true;
         public MIDIThread(Sequencer sequencer)
              this.sequencer = sequencer;
         public void run()
              System.out.println("Thread Started");
              while (midiTick<midi_progressionLastChord)
              {     midiTick = sequencer.getTickPosition();
                   if (midiTick == 0 || midiTick == 16)
                   {     if (print)
                        {     System.out.println("NOTE CHANGE");
                             print = false;
                   else
                        print = true;
    }I put in several print statements (with pauses in the init method) and the init print statements continue to be printed while the sequencer is playing, so it's not locking up the system and the "note change" statements happen when the sequencer changes notes. So this part is working perfectly! :)
    Here's what I got for my output:
    Sequencer Started
    Print from init() 1
    Thread Started
    NOTE CHANGE
    Print from init() 2
    NOTE CHANGE
    Print from init() 3
    SEQUENCER FINISHED
    Print from init() 4
    The only problem I'm having is how to "throw" this action back up to the main init method and have it do the print statement instead of the thread class. Throwing an interrupt apparently won't work as you have to poll it to see if it has been interrupted (so it'd be no different than just polling the sequencer to see if it equals the specific midi tick). Maybe throw an ActionEvent? But how to attach it to my applet? Would I need to create an instance of my applet and then pass that into the thread class so it can catch the ActionEvent? And if I do that will it stop the thread or will it keep the thread running so can detect the other notes?... Or is there a better/simpler way to do this?
    Thanks again,
    -tkr

  • Changing fields of Logical database BRF

    Hi;
    I have a changing problem
    I use brf logical database in my program but I want to change attributes of some selection fields.
    Ex:I want to do mandotary year field.I can't dı it.I can add new field but I can't change fields of BRF.
    How can I do?

    try this:
    AT SELECTION-SCREEN OUTPUT.
      LOOP AT SCREEN.
        CASE SCREEN-NAME.
          WHEN 'BR_GJAHR'.
            SCREEN-REQUIRED = 1.
            MODIFY SCREEN.
        ENDCASE.
      ENDLOOP.
    hope tha helps
    Andreas

Maybe you are looking for

  • A lot of CS4 bugs I need help with....

    The list of bugs I am about to post that are ongoing issues with my CS4... I have tried searching for solutions but to no avail... Corrupt frames Sometimes for no reason, a frame in the timeline will corrupt. everytime you 'scrub' or try to edit a ce

  • Better ripper than iTunes on Leopard?

    hi guys, i love iTunes and am not interested in starting another flame war... but i was never quite satisfied with the ripping and encoding quality. on my Linux box I use cdparanoia (a ripper based on cdda2wav) and LAME (mp3encoder) and i like the fl

  • Computers not networking

    First off, I never imagined networking could be so hard. I'm trying to wirelessly network my laptop and my desktop through a Linksys WRT54GL. Neither computer can 'see' the other one, despite them being in the same workgroup. I managed to get them ne

  • What's All This About PNG Movies?

    A friend phoned me today to ask the best way to export a project to save on her hard drive. I told her that usually it was sufficient to select File>Export>QT Movie and make it self contained. She mentioned that she had been told a PNG Movie was the

  • E-coupon and the never ending story...

    A simple process print the form, fill it out and in 6 to 8 weeks you'll get an "e-coupon" for $200! It would have been simpler to fill it out on line but Apple being one of the most advaced computer makers in the world decided to use the first mentio