![]() |
Code kürzen
Hi,
ich hab hier eine Procedure, die mir je nach Dateiendung im SynEdit den passenden Highlighter setzt. Ich hab 15 Highlighter auf der Form. Manche haben mehr als eine Dateiendung (wie z.B. *.c, *.cpp,... bei C++). Wie könnte man das ganze kürzen:
Delphi-Quellcode:
Das ist jetzt nur ein kleines Stück davon. Das geht so noch weiter. Wie kann man das kürzen? Geht das überhaupt?
if (Pos('.asm', FileName) > 0) then
GetDoc.Code.Highlighter := SynAsm else if (Pos('.cs', FileName) > 0) then GetDoc.Code.Highlighter := SynCS if (Pos('.c', FileName) > 0) or (Pos('.cpp', FileName) > 0) or (Pos('.h', FileName) > 0) or (Pos('.hpp', FileName > 0) then GetDoc.Code.Highlighter := SynCpp |
Re: Code kürzen
Für die untersten Fälle könntest du dir eine Menge von Endungen bereitstellen [c,cpp,h,hpp]. Dann schneidst du aus deinem Filename die letzten Buchstaben nach dem letzten '.' raus und fragst nur noch, ob diese Endung in der Menge vorkommt. Die Mengen kannst du anfänglich als Konstanten anlegen und dann nur noch pro Menge eine Abfrage starten und nicht für jede einzelne Endung.
Ein Problem bei deinem Programm gäbe es beim Namen 'blasm.foo.hpp' :!: |
Re: Code kürzen
Zitat:
|
Re: Code kürzen
Eine Möglichkeit:
Delphi-Quellcode:
nicht geprüft, müsst aber (rein theoritisch) gut funktionieren...
type
THighLights = (SynAsm, SynCs, SynCpp); const HighLights[THighLights]: array[0..3] of string = (('.asm', '', '', ''), ( '.cs', '', '', ''), ( '.h', '.hpp', '.c', '.cpp')); //... function GetSynHighlight: THighLights; var j: integer; begin for result := SynAsm to SynCpp do for j := low(HighLights[result]) to high(HighLights[result]) do if pos(HighLights[result][j], FileName) > 0 then exit; end; Edit: Ok, der Code wurde nich wirklich kürzer, aber wenn du mehr Sprachen im Syntaxhighlighting unterstüzen willst, hastes 1. schnell umgeändert und bei 10 Sprachen und je 3-4 versch. Dateien is der Source dann doch kürzer als sonst ;) |
Re: Code kürzen
Echt? naja, ist auch nicht schlimm. Dann nimmt man als Konstante einen String á la 'h hpp c cpp' und prüft dann per pos.
Oder man nimmt eine Stringlist 'h hpp c cpp' und überprüft per IndexOf, ob die herrausgeschnittene Endung vorhanden ist. Da kann man auch ohne großen Aufwand Endungen hinzufügen. |
Re: Code kürzen
Zitat:
Delphi-Quellcode:
Die string-Varaible Endung muss dann allerdings schon die Dateieindung enthalten, was man ja mit ExtractFileExt-Funktion machen kann.
function StrIdx(str: string; strArr: array of string): Integer;
var si: Integer; begin Result:= -1; for i:=0 to High(strArr) do if str= strArr[si] then begin Result:= si; Break; end; end; ... //Abfrage case StrIdx( Endung, ('.asm','.cs','.c','.cpp','.h','.hpp')) of 0: GetDoc.Code.Highlighter := SynAsm; 1: GetDoc.Code.Highlighter := SynCs; 2..5: GetDoc.Code.Highlighter := SynCpp; end; Statt ('.asm','.cs','.c','.cpp','.h','.hpp') zu verwenden, könnte man auch eine Array of string-Konstante deklarieren und diese verwenden. MfG Binärbaum //Edit: Da war noch ein Fehler im Code. |
Re: Code kürzen
Oder man benutzt RTTI :zwinker:
Bye |
Re: Code kürzen
Ich würde da eher zu soetwas tendieren:
Delphi-Quellcode:
Ist jetzt zwar nicht ganz entsprechend deinem Code, aber das kannst Du sicher anpassen.
Ext := ExtractFileExt(FileName);
if AnsiIndexText(Ext, ['.pas', '.dpr']) > -1 then GetDoc.Code.Highlighter := SynPas else if AnsiIndexText(Ext, ['.c', '.cpp']) > -1 then GetDoc.Code.Highlighter := SynCpp; AnsiIndexText ist in der Unit StrUtils enthalten und hat hier noch den Vorteil, daß es zwischen Groß- und Kleinschreibung nicht unterscheidet. Mit case ist es zwar noch kompakter, aber man muß schon ziemlich aufpassen, daß man beim Zählen nicht durcheinander kommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz