Wubbable Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 (endret) Altså... Finnes det noe lignendes Form_Closing eventen som kan implementeres i et class library? Har en klasse som lastes (databaseklasse) og åpner en database... Jeg vil at den skal kjøre noe kode (Commit'e transactionen) når host-programmet avsluttes... Noen måte å gjøre dette på, uten å manuelt skrive det i Form_Closing'en til programmet? Merk: Det er ikke snakk om en SQL database, men en DB4O database... Just for info Endret 18. oktober 2007 av Wubbable Lenke til kommentar
GeirGrusom Skrevet 18. oktober 2007 Del Skrevet 18. oktober 2007 En event kan ha så mange funksjoner koplet til seg som du vil. Du kan legge til AddHandler på Form.Closing. Nå husker ikke jeg syntaksen til AddHandler, men det vet sikkert du, eller klarer i det minste å finne det ut. Lenke til kommentar
Wubbable Skrevet 18. oktober 2007 Forfatter Del Skrevet 18. oktober 2007 Kan prøve å finne det ut ja Nå bare gjetter jeg: Sub New() har AddHandleren, som legger til et event som kjøres når FormClosing kjøres... Og, i class'en er det en Sub Disposing() der den koden som skal kjøres er.. Correct? Lenke til kommentar
GeirGrusom Skrevet 19. oktober 2007 Del Skrevet 19. oktober 2007 Public Sub New(Form AddForm) AddHandler(AddForm.Closing, Form_Closing) ' Husker ikke syntaks til denne... End Sub Private Sub Form_Closing(sender As Object, e As ClosingEventArgs) ' Gjør noe fornuftig her End Sub Lenke til kommentar
Wubbable Skrevet 19. oktober 2007 Forfatter Del Skrevet 19. oktober 2007 Tenkte forresten på.. Hva om classen brukes i en console application / et program uten vinduer? (F.eks. for å lagre et rss feed fra en side) Da er det jo ikke noen Form_Closing... Lenke til kommentar
GeirGrusom Skrevet 19. oktober 2007 Del Skrevet 19. oktober 2007 Du kan bruke Application.OnExit eller noe kanskje? Lenke til kommentar
nilcat Skrevet 8. november 2007 Del Skrevet 8. november 2007 Jeg vil foreslå at du implementerer IDispose (eller var det IDisposing?) interfacet. Da kan du garantere at koden din kjøres en eller annen gang etter at objektet ditt ikke lenger er referert. (Dvs. at det er GarbageCollector som faktisk kaller din Dispose) Jeg fant en kodesnutt på MSDN som viste eksempel på implementering av IDispose Cato Lenke til kommentar
GeirGrusom Skrevet 8. november 2007 Del Skrevet 8. november 2007 GC kaller da destructoren, Dispose må du kalle selv, enten med using, eller IDisposable.Dispose(); Eller har jeg missforstått noe nå? Jeg tror ikke GC gjør noe som helst med IDisposable.... Lenke til kommentar
Manfred Skrevet 8. november 2007 Del Skrevet 8. november 2007 Med mindre du oppretter klassen din i et using-scope using( MyClass mc = new MyClass()) { //code } Så vil den disposes når den går ut av scope, uansett om det er exceptions eller hva det er. Lenke til kommentar
nilcat Skrevet 9. november 2007 Del Skrevet 9. november 2007 GC kaller da destructoren, Dispose må du kalle selv, enten med using, eller IDisposable.Dispose(); Eller har jeg missforstått noe nå? Jeg tror ikke GC gjør noe som helst med IDisposable.... Du har rett - jeg tok dette etter hukommelsen, og i den koden jeg kopierte så kaller destructoren Dispose (og det er i tillegg en variabel for å sjekke om du allerede har kjørt "dispose" koden public class MyDisposableClass: IDisposable { private bool disposed= false; // Indicates that the object is disposed // Allow your Dispose method to be called multiple times, // but throw an exception if the object has been disposed. // Whenever you do something with this class, // check to see if it has been disposed. public void DoSomething() { if(this.disposed) { throw new ObjectDisposedException(); } } #region IDisposable Members // Implement IDisposable. // Do not make this method virtual. // A derived class should not be able to override this method. public void Dispose() { Dispose(true); // Take yourself off the Finalization queue // to prevent finalization code for this object // from executing a second time. GC.SuppressFinalize(this); } #endregion // Dispose(bool disposing) executes in two distinct scenarios. // If disposing equals true, the method has been called directly // or indirectly by a user's code. Managed and unmanaged resources // can be disposed. // If disposing equals false, the method has been called by the // runtime from inside the finalizer and you should not reference // other objects. Only unmanaged resources can be disposed. protected virtual void Dispose(bool Disposing) { // Check to see if Dispose has already been called. if (!this.disposed) { // If disposing equals true, dispose all managed // and unmanaged resources. if (Disposing) { // Dispose managed resources. } // Release unmanaged resources. If disposing is false, // only the following code is executed. } disposed = true; } // Use C# destructor syntax for finalization code. // This destructor will run only if the Dispose method // does not get called. // It gives your base class the opportunity to finalize. // Do not provide destructors in types derived from this class. ~MyDisposableClass() { // Do not re-create Dispose clean-up code here. // Calling Dispose(false) is optimal in terms of // readability and maintainability. Dispose(false); } // Can be used if calling Close makes more sense for your objects // Do not make this method virtual. // A derived class should not be allowed // to override this method. public void Close() { // Calls the Dispose method without parameters. Dispose(); } Cato Lenke til kommentar
kaffenils Skrevet 9. november 2007 Del Skrevet 9. november 2007 Har en klasse som lastes (databaseklasse) og åpner en database... Jeg vil at den skal kjøre noe kode (Commit'e transactionen) når host-programmet avsluttes... En liten ting som egentlig ikke har noe med spørsmålet ditt å gjøre, men du bør ikke holde en transaksjon åpen hele levetiden til applikasjonen din. Du bør committe den så raskt som mulig. Hvis ikke kommer du til å ende opp med masse locking-problemer. Lenke til kommentar
Wubbable Skrevet 9. november 2007 Forfatter Del Skrevet 9. november 2007 Jada, den commiter hver gang en entry lagres (dreamjournal) I slutten kalles bare XDB.Transact(XFDB.Pub.TransactionOptions.Close) som lukker databasen... Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå