AW: Gleiche Variablen-Namen
Hi Haentschman
Die ist:
Delphi-Quellcode:
Und wie gesagt: eine Gui-Ausgabe funktioniert nach wie vor tadellos. Entweder; es liegt an der Empfängermethode oder schlicht daran, dass ich versuche, Objekte zu übergeben.
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
Gruss Delbor |
AW: Gleiche Variablen-Namen
:gruebel: Fehlermeldung?
IST Stand: Event:
Delphi-Quellcode:
EventHandler: ?
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
. Auslösen des Events: ? siehe Beispiel Aviator...http://www.delphipraxis.net/1370782-post40.html |
AW: Gleiche Variablen-Namen
Hi Heantschman
Ups! ich dachte, ich hätte die monströsen Dinger schon gepostet, konnte sie allerdings jetzt gerade nicht wiederfinden. Die sind: --------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x007e007d: read of address 0x0000007c' aufgetreten. --------------------------- und --------------------------- Im Projekt SQLiteTestProject.exe ist eine Exception der Klasse EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 007E007D in Modul 'SQLiteTestProject.exe'. Lesen von Adresse 0000007C' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe --------------------------- Ich hab in der Zeile, in der die Zuweisung stattfindet, einen Haltepunkt, die erste Fehlermeldung erscheint, wennn ich mit F8 weiterzusteppen versuche, und die zweite, wenn ich die erste mit Fortsetzen weggeklickt habe. Gruss Delbor |
AW: Gleiche Variablen-Namen
Hi Haentschman
Der Auslöser des Events ist, wenn der Filesearcher seine Dateisuche beendet hat:
Delphi-Quellcode:
Der Eventhandler:
procedure TPathFinderFrame.FileSearcher1ExecuteComplete(Sender: TObject);
begin if Assigned(FCurrentNode) then FCurrentNode.Expand(false); if Assigned(FOnPathListEvent) then FOnPathListEvent(Sender, FOrdner, FPathlist); end;
Delphi-Quellcode:
Gruss
procedure TDMLSQLite.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin // FFileList.AddStrings (FPathlist); SQLiteTestMain.LBxPathlist.Items.AddStrings(FPathlist); end; Delbor |
AW: Gleiche Variablen-Namen
Hänge das Testprojekt mal an... Bevor wir weiter raten. :wink:
Ich tippe darauf das beim Absenden des Events FPathlist: TStringList (das F kommt aus dem Original) nil (0x0000007c) ist. :wink: Wo erzeugst du die FPathlist: TStringList Instanz? :gruebel: |
AW: Gleiche Variablen-Namen
Zitat:
EDIT: @Delbor: Hast du meinen Post #40 gesehen. Dort habe ich mal ein Minimalbeispiel gemacht, wie so ein Event erstellt werden kann. |
AW: Gleiche Variablen-Namen
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöle...:P
Zitat:
Zitat:
|
AW: Gleiche Variablen-Namen
Zitat:
Einigen wir uns einfach auf eine nicht (mehr) existierende Objekt Instanz bzw. einen dangling Pointer. :stupid: :mrgreen: |
AW: Gleiche Variablen-Namen
:P
Zitat:
Zitat:
|
AW: Gleiche Variablen-Namen
Hi Aviator
Ja, den hab ich gesehen, zwar erst kürzlich, aber... Und eigentlich machst du da genau das, was ich versucht habe: Im Eventhandler einen andern Bezeichner verwenden, als bei der Tip-Deklaration. Wobei ich gerade sehe, dass du die abweichenden Variablen schon beim abfeuern verwendest; jene im Eventhandler sind eigentlich schon die zweite abweichende Variablengruppe, da sie anderswo deklariert sind.
Delphi-Quellcode:
Und das entspricht meinen Deklarationen.
TMyEvent = procedure(Street: string; Country: string) of object;
... if Assigned(FOnReport) then FOnReport(tmpStreet, tmpCountry); // Hier wird das Event ausgelöst ... // EventHandler für TMyClass.OnReport // Hier könnten die Parameter Bezeichner sogar schon von der Event-Deklaration abweichen // Wichtig sind die Datentypen. Die müssen in Reihenfolge und Typ mit der Event-Deklaration übereinstimmen procedure TForm1.ReportHandler(Street: string; Country: string); begin ShowMessage(Street + sLineBreak + Country); end; Gruss Delbor |
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: |
AW: Gleiche Variablen-Namen
Hi Haentschman
Zitat: Zitat:
Ein Quasi-Schema zu zeichnen, wie du das in deinem Anhang zeigst, macht aber durchaus Sinn. Nur würde ich persönlich dafür nicht Bleistift und Papier vewenden, sondern im einfachsten Fall ein Grafikproggramm wie zum Beispiel Dia oder auch LibreOfficeDraw. Die wohl raffinerteste Art wäre es wohl, sowas mit den Modellierungstools von Delphi zu machen - ich bin zwar noch nicht dazu gekomen, mich da wirklich einzuarbeiten, aber wenn ich das richtig verstanden habe, meckern die auch schon mal, bevor Code damit erstellt wird. Und natürlich erst recht, wenn Code erstellt werden soll. Gruss Delbor |
AW: Gleiche Variablen-Namen
Hallöle...:P
Das Malen des Schemas da 2 Minuten gedauert. :thumb: Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 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