PowerBuilder에서 동적 메뉴를 구현하는 방법
C 언어를 사용하여 동적 메뉴를 구현하는 방법은 많은 API 함수를 호출해야 한다는 내용을 일부 책에서 본 적이 있지만 여기서는 에서 제공하는 속성과 재귀 알고리즘을 사용하도록 방법을 변경하고 싶습니다. PowerBuilder는 동적 메뉴의 생성 프로세스를 구현합니다. 여기에서 설명하는 동적 메뉴는 외부 데이터 소스에 정의된 메뉴 구조를 가지며 메뉴 개체에는 생성해야 하는 메뉴 항목이 없다는 점에 유의해야 합니다. 프로그램에 의해.
메뉴 데이터 구조 정의
동적 메뉴를 구현하려면 먼저 합리적인 메뉴 데이터 구조를 디자인하십시오. 데이터 소스는 DBMS 또는 TXT 텍스트 파일일 수도 있습니다. (합리적인 계층 구조가 확립될 수 있는 한)
메뉴는 트리 컨트롤은 계층적 순차 구조를 가지므로 데이터 구조를 정의할 때 관계를 생생하게 표현할 수 있는 모델을 선택해야 합니다. 아버지, 아들, 형제 사이의 메뉴 구조를 가장 잘 반영할 수 있는 컨트롤은 트리 컨트롤 트리뷰이며, 정의는 두 자리 수 진행을 기반으로 합니다. 일련번호로 형제관계를 판별하고, 두 자리 수순으로 부모-자식 관계를 판별합니다. 예를 들어 그림과 같은 메뉴의 해당 데이터 구조는 다음과 같습니다.
이렇게 메뉴 구조는 메뉴 구조를 설정할 때 재귀 알고리즘을 사용하는 데 매우 적합합니다. 그러면 트리 순회 알고리즘에 따라 트리 구조의 메뉴 개체를 만들 수 있습니다.
다음으로 메뉴 데이터 구조를 정의합니다. 메뉴 데이터 구조에는 다음과 같은 기본 요소 메뉴 이름이 포함되어야 합니다. 메뉴 유형 메뉴 일련 번호 메뉴 항목 텍스트 메뉴 항목 id 메뉴 항목의 실행 코드 메뉴 표시 스타일은 다음 표에 설명되어 있습니다.
2. 동적으로 생성된 메뉴
흐름도
과정 설명
위 그림과 같이 메뉴를 생성하는 전체 과정은 메뉴 초기화 두 부분으로 나누어집니다. 메뉴 속성을 설정하면 재귀 알고리즘을 사용하여 데이터 소스에서 메뉴 데이터를 읽을 때마다 메뉴 항목이 Powerbuilder의 create 메소드를 사용하여 레벨별로 메뉴를 생성합니다. 먼저 메뉴 인스턴스 객체를 정의합니다. 여기서 메뉴는 팝업 메뉴가 아닌 기본 메뉴를 의미하므로 팝업 메뉴의 처리 방법은 나중에 소개하겠습니다. 매우 간단합니다. 메뉴 객체를 생성하는 데는 메뉴 항목이 먼저 숨겨지고 표시됩니다.
integer? 재귀 함수 매개변수 메뉴 am_obj //메뉴 객체는 재귀 함수 매개변수로 전달됩니다. ? m_menu_item? lam_root? //메뉴 객체 m_menu_item은 미리 정의된 메뉴 객체입니다. //이 객체에는 메뉴 항목이 없습니다. object lam_root item[ai_item_serial_no] = create m_menu_item?//기존 메뉴 개체의 am_obj = lam_root item[ai_item_serial_no]에 새 메뉴 개체를 연결합니다. //생성된 메뉴를 표시하는 데 다음 두 문장이 사용됩니다. lam_root Hide()?// 메뉴 개체를 숨기시겠습니까? lam_root Show()?//메뉴 개체 표시
위 명령문을 재귀 프로세스에 넣어 전체 메뉴 구조를 구축하는 중
메뉴의 itemid를 가져와야 합니다. 이 속성은 메뉴 응답 작업을 캡처하는 데 사용되는 유일한 식별자입니다. 메뉴의 itemid를 알아야만 어떤 메뉴 항목 이벤트가 트리거되었는지 알 수 있습니다.
메뉴 항목 itemid를 가져오는 방법은 여러 시스템에서 반복된 테스트를 통해 발견되었으며, 규칙적인 패턴이 발견되었습니다. 상위 메뉴의 itemid는 처음부터 하위 메뉴의 itemid가 처음부터 순차적으로 증가합니다. 재귀적 알고리즘에 따라 각 레이어의 각 메뉴 항목의 itemid가 생성되어 데이터베이스에 저장됩니다.
메뉴 표시 스타일을 설정하는 것은 메뉴가 생성된 후 3가지 항목을 설정하는 것입니다.
표시 스타일, 텍스트 스타일, 그림 스타일, 텍스트와 그림의 혼합 표시 방법 각 메뉴 스타일 설정 시 효율성을 높이기 위해 상위 메뉴, 보이지 않는 메뉴 항목 및 정의되지 않은 메뉴 항목을 모두 설정하지 마십시오. 텍스트 스타일은 기본 스타일이고 변경할 필요가 없기 때문에 그림을 표시합니다. 프로그래머의 이 부분은 주로 세 가지 API 함수를 사용합니다.
Getsubmenu는 지정된 메뉴 항목 SetMenuItemBitmaps의 핸들을 가져오는 데 사용됩니다. 텍스트 표시 스타일을 설정하거나 그림 스타일을 설정하는 데 사용됩니다. 두 경우의 차이점은 함수의 마지막 두 자리일 경우 메뉴 항목에서 비트맵의 마지막 두 자리를 제거합니다. 핸들을 사용하여 메뉴 항목에 비트맵을 추가합니다. ModifyMenu는 그림 표시 스타일을 설정하는 데 사용됩니다.
반복 테스트 후 지정된 표시 그림 이름이 ***bmp와 같은 잘못된 이름인 것으로 나타났습니다. 구분 기호 표시
전체 메뉴 생성 과정에서 중점을 두어야 할 것은 프로그램 알고리즘 데이터 액세스 방법 및 오류 제어입니다.
) 프로그램 알고리즘은 주로 재귀 알고리즘을 말합니다. , 재귀에는 FOR 루프 방법과 DO...while 루프 방법이라는 두 가지 알고리즘이 있습니다. 둘 다 루프 알고리즘이지만 효율성이 다릅니다. 사용자는 자신의 능력에 따라 방법을 선택하고 무한을 작성하지 않는 것이 좋습니다. 루프 For 루프. 이 방법은 비교적 간단하고 직관적입니다. 루프는 순회 횟수를 제어한 다음 루프 내에서 자신을 호출하여 재귀 호출을 구현합니다. while 루프 방법은 주로 잎이나 가지(즉, 부모)를 결정합니다. 노드) 루프 내의 리프와 가지가 별도로 처리되며 내부 호출 자체도 재귀를 구현해야 합니다.
) 합리적이고 안전한 데이터 액세스 방법을 선택하는 것도 매우 중요합니다. stable 메뉴. 메뉴 초기화 시 데이터베이스에서 추출된 모든 데이터를 datastore 객체에 저장하기 위해 datastore(데이터 저장) 객체를 정의합니다. 변경된 메뉴 데이터를 제출할 때까지 더 이상 데이터베이스에 대한 작업이 수행되지 않습니다. itemid 등)을 데이터 저장소의 업데이트 형식으로 데이터베이스에 추가하기 전에 데이터 저장소에서 가져와야 하는 모든 데이터를 필터링합니다. 즉, setfilter() 및 filter() ) 함수에 따라야 합니다. 쌍 프로그래밍 규칙에 따라 데이터 저장소의 데이터를 필터링하고 사용한 후 필터링 조건 쌍은 다음과 같이 필터링할 빈 문자열이어야 합니다. setfilter(조건) 필터() ...처리 프로세스... setfilter( ) Filter()
이 방법을 사용하면 다음 모듈 호출 시점에 데이터를 초기 상태로 복원할 수 있습니다.
Datastore를 사용하면 메뉴 중에도 데이터 보안을 유지할 수 있습니다. 효율성을 높이고 데이터베이스에서 반복적인 읽기 및 쓰기 작업을 제거할 수 있습니다.
) 메뉴의 중요성 때문에 메뉴를 만들 때 오류 제어가 특히 중요합니다. 메뉴를 재귀적으로 생성할 때 가능한 한 많은 잠재적인 오류를 생성할 수 없습니다. 정확한 정의는 모듈 구축의 문제가 아니지만, 특히 2비트 점진적 계층 데이터의 경우 데이터베이스의 메뉴 구조 데이터에 오류가 없는지 확인할 수 없습니다. 메뉴구조상 오류가 있을 경우 전체 생성 과정이 실패할 수 있으며, 더욱이 프로그램이 비정상적으로 종료되므로 프로그램이 오류 처리를 설계할 때 프로세스를 종료할지 아니면 잘못된 부분을 건너뛸지 고려해야 합니다. 링크하고 계속하세요. 프로그램에는 어느 정도의 중복성과 오류 수정 기능이 있어야 합니다. 즉, 오류가 있는 데이터는 환경에 따라 올바른 값으로 수정될 수 있어야 합니다. 효율성을 높이기 위해
반복 테스트를 통해 메뉴의 속성이 문자 유형인 경우 null 값을 할당할 수 없다는 점을 지적해야 합니다. 정수인 경우 빈 문자열이어야 합니다. 유형에 null 값을 할당할 수 없습니다. 그렇지 않은 경우에는 기본 정수여야 합니다. 그렇지 않으면 프로그램이 예외 오류를 보고하고 종료됩니다.
이러한 반복 테스트는 구문 오류를 찾고 알고리즘의 정확성을 보장하는 것뿐만 아니라 우리가 유추하기 어려운 많은 오류를 찾을 수 있다는 점에서 매우 중요합니다.
팝업 메뉴의 세 쌍의 특수 처리
팝업 메뉴는 메인 메뉴와 객체 정의 및 호출 방법이 다르기 때문에 먼저 특별한 처리가 필요합니다.
메뉴 인스턴스 개체를 정의합니다. 이 개체에는 루트 메뉴가 하나만 있어야 합니다. 모든 팝업 메뉴 항목은 창의 마우스 오른쪽 버튼 이벤트에서 호출되어야 합니다. menu는 팝업 메뉴를 호출하기 전에 창 초기화 이벤트에서 호출되어야 합니다. 팝업 지점의 X 및 Y 좌표를 알고 popmenu() 함수를 사용하여 표시해야 합니다.
처리 네 가지 메뉴 응답 이벤트 중
메뉴 응답 이벤트는 데이터 구조에 정의되어 있으므로 메뉴를 생성해야 하며, 그 후에는 사용자가 메뉴를 클릭할 때 핸들만 가져오면 됩니다. 그런 다음 데이터베이스에서 해당 이벤트 정의를 찾고 작업 실행을 시작할 수 있습니다. 중요한 것은 메뉴 핸들을 가져오는 방법입니다. 메뉴가 있는 창. 사용자 정의 이벤트 ue_mouse_clicked EVENT_ID pbm_menuselect. 이 이벤트에는 itemid와 flag라는 두 가지 매개변수가 있습니다. itemid는 트리거되는 메뉴 개체의 핸들입니다. 플래그는 Windows 메시지 번호에 해당합니다. 이 플래그가 같지 않으면 메뉴 이벤트가 트리거되므로 인스턴스 변수는 itemid를 저장하고 메뉴 이벤트를 호출할 수 있습니다. 또한 중요한 질문이 있습니다: ue_mouse_clicked 이벤트를 언제 트리거할 것인가? 사용자 정의 메뉴 인스턴스 객체의 클릭 이벤트 if? Isvalid(iw_win)? then Message StringParm = this is_ItemID/ /itemid를 메시지로 전달 iw_win postEvent(ue_menuitemclicked)?//트리거 윈도우 이벤트 처리 메시지 end if 윈도우 인스턴스 변수 is_ItemID iw_win에 의해 정의된 것은 메뉴 itemid의 문자열 유형 인스턴스 변수 postEvent를 저장하는 데 사용됩니다. 마지막으로, 이전에 정의된 작업을 방해하지 않도록 하기 위해 lixixinzhi/Article/program/SQL/201311/16396