Hmm, seh da jetzt nichts, was eine
AV auslösen könnte. Ich hab mal ein kleines Testprojekt gebastelt:
Delphi-Quellcode:
program miditrackerav;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TSplitStrArray =
array of string;
function Split(
const Source, Delimiter:
string): TSplitStrArray;
var
spCount: integer;
spPos: integer;
spLength: integer;
sTemp:
string;
aSplit: TSplitStrArray;
begin
sTemp := Source;
spCount := 0;
spLength := Length(Delimiter) - 1;
repeat
spPos := Pos(Delimiter, sTemp);
if spPos = 0
then
break
else
begin
Inc(spCount);
SetLength(aSplit, spCount);
aSplit[spCount - 1] := Copy(sTemp, 1, spPos - 1);
Delete(sTemp, 1, spPos + spLength);
end;
until False;
if Length(sTemp) > 0
then
begin
Inc(spCount);
SetLength(aSplit, spCount);
aSplit[spCount - 1] := sTemp;
end;
Result := aSplit;
end;
type
TMidiTracker =
class
private
procedure SplitNotes;
public
procedure TestSplitNotes;
end;
var
// Original:
// HalbTon: array[0..100] of Boolean;
// DieNoten: TSplitStrArray;
// NotenNamen: array[0..127] of string;
// Geändert (bei dir AV, bei mir nicht):
DieNoten: TSplitStrArray;
HalbTon:
array[0..100]
of Boolean;
NotenNamen:
array[0..127]
of string;
procedure TMidiTracker.SplitNotes;
var
IntA: integer;
IntB: integer;
IntC: integer;
i: integer;
begin
DieNoten := Split('
C,C#,D,D#,E,F,F#,G,G#,A,A#,B', '
,');
for IntA := 0
to 11
do
begin
for IntB := 0
to 11
do
begin
IntC := IntA * 12 + IntB;
if IntC < 128
then
NotenNamen[127 - IntC] := IntToStr(IntA) + DieNoten[IntB];
end;
end;
// Zum Test ausgeben, um zu gucken, ob auch alles ok ist
for i := low(DieNoten)
to high(DieNoten)
do
writeln(DieNoten[i]);
end;
procedure TMidiTracker.TestSplitNotes;
begin
SplitNotes;
end;
var
MidiTracker: TMidiTracker;
begin
MidiTracker := TMidiTracker.Create;
MidiTracker.TestSplitNotes;
HalbTon[3] := True;
// Verhindern, dass Compiler die Variable wegoptimiert
readln;
end.
Egal, wie man die Variablen anordnet, es kommt zu keiner
AV. Das Problem muss woanders liegen.
Kann es eventuell sein, dass das Objekt zu dem Zeitpunkt, wo die private Methode aufgerufen wird, bereits zerstört wurde? Ich würde mal einen Haltepunkt auf den Destructor setzen.