[C# 1.1] checken of er nog forms open staan

Pagina: 1
Acties:

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Ik ben bezig met een winforms applicatie waarin verschillende forms tegelijk kunnen worden geopend.
In deze forms worden berekeningen uitgevoerd, en de wijzigingen gaan verloren als de gehele applicatie gesloten wordt.
Dus nu wil ik de gebruiker graag een waarschuwing geven als er nog forms open staan, en er dus eventueel wijzigingen verloren gaan.
De losse forms worden zichtbaar gemaakt met .Show( ). ShowDialog( ) werkt niet, omdat dan de forms niet tegelijk zichtbaar zijn.

Ik weet niet hoe ik kan controleren of er meerdere forms actief zijn (zonder het exacte type te weten)
Ik wil dus niet voor elk form een handler bij gaan houden, en kijken of deze null is.

ps1: zou het een oplossing zijn om de losse forms als mdiChilds te openen, zodat ik ze daarna nog kan benaderen?
ps2: het is natuurlijk netter om per scherm bij te houden of er uberhaupt wijzigingen zijn, en daar op te reageren, maar dat is momenteel te veel werk.

  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21-02 17:46
Je kan al je schermen laten overerven van een BaseForm. Daarin kan je in een static vaiabele bijhouden hoeveel formts er open staan. Dit kan je doen door in de constructor i++ te doen. En de Closed event op te vangen en dan i-- te doen.

Dit werkt als je slechts één instantie van die applicatie open hebt. Heb je meerdere instanties (meerdere keren de .exe geopend), Zou ik het niet weten. Maar je kan wel afdwingen om slechts één instantie te openen. En wanneer de user een extra instantie opent, een nieuwe form openen in een bestaande instantie en de nieuwe instantie terug sluiten. (Heb ik hier onlangs nog gepost)

  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
De Main form heeft een OnClose event, die gevuurd wordt wanneer het form sluit.
In dit event kijk je of er nog forms open zijn, door te kijken of de instanties van de forms null zijn. Zonee, dan kun je een Cancel uitvoeren in de close-event.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
Vedett. schreef op dinsdag 11 april 2006 @ 20:45:
Je kan al je schermen laten overerven van een BaseForm. Daarin kan je in een static vaiabele bijhouden hoeveel formts er open staan. Dit kan je doen door in de constructor i++ te doen. En de Closed event op te vangen en dan i-- te doen.

Dit werkt als je slechts één instantie van die applicatie open hebt. Heb je meerdere instanties (meerdere keren de .exe geopend), Zou ik het niet weten. Maar je kan wel afdwingen om slechts één instantie te openen. En wanneer de user een extra instantie opent, een nieuwe form openen in een bestaande instantie en de nieuwe instantie terug sluiten. (Heb ik hier onlangs nog gepost)
Dat is weer een stukje eenvoudiger inderdaad. Alleen dan moet ik nog steeds in alle forms code zetten. Dat wil ik eigenlijk vermijden. Ik had eigenlijk gehoopt dat ik door een of ander loopje kon lopen met active forms erin ;)
Mastermind schreef op dinsdag 11 april 2006 @ 23:39:
De Main form heeft een OnClose event, die gevuurd wordt wanneer het form sluit.
In dit event kijk je of er nog forms open zijn, door te kijken of de instanties van de forms null zijn. Zonee, dan kun je een Cancel uitvoeren in de close-event.
Eerst even goed de post lezen....

[ Voor 10% gewijzigd door CaptBiele op 12-04-2006 09:13 ]


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 14-02 12:54
Je verhaal is een beetje onduidelijk, maar ik maak eruit opdat als het main-form gesloten wordt en er nog childs openstaan je een waarschuwing wilt geven en als deze genegeerd wordt ook alle childs gesloten worden. Klopt?

Dit kan je dan toch prima met een for-loopje doen in je main-form, als je tenminste alle childs in een array oid hebt staan. Of gewoon met een if-constructie als je een fixed aantal childs hebt die allemaal een eigen variabele in het main-form hebben.

Wat Mastermind dus ook zegt.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Vedett.
  • Registratie: November 2005
  • Laatst online: 21-02 17:46
CaptBiele schreef op woensdag 12 april 2006 @ 09:11:
[...]

Dat is weer een stukje eenvoudiger inderdaad. Alleen dan moet ik nog steeds in alle forms code zetten. Dat wil ik eigenlijk vermijden. Ik had eigenlijk gehoopt dat ik door een of ander loopje kon lopen met active forms erin ;)
....
Hoezo??

Je schrijft je code toch maar 1 maal in je main form. Vervolgens erf je elke form over en klaar.

dus
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OpenFormsCountBase{
    
    private static int nbrOfOpenForms;
    public OpenFormsCountBase(){
         nbrOfOpenForms ++;
    }

    private void OnClosingEventHierOpvangen(){
        if(nbrOfOpenForms > 1){
            msgbox("U heeft nog een aantal forms open staan. Weet u zeker dat u wilt sluiten?");
        }
    }

    private void OnClosedEventHierOpvangen(){
       nbrOfOpenForms --;
    }
}



public class FormA : OpenFormsCountBase{}
public class FormB : OpenFormsCountBase{}

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

De MDI-parent heeft een collectie MdiChildren, die moet je hebben.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 17-01 10:57
CaptBiele schreef op woensdag 12 april 2006 @ 09:11:

Eerst even goed de post lezen....
Hoezo, wees dan duidelijker, of schrijf code waarbij dat wel zo kan.

  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
riezebosch schreef op woensdag 12 april 2006 @ 10:17:
Je verhaal is een beetje onduidelijk, maar ik maak eruit opdat als het main-form gesloten wordt en er nog childs openstaan je een waarschuwing wilt geven en als deze genegeerd wordt ook alle childs gesloten worden. Klopt?

Dit kan je dan toch prima met een for-loopje doen in je main-form, als je tenminste alle childs in een array oid hebt staan. Of gewoon met een if-constructie als je een fixed aantal childs hebt die allemaal een eigen variabele in het main-form hebben.

Wat Mastermind dus ook zegt.
Klopt precies wat je zegt. Ik was alleen benieuwd of er dus nog een mooiere oplossing was.
Ja, nu is het helemaal duidelijk. Ik had nog even niet aan het erven van BaseForm gedacht. Ik was iets te snel....
kenneth schreef op woensdag 12 april 2006 @ 11:12:
De MDI-parent heeft een collectie MdiChildren, die moet je hebben.
Zie ps1. Het zijn nu nog losse forms...

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik zie hier enkele ideetjes die niet echt mooi zijn imo:

statische variabelen om zoiets ? dat gaat terug naar de tijd van C...

Enkele mogelijke oplossingen:
1) je hoofdfrom maak je een MDI parent (das een eigenschap)
je opent elke form en zet:
C#:
1
2
f.MDIParent = this;
f.Show()

dan kun je bij de OnClose-event (zoals iemand al aanhaalde)
alle forms in MDIChildren overlopen en sluiten. (Daar vang je opnieuw de OnClose event af, die eventueel cancelt). Als 1 van de forms nog open is, stop je het afsluiten.

2) Zonder MDI voeg je de nieuwe form gewoon toe door
C#:
1
2
f.Owner = this
f.Show();

dan kun je deze uitlezen via de OwnedForms property.

3) Dit is de minst mooie oplossing van de 3 en doet me denken aan de oplosing met statische variabelen. Gebruik dit dus NIET!
Form heeft een statische property ActiveForm die het actieve venster van de applicatie toont.
Blijven sluiten tot alles weg is, of tot de Form niet gesloten is wegens annulatie.

ASSUME makes an ASS out of U and ME


  • CaptBiele
  • Registratie: Juni 2002
  • Laatst online: 27-08-2021

CaptBiele

No Worries!

Topicstarter
HIGHGuY schreef op woensdag 12 april 2006 @ 17:22:
2) Zonder MDI voeg je de nieuwe form gewoon toe door
C#:
1
2
f.Owner = this
f.Show();

dan kun je deze uitlezen via de OwnedForms property.
Kijk, deze zocht ik! Dat vind ik een mooie oplossing die ik nu kan toepassen. _/-\o_
En tnx voor de uitleg over de methodes die ik niet moet toepassen ;)
Pagina: 1