Hallo nochmal!
Nun habe ich mich ein wenig mit dem erstellen und einlesen von Arrays vertraut gemacht und möchte das gerne mit Arrays lösen (das ist ne Arbeit für die Uni und wird nach einsatz verschiedener Elemente und Eleganz bewertet). Nochmal kurz zur Darstellung des Problems:
Ich habe 8 Memos in die Musiknoten eingetragen werden bis jeweils max. 7 Zeilen (kann auch weniger Zeilen enthalten). Die Noten werden vom Benutzer im Programmablauf "eingetragen", dh. es sind nicht immer alle Memos gefüllt. Und wenn nun in einer dieser Memos(1 bis 8 ) z.B. die Note A (oder A#, können bis zu 2 Zeichen sein) erscheint soll etwas gemalt werden. Äquivalent soll natürlich die Funktion für alle Möglichen Noten zur Verfügung stehen.
Ich habe nun folgenden Quelltext:
Code: Alles auswählen
procedure TForm1.drawTimer(Sender: TObject);
Var
AbstdB,Bnd,anzB :Integer; //Werte zum späteren berechnen und einzeichnen
i :Integer;
MemoAry :Array[1..8, 1..7] of String; //Mein Konstantes Array
T :String; //Variable für die gesuchte Note
const
Toene1 =1;
Toene2 =2;
Toene3 =3;
Toene4 =4;
Toene5 =5;
Toene6 =6;
Toene7 =7;
Toene8 =8;
begin
Bnd:=40;
anzB:=25;
AbstdB:=(image1.Width-Bnd)div(anzB);
T:='A'; //Hier das gesuchte Zeichen, bzw. String, da es Halbtonschritte gibt könnte es auch A# sein
for i:=1 to 7 do //Hier das eintragen der Daten ins Array, jeweils 7 Zeilen pro Memo
begin
MemoAry[Toene1 ,i]:=memo1.lines[i];
MemoAry[Toene2 ,i]:=memo2.lines[i];
MemoAry[Toene3 ,i]:=memo3.lines[i];
MemoAry[Toene4 ,i]:=memo4.lines[i];
MemoAry[Toene5 ,i]:=memo5.lines[i];
MemoAry[Toene6 ,i]:=memo6.lines[i];
MemoAry[Toene7 ,i]:=memo7.lines[i];
MemoAry[Toene8 ,i]:=memo8.lines[i];
end;
for i:=1 to 7 do //Da ich weiß wie ich ein Memo nach einem String durchsuchen kann erschien mir das als einfache Lösung,
//allerdings funktioniert das nicht, da es ein Procedure eines Timers ist ist es zu schnell für die Anzeige
Memo9.lines.add(MemoAry[Toene1 ,i]);
Memo9.lines.add(MemoAry[Toene2 ,i]);
Memo9.lines.add(MemoAry[Toene3 ,i]);
Memo9.lines.add(MemoAry[Toene4 ,i]);
Memo9.lines.add(MemoAry[Toene5 ,i]);
Memo9.lines.add(MemoAry[Toene6 ,i]);
Memo9.lines.add(MemoAry[Toene7 ,i]);
Memo9.lines.add(MemoAry[Toene8 ,i]);
if ('A' in MemoAry[1..8, 1..7]) then //Hier würde ich das Memo9 durchsuchen oder aber nach einer eleganten
// Lösung das MemoAry nach dem String 'A' bzw Platzhalter T durchsuchen
//So sagt er folgende Fehlermedlung: "Operator is not overload"
if MemoAry[1..8, 1..7] = T //Eine weitere Idee aber funktioniert auch nicht:
// "Operator is not overload: Array... of Array... ofAnsiString" = "AnsiString"
begin
MaleAE((AbstdB*5)+(AbstdB div 2)+10);
MaleAE((AbstdB*17)+(AbstdB div 2)+35);
end;
end;
Ich denke das könnte so funktionieren, allerdings hängt es bei dem Befehl für die Durchsuche des Arrays nach dem entsprechenden String/Note. Ich finde keinen Befehl mit dem ich das Array einfach nach einem String durchsuchen kann. Wie muss ich das angehen? Was denkt ihr, oder ist die Lösung mit dem Array schwachsinn? Ich weiß es ist nun ein etwas längerer Quelltext und würde mit einer voherigen Lösung wahrscheinlich einfacher sein, aber die Vorgehensweise verstehe ich nun und denke es passt auch zu meinem Anwendungsfall.
Ich danke euch für eure Hilfe!
Gruß Varus