AGB  ·  Datenschutz  ·  Impressum  







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

{$region '...'} {$endregion}

Ein Thema von Amateurprofi · begonnen am 25. Jul 2019 · letzter Beitrag vom 25. Jul 2019
Antwort Antwort
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#1

{$region '...'} {$endregion}

  Alt 25. Jul 2019, 12:24
Ich benutze oft und gern Region/EndRegion um schnell bestimmte CodeStellen zu finden.
Nun ist mir aufgefallen, dass in einigen Units ab einer bestimmten Stelle Region/EndRegion nicht mehr richtig funktioniert

Im Code steht z.B.
Delphi-Quellcode:
{$REGION 'Test'}
PROCEDURE TMain.Test;
begin
end;
{$ENDREGION}
Normalerweise steht links neben {$REGION '...'} das '-' zum Ausblenden.
Hier steht das '-' eine Zeile tiefer (Siehe Bild "Fehler 1")
Wenn ich mit Strg+Shift+K+R alle Regionen ausblende, bleibt die Zeile {$REGION 'Test'} stehen. (Siehe Bild "Fehler 2")
Wie das bei mehreren hintereinander stehenden Regionen aussieht, seht ihr in Bild "Fehler 3".

Wie es sein sollte seht ihr in den Bildern "Korrekt 1" und "Korrekt 2"

Meine erste Vermutung war, dass das daran liegt, dass in der darüber liegenden Region Assembler Funktionen liegen, die so aufgebaut sind;
Delphi-Quellcode:
FUNCTION Test:Integer;
asm
{$IFDEF CPUX86}
      32 Bit Code
{$ELSE}
      64 Bit Code
{$ENDIF}
end;
Da das Problem in einer anderen Unit, mit gleichem Aufbau nicht Auftritt, scheint das nicht die Ursache zu sein.

Hat jemand eine Vermutung (oder das Wissen) was die Ursache für diesen Fehler ist?
Miniaturansicht angehängter Grafiken
fehler-1.jpg   fehler-2.jpg   fehler-3.jpg   korrekt-1.jpg   korrekt-2.jpg  

Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 12:52
Hast du mal nachgeschaut ob alle Regionen (davor und innerhalb der nicht funktionierenden Region) auch wirklich korrekt geschlossen wurden?
Was du beschreibst kommt eigentlich erfahrungsgemäß immer von sowas.

Beispiel (Region B funktioniert nicht):

Miniaturansicht angehängter Grafiken
region.png  
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (25. Jul 2019 um 12:55 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#3

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 14:03
Ja, hab ich gerade noch einmal geprüft, und damit ich nichts übersehe mit nachstehender Prozedur.
Erwartungsgemäß steht da "6393 6394 Region folgt Region"
Zeilen 6393 und 6394 sind die Zeilen
Delphi-Quellcode:
         if AnsiContainsText(List[I],'{$Region') then begin
            if (J>0) and AnsiContainsText(List[J-1],'{$Region') then

Delphi-Quellcode:
PROCEDURE TMain.Test;
const sRegReg=' Region folgt Region'; sNoReg='EndRegion ohne Reagion';
var I,J,L:Integer; List,ErrList:TStrings;
begin
   if ClipBoard.HasFormat(CF_Text) then begin
      List:=TStringList.Create;
      List.Text:=ClipBoard.AsText;
      ErrList:=TStringList.Create;
      J:=0;
      L:=0;
      for I:=0 to List.Count-1 do begin
         if AnsiContainsText(List[I],'{$Region') then begin
            if (J>0) and AnsiContainsText(List[J-1],'{$Region') then
               ErrList.Add(IntToStr(L)+' '+IntToStr(I)+sRegReg);
            L:=I;
            List[J]:=List[I];
            Inc(J);
         end else if AnsiContainsText(List[I],'{$EndRegion') then begin
            if (J=0) or not AnsiContainsText(List[J-1],'{$Region') then
               ErrList.Add(IntToStr(L)+' '+IntToStr(I)+sNoReg);
            L:=I;
            List[J]:=List[I];
            Inc(J);
         end;
      end;
      if ErrList.Count=0 then ErrList.Add('Keine Fehler');
      for I:=0 to J-1 do ErrList.Add(List[I]);
      List.Free;
      ClipBoard.AsText:=ErrList.Text;
      ErrList.Free;
   end;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 14:09
Es ist ja kein Problem wenn ein {$region} einer {$region} folgt. Es müssen dann aber halt auch 2 {$endregion} folgen.
Also deine Testmethode funktioniert nicht so ganz.
Du solltest lieber für jedes {$region} einen counter erhöhen und für jedes {$endregion} den counter um 1 verringern.
Wenn du am Ende nicht bei 0 rauskommst ist was falsch.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#5

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 15:08
Danke für den Hinweis.
Für eine allgemein gehaltene Prüfprozedur wäre so eine Konstruktion sicherlich richtig.
Aber bei mir treten solche Verschachtelungen nicht auf und zudem erstellt meine Prozedur ja nicht nur eine Meldung sondern auch eine Liste aller Zeilen in denen "{$REGION" oder "{$ENDREGION" vorkommt, ich kann das dann flink manuell prüfen.
Und nebenbei:
Einen Counter bei Region erhöhen und bei Endregion senken und am Ende auf 0 prüfen klingt und ist simpel aber leider auch genauso falsch wie simpel.
Was würde der Counter wohl bei folgendem Code zeigen? Ich denke etwas komplexer ist das schon.
Delphi-Quellcode:
{$ENDREGION}
{$REGION ''}
{$ENDREGION ''}
{$REGION ''}
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 15:13
Okay, aber das lässt sich umgehen indem man sofort die Prüfung abbricht sobald der counter < 0 fällt und einen Fehler wirft.
Nach der Anpassung sollte das dann aber auch schon passen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#7

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 15:56
Richtig.
Aber das ist nicht das Thema des Threads.
Der von mir geschilderte Fehler hat nichts mit einer fehlerhaften {$REGION ''} - {$ENDREGION} Struktur zu tun, denn sie ist stimmig.

Hat noch jemand ne Idee, woran es liegen könnte?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
445 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 19:06
Manchmal kann es auch an "verloren" gegangengen Zeilenenden liegen. Datei mit Notepad++ öffnen, Zeilenenden auf LF (Linux) und dann wieder auf CRLF (Windows) umstellen und abspeichern.
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.071 Beiträge
 
Delphi XE2 Professional
 
#9

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 22:38
Manchmal kann es auch an "verloren" gegangengen Zeilenenden liegen. Datei mit Notepad++ öffnen, Zeilenenden auf LF (Linux) und dann wieder auf CRLF (Windows) umstellen und abspeichern.
Danke Whookie,
das war das Problem.

Dumm nur, ich habe kein Notepad++.
Auf meinem Rechner sind als Texteditoren "Notepad" und "Editor" installiert.
In beiden gibt es die von dir geschilderten Einstellungen nicht.

Hilfreich war dein Tipp trotzdem.
Ich ging davon aus, dass der Fehler innerhalb der letzten korrekt ausgeblendeten Region lag.
Diese Region habe ich dann in mehrere kleinere Regionen unterteilt und konnte dann schließlich
den Teil finden, ab dem das Ausblenden nicht mehr richtig funktionierte.
Tja, das war ein längerer Kommentarblock, den ich aus einer Fremddatei kopiert hatte.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.462 Beiträge
 
Delphi 12 Athens
 
#10

AW: {$region '...'} {$endregion}

  Alt 25. Jul 2019, 23:11
Um sowas von vorneherein zu vermeiden: https://www.uweraabe.de/Blog/2018/05...ject-magician/

Zitat:
Only as part of the global options you have access to the Clean Line Feeds feature. When opening dpr, dpk, pas or inc files any invalid line feed sequence (like single <CR> or <LF> alone) will be converted to a proper <CR><LF> sequence.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  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 20:05 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