Forum | | | | 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 |
| | | | |
| | 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
|
| | | | |
| | 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.
|
| | | | |
| | 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 |
| | | | |
| | 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. |
| | | | |
| | 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 |
| | | | |
| | 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. |
| | | | |
| | 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. |
| | | | |
| | 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. |
| | | | |
| | 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
|
| | | | |
|
AntwortenThemenoptionen | 9.950 Betrachtungen |
ThemeninformationenDieses Thema hat 4 Teilnehmer: |