[gelöst] SelectDirectoryDialog1.Execute Anwenung friert ein

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[gelöst] SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von kralle »

Lazarus 1.6

Moin,

wenn ich ein

Code: Alles auswählen

SelectDirectoryDialog1.Execute
in meiner Anwendung nutze, dann friert die Anwendung unter Win8.1 Pro ein.
Es wird nur der Rahmen des Dialogs angezeigt, aber sonst nichts.
Bin ich wieder einmal der einzige mit diesem Problem? Im WWW habe ich nichts gefunden.

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, FileCtrl;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    SelectDirectoryDialog1: TSelectDirectoryDialog;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var Ergebnis: TStringList;
begin
   Ergebnis := TStringList.Create; // Dies ist erforderlich, bei der Verwendung dieser Klasse (bei den meisten Klassen)
  If SelectDirectoryDialog1.Execute then
     Begin
//      FindAllFiles(const SearchPath: String; SearchMask: String = ''''''; SearchSubDirs: Boolean = true):TStringList;
        If SelectDirectoryDialog1.FileName <> '' then
           begin
                Ergebnis := FindAllFiles(SelectDirectoryDialog1.FileName,'*.*', true);
                Memo1.Lines.Assign(Ergebnis);
           end;
        Ergebnis.Free; //Freigabe des, durch diese StringList-Instanz verwendeten, Speichers
     end;
end;
 
end.
 
Gruß Heiko
Zuletzt geändert von kralle am Mo 15. Aug 2016, 10:24, insgesamt 1-mal geändert.
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von Michl »

Bei Windows7 und Windows10 mit Lazarus 1.6 kann ich so ein Problem nicht sehen. Da es aber manchmal Probleme mit der Anordnung von Formularen gibt oder gab, könnte ich mir vorstellen, daß der Dialog hinter dem aktuellem Formular liegt. Könntest ja mal testen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Hide;
  if SelectDirectoryDialog1.Execute and (SelectDirectoryDialog1.FileName <> '') then
    FindAllFiles(Memo1.Lines, SelectDirectoryDialog1.FileName, '');
  Show;
end; 
PS: zwei Speicherlecks können bei deinem aktuellen Code entstehen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Ergebnis: TStringList;
begin
  Ergebnis := TStringList.Create;
  If SelectDirectoryDialog1.Execute then // wenn der Nutzer auf Abbruch klickt, wird die eben erstellte StringList nicht wieder frei gegeben
...
  end;
end;

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var Ergebnis: TStringList;
begin
  Ergebnis := TStringList.Create; // entweder dieses Createn weglassen oder ganz auf die StringList "Ergebnis" verzichten, siehe Code oben 
  If SelectDirectoryDialog1.Execute then
  Begin
...
    Ergebnis := FindAllFiles(SelectDirectoryDialog1.FileName,'*.*', true); // die zuvor erstellte StringList wird mit einer neuen StringList-Instanz überschrieben. Die alte Instanz wird zum Speicherleck.
...
  end;
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von kralle »

Moin,
Michl hat geschrieben:Bei Windows7 und Windows10 mit Lazarus 1.6 kann ich so ein Problem nicht sehen. Da es aber manchmal Probleme mit der Anordnung von Formularen gibt oder gab, könnte ich mir vorstellen, daß der Dialog hinter dem aktuellem Formular liegt. Könntest ja mal testen:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Hide;
  if SelectDirectoryDialog1.Execute and (SelectDirectoryDialog1.FileName <> '') then
    FindAllFiles(Memo1.Lines, SelectDirectoryDialog1.FileName, '');
  Show;
end; 
Also, wenn Ich Deinen Code nehme, ändert sich auch nicht (siehe Bild)

Zu den beiden Speicherlecks: Ich brauche nachher noch die Liste der gefundenen Dateien und daher wollte ich sie in eine Stringliste schreiben.

Gruß Heiko
Dateianhänge
ÖffnenDialog
ÖffnenDialog
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von Michl »

kralle hat geschrieben:Also, wenn Ich Deinen Code nehme, ändert sich auch nicht (siehe Bild)
Gehen denn andere Dialoge in Windows 8.1?
kralle hat geschrieben:Ich brauche nachher noch die Liste der gefundenen Dateien und daher wollte ich sie in eine Stringliste schreiben.
Offtopic: Eine Möglichkeit (oder das if-Statement vor dem Createn):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  Ergebnis: TStringList;
begin
  Ergebnis := TStringList.Create;
  try
    if SelectDirectoryDialog1.Execute and (SelectDirectoryDialog1.FileName <> '') then
    begin
      FindAllFiles(Ergebnis, SelectDirectoryDialog1.FileName);
      Memo1.Lines.Assign(Ergebnis);
      // hier jetzt die gewünschte Aktion mit "Ergebnis" durchführen
    end;
  finally
    Ergebnis.Free;
  end;
end; 

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von kralle »

Hallo Michl,
Michl hat geschrieben:
kralle hat geschrieben:Also, wenn Ich Deinen Code nehme, ändert sich auch nicht (siehe Bild)
Gehen denn andere Dialoge in Windows 8.1?
Also, der FileOpen-Dialog funktioniert. Andere Habe ich jetzt noch nicht probiert.
Muß ich da irgendwo so ein Manifest definieren, damit das klappt?

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von Michl »

kralle hat geschrieben:Muß ich da irgendwo so ein Manifest definieren, damit das klappt?
Nein.

Du könntest mal das Projekt vom Bugtracker http://bugs.freepascal.org/view.php?id=30449 runterladen, testen und den Hinweis hinterlassen (möglichst in einem neuen Bugreport), welche Dialoge nicht unter Windows 8.1 funktionieren. Ob es was hilft weiss ich nicht, da die Dialoge in der "Nachfolgeversion" Windows 10 funktionieren (zumindest bei mir).

Leider kann ich dir nicht weiter helfen, da ich hier kein Windows 8 habe.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1196
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: SelectDirectoryDialog1.Execute Anwenung friert ein

Beitrag von kralle »

Moin,

das Problem ist gelöst. Komponeten vom Formular gelöscht und neu platziert.
Jetzt geht es.
Warum? Keine Ahnung.

Gruß Heiko
OS: Manjaro Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Antworten