Delphi-PRAXiS
Seite 2 von 2     12   

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)

Delbor 9. Mai 2017 16:43

AW: Gleiche Variablen-Namen
 
Hi Haentschman
Die ist:
Delphi-Quellcode:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
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.

Gruss
Delbor

haentschman 9. Mai 2017 16:47

AW: Gleiche Variablen-Namen
 
:gruebel: Fehlermeldung?

IST Stand:
Event:
Delphi-Quellcode:
TPathListEvent = procedure(Sender:TObject; const FOrdner: String; const FPathlist: TStringList) of Object;
.
EventHandler: ?
Auslösen des Events: ?

siehe Beispiel Aviator...http://www.delphipraxis.net/1370782-post40.html

Delbor 9. Mai 2017 16:55

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

Delbor 9. Mai 2017 17:01

AW: Gleiche Variablen-Namen
 
Hi Haentschman

Der Auslöser des Events ist, wenn der Filesearcher seine Dateisuche beendet hat:
Delphi-Quellcode:
procedure TPathFinderFrame.FileSearcher1ExecuteComplete(Sender: TObject);
begin
  if Assigned(FCurrentNode) then
    FCurrentNode.Expand(false);
  if Assigned(FOnPathListEvent) then
    FOnPathListEvent(Sender, FOrdner, FPathlist);
end;
Der Eventhandler:
Delphi-Quellcode:
procedure TDMLSQLite.DoPathListEvent(Sender: TObject;
  const FOrdner: String; const FPathlist: TStringList);
begin
//  FFileList.AddStrings (FPathlist);
  SQLiteTestMain.LBxPathlist.Items.AddStrings(FPathlist);
end;
Gruss
Delbor

haentschman 9. Mai 2017 17:03

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:

Aviator 9. Mai 2017 17:06

AW: Gleiche Variablen-Namen
 
Zitat:

Zitat von haentschman (Beitrag 1370787)
Ich tippe darauf das beim Absenden des Events FPathlist: TStringList (das F kommt aus dem Original) nil (0x0000007c) ist. :wink:

Wenn das Objekt nil ist, dann wäre die Adresse eher 0x00000000. Ich kann mich aber auch täuschen. Nur kenne ich es nur so, dass die Adresse dann 0x00000000 wäre.

EDIT: @Delbor: Hast du meinen Post #40 gesehen. Dort habe ich mal ein Minimalbeispiel gemacht, wie so ein Event erstellt werden kann.

haentschman 9. Mai 2017 17:14

AW: Gleiche Variablen-Namen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallöle...:P
Zitat:

Wenn das Objekt nil ist, dann wäre die Adresse eher 0x00000000.
Zitat:

Ich kann mich aber auch täuschen
...ist leider so. :wink: Auch wenn das Objekt nil ist kannst du auch Adressen > 0 haben. In der Regel sind aber die Adressen im niedrigem 2 stelligem Bereich. :wink:

Aviator 9. Mai 2017 17:21

AW: Gleiche Variablen-Namen
 
Zitat:

Zitat von haentschman (Beitrag 1370789)
Hallöle...:P
Zitat:

Wenn das Objekt nil ist, dann wäre die Adresse eher 0x00000000.
Zitat:

Ich kann mich aber auch täuschen
...ist leider so. :wink: Auch wenn das Objekt nil ist kannst du auch Adressen > 0 haben. In der Regel sind aber die Adressen im niedrigem 2 stelligem Bereich. :wink:

Ja ok. In deinem Fall (Screenshot) ist es allerdings ein nicht initialisiertes Objekt. Eine Variable, der explizit nil zugewiesen wurde, ist eigentlich immer an 0x00000000. Aber es kann ja gut sein, dass es bei ihm auch so ist.

Einigen wir uns einfach auf eine nicht (mehr) existierende Objekt Instanz bzw. einen dangling Pointer. :stupid: :mrgreen:

haentschman 9. Mai 2017 17:25

AW: Gleiche Variablen-Namen
 
:P
Zitat:

dem explizit nil zugewiesen wurde, .... Aber es kann ja gut sein, dass es bei ihm auch so ist.
... da tippe ich auch drauf. :wink: Solange wir den QT nicht gesehen haben ist alles nur raten. :?
Zitat:

Einigen wir uns einfach auf eine nicht (mehr) existierende Objekt Instanz bzw. einen dangling Pointer.
... jawoll ja. :thumb:

Delbor 9. Mai 2017 17:26

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:
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;
Und das entspricht meinen Deklarationen.

Gruss
Delbor

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:

Delbor 10. Mai 2017 08:20

AW: Gleiche Variablen-Namen
 
Hi Haentschman

Zitat:
Zitat:

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.
Zitat:
Zitat:

Sorry, aber Papier und Bleistift meckern nicht.
...das du das so abtust.
Sorry, ich wollte dies nicht einfach so abtun. Irgendwie hab ich die Vorstellung, auf Papier meinen Code hinzuschreiben und dann zu erwarten, dass der auch so funktioniert.
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

haentschman 10. Mai 2017 08:26

AW: Gleiche Variablen-Namen
 
Hallöle...:P
Das Malen des Schemas da 2 Minuten gedauert. :thumb:
Zitat:

Nur würde ich persönlich dafür nicht Bleistift und Papier vewenden, sondern im einfachsten Fall ein Grafikproggramm
...da sage ich nur KISS. :stupid: Die einfachsten Sachen funkionieren am besten.
Zitat:

sowas mit den Modellierungstools von Delphi zu machen
...da ist Vorsicht geboten. :warn: Für die erste Skizze ist es nicht geeignet. Jede "Modelierung" wirkt sich auf den Quelltext aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:55 Uhr.
Seite 2 von 2     12   

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