Thema: Delphi Die unerklärliche AV

Einzelnen Beitrag anzeigen

Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Die unerklärliche AV

  Alt 11. Feb 2018, 17:58
Hi Himitsu

Du sprichst von dieser Prozedur:
Delphi-Quellcode:
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
....
Jetzt brauch ich aber ganz schnell ein recht tiefes Mausloch, in das ich mich verkriechen kann!!

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:
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;
Also: Zu dem Zeitpunkt, da der Frame createt wird:
  • gibt es noch keine Mainform.
  • Also gibt es weder Listbox1 noch Listbox2
  • Der Constructor des Frames greift aber via aufruf von AddNewNode indirekt auf auf beide zu.
  • Wesshalb erzeugt nur der Zugriff auf die noch nicht vorhandenen Listbox2 eine AV, nicht aber der auf die ebenfalls noch nicht vorhandene Listbox1?

Gruss
Delbor

PS:
Zitat:
Irgendwer kommt auf die geniale Idee im Create des Frame auf die globale Variable der Form zuzugreifen,
Das muss dieser ominöse Fehler sein, der da vor meinem Bildschirm sitzt...
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (11. Feb 2018 um 18:02 Uhr)
  Mit Zitat antworten Zitat