AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gleiche Variablen-Namen

Ein Thema von Delbor · begonnen am 8. Mai 2017 · letzter Beitrag vom 10. Mai 2017
Antwort Antwort
Seite 6 von 7   « Erste     456 7      
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#51

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 17:29
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. Bitte... wenigstens die 2 Units mit dem Eventhander und dem Event.

Geändert von haentschman ( 9. Mai 2017 um 17:33 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#52

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 17:40
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
Angehängte Dateien
Dateityp: pas DMLSQLiteUnit.pas (1,7 KB, 2x aufgerufen)
Dateityp: pas PathFinderFrameUnit.pas (7,3 KB, 3x aufgerufen)
Dateityp: pas SQLiteTestMainUnit.pas (4,0 KB, 2x aufgerufen)
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#53

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 17:48
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#54

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 18:06
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#55

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 18:27
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#56

AW: Gleiche Variablen-Namen

  Alt 9. Mai 2017, 18:29
Hallöle...

1. Verabschiede dich von den 2 Instanzen.
2. Die File Liste sollte da liegen wo das Event ausgelöst wird. 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;

Geändert von haentschman ( 9. Mai 2017 um 18:45 Uhr)
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#57

AW: Gleiche Variablen-Namen

  Alt 10. Mai 2017, 01:38
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#58

AW: Gleiche Variablen-Namen

  Alt 10. Mai 2017, 06:23
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#59

AW: Gleiche Variablen-Namen

  Alt 10. Mai 2017, 07:29
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.297 Beiträge
 
Delphi 12 Athens
 
#60

AW: Gleiche Variablen-Namen

  Alt 10. Mai 2017, 07:29
Moin...
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.
Zitat:
Sorry, aber Papier und Bleistift meckern nicht.
...das du das so abtust.

Siehe Papier:
So sollte es ungefähr aussehen. 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 ), ist der Unit wurscht.

Mache nur im NOTFALLE die uses im implementation Teil. 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!
Miniaturansicht angehängter Grafiken
blatt0001.jpg  

Geändert von haentschman (10. Mai 2017 um 07:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 7   « Erste     456 7      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 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