Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   [Andorra] - Auf Events reagieren ? (https://www.delphipraxis.net/126955-%5Bandorra%5D-auf-events-reagieren.html)

mimi 5. Jan 2009 17:14


[Andorra] - Auf Events reagieren ?
 
Hallo,
Bei einem Projekt möchte ich gerne auf die Tastertur und Maus Events reagieren können. Jedoch klappt das einfach nicht zuverlässig. Selten klappt es. Dann eine Zeitlang überhaupt nicht.
Delphi-Quellcode:
    AdDraw.Window.Events.OnMouseDown:=MouseDown;
    AdDraw.Window.Events.OnKeyDown:=KeyDown;

procedure TPlSMC.KeyDown(Sender: TObject; Key: Word; Shift: TAdShiftState);
begin
  if key in [ord('0')..ord('9')] then begin
    AdObjTyp:=StrToint(chr(key));
    writeln(AdObjTyp);
  end;
end; // TPlSMC.KeyDown
Das ist die kurz Fassung. Ich arbeite mit Linux,
Lazarus 0.9.27, Debian, Lenny unter KDE

Kann mir jemand sagen was ich Falsch gemacht habe oder vergessen habe ? Danke !
Im Übrigen habe ich das mit AdDraw.Window.Events aus den Beispielen. Da klappt es auch nicht zuverlässig. Könnte ein Lazarus Problem sein bzw. ein Linux Problem. Wobei die Normalen Events klappen. Nur halt nicht in Andorra.

igel457 5. Jan 2009 17:58

Re: [Andorra] - Auf Events reagieren ?
 
Hallo,

dieses Problem ist äußerst seltsam. Theoretisch müsste es in der AdVCLComponentEventConnector.pas liegen. Setze mal einen Haltepunkt in der Prozedur TAdVCLComponentEventConnector.KeyDown. Das ist die Stelle, an der die Events von VCL/LCL an die Andorra-Anwendung übergeben werden. Setze auch mal einen Haltepunkt auf die "ConnectEvents"- und die "DisconnectEvents"-Methode. Die sollten jeweils nur ein einziges Mal aufgerufen werden. Schau in der "ConnectEvents"-Methode auch ob "PropInfo" bei jeder Abfrage auf einen gültigen Wert gesetzt wird (der sich vom vorhergehenden unterscheidet).

mimi 5. Jan 2009 18:29

Re: [Andorra] - Auf Events reagieren ?
 
Tests haben ergeben das "ConnectEvents" zweimal aufgerufen wird.
Delphi-Quellcode:
 writeln('OK00');
    //Check for on key down event
    PropInfo := GetPropInfo(Control, 'OnKeyDown');
    if (FKeyDownComp = nil) and (PropInfo <> nil) then
    begin
      writeln('OK01');
      Method := GetMethodProp(Control, PropInfo);
      FOldKeyDown := TKeyEvent(Method);
      PKeyEvent(@Method.Code)^ := KeyDown; Method.Data := self;
      SetMethodProp(Control, PropInfo, Method);
      FKeyDownComp := Control;
    end;
Der Debugger geht bei mir leider nicht. Darum gehe ich diesen weg mit Writeln.
Beim ersten durchgang werden alle beide weriteln aufgerufen beim zweiten nicht mehr. Warum das so ist weiß ich noch nicht. Ich stelle weitere nach Forschungen an. Ich weiß allerdings das die Events vor einiger Zeit geklappt haben.

Edit01:
Das seltsame ist das die Procedure scheinbar zwei Mal aufgerufen wird. tue ich aber ein writeln am anfang der Procedure ConnectEvents erscheint die Meldung nur einmal. Erst wenn er bei onKeyDown ist. PropInfo scheint auch richtig gesetzt zu sein. Werde aber weiter Forschen. :-D

Edit02: Habe übersehen das es sich um eine while schleife handelt. Also ist das verhalten hier richtig. Glaube ich.

mimi 6. Jan 2009 22:25

Re: [Andorra] - Auf Events reagieren ?
 
Tritt das Problem eigentlich auch bei anderen auf ? Bisher konnte ich die Ursache noch nicht finde und habe auch aufgehört zu suchen.

inherited 6. Jan 2009 22:54

Re: [Andorra] - Auf Events reagieren ?
 
Magst du mir mal das Projekt oder ein mini-projekt, das das Problem rekonstruiert schicken bzw. hier anhängen?
Das wäre sehr lieb, dann teste ich das mal.

mimi 7. Jan 2009 16:40

Re: [Andorra] - Auf Events reagieren ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann ich gerne machen. Aber ich glaube es dürfte ein allgemeiner Fehler sein.
Im Anhang findest du das Komplett Projekt. Die Grafiken sind NICHT von mir. Sie stammen von hier:
http://www.secretmaryo.org/
oder von einem Andorra Tutorial.

Hier mal ein Code-Auszug:
Delphi-Quellcode:
constructor TPlSMC.Create(aForm:TForm);
begin
  inherited Create;
  AdDraw :=TAdDraw.Create(aForm);
  AdDraw.DllName := '/media/sda6/Michael/daten/add_lazarus/ad2d_451_ALL/bin/AndorraOGLLaz.so';
  AdPerCounter:=TAdPerformanceCounter.Create;
  if AdDraw.Initialize then begin

    AdImageList := TAdImageList.Create(AdDraw);
    with AdImageList.Add('bricks') do begin
      Texture.LoadGraphicFromFile('image/bricks_sand.png',true,clFuchsia); // Dieses mal laden wir das Bild transparent herein
      PatternWidth := 64;
      PatternHeight := 64;
    end;
    AdImageList.Restore;

    AdSpriteEngine := TSpriteEngineEx.Create(nil);
    AdSpriteEngine.Surface := AdDraw;
    AdSpriteEngine.Zoom:=3;
    Application.OnIdle:=Idle;
    AdDraw.Window.Events.OnKeyDown:=KeyDown;
    AdDraw.Window.Events.OnMouseDown:=MouseDown;

  end
  else
  begin
    writeln(AdDraw.GetLastError);
    halt; //<-- Schließt die komplette Anwendung
  end;
end; // TPlSMC.Create
Wenn dann ist es ein Fehler in der reihenfolge.

Edit01 Es ist ein Lazarus Projekt 0.9.27 ich hoffe das läuft bei dir.

inherited 7. Jan 2009 19:38

Re: [Andorra] - Auf Events reagieren ?
 
Das Projekt funktioniert hier Problemlos :gruebel:
mit Lazarus 2.6.27, FPC 2.3.1, Andorra aktuelle CVS.
Hast du es auch mal mit der aktuellen CVS-Version probiert?

mimi 7. Jan 2009 21:28

Re: [Andorra] - Auf Events reagieren ?
 
Zitat:

Lazarus 2.6.27
du meinst wahrscheinlich 0.9.27

Zitat:

Hast du es auch mal mit der aktuellen CVS-Version probiert?
Ich glaube noch nicht. Werde ich nachholen. Welche Andorra Version hast du denn genau ? Ich habe inzwischen die "ad2d_451_ALL"

Erstmal danke für deine Tests also muss es an meine Andorra Version liegen.

inherited 8. Jan 2009 18:12

Re: [Andorra] - Auf Events reagieren ?
 
mein ich doch :oops:
Ich habe die aktuelle CVS-Version

igel457 8. Jan 2009 18:34

Re: [Andorra] - Auf Events reagieren ?
 
Seit Version 0.4.5.1 habe ich allerdings nicht an der Eventbehandlung geändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz