AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Code kürzen

Ein Thema von Die Muhkuh · begonnen am 23. Jan 2005 · letzter Beitrag vom 24. Jan 2005
Antwort Antwort
Benutzerbild von Die Muhkuh
Die Muhkuh

Registriert seit: 21. Aug 2003
7.332 Beiträge
 
Delphi 2009 Professional
 
#1

Code kürzen

  Alt 23. Jan 2005, 15:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Code kürzen

  Alt 23. Jan 2005, 16:13
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'
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#3

Re: Code kürzen

  Alt 23. Jan 2005, 16:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

Re: Code kürzen

  Alt 23. Jan 2005, 17:56
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Code kürzen

  Alt 23. Jan 2005, 17:58
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Binärbaum
Binärbaum

Registriert seit: 19. Jan 2005
Ort: Elstra
764 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Code kürzen

  Alt 24. Jan 2005, 07:46
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.
There are exactly 10 kinds of people: those who understand binary, and those who don't.
---
"Software reift beim Kunden. Bei Hardware ist es anders: Hardware fault beim Kunden." - Rainer G. Spallek
  Mit Zitat antworten Zitat
Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Code kürzen

  Alt 24. Jan 2005, 08:44
Oder man benutzt RTTI

Bye
Christian
  Mit Zitat antworten Zitat
Lasse2002

Registriert seit: 29. Nov 2004
79 Beiträge
 
RAD-Studio 2009 Pro
 
#8

Re: Code kürzen

  Alt 24. Jan 2005, 12:27
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz