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?