Delphi-PRAXiS
Seite 6 von 7   « Erste     456 7      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gleiche Variablen-Namen (https://www.delphipraxis.net/192650-gleiche-variablen-namen.html)

haentschman 9. Mai 2017 17:29

AW: Gleiche Variablen-Namen
 
Zitat:

Und das entspricht meinen Deklarationen.
...das ist ja auch nicht die Ursache. Du übergibst dem Event eine Liste die NIL ist. :?

Bitte hänge den QT an. Sonst sind wir in 10 Seiten noch nicht fertig. :zwinker: Bitte... wenigstens die 2 Units mit dem Eventhander und dem Event.

Delbor 9. Mai 2017 17:40

AW: Gleiche Variablen-Namen
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hi Haentschman

Im Anhang die drei pas-Dateien. Ursprünglich hatte ich den Eventhandler in der Mainform. Aber wenn damit keine Gui-Ausgabe erfolgt, gehört er da eigentlich nicht hin.

Gruss
Delbor

DeddyH 9. Mai 2017 17:48

AW: Gleiche Variablen-Namen
 
Es gibt jetzt in DMLSQLiteUnit eine FPathList, in PathFinderFrameUnit noch eine und zusätzlich nochmal als Parameter. Die einzige wirklich erzeugte Instanz ist die in DMLSQLiteUnit, aber die wird nirgends benutzt. Wie war das nochmal mit dem Stift und dem Papier?

Delbor 9. Mai 2017 18:06

AW: Gleiche Variablen-Namen
 
Hi DeddyH
Wie kommst du darauf, dass die einzige Instanz der Liste im Datenmodul erzeugt wird?
Delphi-Quellcode:
constructor TPathFinderFrame.Create(AOwner: TComponent);
  var RGindex, L: integer; Drive, D: string;
      Drives: TStringlist;
begin
  inherited;
  Drives := TStringlist.Create;
  try
    TDrives.ListDrivesAndNames(Drives);
    for Drive in Drives do
    begin
      D := Copy(Drive, 1, 3);
      AddNewNode(nil, Drive, Copy(Drive, 1, 3), true);
      FReportlist.Add(D);
    end;
  finally
    FreeAndNil(Drives);
  end;
  FReportlist.Add('----');
  FileSearcher1.SearchType := stBoth;
  FPathlist := TStringlist.Create;   //<<====
  RGindex := 0;
  FFileType := InitFileType(RGindex);
  L := CmbxFileType.Items.IndexOf(FFileType);
  if L <> -1 then
    CmbxFileType.Text := CmbxFileType.Items[L];
  if CmbxFileType.Items.IndexOf(FFileType) > -1 then
    CmbxFileType.Text := CmbxFileType.Items[CmbxFileType.Items.IndexOf(FFileType)];
  FCmbxItem := False;

end;
Die Pathlist des Datenmoduls habe ich erst kürzlich eingefügt. Eben, weil ich mir die Fehlermeldungen nicht erklären konnte. Angedacht war eigentlich nur FFilelist.

Gruss
Delbor

DeddyH 9. Mai 2017 18:27

AW: Gleiche Variablen-Namen
 
Ich habe mir jetzt extra meine eigene Komponente installiert und auf die Schnelle ein Beispiel gebastelt. Zunächst der Frame:
Delphi-Quellcode:
unit uTestFrame;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, DDFileUtils, FileSearch;

type
  TSearchFrame = class(TFrame)
    FileSearcher1: TFileSearcher;
    procedure FileSearcher1MatchFound(Sender: TObject; const Path: string;
      const FileInfo: TSearchRec);
    procedure FileSearcher1ExecuteComplete(Sender: TObject);
  private
    { Private-Deklarationen }
    //Der FileSearcher ist hier, dann sollte die Liste auch hier sein
    FPaths: TStrings;
    FOnFertig: TNotifyEvent;
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Search;
    //Nach außen verfügbar machen (Lesezugriff genügt)
    property PathList: TStrings read FPaths;
    //Event nach Beendigung der Suche
    property OnFertig: TNotifyEvent read FOnFertig write FOnFertig;
  end;

implementation

{$R *.dfm}

uses IOUtils;

{ TSearchFrame }

constructor TSearchFrame.Create(AOwner: TComponent);
begin
  inherited;
  FPaths := TStringList.Create;
end;

destructor TSearchFrame.Destroy;
begin
  FPaths.Free;
  inherited;
end;

procedure TSearchFrame.FileSearcher1ExecuteComplete(Sender: TObject);
begin
  if Assigned(FOnFertig) then
    FOnFertig(self);
end;

procedure TSearchFrame.FileSearcher1MatchFound(Sender: TObject;
  const Path: string; const FileInfo: TSearchRec);
begin
  FPaths.Add(IncludeTrailingPathDelimiter(Path) + FileInfo.Name);
end;

procedure TSearchFrame.Search;
begin
  FPaths.Clear;
  FileSearcher1.RootDir := TPath.GetDocumentsPath;
  FileSearcher1.Execute;
end;

end.
Und jetzt das MainForm, auf dem der Frame liegt:
Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uTestFrame, Vcl.StdCtrls;

type
  TfrmTestMain = class(TForm)
    SearchFrame1: TSearchFrame;
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure DoFertig(Sender: TObject);
  public
    { Public-Deklarationen }
  end;

var
  frmTestMain: TfrmTestMain;

implementation

{$R *.dfm}

procedure TfrmTestMain.Button1Click(Sender: TObject);
begin
  SearchFrame1.Search;
end;

procedure TfrmTestMain.DoFertig(Sender: TObject);
begin
  Memo1.Lines.Assign(SearchFrame1.PathList);
end;

procedure TfrmTestMain.FormCreate(Sender: TObject);
begin
  SearchFrame1.OnFertig := DoFertig;
end;

end.
Es gibt nur eine Instanz der Liste, und ich weiß, wo sie ist. Von außen kann ich aber trotzdem darauf zugreifen und sie anderen Listen zuweisen. Wo ist da jetzt das Problem?

haentschman 9. Mai 2017 18:29

AW: Gleiche Variablen-Namen
 
Hallöle...:P

1. Verabschiede dich von den 2 Instanzen. :warn:
2. Die File Liste sollte da liegen wo das Event ausgelöst wird. :warn: Der Frame wird gefragt...der Frame anwortet über ein Event.
3. Das Event gibt nur einer raus. Das andere sind Prozeduren der Datamodule die die Informationen nacheinander bekommen. (Self und DMLSQLiteUnit)
4. Die Units müssen sich nicht alle gleichzeitig kennen. Die Main Unit sollte die einzige sein die alle kennt. Die Unit(TPathFinderFrame) gibt nur das Event raus fertsch... Wohin ist dem Frame wurscht. usw... Nimm mal die Units aus der uses implmentation in den interface Teil. Da siehst du die zirkulären Referenzen.

Die Fehler: (keine Garantie für Vollständigkeit)
Delphi-Quellcode:
  private{ Private-Deklarationen }
    FFileList: TStringlist;
    //FPathlist: TStringlist; wird nun im Frame instanziert ... nur eine Instanz!
  public{ Public-Deklarationen }
    procedure FillPathList(Sender: TObject; const Ordner: String; const Pathlist: TStringList);
    // Sender ist nicht nötig aber nicht falsch // besserer Name (Funktion) wegen der Unterscheidung
  end;

procedure TDMLSQLite.DataModuleCreate(Sender: TObject);
begin
  FFileList := TStringlist.Create;
  //FPathlist := TStringlist.Create;
end;

procedure TDMLSQLite.DataModuleDestroy(Sender: TObject);
begin
  FFileList.Free;
  //FPathlist.Free;
end;

procedure TDMLSQLite.FillPathList(Sender: TObject; const Ordner: String; const Pathlist: TStringList); // Das F kann weg! 
begin
//  FFileList.AddStrings (FPathlist);
  // SQLiteTestMain.LBxPathlist.Items.AddStrings(FPathlist); // wird im Eventhandler erledigt
end;
Delphi-Quellcode:
TPathListEvent = procedure(Sender:TObject; const Ordner: String; const Pathlist: TStringList) of Object; // das F kann weg
...
  private // !!!!
    FPathlist: TStringlist;
  ...
  public
    property PathList : TStringList read FPathlist write FPathlist;
    property OnPathListEvent: TPathListEvent read FOnPathListEvent write FOnPathListEvent;
...
constructor TPathFinderFrame.Create(AOwner: TComponent);
...
 FPathlist := TStringlist.Create; // unter den anderen gefunden :-)
...
end;
destructor TPathFinderFrame.Destroy;
begin
  FPathlist.Free;
end;
Delphi-Quellcode:
  private { Private-Deklarationen }
    ...
    procedure DoPathListEvent(Sender: TObject; const Ordner: String; const Pathlist: TStringList); // der eigentliche Eventhandler
    ...
  end;
...
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject; const Ordner: String; const Pathlist: TStringList);
begin
  Self.EdiFolder.Clear;
  Self.EdiFolder.Text := FOrdner;
  Self.LBxPathlist.Clear;
