Thema: Delphi Gleiche Variablen-Namen

Einzelnen Beitrag anzeigen

Delbor

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

AW: Gleiche Variablen-Namen

  Alt 8. Mai 2017, 22:09
Hi DeddyH

Zitat:
Jetzt kann das Formular der Frame-Property eine TStrings-Instanz zuweisen, und der nutzt dann diese. Damit gibt es nur eine Instanz, aber beide haben Zugriff darauf.
Da gibts jetzt aber ein gewaltiges Missverständnis: Die Mainform darf/muss dem Pathfinderframe keinen String zuweisen. Die Aufgabe des Frames ist es ja gerade, die von seiner Komponente TFilesearcher gefundenen Pfade in einer Liste zu sammeln und diese nach aussen zu senden/von aussen auszulesen zu lassen. dieser Liste einen String von der Mainform, aus zuzuweisen.

Diese Procedure wird ausgeführt, wenn der Filesearcher einen Pfad gefunden hat:
Delphi-Quellcode:
procedure TSearchThread.DoOnMatchFound;
begin
  if Assigned(FOnMatchFound) then
    begin
      Lock;
      try
        FOnMatchFound(self, FPath, FSearchRec);
      finally
        UnLock;
      end;
    end;
end;
Das da gefeuerte Event wird im PathfinderFrame abgefangen:
Delphi-Quellcode:
procedure TPathFinderFrame.FileSearcher1MatchFound(Sender: TObject;
  const Path: string; const FileInfo: TSearchRec);
  var Complettpath, J: String;
begin
  if Assigned(FCurrentNode) then
  begin
    Complettpath := IncludeTrailingPathDelimiter(Path) + FileInfo.Name;
    AddNewNode(FCurrentNode, FileInfo.Name, Complettpath,TSearchRecAnalyzer.IsDirectory(FileInfo));
  end;
end;
Und AddNewNode fügt dem Treeview einen neuen Knoten hinzu sowie FPathlist einen neuen String:
Delphi-Quellcode:
procedure TPathFinderFrame.AddNewNode(ParentNode: TTreeNode; const aCaption,
  aRealName: string; CanGetChildren: Boolean);
var
  Node: TTreeNode;
  NameRec: PNameRec;
begin
  Node := TVPathExplorer.Items.AddChild(ParentNode, aCaption);
  if CanGetChildren then
    begin
      Node.ImageIndex := 1;
      Node.SelectedIndex := 1;
      (* Dummy-Knoten anlegen *)
      TVPathExplorer.Items.AddChild(Node, 'dummy');
    end
  else
    begin
      Node.ImageIndex := 2;
      Node.SelectedIndex := 2;
      FPathlist.Add(aRealName); // <<===
    end;
  New(NameRec);
  NameRec^.RealName := aRealName;
  Node.Data := NameRec;
end;
In FPathlist stehen abschliessend alle in einem bestimmten Ordner gefundenen Dateien. Ausgelöst wird dder Event, wenn der Filesearcher seine Suche beendet hat:
Delphi-Quellcode:
procedure TPathFinderFrame.FileSearcher1ExecuteComplete(Sender: TObject);
  var LPathlist: TStringlist; LOrdner: String;
begin
  if Assigned(FCurrentNode) then
    FCurrentNode.Expand(false);
  if Assigned(FOnPathListEvent) then
    FOnPathListEvent(Sender, FOrdner, FPathlist);
end;
Der Eventtyp:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object; Wenn ich das richtig verstanden habe, müsste ich diesen Event jedesmal, wenn ein Pfad gefunden wird, feuern:
Delphi-Quellcode:
procedure TDingensFrame.SomeEvent(Param: string);
begin
  if Assigned(FPathList) then
    FPathList.Add(Param);
end;
Dieser Beispielcode erinnert mich allerdings sehr an diese Diskussion.
Damals hatte ich MapRules für eine normale Stringliste gehalten; reichlich spät kam ich dahinter, dass MapRules ene TCollection-Object ist und Add ein TCollectionitem-Objekt zurückliefert.
Im Gegensatz dazu ist nun FPathlist wirklich ein TStringlist-Objekt und Add die Methode, die der Liste einen Eintrag hinzufügt. Die Procedur müsste also so ausehen:
Delphi-Quellcode:
procedure TDingensFrame.SomeEvent(Pfad: string);
begin
  if Assigned(FPfad) then
    FPfad(Pfad);
end;
Und in TDingensMainForm:
procedure TDingensMainForm.DoSomeEvent(Pfad: string);
begin
Self.FPathlist.Add(Pfad);
end;
Das Problem, das ich da sehe, ist: woher weiss ich nun, wann der TDingensframe keine Pfade mehr sendet? Einfach nur zuzuwarten, ob innerhab einer gewissen Zeit noch was kommt, scheint mir sehr zweifelhaft.

Gruss
Delbor
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 ( 8. Mai 2017 um 23:07 Uhr)
  Mit Zitat antworten Zitat