Delphi-Version: XE8
Gleiche Variablen-Namen
Hi zusammen
Zu Beginn: die bewusste Variable ist ein Feld vom Tip TStringlist und hat überall den selben Namen: FPathlist. Da (und solange) es sich dabei um ein privates Feld handelt, ist das im Grunde kein Problem. Hier feuere ich einen Event und übergebe dabei unter anderem FPathlist:
Delphi-Quellcode:
Die auskommentierten Zeilen zeigen schon meinen Lösungsansatz, indem ich vor dem Abfeuern lokale Variaben einführe. Das Problem zeigt sich beim Empfänger der FPathlist(wenn es denn wirklich eins ist):
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; // LPathList.AddStrings(LPathlist); // LOrdner := FOrdner; FOnPathListEvent(Sender, FOrdner, FPathlist); end; end;
Delphi-Quellcode:
Wie der Klassenname der Form schon sagt, handelt es sich hier um eine Testanwendung. Wobei noch sehr simpel ist, was hier geschieht - die übergebenen Werte werden einfach ausgegeben.
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; Weniger simpel ist (oder scheint mir), was eigentlich geschehen soll: Der Übergabeparameter FPathlist soll an ein privates Feld FPathlist der Form TSQLiteTestMain übergeben werden, also FPathlist wird an FPathlist übergeben. Mich würde erstaunen, wenn dies keine Probleme macht, auch wenn das eine eine Konstante ist, das andere nicht. Im Gegensatz von Funktionsparametern müssen Eventparameter offenbar nicht nur an der selben Position stehen, sondern auch gleich heissen. Meine Frage ist also: Gibt oder kann es Probleme geben, wenn ein Eventparameter an ein gleichnamiges Feld übergeben wird, wie ich vermute? Gruss Delbor |
AW: Gleiche Variablen-Namen
Probleme gibt es wohl mit der Ownership - sprich, wer gibt die Instanz frei.
Aber warum genau willst du denn den FPathList-Parameter an das lokale Feld übergeben? Was willst du damit bewirken? |
AW: Gleiche Variablen-Namen
Ich mache das in etwa so
Pseudocode
Delphi-Quellcode:
Auf diese Art und Weise schicke ich eine bei Programmstart erstellte Variableninstanz von Ini bis an die Stelle an der das Programm komplett geladen ist.
prozedur1
var Variableninstanz Typ begin Variableninstanz erstellen prozedur2(variableninstanz) end prozedur2 (variableninstanz: Typ = nil) var gebeinstanzfrei Boolean begin gebeinstanzfrei := False if variableninstanz = nil begin variableninstanz erstellen gebeinstanzfrei := True end ..... if gebeinstanzfrei then variableninstanz.Free end Verwendet wird diese Instanz von einer Hand voll Prozeduren. Eine globale Instanz kommt nicht in Frage, das immer immer neu-erstellen in jeder Prozedur ebenfalls nicht. |
AW: Gleiche Variablen-Namen
Hi Uwe Raabe
Zitat:
Verarbeitet wird diese Liste allerdings ausserhalb: aus den enthaltenen Pfaden sollen Bilddateien geladen werden und anschliessend in eine SQLite-DB geschrieben werden. Zitat:
Gruss Delbor |
AW: Gleiche Variablen-Namen
Hallo,
Zitat:
|
AW: Gleiche Variablen-Namen
Hi SneakyBagels
Tönt nicht schlecht - auf diese Weise hätte ich genau eine Instanz meiner FPathlist. Allerdings hat das in meinem Fall einen kleinen Haken: FPathlist übernimmt in meinem PathfinderFrame die von DeddyH'sTFileSearch gefundenen Pfade:
Delphi-Quellcode:
AddNewNode wird das erste mal aus TPathFinderFrame.Create aus aufgerufen, um die Ordner der ersten Ebene darzustellen (Laufwerke). Danach erfolgen die Aufrufe immer aus den Expanding-Events des Treeviews. Denen kann ich die Liste nicht per Aufruf übergeben, da diese per Mousedown ausgelöst werden (wenn der User einen Ordner anklickt). Und bei jedem Klick eine neue Instanz erstellen, dürfte auch nicht wirklich das Wahre sein.
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; Gruss Delbor |
AW: Gleiche Variablen-Namen
Danke für das Lob. Hätte eigentlich gedacht du erschlägst mich wegen dieser zusammengebastelten Lösung welche alles andere ist als OOP.
|
AW: Gleiche Variablen-Namen
Hi Hoika
Zitat:
Zitat:
Klar, ich könnte so aus jeder Unit mit der Framevariable arbeiten. Aber sobald sich in einem Projekt keine PathfinderFrame befindet, muss ich in allen Units, die darauf zugreifen, dies unterbinden - das heisst, ich müsste alle diese Units bearbeiten. Nach dem Schichtenmodell kann zwar die GUI auf die Logikschicht, zum Beispiel ein Datenmoudul, zugreifen, aber nicht umgekehrt. Das erspart bei Änderungen eine Menge arbeit. Gruss Delbor |
AW: Gleiche Variablen-Namen
Wenn der FileSearcher und am besten auch die ihm zugewiesenen EventHandler zum Frame gehören, würde ich die Stringliste auch als privates Feld (und ggf. Public ReadOnly-Property) des Frames deklarieren, dann ist alles schön beisammen und man kommt nicht durcheinander.
|
AW: Gleiche Variablen-Namen
Hi SneakyBagels
Zitat:
Allerdings habe ich deinen Beitrag nicht wirklich ganz verstanden. Zitat:
Zitat:
Das Erstellen (und zerstören!) von lokalen Instanzen in einer Prozedur wird in vielen Beispielen angewendet und macht durchaus Sinn, ist aber nicht in jedem Fall Zielführend. Gruss Delbor |
AW: Gleiche Variablen-Namen
Hi DeddyH
Zitat:
So, wie ich Uwe Raabe aber verstanden habe, kann ich den FPathlist-Parameter des Frames problemlos an das private Feld FPathlist der Mainform zuweisen. Ein vorgehen, dass mich auch in späteren Zeiten beim lesen meines Codes wohl immer etwas irritieren wird. Von daher wäre die Lösung mit dem Property wohl etwas klarer. Gruss Delbor |
AW: Gleiche Variablen-Namen
Also gibt es auch im Mainform eine entsprechende Liste? Dann ist eine 2. Instanz vermutlich Quatsch, da Du mit einer Public (jetzt aber nicht mehr ReadOnly) Property dasselbe erreichen kannst. Ich tippe hier am Tablet, sonst hätte ich mal schnell etwas Beispielcode geschrieben, so ist mir das aber zu mühsam.
|
AW: Gleiche Variablen-Namen
Hallo,
Zitat:
dann bleiben wir beim OOP) die sowohl Main als auch der Frame benutzt. Ansonsten ist das hier mit Kanonen auf Spatzen schießen. Zitat:
|
AW: Gleiche Variablen-Namen
Das ist aber doch keine Raketentechnik.
Delphi-Quellcode:
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.
type
TDingensFrame = class(TFrame) private FPathList: TStrings; ... public property PathList: TStrings read FPathList write FPathList; ... procedure TDingensFrame.SomeEvent(Param: string); begin if Assigned(FPathList) then FPathList.Add(Param); end; |
AW: Gleiche Variablen-Namen
Zitat:
Besser wäre es, du würdest immer nur die Inhalte von einer StringList in die andere kopieren. Dann hast du auch keine Probleme. Möglicherweise musst du dazu aber noch an deiner Programmstruktur basteln. |
AW: Gleiche Variablen-Namen
Hi DeddyH
Zitat:
Diese Procedure wird ausgeführt, wenn der Filesearcher einen Pfad gefunden hat:
Delphi-Quellcode:
Das da gefeuerte Event wird im PathfinderFrame abgefangen:
procedure TSearchThread.DoOnMatchFound;
begin if Assigned(FOnMatchFound) then begin Lock; try FOnMatchFound(self, FPath, FSearchRec); finally UnLock; end; end; end;
Delphi-Quellcode:
Und AddNewNode fügt dem Treeview einen neuen Knoten hinzu sowie FPathlist einen neuen String:
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;
Delphi-Quellcode:
In FPathlist stehen abschliessend alle in einem bestimmten Ordner gefundenen Dateien. Ausgelöst wird dder Event, wenn der Filesearcher seine Suche beendet hat:
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;
Delphi-Quellcode:
Der Eventtyp:
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;
Delphi-Quellcode:
Wenn ich das richtig verstanden habe, müsste ich diesen Event jedesmal, wenn ein Pfad gefunden wird, feuern:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
Delphi-Quellcode:
Dieser Beispielcode erinnert mich allerdings sehr an diese Diskussion.
procedure TDingensFrame.SomeEvent(Param: string);
begin if Assigned(FPathList) then FPathList.Add(Param); end; 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:
Und in TDingensMainForm:
procedure TDingensFrame.SomeEvent(Pfad: string);
begin if Assigned(FPfad) then FPfad(Pfad); end; 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 |
AW: Gleiche Variablen-Namen
Hi Uwe Raabe
Zitat:
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:
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:
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;
Delphi-Quellcode:
Und genau das dürfte unmöglich sein. Es sei denn...:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin FPathlist.AddStrings(FPathlist); end;
Delphi-Quellcode:
Allerdings müsste so auch der Eventtyp angepasst werden: Statt
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin Self.FPathlist.AddStrings(PathFinderFrame.FPathlist); end;
Delphi-Quellcode:
müsste dies heissen:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
Delphi-Quellcode:
Allerdings - ob sowas überhaupt möglich ist, ist mir nicht bekannt; ich denke eher nicht.
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const PathFinderFrame.FPathlist: TStringList) of Object;
Wobei dann tatsächlich mein erster ansatz übrig bliebe:
Delphi-Quellcode:
und in der Mainform:
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;
Delphi-Quellcode:
Gruss
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
const FOrdner: String; const LPathlist: TStringList); begin FPathlist.AddStrings(LPathlist); end; Delbor |
AW: Gleiche Variablen-Namen
Und was spricht gegen dies?
Delphi-Quellcode:
procedure TSQLiteTestMain.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin Self.FPathlist.Assign(FPathlist); end; |
AW: Gleiche Variablen-Namen
Jetzt muss ich aber mal nachhaken: wo genau wird diese Liste benötigt/angezeigt?
|
AW: Gleiche Variablen-Namen
So wie ich das verstehe, wird die Liste im Mainform angzeigt.
Ich würde das so lösen (Code frei getippt):
Delphi-Quellcode:
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.
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; Eine Instanz der Stringliste und eine Übergabe ist nicht notwendig. |
AW: Gleiche Variablen-Namen
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 |
AW: Gleiche Variablen-Namen
Und wozu brauchst Du dann eine 2. Instanz? Ich habe immer öfter den Eindruck, Du machst es Dir unnötig schwer.
|
AW: Gleiche Variablen-Namen
@DeddyH
Jap...deshalb ja auch mein Lösungsansatz. |
AW: Gleiche Variablen-Namen
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 |
AW: Gleiche Variablen-Namen
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:
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 |
AW: Gleiche Variablen-Namen
Hi zusammen
@DeddyH: Zitat:
Zitat:
Aber jetzt fällt mir auf:
Delphi-Quellcode:
Durch das Property Pathlist lässt sich in einer Mainform oder einem Datenmodul genauso iterieren wie durch eine private Liste. Das widerspricht einzig etwas dem Schichtenmodell, wonach zwar die GUI (PathFinderFrame, Mainform) nach unten (Datenmodul) zugreifen sollen, nicht aber umgekehrt. Technisch ist es durchaus möglich.
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; Gruss Delbor |
AW: Gleiche Variablen-Namen
Hi zusammen
Eben hab ich versucht, Uwe Raabes Vorschlag umzusetzen. Der Empfänger des Events befindet sich bislang in der Mainform, und so wolllte ich ihn ins Datenmodul verlegen. Dazu kopierte ich die Prozedur in der Mainform, fügte sie im Datenmodul ein und liess sie per Shift/Control/C deklarieren. Anschliessend versuchte ich, die Variable FPathlist per Refactoring als privates Feld deklarieren zu lassen. Da hat Delphi aber ganz schön gemeckert! Wie, das zeigt der Anhang. Ich habe dann mal versucht, das Feld von Hand zu deklarieren. Das schien OK. So hab ich in der Empfängerprozedur einen Haltepunkt gesetzt. Aber als ich von da weitersteppen wollte, meckerte Delphi Gleich zweimal: Zitat:
Zitat:
Delphi-Quellcode:
So, wie ich das jetzt sehe, bleiben also 2 Lösungen:
procedure TDMLSQLite.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin Self.FPathlist.Assign(FPathlist); end;
Gruss Delbor |
AW: Gleiche Variablen-Namen
Zitat:
Delphi-Quellcode:
class TDMLSQLite = ... private FPathlist: TStringList; end; procedure TDMLSQLite.DoPathListEvent(Sender: TObject; const AOrdner: String; const APathlist: TStringList); var Pathlist: TStringList begin FPathlist.Assign(APathlist); end; |
AW: Gleiche Variablen-Namen
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. Ansonsten verschlimmbesserst Du Dein Programm am Ende immer weiter, bis gar nichts mehr funktioniert.
|
AW: Gleiche Variablen-Namen
Zitat:
|
AW: Gleiche Variablen-Namen
Hi zusammen
@DeddyH: Zitat:
Klar, ich hätte von Anfang an sehen können: Da sind zwei gleichnamige Variablen, die einander zugewiesen werden sollen. Mein Ansatz war ja, vor dem Abfeuern des Events eine weitere Stringliste anderen Namens zu erzeugen und die dann an die Datenmodul.Stringliste zuzuweisen. Nur hätte ich dann für den gleichen Inhalt nicht nur 2 Instanzen der Liste gehabt, sondern temporär deren drei. @bra: Zitat:
Der Sender:
Delphi-Quellcode:
und der Empfänger:
if Assigned(FOnPathListEvent) then
FOnPathListEvent(Sender, FOrdner, FPathlist);
Delphi-Quellcode:
Das erste, was ich versucht habe, war eben hier den Konstantenparameter anders zu benennen. Delphi meckerte das als unterschiedliche Deklaration an. Während ich dies schreibe, fällt mir auf, dass ich nicht versucht habe, die Liste nicht als Konstante zu übergeben. Aber das ändert an der Unterschiedlichen Deklaration nichts.
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); // Self.FPathlist.Assign(FPathlist); end; Wobei FPathList im PathfinderFrame zum Bleistift FFileList sein könnte. So sollte sich eine Kollision bei der Übergabe vermeiden lassen. Gruss Delbor |
AW: Gleiche Variablen-Namen
Zitat:
Da die F-Notation schon von Feldern besetzt ist, bietet sich bei Parametern die A-Notation an - ist aber immer noch Geschmackssache. |
AW: Gleiche Variablen-Namen
Zitat:
|
AW: Gleiche Variablen-Namen
Auf mich will ja keiner hören... seufz.
Sherlock |
AW: Gleiche Variablen-Namen
[OT]
:P Patient: Alle ignorieren mich! Arzt: Der nächste bitte... Willkommen im Club. :zwinker: [/OT] Zitat:
|
AW: Gleiche Variablen-Namen
Hi zusammen
@ Jumpy Zitat:
Ich habe mich hierauf gestützt - von Namensgleicheit ist hier nicht die Rede. Ein Zitat daraus: Zitat:
Als ich versuchte, den Namen des übergeben Listen-Parameters zu ändern und Delphi meckerte wegen unterschiedlicher Deklaration, dachte ich allerdings an die Deklaration des Events und nicht an diejenige der Empfängerroutine. Und da müssen in der Deklaration und in der Implementierung nicht nur Reihenfolge und Tip stimmen, sondern auch die Parameterbezeichner. @Uwe Raabe Zitat:
Delphi-Quellcode:
Natürlich müssen die Deklarationen jeder der beiden Methoden dabei gleich lauten und die Reihenfolge und Typen der Parameter übereinstimmen.
procedure Tfoo.xxx
begin GetNamen(Strasse, Hausnummer) end function Getnamen(Street, Number) Begin End End; Interessant ist jetzt: Im Datenmodul Heisst die Liste jetzt anders. Trotzdem gibts die beiden schon gepostetn Fehlermeldungen. Andrerseits funktioniert folgendes problemlos:
Delphi-Quellcode:
@Sherlock:
procedure TDMLSQLite.DoPathListEvent(Sender: TObject;
const FOrdner: String; const FPathlist: TStringList); begin // FFileList.AddStrings (FPathlist); //<<=== löst die bekannten Fehlermeldungen aus SQLiteTestMain.LBxPathlist.Items.AddStrings(FPathlist); //<<== Kein Problem end; Zitat:
Gruss Delbor |
AW: Gleiche Variablen-Namen
Hallöle...8-)
Zitat:
Schreib mal die Eventdeklaration. |
AW: Gleiche Variablen-Namen
Hi Sherlock
Zitat:
Nenne ich den übergebenen ListenParameter im Empfänger AList, muss er auch bei der Eventdeklaration so heissen. Ich habe im Frame die Deklaration der Liste mal probeweise nach Public verschoben. Das hatte jedoch keine Auswirkungen - wenn, dann hätte ich erwartet, dass von den angesprochenen 2 Fehlermeldungen eine ausbleibt. Gruss Delbor |
AW: Gleiche Variablen-Namen
Zitat:
Über welche Fehlermeldungen reden wir? Screenshot. :wink: |
AW: Gleiche Variablen-Namen
Zitat:
Delphi-Quellcode:
type
// Deklaration des Events TMyEvent = procedure(Street: string; Country: string) of object; TMyClass = class private FOnReport: TMyEvent; public procedure DoSomethingAndReport(); property OnReport: TMyEvent read FOnReport write FOnReport; end; TForm1 = class(TForm) private procedure ReportHandler(Street: string; Country: string); end; implementation procedure TMyClass.DoSomethingAndReport(); var tmpStreet, tmpCountry: string; begin tmpStreet := GetStreet(); // Irgendeine Methode ausführen tmpStreet := GetCountry(); // Irgendeine Methode ausführen if Assigned(FOnReport) then FOnReport(tmpStreet, tmpCountry); // Hier wird das Event ausgelöst end; // 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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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