Openen en sluiten van vensters

Cursussen, tutorials
Plaats hier uw bijdrage.

Openen en sluiten van vensters

Berichtdoor Gordon » za jul 14, 2007 10:14 pm

Naar aanleiding van een simpele vraag op een ander forum.
Hoe sluit ik een venster gecontroleerd af.

Een venster openen gaat eenvoudig.
Open "Plaats hier de tekst voor de titelbalk" for window as #handlenaam

Hiermee verschijnt op het scherm een Windows venster in de Windows
stijl van de gebruiker van dat moment. Dit venster heeft voor Windows
een nummer en voor Liberty BASIC een naam. De naam van het venster
is #handlenaam.
Het nummer (soort naam) van dit venster (gegeven door Windows)
kun je achterhalen door N = hWnd(#handlenaam)

hWnd() is een ingebouwde functie bij Liberty BASIC waarin het Windows
nummer van een opgegeven venster (dat is dus de #handlenaam in dit
geval) wordt geplaatst.
Voortaan kun je in je programma dus Liberty BASIC commanderen om
het venster te sluiten met:
close #handlenaam

(of je kunt bij wijze van spreken Windows commanderen het venster
te sluiten met
CLOSE N ’ N zal een groot getal zijn.)

Het is gebruikelijk om direct het afvangen van het afsluitkruisje
te regelen nadat je een venster geopend hebt.
1. Vang het afsluiten van een venster keurig af met
#handlenaam "closetrap [X]"
Zodra de gebruiker nu op het afsluitkruisje drukt (of ALT+F4) dan
springt jouw programma naar het label [X]
Natuurlijk moet je nu direct eerst dit label plaatsen en afwerken,
want je kunt nu even niet testen omdat het programma
(zelfs Windows) niet kan worden afgesloten als je deze afsluitroutine
nog niet hebt geschreven.
[X]
close #handlenaam
end

2. Sommige nette programmeurs plaatsen ook direct een z.g. merkteken
aan het venster om te onthouden dat het geopend is. Dat is nodig om te
voorkomen dat een reeds gesloten venster nog door een ander venster
gesloten kan worden of om te voorkomen dat je vergeet om een
venster te sluiten. Dat zijn gewoon slordigheden.

Het hele programma:
Code: Selecteer alles
Open "Plaats hier de tekst voor de titelbalk" for window as #handlenaam
#handlenaam "closetrap [X]"
wait

[X]
close #handlenaam
end
Laatst bijgewerkt door Gordon op zo jul 15, 2007 5:22 pm, in totaal 1 keer bewerkt.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor Gordon » za jul 14, 2007 10:55 pm

Oké nu zullen wij wat uitbreidingen maken.

We willen de gebruiker nog de mogelijkheid geven om niet af te sluiten.
Daartoe plaatsen we een CONFIRM box na de label [X]

Code: Selecteer alles
[X]
        confirm "Wilt u echt afsluiten? ";yn$
          if yn$="yes" then
               close #handlenaam
               end
          else
              wait
          end if

Er zijn mensen die liever met een subroutine werken dan met een label. Die zijn modern. Hou rekening met het feit dat variabelen in een sub niet global zijn.

Dus
#handlenaam "CLOSETRAP X"
wait

SUB X handlenaam$
IF V=3 then close #handlenaam$ :V=0
END SUB

vereist dat vooraf V global gedeclareerd wordt:
GLOBAL V
V=3
Nogmaals beginners kunnen liever het oude vertrouwde [X] label systeem gebruiken.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am

Berichtdoor anthonio » zo jul 15, 2007 2:31 pm

mooie tutorial gordon.
Een van de belangrijkste zaken dat beginners wel eens durven vergeten als ze beginnen met programmeren.
Het venster correct afsluiten.

sub, modern?
Ik geef toe dat ik ook nogaltijd met Labels werk, dit varieert van tijd tot tijd.
Ik verkies gewoon labels om het simpel te houden en het oogt overzichtelijker, maar dit is mijn mening.
Dual boot: Ubuntu 8.04 - WIndows XP SP2 (via VMware) - Windows Vista 32bit - Toshiba L40 - Dual Core @ 1,76GHz - 1GB RAM - 120GB HDD - VDSL Connection
Avatar gebruiker
anthonio
 
Berichten: 281
Geregistreerd: zo mei 20, 2007 9:58 pm

Berichtdoor Gordon » zo jul 15, 2007 5:46 pm

Subs in een BUTTON-EVENT noem ik modern, omdat dat in LB 3.01
nog niet mogelijk was. Dus modern voor LB gebruikers.
Code: Selecteer alles
BUTTON #handle.ext, "label", returnVar, corner, x, y {, width, height}

staat in de handleiding van LB4. Maar waar nu returnVar staat
stond vroeger [userAccepts] als label waar het programma bij indrukken
van de knop naar toe moest springen.

Het gebruik van returnVar is sinds LB 4.01 pas mogelijk. Zo'n
jump naar een call subroutine(returnVar) heeft een groot voordeel.
Het voordeel is dat de originele Wiindows API's gebruikt werden,
waarbij een parameter inhoudend de naam (eigenlijk het nummer) van
de control geleverd wordt.

Dus bij het afvangen met een sub ontvang je van Windows
de naam van de control:

sub returnVar xxxx$
end sub

Voor LB programmeurs is een handlestring xxxx$ iets eigenaardigs.
Je moet weten dat deze parameter gegeven wordt.
Maar hierdoor weet je dat in ons voorbeeld dat xxxx$ = "handle.ext"
Oftewel, je weet welke knop gebruikt is.
Je kunt nu 1 subroutine gedeeltelijk voor al je knoppen gebruiken.

Subs hebben een groot nadeel:
Ze werken niet met globale variabelen.

Hier nog een voorbeeld
Code: Selecteer alles
'demo close with sub

open "Demo" for window as #m
#m "trapclose quit"

wait

sub quit h$
print h$
close #m
end sub



Gordon.
Avatar gebruiker
Gordon
Site Admin
 
Berichten: 684
Geregistreerd: zo mei 22, 2005 12:50 am


Keer terug naar Leren programmeren met Liberty BASIC

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers. en 1 gast

cron