Autor |
Beitrag |
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
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) > 1) Then Tabu := True; If (Pos('.COM', S) > 1) Then Tabu := True; If (Pos('.DLL', S) > 1) Then Tabu := True; If (Pos('.OVL', S) > 1) Then Tabu := True; If (Pos('.SYS', S) > 1) Then Tabu := True; If (Pos('.DOCX', S) > 1) Then Tabu := True; If (Pos('.PPT', S) > 1) Then Tabu := True; If (Pos('.XLS', S) > 1) Then Tabu := True; If (Pos('.ACCD', S) > 1) Then Tabu := True; If (Pos('.BAK', S) > 1) Then Tabu := True; If (Pos('.SIK', S) > 1) Then Tabu := True; If (Pos('.TMP', S) > 1) Then Tabu := True; If (Pos('.PDF', S) > 1) Then Tabu := True; If (Pos('.DCU', S) > 1) Then Tabu := True; If (Pos('.DFM', S) > 1) Then Tabu := True; If (Pos('.MP', S) > 1) Then Tabu := True; If (Pos('.MD', S) > 1) Then Tabu := True; If (Pos('.DB', S) > 1) Then Tabu := True; If (Pos('.RES', S) > 1) Then Tabu := True; If (Pos('.GH', S) > 1) Then Tabu := True; If (Pos('.NRG', S) > 1) Then Tabu := True; If (Pos('.IMG', S) > 1) Then Tabu := True; If (Pos('.ZIP', S) > 1) Then Tabu := True; If (Pos('.RAR', S) > 1) Then Tabu := True; If (Pos('.TIB', S) > 1) Then Tabu := True; If (Pos('.PNG', S) > 1) Then Tabu := True; If (Pos('.PDN', S) > 1) Then Tabu := True; If (Pos('.TGA', S) > 1) Then Tabu := True; If (Pos('.TIF', S) > 1) Then Tabu := True; If (Pos('.ICO', S) > 1) Then Tabu := True; If (Pos('.JPG', S) > 1) Then Tabu := True; If (Pos('.JPEG', S) > 1) Then Tabu := True; If (Pos('.GIF', S) > 1) Then Tabu := True; If (Pos('.BMP', S) > 1) Then Tabu := True; If (Pos('.AVI', S) > 1) Then Tabu := True; If (Pos('.DBF', S) > 1) Then Tabu := True; If (Pos('.DOT', S) > 1) Then Tabu := True; If (Pos('.LIB', S) > 1) Then Tabu := True; If (Pos('.OBJ', S) > 1) Then Tabu := True; If (Pos('.WAV', S) > 1) Then Tabu := True;
If Tabu Then Begin MessageDlg('Fehler: Dateityp wird nicht unterstützt !', mtError, [mbOk], 0); Status := False; SaveAs := Status; Exit; End; |
|
|
Stundenplan
Beiträge: 128
Erhaltene Danke: 32
Win 7
Delphi 7 Pers., C# (VS 2010 Express)
|
Verfasst: 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) > 1) Then Tabu := True; kann außerdem optimiert werden in
Delphi-Quelltext 1:
| Tabu := Pos('.EXE', S) > 1; |
Macht man das für alle Zeilen, kommt ein Konstrukt raus à la
Delphi-Quelltext 1:
| Tabu := (Pos('.EXE', S) > 1) or (Pos('.COM', S) > 1) or |
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
Beiträge: 429
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Do 17.07.14 11:25
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
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: Do 17.07.14 11:29
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| uses StrUtils;
function InvalidExtension(const Filename: string): Boolean; const INVALID_EXT: array[0..2] of string = ('.exe', '.com', '.dll'); 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
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Do 17.07.14 16:37
Stundenplan hat folgendes geschrieben : | 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
Beiträge: 653
Erhaltene Danke: 160
|
Verfasst: 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
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Do 17.07.14 18:33
WasWeißDennIch hat folgendes geschrieben : | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| uses StrUtils;
function InvalidExtension(const Filename: string): Boolean; const INVALID_EXT: array[0..2] of string = ('.exe', '.com', '.dll'); 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
Beiträge: 19273
Erhaltene Danke: 1740
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
|
|
|