...
  Self.LBxPathlist.Items.AddStrings(Pathlist); // das ist die eigene Liste ???
  Self.Pathlist.Assign(Pathlist); // die eigene Liste
  DMLSQLite.FillPathList(Self, Ordner, Pathlist); // Name wegen der Übesicht was wo geändert
end;
...
procedure TSQLiteTestMain.FormCreate(Sender: TObject);
begin
  PathFinderFrame1.OnPathListEvent := DoPathListEvent; // Handler in der eigenen Unit.
end;

Delbor 10. Mai 2017 01:38

AW: Gleiche Variablen-Namen
 
Hi zusammen

Ich habe - zumindest ansatzweise - eine Lösung gefunden:

Delphi-Quellcode:
procedure TDMLSQLite.DoPathListEvent(Sender: TObject;
  const Ordner: String; const Pathlist: TStringList);
  var i : integer;
begin
// Self.Pathlist.Assign(Pathlist);//<<=== Das hat nie, in welcher Form auch immer, funktioniert
  for i := 0 to Pathlist.Count -1 do
    begin
      SQLiteTestMain.LBxPathlist.Items.Add(Pathlist[i]) //<<== Das steht so nur mal als Test da, funktioniert aber
    end;
end;
Wie ich im Verlauf der Beiträge erwähnt habe, war der Sinn der 2. Liste im Datenmodul ja eben der, das ich da durch diese Liste Iterieren und die Bilder auf der Festplatte so in die DB schreiben kann.
Auf die Idee aber, dass ich an dieser Stelle durch die Liste des Pathframes iterieren könnte, bin ich nur sehr spät gekommen.
So, wie die Schleife dasteht, demonstriert sie nur die Funktion. Im Endeffekt sollen die hier gefundenen Bilder in die Datenbank geschrieben werden.

