用户点击鼠标后如何运行程序[Pascal]

时间:2014-09-23 12:44:07

标签: if-statement pascal

当用户通过鼠标点击选择它时,我需要运行一个程序。

程序将显示:

十进制到二进制

二进制到十进制

退出

如果人们点击十进制到二进制,那么它运行dectobin程序,如果在二进制到十进制,那么它运行bintodec程序,如果他点击Exit然后它退出程序。

执行Menu程序后,我需要在IF语句中键入什么才能使其正常工作?

program menu_with_mouse;
uses crt,mouse,mmsystem;
var n: byte;
var menu_element: array [1..3] of string;
var selected_one_element: boolean;
var mouse_on_element: byte;

procedure Menu;
var sel_el_nr: byte;
    Event: TMouseEvent;
begin
    menu_element[1] := 'decimal -> binary';
    menu_element[2] := 'binary -> decimal';
    menu_element[3] := 'Exit';

    mouse_on_element := 1;
    for n := 1 to 3 do
    begin
       if n = mouse_on_element then textcolor(green)
       else textcolor(LightGray);
       writeln(menu_element[n]);
    end;

    sel_el_nr := 0;
InitMouse;
   Repeat
      GetMouseEvent(Event);

         mouse_on_element := GetMouseY+1;
         for n := 1 to 3 do
         begin
            if (n = mouse_on_element) and
            (GetMouseX < length(menu_element[n])) then textcolor(green)
         else textcolor(LightGray);
            writeln(menu_element[n]);
         end;

     With Event do
     If (Buttons=MouseLeftbutton) and (Action=MouseActionDown) then
     begin
        if mouse_on_element <= 3 then
           selected_one_element := true;
     end;
   Until ((Event.Buttons=MouseLeftbutton) and (Event.Action=MouseActionDown))
   and selected_one_element;
DoneMouse;

end;

procedure dectobin;
var dec: integer;
x: char;
bin: string;
begin
clrscr;
readln(dec);
repeat 
if (dec mod 2 = 0) then bin:='0'+bin 
else bin:='1'+bin; 
dec:= dec div 2;
until dec = 0; 
writeln(bin);
readln;
end;


BEGIN
clrscr;

Menu;

readln;

END.

1 个答案:

答案 0 :(得分:0)

在控制台窗口中,文本行不像按钮或任何可视控件。 它们只是文本串。

在使用可视控件(按钮,文本框等等)的应用程序上,这些控件会向程序的事件处理程序发送称为事件的特殊信号,然后程序会查看它为给定事件执行的操作。这些控件在计算机屏幕上知道它们的坐标和边界,并且可以检测是否在这些边界内单击了鼠标按钮。

因此,要在控制台窗口上进行此操作,您必须知道每个菜单元素的位置。在控制台窗口中,鼠标Y是行号(从0开始),鼠标X是从左到右的字符(从0开始)。第一行的第一个字符给出鼠标X = 0,鼠标Y = 0。

如果您设置菜单以便所有菜单元素始终在同一行上, 您可以测试鼠标Y是否与菜单元素的行号匹配。

请参阅我的简单示例(它不测试菜单项长度 - 鼠标X坐标):

program Menu;

Uses Mouse;

var
    Event: TMouseEvent;

begin
    writeln('Menu 1');  // line 0
    writeln('Menu 2');  // line 1       
    writeln('Menu 3');  // line 2 

    InitMouse;

    repeat
       GetMouseEvent(Event);
       If (Event.Buttons=MouseLeftbutton) and (Event.Action=MouseActionDown) then
          if GetMouseY = 0 then Writeln('Item 1 pressed')
          else if GetMouseY = 1 then Writeln('Item 2 pressed')
          else if GetMouseY = 2 then Writeln('Item 3 pressed');
    until false;

    DoneMouse;
end.

希望你明白这一点:)

在控制台中,使用数字选择菜单中的项目往往更加用户友好。 实现起来也更简单。

Menu
-----
  1) Menu A
  2) Menu B
  3) Menu C

What do you want to do ?(1-3):  

PS:对于控制台表单,如果内置了任何事件系统,请查看NCURSES库。我没有用它,但人们似乎很高兴:)