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