Lade...
 

CX_FILE_SOURCE_RANGE::RelativeTo

CX_FILE_SOURCE_RANGE::RelativeTo

230177
Beschreibung:

Diese Methode errechnet aus diesem Quellcodebereich und der Startposition des übergebenen Quellcodebereichs einen neuen "relativen" Quellcodebereich. Der relative Quellcodebereich wird errechnet, indem die übergebene Startposition also neue Null-Position (0:0) betrachtet wird und die Zeilennummern entsprechend angepasst werden.

Rechenbeispiel: 

(start=12:1, end=45:0) (start=20:3, end=25:0) Call(RelativeTo)
= (start=(20-12):3, end=(25-12):0)
= (start=8:3, end=13:0)

Die Operation entspricht einer Subtraktion der Zeilennummern mit ein paar Sonderfällen.

Diese relativen Quellcodebereiche sind hilfreich, wenn ReadFromString oder RewriteInString nur auf einem Teilbereich des Dateiquellcodes arbeiten sollen.

RelativeTo stellt sicher, dass für die übergebene Start-Position (SP) folgendes gilt: (0:0) ≤ SP ≤ start.
Falls dies nicht zutrifft, wird eine Fehlermeldung ausgelöst. RelativeTo prüft nicht, ob der übergebene Quellcodebereich diesen Quellcodebereich enthält (also ob dessen Endposition ≥ end ist).

Zudem erwartet RelativeTo dass die Dateinamen der beiden Quellcodebereiche übereinstimmen und liefert Fehlermeldung, falls dies nicht der Fall ist, denn dies deutet auf eine falsche Verwendung von RelativeTo hin.


Code-Beispiel:

// Remove the widget "mainGrp" from the window "editWin"
// 1. retrieve the window's source range and read the complete source
Var(windowRange, windowSource)
NULL Widget(editWin) Call(GetSourceRange) -> windowRange // (start=123:4, end=256:5)
FALSE windowRange Call(Read) -> windowSource // "Window(editWin, ...) { ... Group(mainGrp... }"

// 2. retrieve the group's source range
Var(group, groupRange)
"mainGrp" Widget(editWin) Call(GetChild) -> group
NULL group Call(GetSourceRange) -> groupRange // (start=148:6, end=168:7)

// 3. convert the group's source range into a relative source range
windowRange groupRange Call(RelativeTo) -> groupRange // (start=25:6, end=45:7)

// 4. use the relative range to overwrite the group's source with an empty string
windowSource "" groupRange Call(RewriteInString) -> windowSource // "Window(editWin, ...) { ... }"

// 5. compile the modified window definition into the current module
windowSource Module Call(CompileOverrideWindow)

Stack
Stack Positionn Objekttyp Kurzbeschreibung
Stack(In) Top CX_FILE_SOURCE_RANGE Der Quellcodebereich für den ein relativer Quellcodebereich errechnet werden soll.
  Top-1 CX_FILE_SOURCE_RANGE Der Quellcodebereich dessen Start-Position als (0:0)-Position betrachtet werden soll.
Stack(Out) Top CX_FILE_SOURCE_RANGE Ein neuer Quellcodebereich, dessen Zeilennummerierung relativ zur Startposition des Übergebenen Quellcodebereichs ist.
Funktionsaufruf: Call(RelativeTo)