Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Die AV, die es gar nicht gibt (https://www.delphipraxis.net/210039-die-av-die-es-gar-nicht-gibt.html)

Delbor 20. Feb 2022 15:28

Delphi-Version: 11 Alexandria

Die AV, die es gar nicht gibt
 
Hi zusammen

Ich fürchte, ich habe eines meiner Testprogramme zum einen mit Delphi Alexandria geöffnet, um dann mit Sydney daran weiterzuarbeiten - anders kann ich mir nicht erklären, dass das Programm keinen weiteren Frame mehr akzeptiert (wo andere mehreredutzend oder hundert in ihren Programmen haben), sich die Codevervollständigung verabschiedete hat und das Programm bei F9 fürchterlich lange zum aufstarten braucht.

Also hab ich damit begonnen, unter Verwendung des bestehenden Codes eine neue Anwendzung zu bauen. Die jetzt verwendeten Fremdkomponenten, Frames, Forms und Units tragen alle den Namen 'Alex' irgendwo im Namen, Methodenköpfe werden in Alexandria erzeugt.
Vom bestehenden Programm werden gerade mal die lokalen Deklarationen und alles/das meiste zwischen begin und end inklusive übernommen.
Das sieht im konkreten Fall zB. so aus: (alt)
Delphi-Quellcode:
constructor TOpenFileFrame.Create(AOwner: TComponent);
begin
  inherited;
  FReportlist := TStringlist.Create;
  FPopUpModeList:= TStringlist.Create;
  DisplayAllFiles;                      //<== Läuft problemlos durch
  FPathlist := TStringlist.Create;
  FPopUpItemList := TStringlist.Create;
  PnlLookOut.Align := alClient;
  FCmbxItem := False;
  FFileType := 'Alle Dateien';
  FPopUpNode := NIL;
  NewPopUpItem;
end;
und neu (Der Frame wurde nicht unter einem andern Namen gespeichrt, sondern von Null an neu aufgebaut):
Delphi-Quellcode:
constructor TAlexOpenfileFrame.Create(AOwner: TComponent);
begin
  inherited;
  FReportlist := TStringlist.Create;
  FPopUpModeList:= TStringlist.Create;
  DisplayAllFiles;
  FPathlist := TStringlist.Create;
  FPopUpItemList := TStringlist.Create;
  PnlLookOut.Align := alClient;
  FCmbxItem := False;
  FFileType := 'Alle Dateien';
  FPopUpNode := NIL;
  NewPopUpItem;
end;

procedure TAlexOpenfileFrame.DisplayAllFiles;   // D: string;
  var Drives: TStringList; Drive, D: string;
begin
  Drives := TStringlist.Create;
  try
    TDrives.ListDrivesAndNames(Drives);
    FReportlist.Add('--OpenFileFrame.ReportList--');
    FReportlist.Add('--Start : --');
    for Drive in Drives do
    begin
      D := Copy(Drive, 1, 3);
      AddNewNode(nil, Drive, Copy(Drive, 1, 3), true);             // Zugriffsverletzung. Der Code ist genau der selbe wie vorher
      FReportlist.Add('procedure TOpenFileFrame.DisplayAllFiles');
      FReportlist.Add(D);
    end;
  finally
    FreeAndNil(Drives);
  end;
  FileSearcherAlex1.SearchType := stBoth;
  FReportlist.Add('--procedure TOpenFileFrame.DisplayAllFiles;--');
  Self.Zurcksetzen1.Enabled := False;
end;
AddNewNode schreibt die gefundenen Ordner und Dateien in ein Treeview - hier gerade mal die ersten Laufwerksbuchstaben (C:\ etc).
In TOpenFileFrame läuft diese Prozedur seit Jahren problemlos ab.
Eine Frameinstanz ist auf der Mainform vorhanden. Ich seh also keinen Grund für die AV. Was habe ich übersehen?

Gruss
Delbor

Delbor 20. Feb 2022 16:40

AW: Die AV, die es gar nicht gibt
 
Hi zusammen
Zitat:

Zitat von Delbor (Beitrag 1502512)
Hi zusammen
Was habe ich übersehen?

Oft kopiere ich auch die komplette Prozedur vom Vorgänger, passe den neuen Klasssennamen an und deklariere die Prozedure mit der Tastenkombination <Shift-Control-C>. Aber anders als beim Refactoring fragt Delphi nicht per Dialog nach, wo deklariert werden soll, sondern 'schmeisst' den Kram einfach nach Private.
So auch hier mit der Prozedur AddNewNode. Ist die private, gibt es die für Aussenstehende nicht...

Gruss
Delbor

TiGü 21. Feb 2022 08:21

AW: Die AV, die es gar nicht gibt
 
Wäre es nicht irgendwie gut, uns auch AddNewNode zu zeigen?
Ist es denn eine klassische Zugriffsverletzung mit c0000005 oder was anderes?
Den textuellen Inhalt der aufpoppenden Messageboxen kann man per Strg + C kopieren und hier einfügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:18 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