====== Lyx-Eigenheiten ====== **Vor dem ersten Beitrag lesen.** Die meisten Merkwürdigkeiten in Vegas Quelltext haben hier ihren Grund. Wer sie nicht kennt, „räumt auf" und bricht dabei etwas. ===== Die Sprache ===== ^ Was fehlt ^ Womit Vega arbeitet ^ | ''property'' | Paare aus ''GetX'' / ''SetX'', gebündelt in ''IControlProps'' | | Überladung | eindeutige Namen — ''IsSelected'' neben ''Selected'' | | Methodenzeiger | freie Funktionen plus Funktionszeiger-Haken | | Generics | [[lyx_-_programmiersprache:vega:controls:tobjectlist|TObjectList]] mit ''int64''-Einträgen und Cast | | Reflexion | Tabellen: Klassenregistry, Eigenschaftsregistry, Handler-Tabelle | | zyklische Imports | Funktionszeiger-Haken, ''…Ptr''-Felder als ''int64'' | | bedingte Übersetzung | getrennte Verzeichnisse im Include-Pfad | Weitere Punkte: * ''con'' statt ''const'', und die Zuweisung ist '':='', nicht ''=''. * **Reservierte Wortformen**, die als Bezeichner nicht gehen: ''layout'', ''to'', ''Set'', ''u32'', ''k32'', ''f32''. * Groß- und Kleinschreibung zählt. * Zeichenketten sind ''pchar''; Speicher wird über ''peek*''/''poke*'' angesprochen. * ''dispose'' ruft ''Destroy''. * ''super.X()'' läuft die ganze Vererbungskette hoch (seit 1.1.2J). * ''ClassName()'' liefert die **echte** Klasse, auch über eine Variable des Basistyps (seit 1.1.3D). Es gibt nur die eigene Klasse — kein ''ClassParent'', kein ''InheritsFrom''. ===== Fallen, die Zeit gekostet haben ===== ==== Caption speichert nur die Adresse ==== ''TControl.Caption'' und ''Hint'' halten einen ''pchar'', keinen Text. In der Bibliothek stehen dort Literale, die ewig leben. Wer eine Beschriftung aus einem Puffer setzt und den Puffer freigibt, hat danach ein leeres Label — **und merkt es erst beim nächsten Zeichnen**. Der LFM-Lader legt deshalb jede solche Zeichenkette über ''LfmKeepString'' in einen Vorrat, der die Formulare überlebt. ==== Modulvariablen vor der ersten Verwendung ==== Eine Modulvariable, die **nach** ihrer ersten Verwendung deklariert wird, zerfiel still in **zwei** Variablen (lyxc #1665, behoben in 1.1.3D — die Reihenfolge spielt jetzt keine Rolle mehr). Der Schreibzugriff oben traf die eine, der Lesezugriff unten die andere. Zusammen mit #1619 (globale Objektvariable ist nicht ''null'') wurde daraus ein Absturz beim Schließen **jedes** Dateidialogs. Gefunden hat ihn erst ein ''--map-file''. ''tools/check-varorder.sh'' prüft das jetzt bei jedem Testlauf. ==== Unbekanntes Feld wird still angenommen ==== Stammte die Basisklasse aus einer **anderen** Unit, nahm ''lyxc'' eine Zuweisung an ein nicht vorhandenes Feld stillschweigend an (#1666, behoben in 1.1.3D — es kommt jetzt ''unknown field''). In Vega trug [[lyx_-_programmiersprache:vega:controls:tcombobox|TComboBox]] dadurch monatelang einen kopierten Mehrfachauswahl-Block, dessen Felder es dort nie gab. Bemerkbar machte sich das erst indirekt — als ''undefined function 'Get''' **ohne Klasse und ohne Zeile**, und die einzige Klasse, die den Namen wirklich kannte, war eine andere. Vier Compilerversionen Suche an der falschen Stelle. ''tools/check-fields.sh'' prüft jetzt jeden ''self.X''-Zugriff. ==== Zwei Methoden gleichen Namens ==== Übersetzte ohne Fehler (#1668, behoben in 1.1.3G — es kommt jetzt ''Methode 'X' ist in TDing bereits deklariert''), und **die zuerst deklarierte gewann**. Wer eine Methode überarbeitet und die neue Fassung unten anfügt — der übliche Reflex —, bekommt stumm die alte. In [[lyx_-_programmiersprache:vega:controls:tmemo|TMemo]] lagen ''SetLines'' und ''AddLine'' je doppelt; die neuere, bessere Fassung war toter Code. ''tools/check-dupmethods.sh'' prüft das jetzt. ==== Vorwärtsverweis auf eine spätere Klasse ==== Innerhalb einer Unit liefert ein Feldzugriff auf eine **später** deklarierte Klasse still ''0'', ein Methodenaufruf bricht ab (#1663, behoben in 1.1.3 — Klassenlayouts werden jetzt vorgezogen). Deshalb schiebt ''TToolBar'' ihren Zustand in die Knöpfe, statt dass diese ihn holen. ==== Weitere ==== * **''PrintLn(x.ClassName())'' gab bis lyxc 1.1.3O die Adresse aus** — der Typ des Methodenaufrufs stand bei der Auswahl der ''Print''-Fassung nicht zur Verfügung. Gemeldet als lyxc #1683 und **seit 1.1.4A behoben** (nachgemessen). Mit älteren Compilern hilft eine ''pchar''-Zwischenvariable. * ''peek32'' liefert **vorzeichenlos** — RECT-Felder können negativ sein. * ''ExtensionOf'' liefert die Endung **mit** Punkt (''".ttf"''). * Inline-Arrays von Klassen (''[64]TFoo'') speicherten Kopien statt Referenzen (#1646, behoben in 1.1.2G). Vega benutzt seitdem durchgehend ''TObjectList''. ===== Compilerbefunde melden ===== Alles, was nach einem Compilerfehler aussieht, gehört als Ticket nach https://github.com/SEOLizer/LyX-Compiler/issues Was sich bewährt hat: * **Minimalfall beilegen** — aber wenn fünf Nachbauten nicht auslösen, war die Annahme über die Fundstelle falsch, nicht der Nachbau zu klein. * **Schreiben, was man ausschließen konnte.** Das spart dem nächsten die Sackgassen. * **Messreihen statt Eindrücken.** „Alles bis 0xfb8 läuft, beides darüber nicht" ist ein Befund; „manchmal stürzt es ab" ist keiner.