Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Sprachen (https://www.delphipraxis.net/82-net-sprachen/)
-   -   Prism .Net WinForms - NULLPointer Exception beim Methodenaufruf (https://www.delphipraxis.net/179326-net-winforms-nullpointer-exception-beim-methodenaufruf.html)

jensw_2000 27. Feb 2014 08:08


.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;

Wormid 27. Feb 2014 11:19

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.

Phoenix 27. Feb 2014 11:28

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.

michaelthuma 27. Feb 2014 11:59

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:

Zitat von jensw_2000 (Beitrag 1249799)
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;


jensw_2000 27. Feb 2014 14:14

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.

Furtbichler 27. Feb 2014 15:42

AW: .Net WinForms - NULLPointer Exception beim Methodenaufruf
 
Mit C# funzt das alles problemlos.

jensw_2000 27. Feb 2014 18:23

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:
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;
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.

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 ...

michaelthuma 27. Feb 2014 20:44

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:

Zitat von jensw_2000 (Beitrag 1249917)
Ja, C# kann Formulare malen und Oxygene auch. Der IL Code war nicht das Problem.



Alle Zeitangaben in WEZ +1. Es ist jetzt 03:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz