Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Probleme mit meiner GUI

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 07.06.2012, 18:16    Titel: Probleme mit meiner GUI Antworten mit Zitat

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. lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.06.2012, 20:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 07.06.2012, 21:08    Titel: Antworten mit Zitat

Selbst wenn ich in jede For-Schleife eine Prüfung einbaue, ob das Fenster überhaupt geöffnet ist, ändert das leider nichts. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 07.06.2012, 21:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.06.2012, 21:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 07.06.2012, 21:59    Titel: Antworten mit Zitat

Das funktioniert schon besser, danke. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 07.06.2012, 22:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 07.06.2012, 22:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 07.06.2012, 23:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 08.06.2012, 10:13    Titel: Antworten mit Zitat

Ä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. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 08.06.2012, 16:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 08.06.2012, 23:52    Titel: Antworten mit Zitat

(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 mit den Augen rollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Westbeam



Anmeldungsdatum: 22.12.2009
Beiträge: 760

BeitragVerfasst am: 09.06.2012, 09:43    Titel: Antworten mit Zitat

Wow, danke. lächeln
Jetzt funktioniert es
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 09.06.2012, 10:20    Titel: Antworten mit Zitat

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. neutral
Da mußt du nochmal ran zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 09.06.2012, 13:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz