AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Gleiche Variablen-Namen

Ein Thema von Delbor · begonnen am 8. Mai 2017 · letzter Beitrag vom 10. Mai 2017
Antwort Antwort
Seite 1 von 2  1 2   
Delbor

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

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
Delbor

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

AW: Gleiche Variablen-Namen

  Alt 8. Mai 2017, 22:54
Hi Uwe Raabe
Zitat:
Das habe ich so nicht gesagt! Es muss dann schon geklärt werden, wer da dann was frei gibt.
Hmm... Und wie wird, bzw. kann dies geklärt werden? Indem der Compiler darüber informiert wird, welche der Variablen zu was gehört?
Genau das hat aber meine Frage veranlasst.

Zur Erinnerung: Meine bisherige Prozedur gibt die Liste direkt aus, ohne sie in einem Feld zwischenzuspeichern:
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const FPathlist: TStringList);
begin
  Self.EdiFolder.Clear;
  Self.EdiFolder.Text := FOrdner;
  Self.LBxPathlist.Clear;
  Self.LBxPathlist.Items.AddStrings(FPathlist);
end;
Stattdessen soll nun der übergebene KonstantenParameter FPathlist an das private Feld TSQLiteTestMain.FPathlist übergeben werden. Das würde nach meinen bisherigen Vorstellungen etwa so ausehen:
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const FPathlist: TStringList);
begin
  FPathlist.AddStrings(FPathlist);
end;
Und genau das dürfte unmöglich sein. Es sei denn...:
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const FPathlist: TStringList);
begin
  Self.FPathlist.AddStrings(PathFinderFrame.FPathlist);
end;
Allerdings müsste so auch der Eventtyp angepasst werden: Statt
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object; müsste dies heissen:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const PathFinderFrame.FPathlist: TStringList) of Object; Allerdings - ob sowas überhaupt möglich ist, ist mir nicht bekannt; ich denke eher nicht.
Wobei dann tatsächlich mein erster ansatz übrig bliebe:
Delphi-Quellcode:
procedure TPathFinderFrame.FileSearcher1ExecuteComplete(Sender: TObject);
  var LPathlist: TStringlist; LOrdner: String;
begin
  if Assigned(FCurrentNode) then
    FCurrentNode.Expand(false);
  if Assigned(FOnPathListEvent) then
  begin
    LPathList := TStringlist.Create;
    try
    LPathList.AddStrings(FPathlist);
    LOrdner := FOrdner;
    FOnPathListEvent(Sender, FOrdner, LPathlist);
    finally
      LPathList.Free;
    end;
  end;
end;
und in der Mainform:
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const LPathlist: TStringList);
begin
  FPathlist.AddStrings(LPathlist);
end;
Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.633 Beiträge
 
Delphi 12 Athens
 
#3

AW: Gleiche Variablen-Namen

  Alt 8. Mai 2017, 23:57
Und was spricht gegen dies?
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const FPathlist: TStringList);
begin
  Self.FPathlist.Assign(FPathlist);
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#4

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 06:28
Jetzt muss ich aber mal nachhaken: wo genau wird diese Liste benötigt/angezeigt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 07:00
So wie ich das verstehe, wird die Liste im Mainform angzeigt.

Ich würde das so lösen (Code frei getippt):
Delphi-Quellcode:
   TOnComplete = TNotifyEvent;

   TPathfinderframe = Class...
   private
      fpathlist : TStringlist;
      fonComplete : TOnComplete;
     :
   published
     Property Pathlist : TStringlist read fpathlist write fpathlist;
     Property onComplete: TOnComplete read fonComplete write foncomplete;
     :
   end;
Bei der Suche selbst, innerhalb des Frames, wird die Stringliste erweitert. Beim Complete wird einfach das Event gefeuert und so dem Hauptformular bescheid gegeben, das die Liste neu ist. Anhand der Liste kann dann der Treeview entsprechend angezeigt werden.

Eine Instanz der Stringliste und eine Übergabe ist nicht notwendig.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Delbor

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

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 07:24
Hi zusammen

Vielen Dank, Uwe Raabe. An sowas habe ich weniger gedacht, da es mir zu wenig klar erschien. Aber klar - Self.FPathlist kann unmöglich der Parameter sein, womit klar wäre, welche der beiden Variablen an welche zugewiesen und von wem gelöscht wird.
Ohne die klare Adressierung mindestens der einen Variablen ist ja auch nicht wirklich klar, wer wem zugewiesen wird.

@DeddyH: FPathlist sammelt im PathfinderFrame die vom Filesearcher gefundenen Pfade. Hier im Test wird diese Liste von der Mainform abgearbeitet, soll aber in einem Datenmodul eingesetzt werden, um Daten - in diesem Fall Bilder - von der Festplatte in eine DB zu schreiben.

Den Pathfinderframe hatte ich ursrünglich unter dem Namen OpenfileDialog, bzw. OpenFileFrame entwickelt. Dieses Ding hat nur den grossen Fehler, dass es ausser gefundene Files anzuzeigen, auch noch andere, programmspezifische, Aufgaben erledigt. Allgemein sind da ddie Zugriffe des Frames und anderer Projektteile nicht sauber geregelt.
Na ja, das Ding hat schon einige Jährchen auf dem Buckel...

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.658 Beiträge
 
Delphi 12 Athens
 
#7

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 07:38
Und wozu brauchst Du dann eine 2. Instanz? Ich habe immer öfter den Eindruck, Du machst es Dir unnötig schwer.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 07:41
@DeddyH

Jap...deshalb ja auch mein Lösungsansatz.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.811 Beiträge
 
Delphi 12 Athens
 
#9

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 07:41
Ich schieße mal kurz unsachlich dazwischen: Wenn Du schon so einen Namen wie FPathList für ein Feld wählst, warum nicht auch aPathList für ein Argument? Zumindest wäre dann die Namensverwirrung im Titel sinnvoll aufgelöst

Ansonsten, schließe ich mich immer Uwe Raabes Meinung an...

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Delbor

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

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 08:03
Hi Ghostwalker
Ja, danke. Daran habe ich auch schon gedacht, mich dann aber für dieses Vorgehen entschieden, da ich ja auch noch ein Feld FOrdner habe, in dem der Name des Parentfolders enthält.

Zitat:
Die Sache mit dem Property habe ich mir auch überlegt. Einen Event müsste ich vom Frame aus aber so oder so abfeuern, da die Mainform ja nicht wissen kann, wann der PathfinderFrame die Liste (und damit das Listenproperty) neu bestückt. Das würde dann heissen, dass ich vom Frame aus einen TNotifierEvent abfeuere, den die Mainform empfängt und dabei dann das Listen-Property des Frames ausliest.
Klar könnte dieser Name aus einem Dateipfad herausgefiltert werden. Für die jetzige Vorgehensweise habe ich mich entschieden, weil Teile dieses Namens als DBName verwendet werden sollen. Und um nun alle Klarheiten zu beseitigen:
Ziel ist es, eine eingebettete SQLite-DB zu erstellen, die gerade mal eine Tabelle enthält,die ihrerseits nur einige wenige Felder aufweist. Die Aufgabe dieser DB wird es sein, RAWBild-Dateien und davon erstellte Bitmaps zu speichern. Diese DB soll auch Auskunft darüber geben, ob das Bitmap schon bearbeitet wurde.
Im Produktiveinsatz werden aus den RAW-Bildern nebst Bitmaps auch Thumbnails erstellt. Diese werden in meiner BilderDB (12 Tabellen, MySQL) gespeichert.

Gruss
Delbor
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:41 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