Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi If Then Problem (https://www.delphipraxis.net/105043-if-then-problem.html)

STS301 14. Dez 2007 16:02


If Then Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo

Habe ein Problem

ich bin gerade (immer noch) beim Löschprogramm, und das "then begin" stellt mir ein unerklährliches Problem in den weg.

siehe Screenshot (Fotomontage, merkt man an der uhr ;) )
sry, es bezieht sich aber nicht darauf dass ich zwei Mal

Delphi-Quellcode:
if edit1.text:='' and edit1.text:=''
geschrieben habe

turboPASCAL 14. Dez 2007 16:09

Re: If Then Problem
 
Zitat:

Zitat von STS301
Hallo

...

Delphi-Quellcode:
if edit1.text:='' and edit1.text:=''

Delphi-Quellcode:
if (edit1.text = '') and (edit1.text = '') then ...

:zwinker:

RavenIV 14. Dez 2007 16:11

Re: If Then Problem
 
Da sind gleich zwei (eigentlich drei oder vier oder fünf) Fehler drin versteckt.

a)
es heisst nicht
if a := 3 then ...
sondern
if a = 3 then
<Doppelpunkt><Gleich> ist eine Zuweisung
<Gleich> ist ein Vergleich.

b)
wenn mehrere Konditionen angegeben werden mit AND oder OR, dann muss jede Kondition geklammert werden
if (a = 3) and (b = 4) then ...

c)
Und ein Style-Guide Fehler ist auch noch dabei.
- das then gehört in die gleiche Zeile wie das if
- das begin kommt in eine neue Zeile und wird eingerückt.

d)
Man prüft nie eine boolsche Variable auf True ab.
Anstelle von
if XY.Checked = True then ...
schreibt man
if XY.Checked then ...

e)
Wenn Dich der Rückgabewert der Funktion DeleteFile nicht interessiert, dann lass das if komplett weg.

STS301 14. Dez 2007 16:26

Re: If Then Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
gut danke ihr beiden
habe jetzt nur noch ein Problem mit einer Fehlermeldung die ich ausblenden will.

@RavenIV:

Wie meinst du das mit dem Rückgabewert (e)

Luckie 14. Dez 2007 16:31

Re: If Then Problem
 
Zitat:

Zitat von STS301
habe jetzt nur noch ein Problem mit einer Fehlermeldung die ich ausblenden will.

Dann lass den else-Zweig mit der Fehlermeldung weg.

Klaus01 14. Dez 2007 16:32

Re: If Then Problem
 
Guten Abend,

alles in try -except einpacken.

Delphi-Quellcode:
try
  deleteFile(...)
except on E:Exception do
 begin
 end;
end;
Grüße
Klaus

Luckie 14. Dez 2007 16:46

Re: If Then Problem
 
DeleteFile ist eine API-Funktion, sie wirft keine Exception. Die müsste man schon selber werfen.

STS301 14. Dez 2007 17:09

Re: If Then Problem
 
:gruebel: :gruebel: ich stehe auf der Leitung, wie soll man es werfen??

mit dem Weglassen funktioniert es auch nicht, das heißt er zeigt die Meldung immer noch an

Muetze1 14. Dez 2007 17:20

Re: If Then Problem
 
Zitat:

Zitat von Luckie
DeleteFile ist eine API-Funktion, sie wirft keine Exception. Die müsste man schon selber werfen.

Erst genau hinschauen und dann sowas behaupten. Er übergibt Edit1.Text direkt an DeleteFile(), also ohne PChar Konvertierung. Somit muss diese Funktion AnsiString akzeptieren und das tut definitiv keine WinAPI Funktion. Danach ein Blick in die Hilfe offenbart uns dann, dass die VCL diese Funktion entpsrechend kapselt und dort steht am Ende ein RaiseLastOSError drin. Also alles zurück nehmen und abnicken bitte :drunken: :zwinker:

/EDIT: RaiseLastOSError anscheinend nicht in allen Delphi Versionen!

Luckie 14. Dez 2007 22:27

Re: If Then Problem
 
Ich sehe gerade, die Fehlermeldung ist gar nicht von dir. Ich nehme mal an sie kommt von Windows (Wenn du ein englisches Windows hast.) Um was für Dateien handelt es sich? Hast du die nötigen Rechte? Existieren die Dateien?

PS: Man kann den Code auch hier reinkopieren und mit Delphi-Tags sogar mit Code-Hervorhebung. :zwinker:

STS301 15. Dez 2007 10:24

Re: If Then Problem
 
ja ich habe ein englisches Betriebssystem, aber was hat das damit zu tun?

ich weiß, dass ich den Code auch hineinkopieren kann, habe es aber als screenshot eingefügt, damit man weiß, welcher Fehler auftaucht.

hier

Delphi-Quellcode:
unit loeschprogramm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ToolWin, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    Label1: TLabel;
    Edit2: TEdit;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses ShellAPI;

function DeleteFile(const AFile: string): boolean;
var
 sh: SHFileOpStruct;
begin
 ZeroMemory(@sh, sizeof(sh));
 with sh do
   begin
   Wnd := Application.Handle;
   wFunc := fo_Delete;
   pFrom := PChar(AFile +#0);
   fFlags := fof_Silent or fof_NoConfirmation;
   end;
 result := SHFileOperation(sh) = 0;
end;

procedure TForm1.Button1Click(Sender: TObject);

begin

if (checkbox1.checked) and (checkbox2.checked)
    then begin
       deletefile(edit1.text) ;
       deletefile(edit2.text) ;
  end
else if checkbox1.Checked
    then begin
       deletefile(edit1.text) ;
    end
  else if checkbox2.checked
    then begin
       deletefile(edit2.text) ;
    end;

if (edit1.enabled=true) and (edit1.text='')
    then begin
          Showmessage('Gib bitte einen Pfad an!');
    end;
if (edit2.Enabled=true) and (edit2.text='')
    then begin
      showmessage('Gib bitte einen Pfad an!');
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
close
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.checked
then edit1.enabled:=true
else edit1.enabled:=false;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if checkbox2.checked
then edit2.enabled:=true
else edit2.enabled:=false;
end;

end.

thkerkmann 15. Dez 2007 13:25

Re: If Then Problem
 
Hi,

also mal aufgeräumt:

checkbox2 ist angemarkert, aber in edit2 steht nix drin.
Daraus folgt es wird ein deletefile mit eimen leeren string als Filename versucht.

Jetzt soll die Fehlermeldung unterdrückt werden ? :wiejetzt:

Es wäre ja wohl sinnvoller stattdessen zu prüfen, ob gültige Eingabedaten vorliegen,
also ob der Dateiname nicht leer ist und ob die Datei existiert.

Gruss

[Edit] und noch was: es handelt sich hierbei sicherlich nicht um ein IfThen Problem [/Edit]

STS301 15. Dez 2007 18:38

Re: If Then Problem
 
Zitat:

Zitat von thkerkmann
Es wäre ja wohl sinnvoller stattdessen zu prüfen, ob gültige Eingabedaten vorliegen,
also ob der Dateiname nicht leer ist und ob die Datei existiert.

stimmt das wäre noch besser, nur wie stelle ich das an?

du hast schon recht, dass das nicht mehr zum "if then Problem" gehört, aber es ist finde ich zu wenig um einen neuen Thread auzumachen ;)

DeddyH 15. Dez 2007 18:45

Re: If Then Problem
 
Delphi-Quellcode:
function DeleteFile(const AFile: string): boolean;
var
sh: SHFileOpStruct;
begin
  Result := FileExists(AFile);
  if Result then
    begin
      ZeroMemory(@sh, sizeof(sh));
      with sh do
         begin
           Wnd := Application.Handle;
           wFunc := fo_Delete;
           pFrom := PChar(AFile +#0);
           fFlags := fof_Silent or fof_NoConfirmation;
         end;
    result := SHFileOperation(sh) = 0;
  end;
end;
Delphi-Quellcode:
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  edit1.enabled := checkbox1.checked;
end;
Zitat:

Zitat von STS301
Delphi-Quellcode:
if (checkbox1.checked) and (checkbox2.checked)
    then begin
       deletefile(edit1.text) ;
       deletefile(edit2.text) ;
  end
else if checkbox1.Checked
    then begin
       deletefile(edit1.text) ;
    end
  else if checkbox2.checked
    then begin
       deletefile(edit2.text) ;
    end;

Wozu ist denn die 1. Abfrage gedacht?

STS301 15. Dez 2007 18:57

Re: If Then Problem
 
super, jetzt zeigt er die Fehlermeldung nicht mehr an.

Delphi-Quellcode:
edit1.enabled := checkbox1.checked;
das ist eigentlich nur eine kürzere Version aber danke.

stimmt, an der Abfrage muss ich noch arbeiten aber sonnst funktioniert es :firejump:

Progman 15. Dez 2007 19:01

Re: If Then Problem
 
hi, es genügt doch:
Delphi-Quellcode:
  if checkbox1.Checked then deletefile(edit1.text) ;
  if checkbox2.checked then deletefile(edit2.text) ;

DeddyH 15. Dez 2007 19:02

Re: If Then Problem
 
Ja eben, deshalb hatte ich nach dem Sinn gefragt ;)

STS301 15. Dez 2007 19:07

Re: If Then Problem
 
:wall: :wall: :wall: :wall: :wall:

sooo nahh und doch so fern (die programmierung eines einfachen Delphiprogramms mit einfachen Methoden)

:wall: :wall: :wall: :wall: :wall:


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