Vielen Dank für eure Bemühungen!

Gruss
Delbor

DeddyH 10. Mai 2017 06:23

AW: Gleiche Variablen-Namen
 
Zitat:

Zitat von Delbor (Beitrag 1370836)
Auf die Idee aber, dass ich an dieser Stelle durch die Liste des Pathframes iterieren könnte, bin ich nur sehr spät gekommen.

Das hatten wir aber doch schon mehrfach gesagt.

Delbor 10. Mai 2017 07:29

AW: Gleiche Variablen-Namen
 
Hi DeddyH

Zitat:

Das hatten wir aber doch schon mehrfach gesagt.
Dann hab ich das schlicht und einfach überlesen oder falsch interpretiert. Andrerseits deutete schon darauf hin, dass der Listeninhalt an eine Listbox oder was auch immer übergeben werden kann, dass das möglich ist - wie auch immer, was mich letzten Endes blockiert hat, ist mir momentan nicht wirklich klar.

Gruss
Delbor

haentschman 10. Mai 2017 07:29

AW: Gleiche Variablen-Namen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...:P
Hallo Delbor. Du hast in deinen Programmen ein Chaos mit den Informationswegen. :?
Zitat:

Vielleicht wäre es zielführender, Delphi erstmal links liegen zu lassen, Dich mit Bleistift und Papier hinzusetzen und einmal genau zu planen, wer was erzeugen/freigeben soll und wer worauf Zugriff haben muss.
Der Tipp war nicht böse gemeint sondern imho angebracht. :wink:
Zitat:

Sorry, aber Papier und Bleistift meckern nicht.
...das du das so abtust. :roll:

Siehe Papier:
So sollte es ungefähr aussehen. :thumb: Da wärst du von selbst drauf gekommen das 2 Instanzen keinen Sinn machen, und wer wem die Informationen gibt. Die Unit TDMLSQLite kennt die PathFinder Unit nicht. Die bekommt von außen die Liste. Wo die herkommt, Festplatte, Datenbank, Omas Küchenschrank (den mag ich :stupid:), ist der Unit wurscht.

Mache nur im NOTFALLE die uses im implementation Teil. :warn: Ich empfinde das als Fehler, daß das in den implementation Teil müßte. :? Das ist der erste Schritt um die "Abhängigkeiten" aufzulösen und das Design zu überdenken. Erst Recht bei komplexen Anwendungen muß man seine Informationswege kennen! :warn:


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:17 Uhr.
Seite 6 von 7   « Erste     456 7      

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