![]() |
[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:
Das ist die kurz Fassung. Ich arbeite mit Linux,
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 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. |
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). |
Re: [Andorra] - Auf Events reagieren ?
Tests haben ergeben das "ConnectEvents" zweimal aufgerufen wird.
Delphi-Quellcode:
Der Debugger geht bei mir leider nicht. Darum gehe ich diesen weg mit Writeln.
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; 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. |
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.
|
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. |
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: ![]() oder von einem Andorra Tutorial. Hier mal ein Code-Auszug:
Delphi-Quellcode:
Wenn dann ist es ein Fehler in der reihenfolge.
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 Edit01 Es ist ein Lazarus Projekt 0.9.27 ich hoffe das läuft bei dir. |
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? |
Re: [Andorra] - Auf Events reagieren ?
Zitat:
Zitat:
Erstmal danke für deine Tests also muss es an meine Andorra Version liegen. |
Re: [Andorra] - Auf Events reagieren ?
mein ich doch :oops:
Ich habe die aktuelle CVS-Version |
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 13:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz