Registriert seit: 17. Nov 2005
Ort: Hamburg
1.064 Beiträge
Delphi XE2 Professional
|
Zugriff auf andere Konstante als im Source Code angegeben
26. Sep 2016, 12:07
Ich hatte gestern ein sehr merkwürdiges Erlebnis.
Szenario:
In einer Unit "Base.pas" sind Typen und Konstanten, die ich in meinem Projekt verwende, deklariert.
In anderen Units greife ich auf diese Daten zu.
In Base.pas standen u.A. folgende Konstanten
Code:
const
MinTone=21;
MaxTone=108;
PianoKeyName:Array[MinTone..MaxTone] of String=
('A0','Ais0/B0','H0',
'C1','Cis1/Des1','D1','Dis1/Es1','E1','F1','Fis1/Ges1','G1','Gis1/As1','A1','Ais1/B1','H1',
'C2','Cis2/Des2','D2','Dis2/Es2','E2','F2','Fis2/Ges2','G2','Gis2/As2','A2','Ais2/B2','H2',
'C3','Cis3/Des3','D3','Dis3/Es3','E3','F3','Fis3/Ges3','G3','Gis3/As3','A3','Ais3/B3','H3',
'C4','Cis4/Des4','D4','Dis4/Es4','E4','F4','Fis4/Ges4','G4','Gis4/As4','A4','Ais4/B4','H4',
'C5','Cis5/Des5','D5','Dis5/Es5','E5','F5','Fis5/Ges5','G5','Gis5/As5','A5','Ais5/B5','H5',
'C6','Cis6/Des6','D6','Dis6/Es6','E6','F6','Fis6/Ges6','G6','Gis6/As6','A6','Ais6/B6','H6',
'C7','Cis7/Des7','D7','Dis7/Es7','E7','F7','Fis7/Ges7','G7','Gis7/As7','A7','Ais7/B7','H7',
'C8');
Auf "PianoKeyName" wird an verschiedenen Stellen zugegriffen.
Nun wollte ich für eine neue Funktionalität nicht die Texte "Cis1/Des1" etc. verwenden, sondern statt dessen "Cis1".
Also habe ich per Copy/Paste eine Kopie von "PianoKeyName" erstellt und die ursprüngliche Konstante umbenannt in "PianoKeyLongName" .
An den Stellen, an denen auf " PianoKeyName" zugegriffen wurde, habe ich die gleiche Umbenennung vorgenommen.
In "PianoKeyName" habe ich dann mit der Maus mit gedrückter Alt-Taste "/Des1" bis "/Des7" markiert und mit der Delete-Taste entfernt. Das gleiche für die anderen Spalten "/Es11" bist "/B1".
Jetzt hatte ich also folgende Deklarationen:
Code:
PianoKeyLongName:Array[MinTone..MaxTone] of String=
('A0','Ais0/B0','H0',
'C1','Cis1/Des1','D1','Dis1/Es1','E1','F1','Fis1/Ges1','G1','Gis1/As1','A1','Ais1/B1','H1',
'C2','Cis2/Des2','D2','Dis2/Es2','E2','F2','Fis2/Ges2','G2','Gis2/As2','A2','Ais2/B2','H2',
'C3','Cis3/Des3','D3','Dis3/Es3','E3','F3','Fis3/Ges3','G3','Gis3/As3','A3','Ais3/B3','H3',
'C4','Cis4/Des4','D4','Dis4/Es4','E4','F4','Fis4/Ges4','G4','Gis4/As4','A4','Ais4/B4','H4',
'C5','Cis5/Des5','D5','Dis5/Es5','E5','F5','Fis5/Ges5','G5','Gis5/As5','A5','Ais5/B5','H5',
'C6','Cis6/Des6','D6','Dis6/Es6','E6','F6','Fis6/Ges6','G6','Gis6/As6','A6','Ais6/B6','H6',
'C7','Cis7/Des7','D7','Dis7/Es7','E7','F7','Fis7/Ges7','G7','Gis7/As7','A7','Ais7/B7','H7',
'C8');
PianoKeyName:Array[MinTone..MaxTone] of String=
('A0','B0','H0',
'C1','Cis1','D1','Dis1','E1','F1','Fis1','G1','Gis1','A1','Ais1','H1',
'C2','Cis2','D2','Dis2','E2','F2','Fis2','G2','Gis2','A2','Ais2','H2',
'C3','Cis3','D3','Dis3','E3','F3','Fis3','G3','Gis3','A3','Ais3','H3',
'C4','Cis4','D4','Dis4','E4','F4','Fis4','G4','Gis4','A4','Ais4','H4',
'C5','Cis5','D5','Dis5','E5','F5','Fis5','G5','Gis5','A5','Ais5','H5',
'C6','Cis6','D6','Dis6','E6','F6','Fis6','G6','Gis6','A6','Ais6','H6',
'C7','Cis7','D7','Dis7','E7','F7','Fis7','G7','Gis7','A7','Ais7','H7',
'C8');
In der neu geschriebenen Prozedur, stand dann z.B.
Label1.Caption:=PianoKeyName[25];
Im Label stand dann aber nicht der Text aus "PianoKeyName" sondern der längere Text aus "PianoKeyLongName".
Im DebugMode zeigte Insight, das auf "PianoKeyName" zugegriffen wird, tatsächlich wurde aber auf "PianoKeyLongName" zugegriffen.
Alle Versuche, das zu beheben scheiterten.
Delphi schließen, alle .dcu Dateien löschen Delphi neu starten brachte nichts.
Anderes Projekt laden Delphi schließen, neu starten und dann das Projekt laden, brachte nichts.
Rechner komplett runterfahren brachte nichts.
Die Konstante "PianoKeyName" aus der Unit Base.pas entfernen und in die Unit zu stellen, in der ich darauf zugreifen wollte führte zu einer Exception. (Irgend etwas mit Speicherzugriff).
Auch das Löschen von "PianoKeyLongName" brachte nichts. Es wurde weiterhin auf diese nicht mehr existierende Konstante zugegriffen.
Ich habe dann den gesamten Inhalt aus Base.pas in einen Texteditor kopiert. Base.pas und Base.dcu gelöscht, eine neue Unit erstellt, den Text aus dem Texteditor in die neue Unit kopiert und diese unter Base.pas gespeichert.
Danach funktionierte alles, wie es sollte.
Und nach dieser langen Vorrede die kurzen Fragen:
Woran kann das liegen. (Vermutung: Die Methode wie ich die Texte gelöscht habe)
Wie gehe ich am besten vor, wenn solche Fehler wieder auftreten?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
|