ich muss für die FH ein kleines Delphi/Lazarus Programm schreiben und habe mich nun dafür entschieden ein Gitarrentool zu schreiben. Ich selber spiele Gitarre und möchte manchmal gerne Irgendwo nachschlagen wie ich oder wo ich den Akkord noch greifen kann, bzw. welche Töne noch zu der Skale passen und dann natürlich wo sie auf dem Griffbrett zu finden sind. Ich erfinde das Rad nicht neu http://www.bing.com/images/search?q=guitar+scale+programme+&FORM=AWIR#view=detail&id=2EF700CDE4A2933FC8689A4E6CD69D895D4BC742&selectedIndex=20 aber denke das es vom umfang her gut passt. Da ich blutiger Anfänger bin ist das auch für weitere Projekte sicher eine gute Übung. Das Programmieren macht echt spaß und es ist toll so schnell erfolge zu sehen. Ich habe mir gedacht dass ich hier meine Arbeitsfortschritte dokumentiere und bei Hilfe in diesem Thread drüber diskutieren kann. Falls das hier nicht gewünscht ist bitte ich drum den Thread zu verschieben!
Nun zum Projekt:
Für alle Nichtmusiker ist es vllt schwer zu erklären. Die Idee ist es, dass ich mir das Griffbrett einer Gitarre im unteren Bereich anzeigen lassen kann und je nachdem welche Akkorde oder Skale ich ausgewählt habe die entsprechenden Noten auf dem Griffbrett eingeblendet bekomme. Das heißt ich werde ein Image einfügen das mir immer ein Griffbrett anzeigt und dann über eine Listbox die Parameter einstellen kann, und dann die Punkte wo man zu greifen hat (also die Noten) mit beschriftung auf dem Image angezeigt bekomme. Natürlich sollte sich auch das Image automatisch auf die Größe des Fensters einstellen und ständig "aktuallisieren". Das ganze habe ich versucht mit einem Timer zu realisieren der ständig die Größe überprüft und neu ausgibt. Das Klappt genau 1 Periode, danach ist das Image einfach schwarz. Er zeichnet zunächst das Griffbrett und dann beim nächsten Timerereignis wirds schwarz. Ich weiß nicht genau woran es liegt, vllt habt ihr eine Idee oder auch eine Lösung. Das Panel ist lediglich dazu da um die Aktuelle Uhrzeit anzuzeigen, wie gesagt es ist ein Uni Projekt und wird nach Aufwand und Funktion bewertet, daher wird das ein oder andere Tool (wie Uhrzeit) eingebaut sein um ein paar plus Punkte zu sammeln.
Hier mal der Quelltext:
Code: Alles auswählen
procedure TForm1.FrmtmrTimer(Sender: TObject);
var
Frm1w,Frm1h :Integer; //Form1
x1,x2,y1,y2 :Integer; //Rectangel
xs1,xs2,yb1,yb2 :Integer; //Anfang-Ende Saiten
anzSait, AbstdS, AnzB,AbstdB,i,j :Integer; //Helfer
begin
Frm1w:=Form1.Width;
Frm1h:=Form1.Height;
image1.Top:=frm1h-StatusBar1.Height-image1.Height; //Image1 Format
image1.left:=0;
image1.width:=Frm1w; //Image1 Format
panel1.Top:=0; //Uhrausrichtung
panel1.Left:=Frm1w-Panel1.Width;
x1:=0; //Image1 Rectangle
y1:=0;
x2:=image1.Width;
y2:=image1.Height;
image1.Canvas.Rectangle(x1,y1,x2,y2); //Image1 Rectangle
image1.Canvas.Brush.Color:=Clwhite;
image1.Canvas.Pen.Color:=Clwhite;
//Saiten Zeichnen
xs1:=50; //Anfang Saiten
xs2:=image1.Width-10; //Ende Saiten
anzSait:=6;
AbstdS:=(image1.height)div(anzSait+2); //Saiten Abstand berechnen
Image1.Canvas.Pen.Width:=3; //Saiten Zeichnen
Image1.Canvas.Pen.Color:=ClBlack;
Image1.Canvas.Brush.Color:=ClBlack;
for j:=1 to AnzSait do
begin
Image1.Canvas.Line(xs1,j+AbstdS*j,xs2,j+AbstdS*j);
end;
//Bünde zeichnen
AnzB:=24; //Bundabstände berechnen
AbstdB:=(image1.Width)div(anzB+2);
yb1:=0;
yb2:=image1.Height;
Image1.Canvas.Pen.Width:=3; //Bünde Zeichnen
Image1.Canvas.Pen.Color:=RGBtoColor(0,0,0);
image1.Canvas.Brush.Color:=RGBtoColor(0,0,0);
for i:=1 to AnzB do
begin
Image1.Canvas.Line(i+AbstdB*i,yb1,i+AbstdB*i,yb2);
end;
end;
Danke Gruß Varus