ich habe den folgenden Quelltext, der im Textmodus einwandfrei die Maus erkennt und die gedrückte Maustaste ausgibt.
Im Grafikmodus (mit Unit Graph eingestellt) tut sich nichts. Warum?
Ich erhalte zwar eine (unleserliche) Ausgabe von der Pepeat/until Schleife, kann jedoch keine Schrift lesen und wenn ich die rechte Maustaste klicke, beendet sich das Programm NICHT. Also wird die Maus im Grafikmodus nicht erkannt.
Woran liegt das. Werden im Grafikmodus andere Ports verwendet? Wenn ja, welche?
Hier erst mal mein Code, der wie geagt im Textmodus korrekt arbeitet:
Code: Alles auswählen
 
{
Programm Maustest: 
 
- funktioniert im Textmodus aber nicht in Grafikmodus
 
}
program gMouse;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes, SysUtils, CustApp, Graph, Mouse
  { you can add units after this };
 
type
 
  { TMouseApplication }
 
  TMouseApplication = class(TCustomApplication)
  private
    fromMouse: TMouseEvent;
  protected
    procedure DoRun; override;
  public
    constructor Create(TheOwner: TComponent); override;
    destructor Destroy; override;
    procedure Run;
    procedure WriteHelp; virtual;
  end;
 
var 
  InConsoleMode: Boolean = true;
 
function MouseActionStr(Action: word): String;
begin
  case Action of
   MouseActionDown : Result := 'MouseActionDown';
   MouseActionMove : Result := 'MouseActionMove';
   MouseActionUp   : Result := 'MouseActionUp';
  end;
end;
 
function MouseButtonsStr(Button: word): String;
begin
  case Button of
   MouseLeftButton: Result := 'MouseLeftButton';
   MouseMiddleButton: Result := 'MouseMiddleButton';
   MouseRightButton: Result := 'MouseRightButton';
  end;
end;
 
procedure gWriteLn(str1: String);
begin
  Graph.MoveTo(GetX, GetY);
  OutText(str1);
  Graph.MoveTo(1, GetY+1);
end;
 
procedure gPrintLn(str1,str2: String);
begin
  Graph.MoveTo(GetX, GetY);
  OutText(str1);
  Graph.MoveTo(GetX + TextWidth('A'), GetY);
  OutText(str2);
  Graph.MoveTo(1, GetY+1);
end;
 
{ TMouseApplication }
 
procedure TMouseApplication.DoRun;
var
  ErrorMsg: String;
begin
  // quick check parameters
  ErrorMsg:=CheckOptions('h', 'help');
  if ErrorMsg<>'' then begin
    ShowException(Exception.Create(ErrorMsg));
    Terminate;
    Exit;
  end;
 
  // parse parameters
  if HasOption('h', 'help') then begin
    WriteHelp;
    Terminate;
    Exit;
  end;
 
  { add your program here }
 
  // stop program loop
  Terminate;
end;
 
constructor TMouseApplication.Create(TheOwner: TComponent);
var gd,gm: smallint;
begin
  inherited Create(TheOwner);
  StopOnException:=True;
  DetectGraph(gd,gm);
  InitGraph(gd,gm,'');
  if GraphResult = grOk then InConsoleMode := false else
  begin
    Writeln('Konnte keinen passenden Grafikmodus finden');
    Halt(GraphResult);
  end;
  InitMouse;
//ShowMouse; //keine Verhaltensänderung
end;
 
destructor TMouseApplication.Destroy;
begin
// HideMouse;   
  DoneMouse;
  inherited Destroy;
end;
 
procedure TMouseApplication.Run;
begin
  //DoRun;
  repeat
    if PollMouseEvent(fromMouse) then GetMouseEvent(fromMouse);
    gwriteln(MouseButtonsStr(fromMouse.buttons));
    gPrintln('Mouse-Action -> ',MouseActionStr(fromMouse.Action));
  until fromMouse.buttons = MouseRightButton;
 
  gwriteln(MouseButtonsStr(fromMouse.buttons));
  gwriteln('Zurück mit Enter ...');
  //Readln;
  Terminate;
end;
 
procedure TMouseApplication.WriteHelp;
begin
  { add your help code here }
  gPrintLn('Usage: ', ExeName + ' -h');
end;
 
var
  Application: TMouseApplication;
begin
  Application:=TMouseApplication.Create(nil);
  Application.Title:='My Mouse Application';
  Application.Run;
  Application.Free;
end.
 Nun möchte ich die Maus aber auch im Grafikmodus erkennen und nutzen. Und den Grund wissen, warum das da nicht mehr klappt. In Windows funktioniert es schließlich auch. Der Quellcode ist für Windows überesetzt. Der Mauszeiger wird im Grafikfenster immer angezeigt, egal, ob ich ShowMouse im Code habe oder nicht, aber das Programm reagiert nicht auf meine Maustasten, was ich durch Klick auf die rechte Maustaste festgestellt habe, da die Textmodeversion bei Rechtsklick terminiert, die Grafikversion jedoch nicht.
WO liegt die Ursache?

 Verein
Verein 
 Links
Links Suche
Suche