WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

ActiveX Matlab - Powerpoint, Tastaturabfrage

 

Danny_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2011, 10:02     Titel: ActiveX Matlab - Powerpoint, Tastaturabfrage
  Antworten mit Zitat      
Hallo an alle.

Ich habe zwar schon einige Sachen mit Matlab gemacht, aber nun stehe ich auf dem Schlauch. Zwar gab es schon ein ähnliches Thema hier im Forum, aber da ging die Lösung über C und da komme ich nicht mehr mit.
Zu allem Überfluss ist ActiveX auch Neuland für mich. Aber bekanntlich wächst man mit den Herausforderungen...

Ich möchte einen Versuch durchführen, bei dem Bilder in einer Präsentation mit einer bestimmten Präsentationszeit gezeigt werden und eine Person per Tastendruck (gewöhnliche PC-Tastatur) das Objekt zuordent. Z.B.: das Objekt ist eine Maus -> Taste A, das Objekt ist ein Mensch -> Taste B usw. Über ein Logfile, dass ich mit "diary" realisieren möchte, sollen die Daten, also gedrückte Taste und Zeit, gespeichert werden. Da die Präsentation einfach durch läuft, könnte ich anhand der Zeit die Folie zuordnen (alternativ ginge natürlich ein counter, der die Folien mitzählt).

Wie ich eine ppt öffne und nach einer gewissen Zeit ein Slide weiter schalte habe ich mir schon zusammen gesucht:

Code:

h=actxserver('PowerPoint.Application');
h.Visible=1;
h.Presentations.Open('C:\Users\Danny\Versuch1.ppt');
h.ActivePresentation.SlideShowSettings.Run; % Präsentation starten
hShow=myp.SlideShowWindows.Item(1); % Hat scheinbar einen Sinn...
pause(2); % 2 Sek Pause bis erstes relevantes Slide gezeigt wird
hShow.View.Next; %switch zum ersten relevanten Slide
%ab jetzt soll die Zeit gestoppt werden können bzw. der counter starten
s=tic; %oder count=1;
% Ab hier kommt das Problem...(s.unten)

%hShow.View.Exit; %Slideshow beenden
%h.ActivePresentation.Close; %Präsentation beenden
%h.Quit; %Powerpoint verlassen
%delete(h);
 



Also ich hatte mir überlegt, dass ich das erste Bild für eine Sekunde zeige, zwei Sekunden auf Antwort warte, dann das nächste Bild auftaucht usw.
In dieser Zeit soll bei einem Tastendurck die entsprechende Taste und die bis dahin verstrichene Zeit im Command Window gezeigt werden (-> für das diary). Die Zeit zum Tastendruck könnte ich einfach per toc(s) abfragen, aber ich bekomme das mit dem Tastendruck nicht hin.

Die Präsentation läuft im Vordergrund. Ich hatte schon versucht ein Figure im Hintergrund zu erstellen, um per KeyPressFcn die Eingaben abzufangen. Aber entweder öffnet das Figure zu spät oder die Anordnung mit Hinter- und Vordergrund funktioniert nicht. Jedenfalls kann ich tippen was ich will, es wird nicht erfasst.

Dann hatte ich überlegt, dass meine Präsentation vllt. als Figure h geöffnet wird und versucht , über
Code:

r=get(h,'CurrentCharacter') % alternativ r=get(gcf,'CurrentCharakter')
 

Tastendrücke abzufangen. Aber das geht auch nicht. h scheint in dem Sinne doch kein Figure zu sein...

Ach ja, dafür hatte ich ein Slide erstmal stehen lassen, ohne durchzuschalten. Die Zeit, bis die nächste Slide gezeigt wird, will ich per Timer ausprobiert. Der Vorteil wäre, dass ich die Timer Funktion immer wieder aufrufen kann, anstatt für jede Slide eine toc(s) Abfrage zu machen. Für sich klappt das mit dem Timer auch ganz gut. Wie ich da die Tastenabfrage reinfummel, schaue ich, wenn ich weiss, wie ich die Tasten erfasse... Wink

Über methods(h) und events(h) und h.invoke, h.Presentation.invoke habe ich versucht raus zu bekommen, was es für Möglichkeiten gibt, aber ich komme nicht weiter. Leider habe ich auch keine Erklärung der einzelnen Methoden oder Events oder wie auch immer gefunden.

Falls hier jemand eine Idee hat, wäre ich sehr sehr dankbar für Hilfestellungen.

PS: Für alle die denken: Warum zum Henker öffnet sie die Bilder nicht einfach per Figure : Ich habe es nicht hinbekommen eine bildfüllende Darstellung, wie ich sie in einer Präsentation hätte, zu bekommen, da ich immer den "Dialog-Fenster-Rand" dabei habe.


Danny_Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2011, 11:49     Titel: Eine (etwas umständliche) Lösung
  Antworten mit Zitat      
Hallo zusammen,

ich habe das lange Wochenende mal genutzt und mir eine Lösung gebastelt. Zwar sicher nicht der einfachste Weg, aber es läuft so wie gewünscht.

Ich arbeite nun mit einem Figure zur Tastatur-Abfrage und lasse die Präsentation auf einem zweiten Monitor laufen. So hab ich in meinem Hauptfenster nur das figure für die Tasten-Erfassung.

Also für alle, die mal ein ähnliches Anliegen haben, hier meine Lösung:
Code:


function PPT
diary ('mydiary_test1') % Log-File erstellen
diary on

h = actxserver('PowerPoint.Application');   % ActiveX-Server erstellen
h.Visible = 1;

h.Presentations.Open('C:\Users\Danny\Desktop\Versuch1.ppt');
KRF; % öffnet Figure für Key-Abfrage

disp('Präsentation: Objekt1');

h.ActivePresentation.SlideShowSettings.Run;  % there is now a slide show running
hShow=h.SlideShowWindows.Item(1);

pause(2);
Folie=1     % (erste Folie)                                                    
hShow.View.Next; % nächste Folie
Folie=Folie+1    % -> Folie 2                                      
s=tic;          % Timer setzen
while toc(s)<=0.5 % Folie wird etwa 0,5sec gezeigt
    drawnow       % "aktualisieren der Key-Abfrage"
end
toc(s)            % zur Kontrolle: Zeit ausgeben
hShow.View.Next;  % nächste Folie  
Folie=Folie+1     % -> Folie3
s=tic;            % Timer neu setzen
while toc(s)<=2   % Folie 2sec anzeigen
    drawnow       % "aktualisieren der Key-Abfrage"
end
%
% die Schritte beliebig oft wiederholen
%
pause(2)

hShow.View.Exit;   % Präsentation beenden
h.ActivePresentation.Close;   % Präsentation schließen
h.Quit; % Powerpoint schließen
delete(h);  % Actxserver schließen
close % Figure für Key-Abfrage schließen

diary off

 


Und hier noch die KeyReleaseFcn (siehe Matlab-Hilfe)

Code:

function KRF
   figure('KeyReleaseFcn',@krf2)
      function krf2(src,evnt)
         out = sprintf('Key: %s\n',evnt.Key);
         disp(out)
      end
 
end
 


Es ist natürlich etwas umständlich das so für jede Folie zu machen, aber ich habe da meine Ansprüche etwas herunter geschraubt.

PS: Ich änder den Status mal auf "beantwortet", aber ich wäre natürlich sehr an anderen Lösungsvorschlägen interessiert.

In diesem Sinne,
VG
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.