| 
| Autor | Beitrag |  
| Hochhaus 
          Beiträge: 662
 Erhaltene Danke: 8
 
 Windows 7
 Delphi XE2
 
 | 
Verfasst: Do 17.07.14 09: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:
 
 |        TryS:=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 10: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: 434
 Erhaltene Danke: 107
 
 Win 10
 Delphi 6 Prof, Delphi 10.4 Prof
 
 | 
Verfasst: Do 17.07.14 10: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 10: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 10: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 14: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 15: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 15: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 17: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Do 17.07.14 20: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
 |  |  |  |