Technician Geschrieben 14. März 2002 Geschrieben 14. März 2002 Hallo, mein Projekt verwendet eine Form, die sich konstant im Hintergrund befinden soll (nicht nur als unterstes Fenster im Programm, sondern als allerunterstes Fenster, also permanent auf dem Desktop). ZOrder hilft hier also nicht, es muss die user32 bemüht werden. ‘CODE DER FORM1 Private Declare Function SetWindowPos Lib "user32" _ (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal y As Long, ByVal cx As Long, _ ByVal cy As Long, ByVal wFlags As Long) As Long Sub AlwaysOnTop(F As Form, OnTop As Boolean) 'OnTop = True: Fenster immer im Vordergrund 'OnTop = False: Fenster immer im Hintergrund Dim Switch As Integer If OnTop Then Switch = -1 'im Vordergrund Else Switch = 1 'im hintergrund '-2 'nicht im Vordergrund End If Call SetWindowPos(F.hwnd, Switch, 0, 0, 0, 0, &H53) End Sub Private Sub Command1_Click() Form2.Show End Sub Private Sub Form_Load() Call AlwaysOnTop(Form1, False) End Sub Private Sub Timer1_Timer() Call AlwaysOnTop(Form1, False) End Sub Soweit, so gut. Meine Form liegt also direkt auf dem Desktop. Wird jetzt allerdings über Command1 die Form2 aufgerufen, die sich „ganz normal“ verhalten soll – so passiert, was ich nicht will: Form2 liegt plötzlich auch direkt auf dem Desktophintergrund... Wie kann ich das vermeiden????? Wenn ich die Sub AlwaysOnTop allerdings mit dem Parameter TRUE aufrufe (also, so dass die betreffende Form nicht auf den Desktop gelegt wird, sondern genau das Gegenteil passieren soll – die Form in den Vordergrund setzen wie z.B. eine Messa-gebox) so bleiben andere Forms – wie gewünscht – unbeeinflusst. Wenn ich nicht irgendeine Möglichkeit finde, nur die Form1 in den Hintergund zu set-zen, dann kann ich mein Programm so gut wie vergessen... Ich hab gestern schon den ganzen Abend auf meinen Compi eingeschimpft Ich erbitte gnädigst ein bisschen Hilfe Technician Zitieren
TAZttDevil Geschrieben 14. März 2002 Geschrieben 14. März 2002 Hihö... ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben... is so das erst, was ich probieren würde... Gruß Taz... Zitieren
Technician Geschrieben 14. März 2002 Autor Geschrieben 14. März 2002 Original geschrieben von TAZttDevil Hihö... ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben... is so das erst, was ich probieren würde... Gruß Taz... Hi Taz, probier ich bei Gelegenheit dann natürlich aus... hab nur jetzt gerade mächtig viel zu tun - Fragenkatalog mit 96 Fragen :eek: is nich lustig Gruß, Technician Zitieren
TAZttDevil Geschrieben 14. März 2002 Geschrieben 14. März 2002 du ärmste.. na dann... man sieh sich... Zitieren
Technician Geschrieben 15. März 2002 Autor Geschrieben 15. März 2002 Original geschrieben von TAZttDevil Hihö... ähm.. hast du mal probiert in das OnShowEreignis von Form2 dessen Position auszulesen und diese gegebnefalls korrigiert?? Wenn du in das genannte Ereignis die Eigenschaften für Form2 neu setzt, werden die von form1 vererbten überschrieben... is so das erst, was ich probieren würde... Gruß Taz... Hi Taz! Sooo, hab jetzt gerad mal Zeit gehabt, mir das anzuschauen... "vererbt" - wie meinst du das ??? :confused: Meinst du vielleicht Delphi oder eine andere Programmiersprache??? Ich schreib das Proggie unter VB6.0 - sorry, hab ich wohl oben vergessen hinzuschreiben... Auch wenn ich der Form2 beim Laden zuweise, sie soll sich ganz im Vordergrund befinden - mittels "Call AlwaysOnTop(Form1, False)" - wird sie mit in den Hintergrund "mitgezogen". Hoffe, du kannst mir da irgendwie weiterhelfen. Gruß, Technician Zitieren
Peregrin Geschrieben 15. März 2002 Geschrieben 15. März 2002 hilft dir eine mdi-anwendung weiter? ein mdi-fenster wäre eines, welches seine abhaengigen fenster 'kontrolliert' und selber immer im hintergrund liegt. hab vor einiger zeit mal was damit programmiert (ebenfalls vb) und könnte, wenn es das ist was du suchst, mich da noch mal etwas schlauer machen... viel spass noch :-) Zitieren
Technician Geschrieben 18. März 2002 Autor Geschrieben 18. März 2002 Original geschrieben von Peregrin hilft dir eine mdi-anwendung weiter? ein mdi-fenster wäre eines, welches seine abhaengigen fenster 'kontrolliert' und selber immer im hintergrund liegt. ich hab schon öfter mit mdi-Anwendungen programmiert. hilft mir leider nicht weiter... denn: es geht hier nicht um "in den Hintergrund" in Bezug auf "innerhalb der Anwendung" (zOrder), sondern: um absolut in den Hintergrund. Wie beim Desktop. Die Form soll nicht in den Vordergrund geholt werden können, aber dennoch auf Eingaben reagieren können. Und es soll eben nur EINE Form in den Hintergrund gestellt werden; die anderen sollen sich "normal" verhalten. hoffe, ihr könnt mir da weiterhelfen! Gruß, Technician Zitieren
TAZttDevil Geschrieben 19. März 2002 Geschrieben 19. März 2002 Hi... das mit dem veerben meinte ich so, wie das mit dem vererben nun mal ist *gggg*... das hat ja in erster Linie nichts mit der Programmiersprache sondern mit OOP (Objekt-Orientierter-Programmierung)... In diesem Falle meinte ich, dass das erste Hauptfenster seine Eigenschaften (Einstellungen) an seine anderen Fenster weitergibt (vererbt). Den Effekt seihst du ja bei deinem Proggi... Wenn das allerdings immer noch nicht funktioniert obwohl du die Anordnung in der OnShow, OnCreate, oder OnActivate Routine geschrieben hast, weiss ich auch nicht mehr.... Doch eigentlich schon, aber eine ziemlich unschöne (genauer gesagt ******-Lösung (entschuldigt meine Ausdrucksweise))... In dem du auf deinem Hauptfenster noch einen Timer packst, den du aktivierst, nachdem dein 2. Formular erzeugt (oder angezeigt) wird. In die Timer Routine schriebst du die Position von Form2 und richtest sie neu aus... Dann deaktivierst du den Timer wieder... mit den Zeiten des Timers mußt du expermimentieren.. Das Verhalten ist dann von System zu System unterschiedlich... Auch verbrennst du damit eine Menge Resourcen und Tralala... Aber wenn dir das so reicht, kannst du das ja so machen.. ich versteh nur nicht, warum das andere nicht funzt... In welchen Routine hast du den kram denn genau reingeschrieben?? Viel Glück, Gruß, Taz.... Zitieren
Technician Geschrieben 19. März 2002 Autor Geschrieben 19. März 2002 Hi Taz! Original geschrieben von TAZttDevil Hi... das mit dem veerben meinte ich so, wie das mit dem vererben nun mal ist *gggg*... das hat ja in erster Linie nichts mit der Programmiersprache sondern mit OOP (Objekt-Orientierter-Programmierung)... In diesem Falle meinte ich, dass das erste Hauptfenster seine Eigenschaften (Einstellungen) an seine anderen Fenster weitergibt (vererbt). In meinem Programm arbeite ich aber nicht mit OOP... soll heißen, die Form die in den Vordergrund soll erbt in keinster Weise von der Hintergrundform (umgekehrt auch nicht). Original geschrieben von TAZttDevil In dem du auf deinem Hauptfenster noch einen Timer packst, den du aktivierst, nachdem dein 2. Formular erzeugt (oder angezeigt) wird. In die Timer Routine schriebst du die Position von Form2 und richtest sie neu aus... Dann deaktivierst du den Timer wieder... mit den Zeiten des Timers mußt du expermimentieren.. Das Verhalten ist dann von System zu System unterschiedlich... Auch verbrennst du damit eine Menge Resourcen und Tralala... hab ich natürlich schon ausprobiert. Aber sobald eine Form mal in den Hintergrund gesetzt wurde (das wird die zweite Form ja leider zwangsweise, wenn ich die erste in den Hintergrund setze), so lässt sie sich (auch mittels der OnTop-Methode die ich geschrieben habe) um nichts in der Welt mehr in den Vordergrund bringen. Mit Timern müsste ich nämlich sowieso arbeiten, da die in den Hintergrund gesetzte Form beim Anklicken wieder in den Vordergrund wandert. Ich hab zuerst gedacht, es läge an dem In-den-Hintergrund-setz-Timer, der andauernd die Methode für OnDesktop aufruft und hab dann auch den Timer ausgeschaltet. Aber trotzdem: wenn ich will dass die Form wieder per Methode "normal" wird - geht nix... Original geschrieben von TAZttDevil Aber wenn dir das so reicht, kannst du das ja so machen.. ich versteh nur nicht, warum das andere nicht funzt... In welchen Routine hast du den kram denn genau reingeschrieben?? Viel Glück, Gruß, Taz.... Der von mit gepostete Code ist eigentlich die ganze (vereinfachte) Fenster-Handling-Angelegenheit. Das ist das minimalste für die Funktion und dann taucht der Fehler bereits auf. Die Form1, welche in den Hintergrund soll, hat den von mir geposteten Code. Form2 ist egal... Gruß, Technician Zitieren
TAZttDevil Geschrieben 19. März 2002 Geschrieben 19. März 2002 Hmm.. also dein Quelltext sieht bündig und einfach aus.. ich sehe darin auch keinen Fehler... Mal was anderes.. wie kann man denn VB ohne OOP porgrammieren?? deine Formulare sind Objekte, du setzt Ereignisse ein... das alles sind doch schon Teile von OOP... Und, kann man in VB einstellen, ob ein Formular neu erstellt oder abgeleitet wird?? Ich selber programmier überwiegend in C und Delphi (also kein VB), deshlab bin ich mir nicht so sicher... Ähm... erstellst du das Formular2 eigentlich beim Programmstart oder erst hinterher (wenn man es braucht)?? Weil du rufst, das Form ja mit Show auf... Hast du mal probiert, das Form erst an der Stelle des ersten Aufrufs zu erstellen?? ansonsten fällt mir auch nichts mehr ein.. sorry... Taz... Zitieren
Technician Geschrieben 19. März 2002 Autor Geschrieben 19. März 2002 Original geschrieben von TAZttDevil Hmm.. also dein Quelltext sieht bündig und einfach aus.. ich sehe darin auch keinen Fehler... Mal was anderes.. wie kann man denn VB ohne OOP porgrammieren?? deine Formulare sind Objekte, du setzt Ereignisse ein... das alles sind doch schon Teile von OOP... Und, kann man in VB einstellen, ob ein Formular neu erstellt oder abgeleitet wird?? Ich selber programmier überwiegend in C und Delphi (also kein VB), deshlab bin ich mir nicht so sicher... VB ohne OOP... so ganz stimmt das natürlich nicht... Formulare sind natürlich Objekte, die über Methoden verfügen. Nur alles "weitergehende" der OOP muss man selber implementieren. VB6 kann sogar noch KEINE Vererbung!!! (gibt's erst ab .NET) So ein Formular erstellt man einfach über den Menübefehl "Projekt - Formular hinzufügen" im VisualBasic. Mit C++ mäßigem "new Formular()" is da nix! Original geschrieben von TAZttDevil Ähm... erstellst du das Formular2 eigentlich beim Programmstart oder erst hinterher (wenn man es braucht)?? Weil du rufst, das Form ja mit Show auf... Hast du mal probiert, das Form erst an der Stelle des ersten Aufrufs zu erstellen?? ansonsten fällt mir auch nichts mehr ein.. sorry... Taz... Mir Show wird die Form entweder angezeigt oder, wenn sie noch nicht geladen wurde, geladen. Direkt die Form an dieser Stelle zu "erstellen", ist mit VB nicht so ohne weiteres möglich. Na ja, ich probier jetzt eben noch irgendwie rum, das Proggie doch noch richtig zum Laufen zu kriegen... Technician Zitieren
TAZttDevil Geschrieben 19. März 2002 Geschrieben 19. März 2002 hmm.... ich denke, dass gibt ein paar Pluspunkte für Delphi... *gggg* Viel Glück noch... Taz... Zitieren
Technician Geschrieben 20. März 2002 Autor Geschrieben 20. März 2002 Hallo Taz, ich hab jetzt noch mal mit Timern und diversem Zeugs herumexperimentiert – hat leider alles nix gebracht Darum habe ich jetzt mal in einem speziellen VB-Forum gefragt. Hoffentlich findet sich da noch was! Trotzdem Danke für deine Hilfe dass du dich mit dem Problem beschäftigt hast, auch wenn du dich mit VB nicht so unbedingt auskennst! Technician Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.