Probleme mit dem Fokus bei CRT-Fenstern

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Bitmusterschuster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 42
Registriert: Do, 12. Feb 2009 11:30
Danksagung erhalten: 2 Mal

Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von Bitmusterschuster »

Aller Anfang ist schwer.

Ich habe mein Programm auf GUI umgestellt und 2 CRT-Fenster in der APPSYS erstellt.
Das Main CRT (oCrtMain) erledigt die 'normale' Arbeit, während ich im 2.CRT (oCrtCover) Fenster die Produktbilder (JPG-Dateien) anzeigen lasse.
Immer, wenn der Satzpointer in der Artikeldatei geändert wird, lade ich das Produktbild in ein XbPBitmap-Objekt und platziere es im Presentation-Space des CRT.
Klappt wunderbar.

Nun wollte ich es ermöglich, das der User mit Drag&Drop eine JPG-Datei im Bereich des Produktbildes fallen lassen kann und damit dem Produkt ein neues Produktbild zuweisen.
Ich habe das mit der DropZone auch hinbekommen, jedoch verliert dann mein Main-Crt Fenster regelmäßig den Fokus. Der bleibt nämlich im Windows-Fenster stehen, aus dem ich die JPG-Datei kopiert habe.
Meine beiden CRT-Fenster sind nach dem Drop nicht aktiv.
Im DragDrop Codeblock habe ich aber versucht den Fokus auf mein Main CRT-Fenster zu setzen, leider ohne Erfolg.
Wo liegt das Problem ?

