![]() |
AW: Gleiche Variablen-Namen
Zitat:
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. |
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 |
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?
|
AW: Gleiche Variablen-Namen
Hi DeddyH
Wie kommst du darauf, dass die einzige Instanz der Liste im Datenmodul erzeugt wird?
Delphi-Quellcode:
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.
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; Gruss Delbor |
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:
Und jetzt das MainForm, auf dem der Frame liegt:
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.
Delphi-Quellcode:
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?
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. |
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; |
AW: Gleiche Variablen-Namen
Hi zusammen
Ich habe - zumindest ansatzweise - eine Lösung gefunden:
Delphi-Quellcode:
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.
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; 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 |
AW: Gleiche Variablen-Namen
Zitat:
|
AW: Gleiche Variablen-Namen
Hi DeddyH
Zitat:
Gruss Delbor |
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:
Zitat:
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 06:46 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