Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 07.06.2012, 18:16 Titel: Probleme mit meiner GUI |
|
|
Hey
Erinnert sich noch jemand an die GUI, an der ich ab und an mal arbeite? Ich habe ein Problem damit. Ich habe 3 Fenster erstellt, wenn ich nun das erste schließe, dann lassen sich Fenster 2 und 3 nicht mehr anklicken oder schließen. Schließe ich Fenster 2, lässt sich nur noch Fenster 1, aber nicht Fenster 3 schließen oder bewegen. Ich habe den Code mal hochgeladen:
http://www.file-upload.net/download-4424542/WIZGUI3.zip.html
Die Fenster werden über ein Z-Array sortiert. Das ist der Code, mit dem die Fenster bewegt werden können:
Code: | For i As Integer=1 To anz_win
If (mx>win(winZ(i)).x And mx<win(winZ(i)).x+20) And (my>win(winZ(i)).y And my<+win(winZ(i)).y+20) And mb=1 And move_win=0 Then
win(winZ(i)).typ=0 'Fenster schließen
End If
Next
If mb = 1 And mba = 0 Then'wenn maus down dann schauen welches fenster angecklickt wurde
For i As Integer= anz_win To 1 Step -1
If (mx>win(winZ(i)).x And mx<win(winZ(i)).w+win(winZ(i)).x) And (my>win(winZ(i)).y And my<win(winZ(i)).h+win(winZ(i)).y) Then
If i < anz_win Then 'ist ganz sinvoll, um nicht jedes mal die liste zu durchlaufen, wenn das fenster sowieso schon am ende is.
WindowToTop (i)
End If
If my<24+win(winZ(anz_win)).y Then 'Klickt man auf die Fensterleiste?
'wen dem so ist, dann:
'fenster bewegen
move_win = winZ(anz_win)
End If
Exit For 'exit danach
End If
Next
End If
'wenn move gesetzt, dann move es
If move_win <> 0 Then
'Fenster bewegen
win(move_win).x += mx - mxa
win(move_win).y += my - mya |
Hoffe mir kann jemand helfen.  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.06.2012, 20:28 Titel: |
|
|
Wird das Fenster beim Schließen ordentlich zerstört? Wenn ich den Codeausschnitt richtig interpretiere, setzt du zum Schließen einfach den Fenstertyp auf 0. Das würde bedeuten, dass ein Fenster mit Typ 0 einfach komplett ignoriert werden muss, also etwa mit
Code: | For i As Integer=1 To anz_win
If win(winZ(i)).typ=0 Then Continue For
' sonst weitere Überprüfungen wie im Codeausschnitt angegeben |
Ich vermute, dass du nach Schließen des ersten Fensters zwar noch das dritte ansprechen kannst, aber die FOR-Schleife bis zum ersten Fenster durchreicht und es ToTop setzt. Damit ist das dritte Fenster wieder abgewählt. Du musst bei jeder Fensteraktion prüfen, ob das gerade geprüfte Fenster überhaupt geöffnet ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 07.06.2012, 21:08 Titel: |
|
|
Selbst wenn ich in jede For-Schleife eine Prüfung einbaue, ob das Fenster überhaupt geöffnet ist, ändert das leider nichts.  |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 07.06.2012, 21:24 Titel: |
|
|
richtig nemored, das Fenster ist noch da, nur nicht sichtbar.
Und wenn scheinbar in einem anderen Fenster nichts passiert
ist in Wirklichkeit das unsichtbare Fenster vorn
Mutton
PS:
Ordne mal diene Fenster so an, hole Fenster 2 nach vorn und lösche es
In dem Bereich wo Fenster 2 war reagiert keines der beiden anderen.
erst wenn man weiter weg klickt |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.06.2012, 21:32 Titel: |
|
|
Vielleicht ist es besser, wenn du sicherheitshalber beim Schließen noch die Fensterkoordinaten sowie Breite und Höhe auf 0 setzt, damit es keine Konflikte gibt - denn irgendwo hast du noch etwas vergessen, muss ja nicht unbedingt eine For-Schleife sein. Falls du ein geschlossenes Fenster später wieder öffnen willst, musst du halt die Koordinaten wieder zurücksetzen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 07.06.2012, 21:59 Titel: |
|
|
Das funktioniert schon besser, danke.
Habe aber noch ein anderes Problem, wenn ich das zweite Fenster schließe und danach mit den anderen beiden rumspiele, passiert das hier:
http://img7.imagebanana.com/img/qe21zqag/Arbeitsflaeche1_183.png
Sieht ein wenig hässlich aus.
Das Stück Code, was dafür verantwortlich sein könnte, ist dieses hier:
Code: | Sub DrawWindowForGadgets(id As Integer)
If id=anz_win Then 'welches Fenster?
'aktives Fenster malen
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img,Trans
Color &hFFFFFF
'Fenstertitel schreiben
Draw String (win(winZ(id)).x+(win(id).w/2-Len(win(id).title)*4),win(winZ(id)).y+4),win(winZ(id)).title
Else
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img2,Trans
Color &h000000
Draw String (win(winZ(id)).x+(win(id).w/2-Len(win(id).title)*4),win(winZ(id)).y+4),win(winZ(id)).title
End If
End Sub |
Es prüft, welches Fenster gemalt werden soll(aktives oder inaktives Fenster) und malt dann dieses. Außerdem wird der Titel in das Fenster geschrieben wird. |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 07.06.2012, 22:51 Titel: |
|
|
Hmm, für was steht anz_win? Wahrscheinlich ja für die Gesamtzahl der Fenster; aber in der oben geposteten Sub scheint es das aktuelle Fenster zu sein ... entweder verstehe ich was falsch, oder da geht was durcheinander. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 07.06.2012, 22:57 Titel: |
|
|
Hm, stimmt. Aber wenn ich das aktive Fenster nehme, dann wird ein anderes Fenster als aktives gewählt und nicht das, was ich ausgewählt habe. Dann ist nicht das Fenster aktiv, welches gerade im Vordergrund ist:
Code: | Sub DrawWindowForGadgets(id As Integer)
If id=active_window Then
Put (win(winZ(id)).x,win(winZ(id)).y),win(winZ(id)).img,Trans
Color &hFFFFFF
Draw String (win(winZ(id)).x+(win(id).w/2-Len(win(id).title)*4),win(winZ(id)).y+4),win(winZ(id)).title |
|
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 07.06.2012, 23:35 Titel: |
|
|
Wenn ich das recht verstehe ist doch das aktive Fenster auch immer das oberste?
Dein Z-Array winZ() enthält nur die Indexnummern der Fenster, richtig?
Dann müßte doch der Index des oberstes aktiven Fensters in winZ(anz-Win) zu finden sein.
Code: |
If id=winZ(anz-Win) Then 'welches Fenster?
'aktives Fenster malen
.......
|
hier holst du mal die id über das z-Array und mal nimmst du die übergebenen id:
win(winZ(id)) oder win(id)
Code: |
Draw String (win(winZ(id)).x+(win(id).w/2-Len(win(id).title)*4),win(winZ(id)).y+4),win(winZ(id)).title
|
das können 2 verschiedene Ids sein. |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 08.06.2012, 10:13 Titel: |
|
|
Ändert leider nichts, oder ich sehe keine Änderung. Das Fenster was ich anklicke wird zwar nach vorne geholt, aber es hat weiterhin eine graue Titelleiste.  |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 08.06.2012, 16:32 Titel: |
|
|
Bist du sicher, dass da nicht irgendwo im Code anschließend noch eines der geschlossenen Fenster nach oben geholt wird und damit zum aktiven Fenster wird?
edit: zu deinem "hässlich gesetzten Fenstertitel" (Post vom 07.06. um 21:59)
Codezeie 7
Draw String (win(winZ(id)).x+(win(id).w/2-Len(win(id).title)*4),win(winZ(id)).y+4),win(winZ(id)).title
das rote sollten wohl auch win(winZ(id)) sein (hat Muttonhead zwar schon angedeutet, aber vielleicht ist das nicht ganz klar geworden). _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 08.06.2012, 23:52 Titel: |
|
|
(hier gehört der Beitrag hin)
ich hab mal ein wenig herumgespielt in der GUI.bi und WINDOW.bi
Zu finden sin die veränderten Dateien im NoPaste Bereich des Portals.
ein gelöschtes Fenster wird vom Typ nicht nur auf 0 gesetzt, sondern im ZPuffer nach hinten gelegt(es gibt eine WindowToBottom Sub)
desweiteren kann ein Fenster nur dann nach vorn geholt werden, wenn sein Typ>0 ist. Bisher konnte auch ein unsichbares Fenster oben auf dem Stapel liegen, was die scheinbare Unbedienbarkeit der sichtbaren Fenster erklären würde
Mutton
ps : noch ein Fehlerteufel: Zeile 78 in der WINDOW.bi bitte einfach löschen  |
|
Nach oben |
|
 |
Westbeam

Anmeldungsdatum: 22.12.2009 Beiträge: 760
|
Verfasst am: 09.06.2012, 09:43 Titel: |
|
|
Wow, danke.
Jetzt funktioniert es |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 09.06.2012, 10:20 Titel: |
|
|
naja... hab beim Probieren aber noch nen Fehler entdeckt.
Hab den Screen mal mit 5 Fenstern vollgepackt alle hübsch verteilt und alle bis aufs letzte gelöscht: die MOVE-Routine funktioniert beim Halten auch wenn ich garnicht in der Kopfzeile und außerhalb bin.
Da mußt du nochmal ran  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 09.06.2012, 13:58 Titel: |
|
|
Code: | If mb = 1 And mba = 0 |
solltest du klammern
Code: | If (mb = 1) And (mba = 0) |
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|