Code: Alles auswählen

  FUNCTION HandleDragDrop( aState,oData )

   LOCAL aRet := oData:GetData( XBPCLPBRD_FILELIST )
	 Local cShortFilename, cLongFilename, cData
	 Local cAnr := alltrim(oCrtCover:title)

	 if aRet <> NIL .and. len(aRet) >= 1
	 	 do case
		   case upper(afteratnum(".",aRet[1])) <> "JPG"
				 Fehler("Sie k”nnen nur Bilddateien mit der Endung 'JPG' zuweisen.",5)
			 case val(cAnr) <= 0
		 	   Fehler("Die Artikelnummer ist unzul„ssig !",5)
		   otherwise
         SetAppFocus( oCrtMain )
				 oCrtMain:Show()
				 oCrtMain:SetFrameState(XBPDLG_FRAMESTAT_NORMALIZED)
		   	 cLongFilename := aRet[1]
		     cShortFilename := afteratnum("\",cLongFilename)
		     if jn("Datei: "+cShortFilename+" als neues Cover zuweisen",12)
			     cData := FileStr(cLongFilename)
			     StrFile(cData,cpUncCover+alltrim(cAnr)+".jpg")
			     fehler("Die Datei wurde erfolgreich kopiert !",2)
  	     endif
	   endcase
	 endif
	 //SetAppFocus(oCrtMain)

	 RETURN(XBP_DROPMODE_COPY)

Vielen Dank für Eure Mühe ....

Rudi
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von brandelh »

hast du nach der Erzeugung auch SetAppWindow( oCrtMain ) aufgerufen (dieses wird häufig von anderen Fenstern als Ziel benutzt) ?

Ansonsten ist SetAppFocus(oCrtMain) sicher nicht verkehrt, eventuell nach oCrtMain:show() oder :toFront() ...
Gruß
Hubert
Bitmusterschuster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 42
Registriert: Do, 12. Feb 2009 11:30
Danksagung erhalten: 2 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von Bitmusterschuster »

Hallo Hubert,

danke für deine schnelle Antwort.
Ja das habe ich natürlich alles gemacht. Es funktioniert auch alles einwandfrei, nur geht er nach dem Drop nicht auf das oMainCrt-Fenster, sondern bleibt im Dateidialog von Windows stehen.
Meine beiden CRT-Fenster sind auch nicht aktiv. Wenn ich dann mit der Maus das Main-Fenster markiere, kann ich normal arbeiten.


Gruß Rudi
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von brandelh »

Probleme mit dem Focus kann man nicht debuggen, da ja jeder Schritt im Debugger sofort den Focus wegsetzt.

eröffne im MAIN eine Protokolldatei und schreibe an markanten Stellen eine Nachricht rein, so kannst du sehen warum er die SetAppFocus() nicht wie gewünscht abarbeitet.
Wenn dein Programm schon eine Alternate Datei nutzt, muss man das berücksichtigen, ansonsten geht es einfach. Etwa so:

Code: Alles auswählen

prog main
   set alternate to protokoll.txt
   set alternate on 
   set console off // du nutzt doch @ SAY oder ?
   ...

an kritischen Stellen ...
 
   ? date(),time(),"Ich bin hier, Variablen : ", ....

falls du die Konsole brauchst, kann man das auch in eine Funktion auslagern ...

   PrintProtokoll("Ich bin hier, Variablen: "+var2Char(...)...)

function PrintProtokoll(cTxt)
   set console off // eventuell auch mit set(_SET_CONSOLE) ermitteln, alten Wert merken und diesen am Ende wieder einstellen.
   ? date(),time(),cTxt
   set console on 
return nil
Es könnte z.B. sein, dass die Verarbeitungsroutine zu schnell zu setAppFocus() kommt, eventuell musst du hier ein sleep(x) einbauen ...
Gruß
Hubert
Bitmusterschuster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 42
Registriert: Do, 12. Feb 2009 11:30
Danksagung erhalten: 2 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von Bitmusterschuster »

Hallo Hubert,

ich habe im Forum den Code für die Funktion: DlgToFront gefunden und wollte sie ausprobieren, weil ich glaube, das das die Lösung ist.
Leider kann ich die Funktionen BringWindowToTop und SetForegroundWindow im Forum nicht finden.

Code: Alles auswählen

FUNCTION DlgToFront(oDlg)
LOCAL nDlgHandle:=oDlg:GetHwnd()
BringWindowToTop( nDlgHandle )
SetForegroundWindow( nDlgHandle )
RETURN NIL
Wenn ich den Code :

DLLFUNCTION BringWindowToTop( nHwnd ) USING STDCALL FROM USER32.DLL
DLLFUNCTION SetForegroundWindow( nHwnd ) USING STDCALL FROM USER32.DLL

in meinen Quellcode einbaue, bringt der Compiler einen Syntax Error ..
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von georg »

Hallo,


es handelt sich um Windows interne Funktionen. Wahrscheinlich reklamiert der Compiler die DLLFUNCTION. In diesem Fall solltest Du

Code: Alles auswählen

#include "dll.ch"
in Deinen Code aufnehmen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Bitmusterschuster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 42
Registriert: Do, 12. Feb 2009 11:30
Danksagung erhalten: 2 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von Bitmusterschuster »

Hallo Georg,

wer es nicht im Kopf hat .....

Super vielen Dank, das wars natürlich.
Meine Funktion macht auch genau das, was sie soll. Das Main-Crt Fenster wird nach dem Drop-Event sauber fokussiert.
Vielen Dank an alle die mitgeholfen haben.

Gruß Rudi
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von brandelh »

die Windows-API sollte eigentlich nicht nötig sein, die Methoden gibt es bei XbpCrt() auch:

:toBack() --> lSuccess

XbpCrt-Fenster in den Hintergrund bringen

:toFront() --> lSuccess

XbpCrt-Fenster in den Vordergrund bringen
Gruß
Hubert
Bitmusterschuster
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 42
Registriert: Do, 12. Feb 2009 11:30
Danksagung erhalten: 2 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von Bitmusterschuster »

Hallo Hubert,

das hatte ich ausprobiert, ging aber nicht.
Das Main Fenster blieb immer im Hintergrund stehen und musst mit der Maus 'gebeten' werden in den Vordergrund zu kommen.
Die harte Lösung funktionierte ....
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Probleme mit dem Fokus bei CRT-Fenstern

Beitrag von AUGE_OHR »

brandelh hat geschrieben:die Windows-API sollte eigentlich nicht nötig sein, die Methoden gibt es bei XbpCrt() auch:
ja ... aber damit wird nur die Z-Order geändert und nicht der Focus !

xbpCrt Fenster werden, wie du in deiner ersten Antwort geschrieben hast, mit SetAppWindow ( oCrt ) umgeschaltet was ja auch die API macht.
gruss by OHR
Jimmy
Antworten