![]() |
Delphi-Version: XE8
Die unerklärliche AV
Hi zusammen
Soeben habe ich meinem Projekt eine weitere Listbox hinzugefügt, um darauf Ausgaben über den Codeverlauf zu machen. Delphis Reaktion: Zitat:
Der Code, in der die AV ausgelöst wird:
Delphi-Quellcode:
Beide Listboxen wurden aus dem OI heraus gesetzt. Was ist da los?
begin
Node := TVPathExplorer.Items.AddChild(ParentNode, aCaption); PDFOfficerMain.ListBox1.Items.Add('aRealName := ' + aRealName); //Listbox1 funkttioniert schon länger PDFOfficerMain.ListBox1.Items.Add('aCaption := ' + aCaption); BCaption := ExtractFileExt(aCaption); PDFOfficerMain.ListBox1.Items.Add('ExtractFileExt := '+ BCaption); Application.ProcessMessages; if CanGetChildren then begin FDefaultdraw := False; FIsDirectory := True; Node.ImageIndex := 1; Node.SelectedIndex := 1; (* Dummy-Knoten anlegen *) TVPathExplorer.Items.AddChild(Node, 'dummy'); PDFOfficerMain.ListBox2.Items.Add('procedure TPathFinderFrame.AddNewNode'); /Listbox2 ist nil PDFOfficerMain.ListBox2.Items.Add('CanGetChildren := True'); PDFOfficerMain.ListBox2.Items.Add(''); end Gruss Delbor |
AW: Die unerklärliche AV
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Aktionen von mir:
Weiter:
Der Anhang zeigt meine Strukturen der Gui. Gruss Delbor |
AW: Die unerklärliche AV
Was hindert dich daran, mal im Debugger in der Codezeile zur Exception nachzusehn ob da irgendwo das böse NIL zu sehen ist?
[edit] grade das fast versteckte
Delphi-Quellcode:
entdeckt.
/Listbox2 ist nil
Heißt nur die Varaible/Feld so in der PDFOfficerMain, aber in der DFM/OI heißt die Komponente anders? Oder wurde Listbox2 zur Programmlaufzeit umbenannt oder vielleicht doch freigegeben? |
AW: Die unerklärliche AV
Du verwendest nicht zufällig eine with do begin Konstruktion irgendwo?
|
AW: Die unerklärliche AV
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen
Vielen Dank für eure Antworten! Zitat:
Zitat:
@Luckie: Hab ich mir schon vor längerem abgewöhnt... Aber nach dem Mittagsschläfchen (um vier Uhr :-D ) fiel mir ein, was ich nicht gecheckt habe: nämlich enabled des Parentpanels. Ich mag mich nebulös erinnern, dass ichs schon mal geschafft habe, sowas unbeabsichtigt zu ändern. ... Soeben nachgeholt - das Ergebnis seht ihr im Anhang... Grrr....Seit wann kann Delphi denn ein Burnout haben??? Gruss Delbor |
AW: Die unerklärliche AV
Hast du möglicherweise Lokalisierungen die nicht aktualisiert wurden? Da stecken auch die dfm resourcen drin und wenn da noch nicht die ListBox2 drin ist, wird sie beim dfm streamen nicht erstellt und demnach bleibt das ListBox2 Feld nil.
|
AW: Die unerklärliche AV
Im Screenshot zu Post 2 ist ListBox2 nicht enthalten, sie soll aber doch auch auf Panel7 liegen?
Enabled sollte eigentlich keinen Auswirkungen auf die Zugriffsmöglichkeiten im Programmcode haben, enabled wirkt sich nur auf die Bedienbarkeit durch den Anwender aus. Irgendwo muss es die ListBox2 geben, sonst würde der Compiler meckern. Das eine auf 'nem Formular liegende Komponente Nil ist, ist eher ungewöhnlich. Könnten wir bitte mal die DFM und die PAS vollständig zu gesicht bekommen. Da muss irgendwo was ungewöhnliches passieren, das man ohne den vollständigen Quelltext höchstwahrscheinlich nicht finden kann. Alternativ: Ist irgendwo unterhalb von
Delphi-Quellcode:
die ListBox2 zu finden?
type TPDFOfficerMain = class(TForm)
Wenn ja, ist sie auch in der DFM zu finden? Wenn sie in der DFM fehlen sollte, wird sie nicht automatisch erstellt und bleibt daher Nil. |
AW: Die unerklärliche AV
Zitat:
Aber in dem Feld ist einfach keine Referenz gespeichert. Die VCL/FMX setzen in ihrem Owner die gleichnamige Variable, die so wie sie heißt. Alle Komponenten im Formdesigner haben die Form als Owner. Wie sieht die Definition von PDFOfficerMain aus? Das Feld "Listbox2" muß natürlich published sein, sonst geht das automatische Setzen nicht. |
AW: Die unerklärliche AV
Liste der Anhänge anzeigen (Anzahl: 4)
Hi zusammen
@Delphi.Narium: Die Strukturansicht in Post2 zeigt die Situation, nachdem ich Listbox2 entfernt hatte und durch Listbox1 ersetzt hatte - und prompt war es dann auch diese, die in dieser Konstellation die AV auslöste. Im Anhang nun mal einige jpeg- und pas-Dateien mit der kompletten DFM, bzw Formularansichten zur Lauf- und Designtime. Aussserdem ist eine kleinere pas dabei, die nur die aktuelle AddNewNode-prozedure zeigt, die einige auskommentierte Zeilen enthält, die von meinen Versuchen stammen. Gruss Delbor |
AW: Die unerklärliche AV
Hi zusammen
Zitat:
Delphi-Quellcode:
Ansonsten findet sich die komplette pas im Anhang meines letzten posts.
type
TPDFOfficerMain = class(TForm) PnlToolBox: TPanel; CategoryPanelGroup1: TCategoryPanelGroup; ... Panel7: TPanel; ListBox1: TListBox; ListBox2: TListBox; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure TVNameMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Gruss Delbor |
AW: Die unerklärliche AV
Hi Stvie
Zitat:
Das Programm selbst ist zur Zeit eher eine Testanwendung, die in einem weiteren Schritt um eine SQLite-DB ergänzt werden soll. Hauptziel: Effizientes organisieren meiner eigenen Dokumente. Gruss Delbor |
AW: Die unerklärliche AV
Zitat:
Das Problem scheint doch vermutlich schon vorher zu existieren und da fehlt gleich mal Alles.
Delphi-Quellcode:
Direkt an den Anfang von TPathFinderFrame.AddNewNode und auch nach dem
Assert(Assinged(PDFOfficerMain));
Assert(Assinged(PDFOfficerMain.ListBox1)); Assert(Assinged(PDFOfficerMain.ListBox2));
Delphi-Quellcode:
, zu dem ich jetzt besser mal nix sage.
Application.ProcessMessages;
|
AW: Die unerklärliche AV
Liste der Anhänge anzeigen (Anzahl: 1)
Hi himitsu
Zitat:
Ich hab mal nur die Pathfinder-Unit angehängt, da hier die Listbox2 angesprochen wird. Gruss Delbor |
AW: Die unerklärliche AV
Hallo,
wir brauchen auch die Main-Pas und -Dfm. Am besten das ganze Projekt. Und markier mal die Stelle, wo es knallt. |
AW: Die unerklärliche AV
Liste der Anhänge anzeigen (Anzahl: 3)
Hi zusammen
Das Projekt erfordert allerdings etwas Zusatzaufwand, da die Vorrausetzungen für einen Zip-Upload nicht so ohne weiteres einzuhalten waren. Das Projekt erwartet: Die PDFium-DLL von Google( ![]() Die TFilesearcher-Komponente von DeddyH, die ich hier ebenso beilege. Diese benötigt eine Zusatzdatei DDFileUtils, die enthalten ist und sich meiner erfahrung nach im Projekteverzeichnis befinden sollte, ohne aber explizit dem Projekte hinzugefügt zu werden. Gruss Delbor |
AW: Die unerklärliche AV
Hi zusammen
Wie ich gesehen habe, wurden meine Zips schon mal heruntergeladen. Da es hier dazu bislang noch keinen Kommentar gab, befürchte ich, dass auf anderen Rechnern dieseAV nicht auftritt. Oder irre ich mich da? Gruss Delbor |
AW: Die unerklärliche AV
LOL :stupid:
Irgendwer kommt auf die geniale Idee im Create des Frame auf die globale Variable der Form zuzugreifen, die gerade eben erstellt wird und dann wundert er sich, dass Komponenten, die erst nach dem Frame erstellt werden, noch nicht existieren, da sie noch nicht erstellt wurden. Verschiebe diesen Code in eine Methode und rufe sie im OnCreate der Form aus, nachdem alles erstellt wurde. ODER: Trenne alle globalen Abhängigkeiten auf. Erstmal solltest du lernen, dass man diese Variablen besser nicht verwenden sollte. Stattdessen sollte dein Frame (deine Komponente) ein Property für diese Listboxen bekommen, mit denen er arbeiten soll. Wenn der Frame registriert wird und ![]() Als Nebeneffekt sind die einzelnen Komponenten voneinander unabhängig, können ausgetauscht oder auch in anderen Programmen wiederverwendet werden. |
AW: Die unerklärliche AV
Hi Himitsu
Du sprichst von dieser Prozedur:
Delphi-Quellcode:
Jetzt brauch ich aber ganz schnell ein recht tiefes Mausloch, in das ich mich verkriechen kann!!
procedure TPathFinderFrame.AddNewNode(ParentNode: TTreeNode; const aCaption,
aRealName: string; CanGetChildren: Boolean); var Node: TTreeNode; NodeRect: TRect; NameRec: PNameRec; DefaultDraw: Boolean;BCaption : String; begin Node := TVPathExplorer.Items.AddChild(ParentNode, aCaption); PDFOfficerMain.ListBox1.Items.Add('aRealName := ' + aRealName); // Hier wird Listbox1 auf PDFOfficerMain.ListBox1.Items.Add('aCaption := ' + aCaption); // der Mainform ausgefüllt. BCaption := ExtractFileExt(aCaption); // Und zwar mit sen hier angegbenen drei PDFOfficerMain.ListBox1.Items.Add('ExtractFileExt := '+ BCaption); // Zeilen, die für jedes der 13 Laufwerke je einmal Application.ProcessMessages; if CanGetChildren then // Boolean-Wert für Isdirectory aus dem TSearchanalizer(TFilesearcher) begin FDefaultdraw := False; FIsDirectory := True; Node.ImageIndex := 1; Node.SelectedIndex := 1; (* Dummy-Knoten anlegen *) TVPathExplorer.Items.AddChild(Node, 'dummy'); // PDFOfficerMain.ListBox2.Items.Add('procedure TPathFinderFrame.AddNewNode'); // Hier die AV: Listbox2 ist Bil, obwohl sie sich auf der Form befindet // PDFOfficerMain.ListBox2.Items.Add('CanGetChildren := True'); // PDFOfficerMain.ListBox2.Items.Add(''); end else begin if BCaption = FFilter then // Boolean begin .... Da hab ich erst grade in einem andern Thread geschrieben, dass der Constructor des Frames vor demjenigen der Form abläuft, weil in dieser eine Frameinstanz angelegt werden soll - und jetzt dies! Natürlich läuft die Prozedur AddNewNodes zum ersten mal vor dem Form-Constructor ab und ebenso natürlich gibt es zu dieser Zeit keine Listbox2. Das Problem ist nur - es gibt zu diesem Zeitpunkt auch keine Listbox1. Die aber wird anstandslos gefüllt, ob es sie nun schon gibt oder nicht! Und das dürfte auch nicht sein!? Im Constructor des Frames gibt es keinen Zugriff auf die Main- oder irgendeine andere Form.
Delphi-Quellcode:
Also: Zu dem Zeitpunkt, da der Frame createt wird:
constructor TPathFinderFrame.Create(AOwner: TComponent);
var RGindex, L: integer; Drive, D: string; Drives: TStringlist; begin inherited; FDefaultDraw := False; Drives := TStringlist.Create; try TDrives.ListDrivesAndNames(Drives); FReportlist := TStringlist.Create; FReportlist.Add('----'); for Drive in Drives do begin D := Copy(Drive, 1, 3); AddNewNode(nil, Drive, Copy(Drive, 1, 3), true); //AddNew wird hier aufgerufen, bevor die Form crestet wird. FReportlist.Add(D); end; finally FreeAndNil(Drives); end; FReportlist.Add('----'); PathFinder1.SearchType := stBoth; FileMaskInit; FPathlist := TStringlist.Create; FNodeList := TStringlist.Create; FNodeList.Sorted := False; RGindex := 0; end;
Gruss Delbor PS: Zitat:
|
AW: Die unerklärliche AV
Bei Frames gibt es halt zwei Varianten,
entweder als Frame, der durch die IDE verwaltet wird. (wie hier)
Was ich schon immer vermisst habe. Es gibt das
Delphi-Quellcode:
-Ereignis, welches nach dem Erstellen und Laden aller Property via DFM ausgeführt wird.
TComponent.Loaded
Es gibt aber leider kein Ereignis für "Form fertig geladen", so wie z.B. csDestroying, wo alle Sub-Komponenten erstmal diesen Status bekommen, bevor auch nur eine Komponente freigegeben wird. Ein AfterModulCreate und BeforeModulDestroy in TComponent (TForm/TFrame/TDataModule) wäre toll. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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