MQL로 작성된 UI 갤러리 - 페이지 58

 
hini #:

예, 전체 프로그램을 먼저 공개하는 것이 중요합니다.

그럴게요.
 
엔진과 빌더의 모든 기능을 갖춘 기본 버전은 유효하고 달성 가능한 목표입니다. 이를 위해서는 명확한 계획과 우선순위가 필요합니다. 이는 결국 계획에 큰 작업을 추가하는 것이 끝나고 긴급한 문제를 해결하는 것이 시작됨을 의미합니다.

고층 빌딩 건설에 비유해 보겠습니다. 감독관이 몇 층을 지어야 하는지 정확히 모르는 프로젝트를 상상해 봅시다. 그가 정보를 받지 못했다고 가정해 봅시다. 하지만 그는 마음속으로 창조적인 사람입니다. 그는 신경 쓰지 않습니다. 클수록 좋습니다. 그는 높은 집과 고층 빌딩을 좋아합니다. 그가 일하는 동안 공사는 계속되고 층이 추가되고 건물은 하늘까지 자랍니다. 그러나 비계가 제거되지 않았고 거주 공간이 청소되지 않았기 때문에 아파트를 세입자에게 넘길 수 없습니다. 문도 삽입되지 않았습니다. 집은 미완성 상태입니다. 그러나 감독에게는 사소한 일입니다. 그는 올려다보고 있습니다. 하늘을요. 그리고 세입자들은 참을성없이 기다리고 있으며 아파트가 필요합니다.

일반적으로 감독은 "펌웨어를 변경"하고 정신적으로 재구성 할 때입니다. 바닥을 짓는 것을 멈추고 개구부에 문을 넣기 시작하세요. 그리고 마지막으로 청소, 벽 미장, 쪽모이 세공, 샹들리에 설치를 시작하세요 ....

이렇게 말씀드리겠습니다. 지금은 바닥을 짓지 않을 것입니다. 대신 이미 지어진 바닥이 완성됩니다. 작업은 가능한 한 빨리 집을 세입자에게 넘겨주는 방식으로 계획 될 것입니다.

결국, 집은 그들을 위해 지어졌습니다....


 

안녕하세요, 여러분,

최근의 논의에 비추어, Peter Konow의 프로젝트의 결과와 진행 상황을 포럼이 아닌 '코드베이스'에 문서화할 것을 제안하고자 합니다. 포럼은 토론과 즉각적인 피드백에는 훌륭하지만, 프로젝트의 전체적인 그림과 일관된 정책을 제시하는 데 필요한 구조와 일관성이 부족합니다.

코드베이스를 사용하면 모든 관련 정보를 체계적으로 정리하고 쉽게 액세스할 수 있으며 프로젝트의 상태에 대한 명확한 개요를 제공할 수 있습니다. 이는 명확성을 유지하는 데 도움이 될 뿐만 아니라 모든 팀원과 이해관계자 간의 협업과 이해를 촉진하는 데도 도움이 될 것입니다.

이 제안을 고려해 주시면 대단히 감사하겠습니다.

 
Yutaka Okamoto 프로젝트의 결과와 진행 상황을 포럼이 아닌 코드베이스에 문서화할 것을 제안하고 싶습니다. 포럼은 토론과 즉각적인 피드백에는 좋지만, 프로젝트의 큰 그림과 일관된 정책을 제시하는 데 필요한 구조와 일관성이 부족합니다.

'코드베이스'를 사용하면 모든 관련 정보를 체계적으로 정리하고 쉽게 액세스할 수 있으며 프로젝트의 상태를 명확하게 파악할 수 있습니다. 이는 명확성을 유지하는 데 도움이 될 뿐만 아니라 모든 팀원 및 이해관계자 간의 협력과 이해를 증진하는 데도 도움이 됩니다.

이 제안을 검토해 주시면 대단히 감사하겠습니다.

매우 합리적인 제안입니다, 감사합니다. 의심할 여지 없이 코드베이스는 업데이트를 게시하고 사용자와 소통하는 데 편리합니다. 프로젝트 개발에 큰 도움이 될 것입니다. 과거에는 코드베이스를 거의 사용하지 않았지만 이제는 이용 약관을 살펴보고 요구 사항에 맞게 조정하는 데 있어 실용적인 면을 보게 되었습니다. 이 플랫폼의 가능성과 한계에 대한 아이디어를 얻기 위해 커뮤니티에서 잘 알려진 회원들의 프로젝트를 찾아볼 것입니다. 그들의 사례를 참고하면 유익하고 유능한 방식으로 코드베이스에서 프로젝트를 수행할 수 있을 것입니다.

 

오늘 릴리스가 예정되어 있습니다.

하지만 포럼 회원의 유용한 조언을 따라 코드베이스에 새 버전을 게시하기로 결정했습니다. 제대로 하려면 비슷한 출판물의 예를 연구하고 포럼과 그곳에서 프로젝트를 병행 실행하는 계획을 세우는 데 며칠이 필요합니다. 또한 검토를 거쳐야 합니다.

이번 릴리스에 대해 몇 마디 말씀드리겠습니다:

1. 사용자 프로그램과 그래픽 인터페이스 간의 프로그래밍 방식의 상호 작용 시스템을 개념화하고 구현했습니다.

자세한 내용:

  • 기술 테스트를 수행하고 결과를 분석한 결과, 추상적인 전역 속성 대신 요소 래퍼 함수를 사용하기로 결정했습니다. 결과적으로 이것은 알고리즘과 그래픽 환경을 프로그램과 결합하는 가장 효과적이고 간단한 변형입니다.
  • 프로젝트가 저장될 때 인터페이스의 각 인터랙티브 요소가 자동으로 래퍼 함수를 받도록 UIDATA.mqh 및 API.mqh 파일의 프로젝트 저장 및 인쇄 기능에 추가되었습니다.
  • 동시에 요소 래퍼 함수는 매우 작은 본문을 가지고 있으며 주요 작업은 요소 번호, 속성 값의 세 가지 주요 매개 변수를 전달하여 중앙 함수를 호출하는 것입니다.
  • 함수의 외형적 단순성은 응용 프로그램의 다양성을 방해하지 않습니다:

1. 빈 괄호로 호출하면 함수는 세 가지 유형 중 하나를 사용하여 요소 매개변수의 값을 반환합니다: int, double, string 의 세 가지 유형 중 하나로 요소 매개변수의 값을 반환합니다.

     int i    = w6_i_CHECKBOX_Some_checkbox(); //Элемент чекбокс. Буква i  после префикса означает что тип возвращаемого/устанавливаемого значения int.
     
     double d = w6_d_S_EDIT_Spin_the_value();  //Элемент поле ввода с кнопками. Буква d после префикса означает что тип возвращаемого/устанавливаемого значения double.

     string s = w7_s_EDIT_Comment_1();         //Элемент текстовое поле ввода. Буква s означает что тип возвращаемого/устанавливаемого значения string.

2 괄호 안에 하나의 값을 넣어 호출하면 함수는 전달된 값을 요소 매개변수로 설정한 다음 다시 그립니다(요소 유형에 따라 값은 int, double 또는 string으로 설정됨).

     int i    = w6_i_CHECKBOX_Some_checkbox(0/1/2/3); //Элемент чекбокс. Передача нуля,единицы, двойки или тройки для смены между нейтральным, активированным, нетр.блокир. и актив. блокир. состояниями элемента. 
                                                      //Тот же метод работает для всех кнопок.
     
     double d = w6_d_S_EDIT_Spin_the_value(653.89);   //Элемент поле ввода с кнопками. Передача значения параметра в функцию для установки его в элемент.

     string s = w7_s_EDIT_Comment_1("Any text");      //Элемент текстовое поле ввода. Передача текста для установки в поле ввода.   


3 첫 번째 매개변수의 기본값과 속성 번호(사용 가능한 속성에서)를 사용하여 호출하면 함수는 요소의 이 속성 값을 반환합니다(모든 속성 번호는 속성 매개변수에 전달된 int 유형입니다).

      int i = w6_i_BUTTON_Start(get_i,_A_COLOR); //Элемент Кнопка. Возврат значения цвета из свойства _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                  //Однако, данных тип функции принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).
                                                                  //Значение первого параметра get_i говорит функции что не нужно принимать значение первого параметра в расчет, а лишь вернуть значение свойства _A_COLOR.


4 . 괄호 안에 값과 속성값을포함하여 호출하면함수는 전달된 값을 요소의 사용 가능한 속성으로 설정합니다. 속성번호는 속성 매개변수로전달되고 속성 값은 매개변수로 전달 됩니다.

     int i = w6_i_BUTTON_Start(C'255,0,0',_A_COLOR); //Элемент Кнопка. Передача и установка польз. значения цвета в свойство _A_COLOR. Может быть указано другое значение или другое свойство из списка доступных свойств.
                                                                      //Однако, тип функции этого элемента принимает значения только типа int, но может приводить их к другим родственным типам (uint, short, bool...).


함수 래퍼 이름의 구조: w6_i_BUTTON_Start();

w는 모든 래퍼 함수의 첫 글자입니다. window의 약자입니다.

2. 6(또는 다른 숫자) - 요소가 포함된 창의 시퀀스 번호입니다.

3. i(d 또는 s) - 요소 매개변수의 반환/설정된 값의 유형을 의미합니다.

  • int 가능: 버튼, 체크박스, 슬라이더, 버튼이 있는/없는 입력 필드, 진행률 표시줄, 차트 막대, 라디오 버튼의 경우.
  • 더블 가능 : 슬라이더, 버튼 유무에 관계없이 입력 필드에 사용할 수 있습니다.
  • 문자열 가능 : 텍스트 입력 필드, 값 요소, 표 셀, 팝업 목록의 경우.


4. 버튼 - 래퍼 함수가 속한 요소 유형의 이름입니다. 다른 요소일 수 있습니다.

5. 시작 - 특정 요소의 이름입니다 .


  • 모든 래퍼 함수는 동일한 이름 구조를 가집니다.
  • 반복합니다: 모든 함수는 자동으로 인쇄됩니다.

//----------------------------------------------------------------------------------------------------

인텔리 센스 시스템의 스마트 응용 프로그램:

창과 요소의 필요한 기능 래퍼를 빠르게 검색하고 찾는 데 도움이되는 특수 접두사 시스템을 사용하기로 결정했습니다. 다음은 예시입니다:

모든 창 및 요소 래퍼 함수는 시작 부분에 문자 W가 있습니다. 그러나 w: _ 뒤에 아래쪽 대시를 넣으면 모든 UI 창 기능의 이름 목록이 있는 인텔리센스 창이 열립니다. 그런 다음 목록에서 원하는 이름의 창을 찾아 해당 번호(기능 이름에 인쇄되어 있음)를 확인하고 대시를 지우고 이 번호를 w 뒤에 넣어야 합니다. 창에 포함 된 요소의 기능 이름이있는 인텔리 센스 목록이 한 번에 나타납니다. 다음은 수행 방법입니다:

이것은 요소 래퍼 함수 목록을 빠르게 탐색하는 간단한 방법입니다. 인쇄할 필요도 없습니다.

//----------------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------------

또한 API 파일이 변경 및 추가되었습니다. 이제 사용자는 요소와 창에 대한 더 많은 정보를 사용할 수 있습니다:

 switch(Element)
   {
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      BUTTON
//NAME:         Start
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_BUTTON_Start(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Start:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when button pressed or released?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case pressed:  Alert("BUTTON Start pressed!");   break;
  
                case released:  Alert("BUTTON Start released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set an option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_an_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_an_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_an_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_an_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      CHECKBOX
//NAME:         Set another option
//PARAMETER:    int
//INIT STATE:   OFF
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   int w6_i_CHECKBOX_Set_another_option(int value = none, int Property = 0)      | PFX: w6
//=====================================================================================================================
  
case Settings_example_1___Set_another_option:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when checkbox checked or unchecked?
               //------------------------------------------------------------------------------------------------------
               switch((int)action)
               {
                case checked:  Alert("CHECKBOX Set_another_option pressed!");   break;
  
                case unchecked:  Alert("CHECKBOX Set_another_option released!");   break;
               }
               //------------------------------------------------------------------------------------------------------
               //Your comment:
               //------------------------------------------------------------------------------------------------------
               break;
  
//=====================================================================================================================
//WINDOW:       Settings example 1 | #: 6 | PFX: w_6 | GET/SET: int w_6_Settings_example_1(int value = get_i, int Property = 0)
//---------------------------------------------------------------------------------------------------------------------
//ELEMENT:      D_LIST
//NAME:         D_LIST 1
//PARAMETER:    string
//INIT OPTION:  L_ITEM  1
//LOCATION:     Location: Window's Main Frame
//---------------------------------------------------------------------------------------------------------------------
//GET/SET:   string w6_s_D_LIST_D_LIST_1(string value = get_s, int Property = 0)      | PFX: w6
//=====================================================================================================================
 
조만간 이 기능들을 사용해보고 싶습니다.
 
hini #:
곧 이 기능들을 사용해보고 싶습니다.
내일 저녁에 새 버전을 코도베이스에 업로드할 예정입니다.
 
심야 릴리스.
 

프로그래밍 방식으로 GUI와 상호 작용하는 엔진 버전을 소개합니다.

저는 많은 일을 해왔습니다. 말하고 보여줄 것이 있습니다.

공개 테스트 후 코드베이스에 업로드할 예정입니다.

흥미로운 것이 밝혀졌습니다...

내일 더 자세히 설명하겠습니다.

파일:
4uh38_06.08.24.zip  1712 kb
 

조금 앞서서 사용자에게 매우 편리한 솔루션을 찾았다고 말할 수 있습니다. 코드 내에서 창, 요소 및 속성을 쉽게 탐색할 수 있습니다. 이 솔루션을 사용하면 요소나 속성의 이름을 기억하지 않고도 쉽게 찾아서 작업할 수 있습니다. 동시에 각 요소에는 해당 요소에서만 사용할 수 있는 속성 가져오기/설정 목록과 '관련' 요소가 있습니다. 요소의 함수 이름에 접두사가 포함되어 있으면 사용자가 함수를 호출할 때 요소에 없는 프로퍼티를 반환하거나 설정하는 실수를 하지 않습니다.

래퍼 함수는 매우 다재다능하고 사용하기 쉬워서 저도 놀랐습니다. 괄호가 비어 있으면 매개변수 값을 반환하고, 값이 1이면 설정하고, 첫 번째 매개변수가 비어 있고 속성 인덱스가 두 번째에 있을 때 목록에서 속성 값을 반환합니다. 첫 번째 매개변수에 값이 있고 두 번째 매개변수에 속성 인덱스가 있는 경우 속성에 값을 설정합니다. 또한 성공하면 결과 알림을 1로, 오류(유효하지 않은 값 또는 속성)가 발생하면 -1로 반환합니다. 이 함수는 요소 자체를 다시 그립니다. 이 작업은 사용자가 처리할 필요가 없습니다.

래퍼 함수로 할 수 있는 작업은 다음과 같습니다:

1. 요소 매개변수의 값을 가져옵니다.

2. 요소 매개변수의 값을 설정합니다.

3. 요소 유형에 속하는 개별 속성 목록(함수 이름에 쓰여진 접두사로 호출)에서 요소 속성 값을 가져옵니다.

4. 4. 동일한 목록에서 요소 속성 값을 설정합니다.

5. 요소의 상태를 설정합니다: 중립, 활성화, (켜기/끄기), 차단된 중립, 차단된 활성화.

6. 요소의 현재 상태를 반환합니다.


첫 번째 경우 함수는 매개변수의 값을 반환합니다.

두 번째 경우에는 성공 또는 오류라는 결과를 반환합니다. 오류는 로그에 출력됩니다.

세 번째 경우에는 속성 값을 반환합니다.

네 번째 - 결과: 속성 설정의 성공 또는 오류입니다.

다섯 번째에서는 1 또는 -1을 반환합니다.

여섯 번째 - 요소의 상태 인덱스를 반환합니다(자세한 내용은 아래 참조).


모든 작업은 자동으로 인쇄되는 하나의 래퍼 함수에 의해 수행됩니다. 이를 찾으려면 w_를 입력하면 인텔리센스 목록이 열리고 창 이름이 포함되어 있습니다. 그 중 하나에는 찾고 있는 요소가 있습니다. 대략 어떤 창에 있는지 기억해야합니다. 그런 다음 악마를 지우고 창 번호를 입력하고 항목 목록에서 필요한 항목을 선택합니다. 암기하지 마세요.

요소의 속성도 기억할 필요가 없습니다. 기능 이름을 보고 접두사를 확인하여 개별 속성 목록을 열면 됩니다. 입력하고, 열고, 속성을 선택하면 됩니다. 아무것도 기억할 필요가 없습니다. 타이핑도 필요 없습니다. Intellisense가 모든 작업을 수행합니다.

Windows에도 자체 래퍼가 있습니다. 래퍼를 열고 닫을 수 있습니다. 나머지 기능은 아직 구현되지 않았습니다.


API 파일을 대폭 업그레이드했습니다. 이제 요소에 대한 유용한 정보가 엄청나게 많이 추가되었습니다. 즉, 접두사, 개별 속성, 요소 래퍼 함수의 프로토타입 및 해당 창, 요소의 정확한 위치(요소가 속한 테이블, 캔버스 및 탭(있는 경우)), 매개변수 유형(int, double, string...), 매개변수 속성(최소값, 최대값, 단계, 소수점 뒤 자릿수)이 인쇄됩니다. 초기값 또는 선택한 옵션(요소에 따라 다름). 모든 것이 매우 읽기 쉽고 이해하기 쉽게 디자인되었습니다.

새로운 기능을 부분적으로 테스트해 본 결과 만족스러웠습니다. 모든 것이 의도 한대로 작동합니다.

내일 실제로 보여 드리겠습니다.