Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi OpenDialog --> Abbrechen (https://www.delphipraxis.net/13133-opendialog-abbrechen.html)

flomei 11. Dez 2003 14:48


OpenDialog --> Abbrechen
 
Hallo!
Ich habe in meinem Programm einen OpenDialog. Das öffnen der Dateien funktioniert auch ganz gut aber wenn man auf Abbrechen klickt erhalte ich eine unschöne Fehlermeldung ala 'Cannot open file ""'
Was kann man dagegen machen?

Habe folgendes probiert:
Delphi-Quellcode:
  begin
    l:= TStringList.Create;
    try
      begin
        OpenDialog.Execute;
        filename := OpenDialog.FileName;
        l.LoadFromFile(filename);
        Label1.Caption := filename; // Hier steht das Programm nach der Fehlermeldung...
      end
    except
        showmessage('Fehler aufgetreten! Evtl. Keine Datei ausgewählt!');
    end
  end;
:roll: Hab keine Ahnung wie man das abfangen könnte...

Dank im Vorraus!

MfG Florian :hi:

Tpercon 11. Dez 2003 14:50

Re: OpenDialog --> Abbrechen
 
Mal schnell umgeschrieben:
Delphi-Quellcode:
  begin
    l:= TStringList.Create;
    try
      begin
        if OpenDialog.Execute then begin
          filename := OpenDialog.FileName;
          l.LoadFromFile(filename);
          Label1.Caption := filename; // Hier steht das Programm nach der Fehlermeldung...
        end;
      end;
...
    finally
      l.Free;
    end
  end;

Robert_G 11. Dez 2003 14:59

Re: OpenDialog --> Abbrechen
 
Das dürfte auch gehen.
Delphi-Quellcode:
  If Not OpenDialog.Execute Then Exit; //Wenn User nicht auf OK drückt => Exit

  Try
    l := TStringList.Create;
    filename := OpenDialog.FileName;
    l.LoadFromFile(filename);
    Label1.Caption := filename; // Hier steht das Programm nach der Fehlermeldung...
  Except
    l.Free;
    showmessage('Fehler aufgetreten!');
  End;

HomerGER 11. Dez 2003 15:12

Re: OpenDialog --> Abbrechen
 
mal mit
if filename <> '' then
.....

versucht

Robert_G 11. Dez 2003 15:14

Re: OpenDialog --> Abbrechen
 
:wall:

Tpercon 11. Dez 2003 15:15

Re: OpenDialog --> Abbrechen
 
Zitat:

Zitat von HomerGER
mal mit
if filename <> '' then
.....

versucht

Nur die Frage basiert ja darauf, dass er nicht wußte, wie er den Abbrechen Button mit einbezieht (abfängt). Du verlagerst das Problem nur.

Robert_G 11. Dez 2003 15:17

Re: OpenDialog --> Abbrechen
 
@Tpercon
Der kam genau hier "l.LoadFromFile(filename);" - LoadFromGarNix funktioniert nicht so gut. :zwinker:

flomei 11. Dez 2003 15:19

Re: OpenDialog --> Abbrechen
 
Hab da von George genommen und es klappt prima! DANKE! :thumb:

MfG Florian :hi:

HomerGER 11. Dez 2003 15:36

Re: OpenDialog --> Abbrechen
 
wieso fehler
tritt denn ein fehler auf wenn ich auf ein Abbrechen Button drücke
ich denke doch nein
wenn einer bei mir im programm beim open dialog auf den button drückt passiert nix - nur ABBRECHEN - das bedeutet doch führe keine aktion durch oder sorry doch lieber nicht
also auch kein Fehler

Tpercon 11. Dez 2003 15:51

Re: OpenDialog --> Abbrechen
 
Genau filename ist leer / kein korrekter Pfad. Und warum? Da der OpenDialog mit Abbrechen beendet wurde ist diese Anweisung
Delphi-Quellcode:
filename := OpenDialog.FileName;
schon unsinnig. Daher würde ich auf das erfolgreiche execute abfragen!

HomerGER 11. Dez 2003 15:56

Re: OpenDialog --> Abbrechen
 
ahhh
jetzt versteh ich
ich bin nur durcheinander gekommen wegen 'Fehler'
ja mit try/Except geht es auch
ich fand es nur besser abzufragen ob filename leer ist

Robert_G 11. Dez 2003 23:58

Re: OpenDialog --> Abbrechen
 
@HomerGER
Ich bevorzuge Try/Except Blöcke, da sie in ihrer Handhabung dem Exception-Handler in Oracle ziemlich ähneln.
Also entweder mache das wenn irgendein Fehler passsiert oder mach das bei dem Fehler, das bei dem, ...

[OffTopic]
Ich weiß nicht genau, wie es sich in Delphi verhält, aber in Oracle ist der schnellste Weg durch den Code zu springen, eine Exception auszulösen und weiter unten den Handler zu schreiben.
Das ShowMessage 'BlaBla' habe ich nur mit kopiert.
@Flomei nutze für Fehlermeldungen lieber MessageDlg('BlaBla', mtError, [mbOK], 0 {oder HelpContext falls in Helpfile definiert} )
das sieht einfach nicht so harmlos aus, wie 'ne simple MessageBox :zwinker:
Die meisten User klicken sowas zu schnell weg (ich überlege mir schon bei uns in der Firma die Stühle mit dem Programm zu verbinden und bei Zeitraum (Dlg - Klick) < 0,5 sec einen Stromschlag auszulösen :twisted:
Solche User machen den Programmierer für allen Bulls*** verantwortlich :( )
[/OffTopic]

HomerGER 12. Dez 2003 00:08

Re: OpenDialog --> Abbrechen
 
hmmm
intressantes Argument

ich setze sie nur ein wenn ein Fehler zu erwarten ist denn ich nicht erwarten kann :gruebel:
zb ich greife auf eine dll zu, was mach ich wenn sie weg ist ? dann halt.
von deinen standpunkt hab ich es noch nicht betrachtet

Luckie 12. Dez 2003 00:15

Re: OpenDialog --> Abbrechen
 
@GeorgeWNewbie: Das ist aber auch nicht dein Ernst oder?
Delphi-Quellcode:
  Try
    l := TStringList.Create;
    filename := OpenDialog.FileName;
    l.LoadFromFile(filename);
    Label1.Caption := filename; // Hier steht das Programm nach der Fehlermeldung...
  Except
    l.Free;
    showmessage('Fehler aufgetreten!');
  End;
Kuck mal ins Ausgabe Fensters deines Kompilers. Nur so viel, wWrnungen sollte man ernst nehmen. Borland hat sich schon was dabei gedacht, selbige zu generieren und dem Programmierer anzuzeigen. Und wieder: Tritt keine Exception auf, wird das Objekt nicht freigegeben. :warn:

Wieder muss es richtig heißen:
Delphi-Quellcode:
var
  sl: Tsringlist;
begin
  if OpenDialog1.Execute then
  begin
    sl := TStringlist.Create;
    try
      sl.LoadFromFile(OpenDialog1.Filename);
      // tu was
    finally
      FreeAndNil(sl);
    end;
  end;
Sollte man auch nicht vorhandene Dateinamen im OpenDialog zu lassen, kann man das ganze auch so erweitern:
Delphi-Quellcode:
var
  sl: Tsringlist;
begin
  sFile := '';
  if OpenDialog1.Execute then
  begin
    if OpenDialog1.Filename <> '' then
    begin  
      sl := TStringlist.Create;
      try
        sl.LoadFromFile(OpenDialog1.Filename);
        // tu was
      finally
        FreeAndNil(sl);
      end;
    end;
  end;
Exceptionen sollten da benutzt werden, wo sie Sinn machen, wenn es um Zustände geht die man eventuellnicht beeinflussen kann. Hier kann ich aber mittels einer simplen if-Abfrage sicherstellen, dass nichts passiert. Jeder try-except/finally-Block kostet Unmengen an CPU Taktzyklen und erfordert erheblichen organisatorische Aufwand was den Stack und die Register angeht.

Robert_G 12. Dez 2003 00:29

Re: OpenDialog --> Abbrechen
 
Sorry Lucky, Ich hätte nicht gedacht, dass das in Delphi so abläuft (ist schon unpraktisch sich den Speicher mit allerhand Objekten zuzustopfen):oops:

Man kann halt nicht alle Gewohnheiten von einer DB-Sprache, wie PL/SQL auf native Sprachen z.B.: Delphi übernehmen.
Trotzdem danke werde ich in Zukunft dran denken. :thuimb:

Luckie 12. Dez 2003 00:42

Re: OpenDialog --> Abbrechen
 
Zitat:

Zitat von GeorgeWNewbie
Sorry Lucky, Ich hätte nicht gedacht, dass das in Delphi so abläuft (ist schon unpraktisch sich den Speicher mit allerhand Objekten zuzustopfen):oops:

Es ist nicht nur unpraktisch, sondern kann auch gefährlich werden. Noch ein bischen unvorsichtig mit dynamischen Array rumgespielt, große Daten statisch im Speicher gehalten und dein 2 GB sind voll.
Zitat:

Man kann halt nicht alle Gewohnheiten von einer DB-Sprache, wie PL/SQL auf native Sprachen z.B.: Delphi übernehmen.
Bei leibe nicht.
Zitat:

Trotzdem danke werde ich in Zukunft dran denken. :thuimb:
Gern geschehen.

Nachtrag:
Warum man mit try-except-Blöcken sparsam sein sollte ist auch der, dass der Compiler für diese Ausnahmebehandlung teilweise jede Menge zusätzlichen Code generieren muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 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