Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   {$region '...'} {$endregion} (https://www.delphipraxis.net/201479-%7B%24region-%7D-%7B%24endregion%7D.html)

Amateurprofi 25. Jul 2019 11:24

{$region '...'} {$endregion}
 
Liste der Anhänge anzeigen (Anzahl: 5)
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?

Neutral General 25. Jul 2019 11:52

AW: {$region '...'} {$endregion}
 
Liste der Anhänge anzeigen (Anzahl: 1)
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):

https://www.delphipraxis.net/attachm...1&d=1564052045

Amateurprofi 25. Jul 2019 13:03

AW: {$region '...'} {$endregion}
 
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;

Neutral General 25. Jul 2019 13:09

AW: {$region '...'} {$endregion}
 
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.

Amateurprofi 25. Jul 2019 14:08

AW: {$region '...'} {$endregion}
 
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 ''}

Neutral General 25. Jul 2019 14:13

AW: {$region '...'} {$endregion}
 
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.

Amateurprofi 25. Jul 2019 14:56

AW: {$region '...'} {$endregion}
 
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?

Whookie 25. Jul 2019 18:06

AW: {$region '...'} {$endregion}
 
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.

Amateurprofi 25. Jul 2019 21:38

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

Zitat von Whookie (Beitrag 1437662)
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.

Uwe Raabe 25. Jul 2019 22:11

AW: {$region '...'} {$endregion}
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:04 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