Deutsch
Forum

Mehrere Fenster/Dialoge gleichzeitig im Fokus haben

 

holmol93
Hallo miteinander

Mal wieder eine sehr eigensinnige Frage... oO
Wie ist es möglich, in einem Programm mehrere Fenster/Dialoge gleichzeitig im Fokus zu haben um zB mit den Dialogfenstern, die im Hintergrund liegen, auch Eingaben machen zu können und nicht zuerst immer das jeweils obere schliessen zu müssen?

Beispiel wäre zB, dass man die Artikelverwaltung und ein Auftragsfenster offen hat und in beiden arbeiten kann... Also beliebig viele Fenster offen hat und alle Eingaben entgegen nehmen können...

Keine Ahnung, wie ich das genau beschreiben kann...
Habe im Anhang mal mein derzeitiges Spassprojekt angehängt, mit allen Datenbankfiles, dem Quelltext und einer vorkompilierten Exe zum Testen...
Vielleicht kann man es sich dann besser vorstellen... Momentan funktioniert immer nur das Fenster, welches im Vordergrund ist...

Testaccounts:

PW: 3333 - Benutzer mit sehr wenigen Rechten
PW: 98553 - Mein Account mit so ziemlich allen Rechten. Die kann man variabel zuteilen übers MitarbeiterMaster.

Hat noch ziemlich viele Bugs, zeigt mein Problem aber recht gut...
Gruess,
Danny

712 kB
Hochgeladen:28.07.2013
Ladeanzahl96
Herunterladen
 
28.07.2013  
 




Julian
Schmidt
Du könntest mittels WindowFromPoint das Handel unter der Maus ermitteln. Und alle Tasteneingaben an das Fenster weiterleiten.

Hier ein ganz primitives Beispiel.
Def @GetParent(1) !"User32","GetParent"
CLS
Declare hhdl&
Create("Button",%hwnd,"test",10,10,200,30)

While 1

    WaitScan
    hhdl&=HandleHover()

    If (GetParent(hhdl&)=%hwnd) or (hhdl&=%hwnd)

        If %ScanKey=8

            Settext hhdl&,Mid$(Gettext$(hhdl&),1,Len(Gettext$(hhdl&))-1)

        Else

            Settext hhdl&,Gettext$(hhdl&)+Inkey$()

        EndIf

    Endif

EndWhile

Proc HandleHover

    Declare mpos#
    Dim mpos#,8
    External("user32","GetCursorPos",mpos#)
    Var hdl&=External("USER32","WindowFromPoint",long(mpos#,0),long(mpos#,4))
    Dispose mpos#
    Return hdl&

EndProc

 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
28.07.2013  
 




Julian
Schmidt
Hab mal deinen Quelltext angeschaut.

Mir ist aufgefallen das du in der Procedur "accessrights" 45 durchnummerierte Variablen für deine Rechterverwaltung verwendest. Leichter wäre hier die Verwendung eines Arrays.
declare right%[]'Deklaration
Clear right%[]'auf 0 setzen

whileloop 0,44

    case recht$=Str$(&loop+1) :  right%[&loop]=1'Wenn Recht vorhanden; dann gleich 1

Endwhile

'Abfrage des Rechtes dann per

If right%[NummerRecht%-1]

Endif

 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
28.07.2013  
 




holmol93
Heyhoo

Wegen deiner ersten Antwort:
Ich muss mir den Quelltext mal genau anschauen, im Moment verstehe ich da nur Bahnhof hihi
Meine Programmierkenntnisse sind doch noch recht beschränkt, vor allem wenn es um systemnahe Funktionen geht...
Muss mich mal durch das Befehlsregister durchwühlen, was jede Anweisung davon genau bewirkt

Zu der Rechtezuteilung:

Hehe, da haben wirs wieder ;) Ich wusste bis eben nicht einmal, was Arrays sind, deshalb hab ich mir so weiter geholfen, wie es mir damals in den Sinn gekommen ist
Aber ich weiss, dass einige Funktionen noch nicht gerade sinnvoll, geschweige denn performant umgesetzt sind... Bis dahin wird noch einiges Wasser über den Rhein gehen ;)

Im Moment möchte ich zuerst einmal den Mehrfensterbetrieb in den Griff bekommen... denn ohne ist die ganze Software sehr mühsam zu bedienen^^
(Damit man in der Auftragsübersicht ebenfalls eine Übersicht über alle Artikel einblenden kann, ohne alle Fenster zuerst zu schliessen, habe ich mir bis jetzt mit einem Hotkey beholfen (F1) , der einen kleinen Dialog mit allen Artikeln einblendet)

Greetz,

Danny
 
28.07.2013  
 




Julian
Schmidt
Vieleicht kannst du mal ein minimalistisches Beispiel posten.Was aufzeigt wie dein Fensterbetrieb gerade aussieht. Und anschließend beschreiben wie du dir den Mehrfensterbetrieb vorstellst.

Ich glaube hier keiner Lust einen Tausendzeilen-Code durchzusuchen.
Und mir ist auch noch nicht klar was du eig willst.
 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
28.07.2013  
 




holmol93
Ah also:

Ich beziehe mich dabei immer auf unser Access basierendes Datenbanksystem im Geschäft.
Ich kann so viele Formulare offen haben, wie ich will, sobald wie ich von einem ins andere Fenster wechsle, kann ich Eingaben machen.

Bei mir ists ja jetzt grade so:
Du willst einen Auftrag suchen. Also gehtst du zB in die Kundendaten, wählst da einen Kunden aus. Die Kundendetails öffnen sich. Von da klickst du auf einen Auftrag. Der Auftrag öffnet sich.
Jetzt haben wir 3 Fenster offen. Ich kann jedoch, ohne zuerst alle "übergeordneten" in der Reihenfolge zu schliessen, nicht einfach so etwas in der Kundenübersicht machen. Klicken geht schon, jedoch reagiert nichts, solang wie das Auftragsfenster aktiv ist.

Ich habe da schon rumprobiert mit den verschiedenen Fensterstilen, da ich gemeint habe, es liegt am Dialogfensterstil.
Aber wenn das so wäre, könnte ich ja im %HWND trotzdem Eingaben vornehmen, was jedoch auch nicht möglich ist

Gruess,
Danny
 
28.07.2013  
 




Julian
Schmidt
Ich gehe davon aus das du für jedes Fenster eine Schleife hast, in der du die für das Fenster wichtigen Bedingungen abgefragst.
Sobald das Fenster geschlossen wird, wird die Abbruchbedingung aktiv und das Programm springt in die untergeordnete Schleife des untergeordenten Fenster.
Anschließend werden ebenfalls nur die für dieses Fenster wichtige Bedingungen abgefragt.

Damit du auch alle Bedingugen aller Fenster gleichzeitig abfragen kannst, müssen alle Bedingungen natürlich auch in einer Schleife liegen. Allternativ verschiebst du alle Bedingungen in eine Funktion und rufst sie in jeder einzelnen Schleife auf.

Das Erste wäre mit Bezug auf sauberen Code die bessere Lösung.
 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
28.07.2013  
 




Thomas
Freier
Im Prinzip kann er ja x-beliebige Fenster über 28.14 - Multiprozessing mit XProfan öffnen , bearbeiten, links liegen lassen und schließen.
Bei den DBFs sollten diese dann vorsichtshalber immer nur zum Datenlesen und -speichern über @db("Open", #N,S) aktiv sein. Bin mir nicht sicher, ob es beim Multiprozessing sonst zu Problemen kommt, wenn von zwei Prozessen darauf zurückgegriffen wird.
 
Gruß Thomas
Windows XP SP2, XProfan X2
28.07.2013  
 




H.Brill
Vielleicht ist auch ein TabControl was für dich ?
Da kann man das doch schön schalten. Und man braucht
nur eine einzige Ereignis-Schleife. Man muß nur aufpassen,
welcher Button/Control in welches Fenster gehört.
Hab hier mal was vorbereitet. Bitte korrigiert mich, wenn
was falsch sein sollte :
Declare Dlg1&, Dlg2&, Dlg3&, tabctrl&, Reiter&
Declare edit1&, edit2&, edit3&, edit4&, edit5&, btn1&, btn2&, btn3&, lb&
WindowTitle "Mein Fenster"
Window 800, 600
tabctrl& = Create("TabCtrl", %HWnd, "Kunden", 5, 10, 730, 550)
' Reiter anlegen
@InsertTab(tabctrl&, 3, "Artikel")
@InsertTab(tabctrl&, 2, "Rechnungen")
WindowStyle 1024
' 1. Dialog
Dlg1&  = @Create("Window",tabctrl&,"Kunden Verwaltung",10, 60, 700, 480)
edit1& = @Create("Edit",    Dlg1&, "", 10, 10, 120, 25)
edit2& = @Create("Edit",    Dlg1&, "", 10, 40, 120, 25)
btn1&  = @Create("Button",  Dlg1&, "Kopiere", 10, 80, 60, 25)
lb&    = @Create("ListBox", Dlg1& , 1, 10, 120, 120, 180)
AddString(lb&, "Maier")
AddString(lb&, "Müller")
AddString(lb&, "Schmitt")
' 2. Dialog
Dlg2&  = @Create("Window",tabctrl&,"Artikel Verwaltung",10, 60, 700, 480)
btn2&  = @Create("Button", Dlg2&, "Test2", 10, 10, 60, 25)
edit3& = @Create("Edit",   Dlg2&, "", 10, 50, 120, 25)
edit4& = @Create("Edit",   Dlg2&, "", 10, 80, 120, 25)
' 3. Dialog
Dlg3&  = @Create("Window", tabctrl&, "Rechnungs Erstellung", 10, 60, 700, 480)
edit5& = @Create("Edit", Dlg3&, "", 10, 10, 240, 25)
btn3&  = @Create("Button", Dlg3&, "Test 3", 10, 50, 80, 25)
ShowWindow(Dlg2&, 0)
ShowWindow(Dlg3&, 0)
SetWindowPos Dlg1& = %WinLeft + 20, %WinTop + 100; 0

While 1

    WaitInput
    Reiter& = @GetActiveTab(tabctrl&)

    If @TabChanged(tabctrl&)

        'Reiter& = @GetActiveTab(tabctrl&)

        Select Reiter&

            CaseOf 0

            ShowWindow(Dlg1&, 1)
            ShowWindow(Dlg2&, 0)
            ShowWindow(Dlg3&, 0)
            SetWindowPos Dlg1& = %WinLeft + 20, %WinTop + 100; 0

            CaseOf 1

            ShowWindow(Dlg2&, 1)
            ShowWindow(Dlg1&, 0)
            ShowWindow(Dlg3&, 0)
            SetWindowPos Dlg2& = %WinLeft + 20, %WinTop + 100; 0

            CaseOf 2

            ShowWindow(Dlg3&, 1)
            ShowWindow(Dlg1&, 0)
            ShowWindow(Dlg2&, 0)
            SetWindowPos Dlg3& = %WinLeft + 20, %WinTop + 100; 0

        EndSelect

    EndIf

    Case %Key = 2 : Break

    If @Clicked(btn1&)

        'MessageBox("Button in Kunden Verwaltung geklickt !", "Info", 0)
        SetText edit5&, GetString$(lb&, GetCurSel(lb&))

    ElseIf @Clicked(btn2&)

        MessageBox("Button in Artikel Verwaltung geklickt !", "Info", 0)

    ElseIf @Clicked(btn3&)

        MessageBox("Button in Rechnungs Erstellung geklickt !", "Info", 0)

    EndIf

EndWhile

End
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
29.07.2013  
 




Julian
Schmidt
Es macht ja im Prinzip absolute keinen Unterschied ob die Controls auf einen TabControl oder einen Fenster liegen.
Das Wichtige ist, das alle Bedingungen in einer Schleife liegen. Oder per Muliprozessing gleichzeitig abgefragt werden können.

Ich denke von Handling her wären ChildWindows noch das einfachste. Kannst du dir ja mal anschauen.
 
XProfan X2
Win7 Professional, SP1, AMD FX(tm)-8350 Eight-Core Processor

˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗˗
Webseite [...] 
29.07.2013  
 




Thomas
Freier
Vielleicht trifft dieses Beispiel das Gesuchte.
 $H windows.ph
 $H messages.ph
UserMessages 16
DEF SysParameterInfo(4) ! "user32","SystemParametersInfoA"
Declare WX%,WY%,WL%,WB%
Declare item&,x%
Declare Win1&,W1Edit1&,W1Edit2&,W1Grid1&,W1End&,W1NeuSp&
Declare Win2&,W2Edit1&,W2Edit2&,W2End&
'Freier Desktopbereich
Declare Rect#
Dim Rect#,16
SysParameterInfo(48,0,Rect#,0)
wx%=Long(Rect#,0)
wy%=Long(Rect#,4)
wl%=Long(Rect#,8)
wb%=Long(Rect#,12)
Dispose Rect#
Window wx%,wy% - wl%,wb%
Windowtitle "Hauptfenster"
Cls ~Getsyscolor(15)
Setdialogfont ~Getstockobject(~Default_gui_font)
PopUp "&Daten"
AppendMenu 100,"&Kunden"
AppendMenu 200,"&Auftrag"

While 1

    Waitinput

    If %UMessage = 16

        case GetActiveWindow()=%hwnd:Break

        If GetActiveWindow()=Win1&

            DestroyWindow(Win1&)
            Win1&=0
            subclass Win1&,0
            setfocus(%hwnd)

        ElseIf GetActiveWindow()=Win2&

            DestroyWindow(Win2&)
            Win2&=0
            subclass Win2&,0
            setfocus(%hwnd)

        EndIf

    EndIf

    Case MenuItem(100) AND (Win1&=0): KUNDEN
    Case MenuItem(200) AND (Win2&=0): AUFTRAG

Endwhile

subclass Win1&,0
subclass Win2&,0
End

subClassProc

    If SubClassMessage(win1&, ~WM_NOTIFY)

        If clicked(W1End&)

            DestroyWindow(Win1&)
            Win1&=0
            subclass Win1&,0
            setfocus(%hwnd)

        ElseIf getfocus(W1NeuSp&)

            x%=Messagebox("Daten speichern?","Hinweis",32+4)
            case x%=6:AddString(W1Grid1&, Gettext$(W1Edit1&)+"|"+Gettext$(W1Edit2&))
            setfocus(W1Grid1&)

        ElseIf Long(&sLParam,8)=-3' Doppelklick links

            item&=Long(&sLParam,12)

            If item&<>-1

                If Win2&>0

                    Settext W2Edit1&, Gettext$(W1Grid1&, item&, 0)
                    Settext W2Edit2&, Gettext$(W1Grid1&, item&, 1)

                endif

            EndIf

        EndIf

    EndIf

    If SubClassMessage(win2&, ~WM_NOTIFY)

        If clicked(W2End&)

            DestroyWindow(Win2&)
            Win2&=0
            subclass Win2&,0
            setfocus(%hwnd)

        EndIf

    EndIf

EndProc

Proc KUNDEN

    Win1&=Create("Window",%hwnd,"Kunden",10,10,340,430)
    W1Grid1&=Create("GridBox", Win1&, "Name;0;180;Vorname;0;100", 1, 10, 10, 300, 190)
    AddString(W1Grid1&, "Meyer|Klaus")
    AddString(W1Grid1&, "Peter|Peter")
    AddString(W1Grid1&, "Klein|Fritz")
    Create("Tooltip",%hwnd,W1Grid1&,"in den Auftrag per Doppelklick")
    Create("Text",Win1&,"Name",10,210,80,20)
    Create("Text",Win1&,"Vorname",10,235,80,20)
    W1Edit1&=Create("EDIT",Win1&,"",100,210,120,20)
    W1Edit2&=Create("EDIT",Win1&,"",100,235,120,20)
    W1NeuSp&=Create("Button",Win1&,"Eingabe speichern",10,310,120,22)
    W1End&=Create("Button",Win1&,"Schließen",200,310,80,22)
    subclass Win1&,1

EndProc

Proc AUFTRAG

    Win2&=Create("Window",%hwnd,"Auftrag",510,10,340,430)
    W2Edit1&=Create("EDIT",Win2&,"",10,50,120,20)
    W2Edit2&=Create("EDIT",Win2&,"",10,75,120,20)
    W2End&=Create("Button",Win2&,"Schließen",200,310,80,22)
    subclass Win2&,1

EndProc

 
Gruß Thomas
Windows XP SP2, XProfan X2
31.07.2013  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

9.968 Betrachtungen

Unbenanntvor 0 min.
E.T.25.06.2023
H.Brill10.07.2018
rquindt28.01.2017
Matthias Arlt18.02.2016
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie