![]() |
Wie herausfinden warum Interface nil ist?
Hallo,
gegeben eine D11.3 Anwendung. Eine Klasse hat eine Report Drucken Methode, diese bekommt ein Interface übergeben aus dem bestimmte Daten auf den Report gedruckt werden sollen. Der Report wird mittels FastReports VCL Embacadero Edition erzeugt. Es gibt ein Ereignis, welches von FastReports aufgerufen wird um an die darzustellenden Daten zu kommen:
Delphi-Quellcode:
Was kann dazu führen, dass FData im CreateReceipt noch brav zugewiesen ist und
procedure TReportPrinting.CreateReceipt(Data: IMyDataReadOnly);
begin FData := Data; // Rest ausgeblendet end; procedure TReportPrinting.OnGetValue(const VarName: string; var Value: Variant); begin if CompareText(VarName, 'ReportDate') = 0 then Value := DateToStr(FData.OrderDate) + ' - ' + TimeToStr(FData.OrderDate); end; dessen Count Methode dem Debugger z. B. 2 liefert, was in dem Testlauf korrekt war, im OnGetValue aber nil ist? Alle Aufrufe die zwischendurch erfolgten hab' ich durchgesteppt und da war FData immer zugewiesen und Count blieb 2. Das OnGetValue wird von irgendwo innerhalb FastReports aufgerufen wenn ich Report.PrepareReport(true); aufrufe. Das ist in der EMBT Edition natürlich eine Blackbox. Grüße TurboMagic |
AW: Wie herausfinden warum Interface nil ist?
Eine Interface-Variable ist immer Nil, wenn du oder wer Anderes da Nil zugewiesen hat, bzw. wenn noch nie etwas zugewiesen wurde.
Ausnahme sind WeakReferenzen, die von alleine NIL werden, wenn wo anders die letzte Variable Nil oder gelöscht wurde. Wenn Data.RefCount im CreateReceipt-BEGIN 0 war, dann wäre es in dessen END freigegeben worden. Passiert eventuell, wenn man ein Interface falsch erzeugt, bzw. das erzeugte "Objekt" direkt als Parameter übergab. Aber wenn es nach dem FData:= mindestens 2 war, dann würde es eigentlich stimmen. Und dürfte hier auch nie passieren, also das RefCount 0 zu Beginn, da der Parameter kein CONST ist. (ich weiß nicht, warum Viele unbedingt drauf bestehen und mich zwingen wollen dort CONST machen zu müssen ... Referenzzählung ist nicht soooooo langsam und verhindert einige "Bugs") |
AW: Wie herausfinden warum Interface nil ist?
Warum setzt du in CreateReceipt nicht einfach nach der Zuweisung einen Datenhaltepunkt auf FData und schaust nach, wann dieses Feld geändert wird? Da dieses in deinem Code liegt, kann der Code von FastReport ja damit nichts zu tun haben.
Eine zweite Instanz von TReportPrinting kann da nicht im Spiel sein? Dann müsstest du noch Self vergleichen. |
AW: Wie herausfinden warum Interface nil ist?
Hallo,
danke für die Tipps, hat sich aber schon erledigt. Das ist eine Anwendung wo in der DPR auch diverse Änderungen nötig wurden und beim Hinzufügen neuer Units hat die IDE mal wieder Code angefasst, der nicht anzufassen wäre. Dadurch wurde das Hauptformular 2x erzeugt, was diverse Probleme verursachte. Ich wünschte die IDE würde mal endlich lernen die Finger vom Hauptprogramm zu lassen wenn die hinzugefügten units keine Forms sind und man könnte sich auch eine Einstellung "Zusätzliche Forms nicht automatisch erzeugen" wünschen, die da auch zu berücksichtigen wäre. Grüße TurboMagic |
AW: Wie herausfinden warum Interface nil ist?
Zitat:
Vielleicht sollten Delphi Entwickler mal lernen, ihre Finger von der DPR-Datei zu lassen und von dort höchstens den Code in einer Unit aufzurufen. Zitat:
|
AW: Wie herausfinden warum Interface nil ist?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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 by Thomas Breitkreuz