Avatar billede naxosnaxos Nybegynder
26. december 2002 - 23:12 Der er 20 kommentarer og
3 løsninger

Kun oprette en instans af objekt

Hej

Er der en der kan fortælle mig hvad det hedder, når jeg kun vil have at det er muligt at oprette en instans af et objekt?? jeg skal bruge det i en MDI applikation, hvor der kun kan oprettes et child window af de typer der er
Avatar billede simon.ulsnes Nybegynder
26. december 2002 - 23:16 #1
Det kan man ikke, sorry...
Du kan godt måske lave en ny Collection som sørger for det, men så skal du override alt muligt som ikke er smart at override i Form/MDIForm-klasserne.

Det smarteste ville nok være at gennemsøge samlingen af child-windows når der laves et nyt, som så ikke bliver lavet hvis der findes en instans i forvejen.

Programmerer du i C# eller VB.NET?

// Simon
Avatar billede naxosnaxos Nybegynder
26. december 2002 - 23:16 #2
c#
Avatar billede naxosnaxos Nybegynder
26. december 2002 - 23:16 #3
det er der måske noget om, men det kunne jo være der var noget indbygget
Avatar billede mufoxe Nybegynder
26. december 2002 - 23:25 #4
lav en variabel på klassen, som er static

f.eks. static bool myVar = false

Den varibel deles på tvær af alle objekter, som instansieres af klassen. Du kan så i constructoren tjekke på om variblen er er sat til true, hvis ikke sættes den til true og klassen oprettes. Hvis den er den er true i forvejen kaldes klassesn destructor i stedet og der meldes tilbage at klassen ikke kan instansieres.
Avatar billede miknil Nybegynder
26. december 2002 - 23:26 #5
Jeg er ikke helt sikker på hvad præcis du skal bruge, men muligvis er en singleton løsningen.

En singleton indeholder en static reference til sig selv så at sige, istedet for at kalde den normale konstruktør oprettes objektet istedet ved at kalde en
statisk metode på klassen.

Et eksempel i noget så ældgammelt som c++, jeg har ikke lige en C# udgave ed hånden  :-) :

<code>
*.h
class PSingleton
{
public:
    virtual ~PSingleton();
    static PSingleton& Instance();

private:
    static     PSingleton* myOnlyInstance;
    PSingleton();

};

*.cpp

PSingleton* PSingleton::myOnlyInstance = NULL;


PSingleton::PSingleton(){}

PSingleton::~PSingleton(){}

PSingleton& PSingleton::Instance()
{
    if( !myOnlyInstance )
    {
        // Make new instance
        myOnlyInstance = new PSingleton();
    }
    return *myOnlyInstance;
}


</code>
Avatar billede naxosnaxos Nybegynder
26. december 2002 - 23:30 #6
jeg skal bare have at jeg kun kan have en mdi child form af dem der nu er, altså hvis form1 er aktiv skal der ikke kunne laves en mere af den and so on
Avatar billede naxosnaxos Nybegynder
26. december 2002 - 23:33 #7
alle child forms bliver vel samet i et array eller ligende nåde de oprettes til deres Parent, så hvis jeg kunne lave noget ligende Parent.Children.COntains[Form1]????
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 02:50 #8
Det kan du da bare...

I din mainform:
public bool ChildWindowCreated = false;

I din funktion som laver et childwindow:
if (!ChildWindowCreated)
{
  // Lav et vindue
  ChildWindowCreated = true;
}
else
{
  // Lad være med at lave et vindue (lav f.eks. en fejlmeddelelse)
}

I en funktion som kaldes når childwindow'et lukkes (lav f.eks. en event):
ChildWindowCreated = false;

// Simon
Avatar billede _just4fun_ Nybegynder
27. december 2002 - 13:55 #9
nax->
en MDIParent-Form har en metode der returnerer et array af MDI-Children:
public Form[] MdiChildren {get;}

I det kan du lede efter din form.. Men jeg mener ikke du kan bruge contains, da du i så fald skal lave en instans af den form du vil tjekke efter (og det vil du vel ikke) så du bliver vist nødt til at løbe dine parents igennem og lave en getType() og tjekke på den...
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 17:14 #10
jeg tror lige jeg prøver mig med MDIChildren metoden, den var jeg også selv ved at komme frem til. Problemet med at have en static variable i klassen f.eks. en bool og så kalde desctructoren hvis denne var true, altså der var et objekt, er at der også bliver kaldt en show() på objektet bagefter
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 17:28 #11
at gennemløbe MdiChildren er ok, men hvis jeg skal sammenligne på gettype, skla jeg jo alligevel oprette et objekt for at have noget at sammenligne med
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 17:30 #12
niks...
if (objekt.GetType() == typeof(DinMDIChildKlasse))
{
  // gæt hvad...
}

// Simon
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 18:02 #13
Jeps nogle gange skal man kode før man skriver ;o). Jeg vender tilbage med point
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 18:10 #14
I må lige deles.
jeg tror desværre ikke jeg kommer uden om at oprette et eller andet. Jeg har det således at det er muligt at oprette 3 forskellige mdichild forms fra en menu, men kun en af hver. Så hvis nu jeg lavede en metode til at gennemløbe mine MDIChildren, skal jeg jo overføre noget der indiker hvilken mdichildform det er jeg vil undersøge om er oprettet.
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 18:22 #15
Det er på samme måde som i f.eks. Excel hvor man kun kan have en af hver toolbar det er dette jeg vil, blot med mdi forms
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 20:36 #16
okay jeg vil implementer det som en singleton hvor der i single(mdi) klassen er en static bool variable som skal indiker om der eksister et objekt. Men lige nu har jeg en metode i constructoren, der undersøger om denne er true( der er et obj) hvis ikke oprettes og returneres et sådan. Men problemet er dette som er koden i parent formen der kalder:
MBNodeInfoWin nodeInfoWin = new MBNodeInfoWin();
nodeInfoWin.MdiParent = this;
nodeInfoWin.Show();   

og så går det jo galt, hvis jeg ikke returnerer et objekt nogle nye og gode forslag som de forgående??
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 20:40 #17
Undskyld, men jeg forstår altså ikke dit spørgsmål... Kan jeg ikke få dig til at omformulere det?

// Simon
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 21:05 #18
jo here goes.

Det er en opfølgning på de forslag der er kommet.
Altså grundet at jeg kun ønsker at kunne instantier et objekt af hver klasse, vil jeg lave klasserne som Singleton klasser. Altså de klasser der udgør mine MDI child forms.
Lige nu har jeg en public metode på disse klasser som opretter et objekt og returner dette.
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 21:13 #19
Ja - en constructor...
Hvorfor tjekker du ikke bare om der eksisterer en instans af klassen før du opretter den? Så her, f.eks.:

public class MainForm
{
  private MBNodeInfoWin nodeInfoWin = null;

  public void CreateNodeInfoWin()
  {
    if (nodeInfoWin == null)
    {
      nodeInfoWin = new MBNodeInfoWin();
      nodeInfoWin.MdiParent = this;
      nodeInfoWin.Show();
    }
    else
    {
      nodeInfoWin.Activate();
    }
  }
}

// Simon
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 21:15 #20
Ovenstående skal så ganges med 3, hvis du forstår hvad jeg mener, en gang for hver slags vindue.
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 21:15 #21
Nå nu er det vist også løst  sådan her:
//privat data i mdichild klassen
private static MBNodeInfoWin classInstance = null;

en private constructor, så indtantiseringen foregår korrekt
//metode til at oprette objekter.Hvis objektet er oprettet er det blot dette //der returneres igen
public MBNodeInfoWin createInstance()
{
  if( classInstance == null )
  {
      classInstance = new MBNodeInfoWin();
  }
    return classInstance;
}

i dispose sættes classInstance så til null igen.


Når singleton klassen så skal bruge en child sker det således:

MBNodeInfoWin nodeInfoWin = new MBNodeInfoWin().createInstance();
Avatar billede naxosnaxos Nybegynder
27. december 2002 - 21:30 #22
Jeg mener selv at min løsning design mæssigt er bedre, da det ikke er parent klassens ansvar at der kun findes en instans af hver child
Avatar billede simon.ulsnes Nybegynder
27. december 2002 - 21:33 #23
Tja, det kommer vel an på situationen...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester