![]() |
.Net WinForms - NULLPointer Exception beim Methodenaufruf
Ich habe meinen ersten "unlösbaren Fall" mit WinFowms auf dem Tisch.
Keine Ahnung, wie ich das debuggen soll. Könnt ihr bitte mal drüber schauen? Ich rufe - jetzt schon in der Minimalversion - in einem Button Klick-Event eine Instanzmethode meinens Formulars auf. Anstatt die Methode aufzurufen kommt eine Nullpointer Exception, die ich im Einzelschritt Debugging nicht mehr greifen kann. Das hat natürlich schon funktioniert, aber irgendwas ist "kaputt" und ich habe heute Nacht nicht herausgefunden wo es klemmt. Statt in "UpdateServerTime" springt der nächste Schritt in "MainForm.Dispose" > (aDisposing ist TRUE).
Delphi-Quellcode:
type
MainForm = partial class(System.Windows.Forms.Form) private fNextUpdateVersion:DateTime := DateTime.Now.AddHours(-1); fNextUpdateServerTime:DateTime := DateTime.Now.AddHours(-1); property ServerURL:String read get_ServerURL; method get_ServerURL: String; method button1_Click(sender: System.Object; e: System.EventArgs); method UpdateVersion; method UpdateServerTime; protected method Dispose(aDisposing: boolean); override; public constructor; end; method MainForm.button1_Click(sender: System.Object; e: System.EventArgs); begin self.UpdateServerTime; // BREAKPOINT wird an dieser Stelle angesprungen. "self" ist assigned (klar) // Debug > Next Step > bring NULLPointerException end; method MainForm.UpdateVersion; begin if fNextUpdateVersion > DateTime.Now then exit; MessageBox.Show('Yippie'); // Der Rest ist auskommentiert.. end; method MainForm.UpdateServerTime; begin if fNextUpdateServerTime > DateTime.Now then exit; // BREAKPOINT wird an dieser Stelle NICHT angesprungen MessageBox.Show('Yippie'); // Der Rest ist auskommentiert.. end; |
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Gibt es eine Variable, die auf das Formular zeigt?
Das "disposing" true ist, dürfte bedeuten, dass der GC zugeschlagen hat. |
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
In .NET hast Du ja multicast delegates. Es kann also problemlos sein, dass Du zwei oder mehrere Event-Handler an einem Button-Click hängen hast.
Hast Du ggf. versehentlich ein Form-Close auch auf den Button gehängt das zuerst ausgeführt wird? Hier sollte ein Blick in die Codebehind-Datei helfen, in der die Events verdrahtet werden. |
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Clean und Rebuild hilft nicht? Da lebt vermutlich der alte Code noch...
Ich schreibe nur sehr wenig GUI in .net. Rein nach Gefühl ... eher so etwas. Aus dem Codefragment sehe ich jetzt nicht viel. Hat der Phoenix schon recht mal nachgucken. Zitat:
|
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Ich gebe es erstmal auf und speichere mir das Projekt im kaputten Zustand irgendwo ab, damit ich demnächst wieder weitersuchen kann. Interessieren tut es mich schon, was ich da verbockt habe.
Das Formular verhält sich zur Entwurfszeit jedenfalls total wacklig. Dabei ist bis auf einem Button und vier Labeln schon garnichts nichts mehr drauf. 8-). Im Code behind gibt es insgesamt auch nur noch nur einen einzigen EventHandler (der für "Button1_Click"). Mal öffnet der Designer problemlos, man bringt er beim Öffnen den Fehler "Objektinstanz bereits zugewiesen" und mal "Objektinstanz nicht zugewiesen" (alles ohne Zeilenangaben oder Quellcode Verweise). Nach dem Neustart von Visual Studio öffnet er dann aber wieder eine Weile problemlos, ohne das am Formular etwas verändert worden wäre. Clean & Rebuild hat leider auch nicht geholfen. Der wichtige Code liegt in einer anderen Assembly. Ich schmeiße das Formular nach dem Sichern weg und mache es schnell neu. Dann kann ich mich wieder mit meinen "echten Problemen" befassen. :wink: Dieser WinForms Designer ist hoffentlich im waren Leben nicht immer so wacklig... Ich gebe nochmal Bescheid, wenn ich herausgefunden habe was die Ursache war. Danke erstmal. |
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Mit C# funzt das alles problemlos.
|
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Ja, C# kann Formulare malen und Oxygene auch. Der IL Code war nicht das Problem.
Naja .. eigentlich doch .. ziemlich genau war es das sogar .. ganz alleine :wink: Das ich mein erster WinForms "Test", er auch für andere .Net "Lernsachen" herhalten muss. Später werden ich den ganzen UI Kram aber auch vorrangig mit C# machen, weil es in der DevExpress Universal Subscription keine Oxygene Projektvorlagen gibt und XAF auch nur C# und VB kann. Ich habe jetzt aber herausgefunden was ich genau vermasselt habe :oops:. Hätte ich die paar übrigen "Variablendeklarationen" bei dem geposteten Beispielcode vorhin mal nicht weggemacht. Die waren doch wichtig. :duck: So etwa sah das vorhin wirklich aus.
Delphi-Quellcode:
Das "FUTURE" "ASYNC" "AWAIT" Konstrukt spaltet ein Task ab, die CommonClient.GetServerVersion parallel ausführt ohne das Mainform zu blockieren, und dann wieder ein im Kontext des UI Thread terminiert. Soweit die Theorie.
method TMainform.irgendwas;
begin MessageBox.show('ich bin nie zu sehen, weil Mainform.irgendwas garnicht aufrufbar ist'); if fNextUpdateServerSersion > DateTime.Now then exit; var lServerVersionInfo:TServerVersionInfo; var lSucceeded:Boolean; // und zwar deshalb ... var lResponse: future TResponse := (async (CommonServiceClient.GetServerVersion(lServerVersionInfo))); if assigned(await lResponse) then begin //lSucceeded := lResponse.ReturnCode = TReturnCode.rcOK; //self.lblServerVersion.Text := if lSucceeded then lServerVersionInfo.VersionString else lResponse:Description; //fNextUpdateVersion := if lSucceeded then DateTime.Now.AddSeconds(90) else DateTime.Now.AddSeconds(2); end; end; In der Praxis ist der "CommonServiceClient" ein Member von Mainform. Und im Video2Brain Kurs "Multithreading mit .Net" hatte der Typ das sogar gesagt .. :pale:. Man kann in Tasks "problemlos" auf außenliegende Variablen zugreifen kann, muss aber aufpassen, weil der IL_CODE dadurch STARK verändert wird. Die außen liegenden Variablen werden im IL Code zu Public Membern des "Task Threads" und liegen dann gar nicht mehr wirklich "außen". Das sieht man nur nicht im C# oder Pascal Code. Unter dem Strich habe ich also eine Methode aufgerufen, die einen IL Code ausgeführt hat, welcher meine MainForm Instanz in einen Task Context gezogen hat, dessen Task aber noch garnicht instanziert war. Resultat - MainForm weg und NullPointer Exception gerechtfertigt und die Nacht umsonst durchgesucht ... |
AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
Soweit funktioniert Oxygene schon. Gewöhne dich an die Nächte. Die sind alle gesessen :-D Und du wirst alle seit .net 1.1 nachsitzen. Es gibt viele Gewohnheiten die der .net Mensch mit den Jahren vermeidet. Aber das ist überall so.
Mein Zugang war damals über Sharpdevelop und dem Source der IDE. Das ist lehrreich. Bei Devexpress kommst du C# sowieso nicht aus und auch die ganzen anderen Generator fokusierten Ansätze. Devexpress .net ohne XAF ist nicht der Heuler. Das ist auch eher eine eigene Welt über .net drübergestülpt. Das hat CASE Tool level. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz