Autor Beitrag
Hochhaus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Do 17.07.14 10:47 
Hallo allerseits !

der folgende Code funktioniert zwar prima. Ich frage mich aber, ob er nicht deutlich verbessert / optimiert werden kann. Danke für jeden Verbesserungsvorschlag !


Hochhaus

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
       Try
        S:=DlgSave.FileName;
        For I:= 1 To Length(S) Do Begin
          S[I] := Upcase(S[I]);
        End;
        If (Pos('.EXE',  S) > 1Then Tabu := True;
        If (Pos('.COM',  S) > 1Then Tabu := True;
        If (Pos('.DLL',  S) > 1Then Tabu := True;
        If (Pos('.OVL',  S) > 1Then Tabu := True;
        If (Pos('.SYS',  S) > 1Then Tabu := True;
        If (Pos('.DOCX',  S) > 1Then Tabu := True;
        If (Pos('.PPT',  S) > 1Then Tabu := True;
        If (Pos('.XLS',  S) > 1Then Tabu := True;
        If (Pos('.ACCD', S) > 1Then Tabu := True;
        If (Pos('.BAK',  S) > 1Then Tabu := True;
        If (Pos('.SIK',  S) > 1Then Tabu := True;
        If (Pos('.TMP',  S) > 1Then Tabu := True;
        If (Pos('.PDF',  S) > 1Then Tabu := True;
        If (Pos('.DCU',  S) > 1Then Tabu := True;
        If (Pos('.DFM',  S) > 1Then Tabu := True;
        If (Pos('.MP',   S) > 1Then Tabu := True;
        If (Pos('.MD',   S) > 1Then Tabu := True;
        If (Pos('.DB',   S) > 1Then Tabu := True;
        If (Pos('.RES',  S) > 1Then Tabu := True;
        If (Pos('.GH',   S) > 1Then Tabu := True;
        If (Pos('.NRG',  S) > 1Then Tabu := True;
        If (Pos('.IMG',  S) > 1Then Tabu := True;
        If (Pos('.ZIP',  S) > 1Then Tabu := True;
        If (Pos('.RAR',  S) > 1Then Tabu := True;
        If (Pos('.TIB',  S) > 1Then Tabu := True;
        If (Pos('.PNG',  S) > 1Then Tabu := True;
        If (Pos('.PDN',  S) > 1Then Tabu := True;
        If (Pos('.TGA',  S) > 1Then Tabu := True;
        If (Pos('.TIF',  S) > 1Then Tabu := True;
        If (Pos('.ICO',  S) > 1Then Tabu := True;
        If (Pos('.JPG',  S) > 1Then Tabu := True;
        If (Pos('.JPEG', S) > 1Then Tabu := True;
        If (Pos('.GIF',  S) > 1Then Tabu := True;
        If (Pos('.BMP',  S) > 1Then Tabu := True;
        If (Pos('.AVI',  S) > 1Then Tabu := True;
        If (Pos('.DBF',  S) > 1Then Tabu := True;
        If (Pos('.DOT',  S) > 1Then Tabu := True;
        If (Pos('.LIB',  S) > 1Then Tabu := True;
        If (Pos('.OBJ',  S) > 1Then Tabu := True;
        If (Pos('.WAV',  S) > 1Then Tabu := True;

        If Tabu Then Begin
          MessageDlg('Fehler: Dateityp wird nicht unterstützt !',
          mtError, [mbOk], 0);
          Status := False;
          SaveAs := Status;
          Exit;
        End;
Stundenplan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128
Erhaltene Danke: 32

Win 7
Delphi 7 Pers., C# (VS 2010 Express)
BeitragVerfasst: Do 17.07.14 11:24 
Also, erstmal musst du gar nicht S zeichenweise in Großbuchstaben umwandeln; es gibt dafür schon die Funktion UpperCase(): S := UpperCase(DlgSave.FileName);
Da du sehr viele Dateitypen nicht zu unterstützen scheinst, wäre es da nicht vielleicht sinnvoller, nur auf die Endungen abzufragen, die unterstützt werden?

Die Zeile If (Pos('.EXE',  S) > 1Then Tabu := True; kann außerdem optimiert werden in
ausblenden Delphi-Quelltext
1:
Tabu := Pos('.EXE',  S) > 1;					

Macht man das für alle Zeilen, kommt ein Konstrukt raus à la
ausblenden Delphi-Quelltext
1:
Tabu := (Pos('.EXE',  S) > 1or (Pos('.COM',  S) > 1or //...					

Da das aber schnell in lange, unübersichtliche Zeilen ausartet, empfiehlt es sich vllt. eher, die Endungen als Auflistung (z.B. in einer Textdatei) abzuspeichern und dann mit Schleifen drüberzugehen.

Für diesen Beitrag haben gedankt: Hochhaus
mandras
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 429
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: Do 17.07.14 11:25 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses StrUtils;
procedure TForm1.FormCreate(Sender: TObject);
var FName:string;
    FExt : string;
    tabu : boolean;
    i : integer;
begin
 FName:='c:\x13.ppt';
 FExt := copy(ExtractFileExt (FName),2,255);
 i:=AnsiIndexText  (FExt, ['pdf','xls','ppt']);
 tabu := i<>-1;
end;

Für diesen Beitrag haben gedankt: Hochhaus
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Do 17.07.14 11:25 
Mit ExtractFileExt bekommst du außerdem direkt die Dateiendung und kannst dir die ganzen Pos-Aufrufe sparen.

Für diesen Beitrag haben gedankt: Hochhaus
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Do 17.07.14 11:29 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses StrUtils;

function InvalidExtension(const Filename: string): Boolean;
const
  INVALID_EXT: array[0..2of string = ('.exe''.com''.dll'); //entsprechend erweitern
begin
  Result := AnsiIndexText(ExtractFileExt(Filename), INVALID_EXT) > -1;
end;


[edit] *Huch*, das wurde ja schon vorgeschlagen. Egal, als eigene Funktion gefällt es mir halt besser :) [/edit]

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Do 17.07.14 15:51 
Vielen Dank für all Eure Vorschläge zur Optimierung ! Ihr seid grossartig ! Ich dachte mir schon, dass sich das verbessern lässt - wusste aber nicht, wie.


Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Do 17.07.14 16:37 
user profile iconStundenplan hat folgendes geschrieben Zum zitierten Posting springen:
Da du sehr viele Dateitypen nicht zu unterstützen scheinst, wäre es da nicht vielleicht sinnvoller, nur auf die Endungen abzufragen, die unterstützt werden?


Es gibt leider auch keine abschliessende Liste von Dateitypen, die ich unterstütze. Wenn ich nur .TXT zulasse, ist das zu mager. Es sollen ja schliesslich auch .C und .PAS und viele weitere möglich sein ...
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Do 17.07.14 16:42 
Trotzdem wäre eine Whitelist vermutlich sinnvoller, da die Blacklist immer wieder gepflegt werden müsste und Du so gut wie unmöglich alle nicht unterstützten Endungen auflisten kannst.

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Do 17.07.14 18:33 
user profile iconWasWeißDennIch hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
uses StrUtils;

function InvalidExtension(const Filename: string): Boolean;
const
  INVALID_EXT: array[0..2of string = ('.exe''.com''.dll'); //entsprechend erweitern
begin
  Result := AnsiIndexText(ExtractFileExt(Filename), INVALID_EXT) > -1;
end;




Meine ältere Delphi-Version unterstützt AnsiIndexText nicht ... was soll ich da tun ?

Hochhaus

//EDIT: Sorry, mein Fehler ! Ich habe StrUtils nicht eingebunden ...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19273
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.07.14 21:20 
Normalerweise gibt es dafür die Möglichkeit im Öffnen-Dialog von den bekannten Typen auf "Alle Dateien" umzuschalten (sprich man füllt normalerweise die Eigenschaft Filter). Wer das macht, kann dann auch unbekannte Dateitypen öffnen, aber es kommen ggf. keine sinnvollen Ergebnisse heraus.

Für diesen Beitrag haben gedankt: Hochhaus