Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Code kürzen (https://www.delphipraxis.net/38736-code-kuerzen.html)

Die Muhkuh 23. Jan 2005 15:58


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:
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
Das ist jetzt nur ein kleines Stück davon. Das geht so noch weiter. Wie kann man das kürzen? Geht das überhaupt?

Nikolas 23. Jan 2005 16:13

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' :!:

Oxmyx 23. Jan 2005 16:23

Re: Code kürzen
 
Zitat:

Zitat von Toxman
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' :!:

Würde nicht funktionieren. In Mengen kann man nur ordinale Typen verwenden, keine Strings.

JasonDX 23. Jan 2005 17:56

Re: Code kürzen
 
Eine Möglichkeit:
Delphi-Quellcode:
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;
nicht geprüft, müsst aber (rein theoritisch) gut funktionieren...


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 ;)

Nikolas 23. Jan 2005 17:58

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.

Binärbaum 24. Jan 2005 07:46

Re: Code kürzen
 
Zitat:

Zitat von Spider
Wie könnte man das ganze kürzen:

Delphi-Quellcode:
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
Das ist jetzt nur ein kleines Stück davon. Das geht so noch weiter. Wie kann man das kürzen? Geht das überhaupt?

Ja, nämlich wenn man vorher noch eine Hilfsfunktion deklariert:
Delphi-Quellcode:
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;
Die string-Varaible Endung muss dann allerdings schon die Dateieindung enthalten, was man ja mit ExtractFileExt-Funktion machen kann.
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.

Kedariodakon 24. Jan 2005 08:44

Re: Code kürzen
 
Oder man benutzt RTTI :zwinker:

Bye

Lasse2002 24. Jan 2005 12:27

Re: Code kürzen
 
Ich würde da eher zu soetwas tendieren:

Delphi-Quellcode:
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;
Ist jetzt zwar nicht ganz entsprechend deinem Code, aber das kannst Du sicher anpassen.

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