2D Arrays - StringGrid
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Hi!
Das ist jetzt an die Forums-Betreiber gewandt:
Die Software ist an dieser Stelle dumm: Beim Zitieren werden auch die Anhänge "zitiert". Das ist ja wohl Quatsch.
Winni
Das ist jetzt an die Forums-Betreiber gewandt:
Die Software ist an dieser Stelle dumm: Beim Zitieren werden auch die Anhänge "zitiert". Das ist ja wohl Quatsch.
Winni
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
zu 1.
ja da hast du völlig recht. Der Finger sollte kurz vor den Bundstäben aufliegen. Optisch wollte ich mich allerdings an den Standard Diagrammen Orientieren, da die Schüler ansonsten durcheinander kommen und direkt auf dem Bundstab greifen.
2. Ok alles klar, außer halb der Cell ist es natürlich nicht mehr sichtbar.

2. Ok alles klar, außer halb der Cell ist es natürlich nicht mehr sichtbar.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Hi!
Da ich Gitarre spiele seit ich 11 bin, interessiert mich das Thema natürlich.
Ich hab kurz mal das ganze auf ein Image übertragen. Das hast Du natürlich deutlich mehr Gestaltungsmöglichkeiten, wenn es um die Optik geht.
Außerdem hab ich mal diesen DatenTyp eingeführt:
Damit kannst Du dann ganz schnell ein ganzes Diagramm in 6 Integer packen. Z.B.:
Und jetzt : Ein Image auf eine Form packen, und dann:
Beispiel ist im Anhang.
Winni
Da ich Gitarre spiele seit ich 11 bin, interessiert mich das Thema natürlich.
Ich hab kurz mal das ganze auf ein Image übertragen. Das hast Du natürlich deutlich mehr Gestaltungsmöglichkeiten, wenn es um die Optik geht.
Außerdem hab ich mal diesen DatenTyp eingeführt:
Code: Alles auswählen
Type TChord = array[0..5] of Integer;
Code: Alles auswählen
var CMajor : TChord= (0,1,0,2,3,0);
Code: Alles auswählen
Procedure TForm1.DrawChord (aChord : TChord);
const Bundlen = 64;
SaitenDY =16;
offsetX = 20;
offsetY= 10;
PressZero='😎';
Press = '😊';
var i,x,y : Integer;
s : string;
begin
With Image1.Canvas do
begin
Brush.Color := clWhite;
FillRect (0,0,Image1.Width, Image1.Height);
Pen.Color := clRed;
for i := 0 to 5 do
line (offsetX, offsety+i*SaitenDy,Image1.width,offsety+i*SaitenDy);
Pen.Color := clBlue;
x := OffsetX;
while x < Image1.Width do
begin
line (x,OffsetY,x,OffsetY + 5* SaitenDy);
inc (x,BundLen);
end;
for i :=0 to 5 do
begin
if aChord [i] = 0 then s := PressZero else s := Press;
if achord[i] = 0 then x := Offsetx+2 else x := offsetX+ aChord[i]*Bundlen - 20;
y := offsetY + i * SaitenDY- TextHeight(s) div 2;
TextOut (x,y,s);
end; // i
end; // with
end;
Winni
- Dateianhänge
-
- Image_G-Dur.png (5.37 KiB) 1970 mal betrachtet
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
Das sieht sehr vielversprechend aus
Werde ich mir nach dem Unterricht mal genau anschauen.
Mein Ziel ist es, ein Tool zu haben, das man auf das Griffbrett die Töne eingeben kann, und das Programm dann ausgibt, was für ein Akkord das ist. Und umgekehrt natürlich auch, so das man sagen kann, ich möchte einen CMaj7, und was für Möglichkeiten gibt es diesen zu Greifen.

Werde ich mir nach dem Unterricht mal genau anschauen.
Mein Ziel ist es, ein Tool zu haben, das man auf das Griffbrett die Töne eingeben kann, und das Programm dann ausgibt, was für ein Akkord das ist. Und umgekehrt natürlich auch, so das man sagen kann, ich möchte einen CMaj7, und was für Möglichkeiten gibt es diesen zu Greifen.
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Hi!
Anhand Deiner Ideen ab ich schon mal n bischen gebaut.
Ich hab eingeführt:
Eine Halbtonleiter. Zwar nur eine Oktave, aber das kann man ja mittels Modulo 12 auf diese zurückführen.
Type TSemiTone
Ein Set Of TSemiTone: Alle für einen Akkord benötigten Töne
Und das oben schon erwähnte TChord = array[0..5] of Integer, mit dem man das Griffbrett in einer Variablen untebringt.
Mann kann den Grundton des Akkords auswählen plus Dur oder Moll.
Dann baut er sich automatisch das Griffbrett auf. Bei einfachen Akkorden geht das alles gut.
Für Cis-Dur braucht er allerdings 6 Finger. Die sind recht selten ...
Da muss ihm noch die Barre-Technik beigebracht werden.
Aber erstmal mach ich Pause.
Winni
Anhand Deiner Ideen ab ich schon mal n bischen gebaut.
Ich hab eingeführt:
Eine Halbtonleiter. Zwar nur eine Oktave, aber das kann man ja mittels Modulo 12 auf diese zurückführen.
Type TSemiTone
Ein Set Of TSemiTone: Alle für einen Akkord benötigten Töne
Und das oben schon erwähnte TChord = array[0..5] of Integer, mit dem man das Griffbrett in einer Variablen untebringt.
Mann kann den Grundton des Akkords auswählen plus Dur oder Moll.
Dann baut er sich automatisch das Griffbrett auf. Bei einfachen Akkorden geht das alles gut.
Für Cis-Dur braucht er allerdings 6 Finger. Die sind recht selten ...
Da muss ihm noch die Barre-Technik beigebracht werden.
Aber erstmal mach ich Pause.
Winni
- Dateianhänge
-
GuitarChords.zip
- (127.95 KiB) 70-mal heruntergeladen
-
- Image_A-Dur.png (34.21 KiB) 1951 mal betrachtet
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
wow ok das ist schon ganz schön weit
ich versuche gerade deinen Source nachzuvollziehen, sehe da ganz neue Sachen für mich wie "ord" "abs" werden wohl irgendwelche Konvertierer sein. spannend

ich versuche gerade deinen Source nachzuvollziehen, sehe da ganz neue Sachen für mich wie "ord" "abs" werden wohl irgendwelche Konvertierer sein. spannend

- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Hi!
Abs ist der positive Wert - das MinusVorrzeichen wird entfernt.
Ord gibt Dir die Position in einem Aufzähl-Type.
Nimm meine Halbtonleiter;
sC : ord (sC) ist null
sCis : Ord (sCis) ist 1
sD : Ord(sD) ist 2
usw.
Kämpfe gerade mit der automatischen Erzwingung eines Barre-Griffes, wenn mehr als 4 Finger benötigt werden. Wenn man mit seinen großen Händen mit den Fingern zwei Quarten greift, und dann mit dem Daumen noch einen Halbton-Lauf auf der tiefen E spielt, gehört das ja wohl nicht in die Gitarrenschule (Jimi Hendrix: Wind Cries Mary)....
Winni
Abs ist der positive Wert - das MinusVorrzeichen wird entfernt.
Ord gibt Dir die Position in einem Aufzähl-Type.
Nimm meine Halbtonleiter;
sC : ord (sC) ist null
sCis : Ord (sCis) ist 1
sD : Ord(sD) ist 2
usw.
Kämpfe gerade mit der automatischen Erzwingung eines Barre-Griffes, wenn mehr als 4 Finger benötigt werden. Wenn man mit seinen großen Händen mit den Fingern zwei Quarten greift, und dann mit dem Daumen noch einen Halbton-Lauf auf der tiefen E spielt, gehört das ja wohl nicht in die Gitarrenschule (Jimi Hendrix: Wind Cries Mary)....
Winni
-
- Beiträge: 1061
- Registriert: Sa 12. Sep 2015, 12:10
- OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
- CPU-Target: Win 32/64, Linux64
- Wohnort: Wien
Re: 2D Arrays - StringGrid
hab ein sehr breites Grinsen im Gesicht wenn man sieht welche Talente da außer den digitalen vorhanden sindWinni hat geschrieben: Fr 21. Mai 2021, 20:39 Kämpfe gerade mit der automatischen Erzwingung eines Barre-Griffes, wenn mehr als 4 Finger benötigt werden. Wenn man mit seinen großen Händen mit den Fingern zwei Quarten greift, und dann mit dem Daumen noch einen Halbton-Lauf auf der tiefen E spielt, gehört das ja wohl nicht in die Gitarrenschule (Jimi Hendrix: Wind Cries Mary)....

Leider kann ich da nur etwas mit meinen Füßen beitragen.
Chapeau
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: 2D Arrays - StringGrid
Weil das im Prinzip eine durchgehende Anweisung ist:nevermore2k hat geschrieben: Fr 21. Mai 2021, 14:20 Das hat mich gerade 15 Minuten gekostet, und zwar nur deshalb bis ich aus Frust das Semikolon vor dem else in der Zeile davor gelöscht habe... wieso darf da keines hin ?
Code: Alles auswählen
if (acol = 0) then DasEine else DasAndere;
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Hi!
Ja, das sieht man oft: überflüssige begin .. end;
Die Pascal-Regeln seit den 1970ern besagen: Hinter jedem if darf genau eine Anweisung stehen.
Solche if Kaskaden sind also erlaubt:
Solche if-Kaskaden sind durchaus alltäglich, wenn case nicht helfen kann.
Winni
Ja, das sieht man oft: überflüssige begin .. end;
Die Pascal-Regeln seit den 1970ern besagen: Hinter jedem if darf genau eine Anweisung stehen.
Solche if Kaskaden sind also erlaubt:
Code: Alles auswählen
If year < 2021 then
if month = 8 then
if year > 1990 then
showMessage ('Junges Sommer-Gemüse') else
begin
Inc(AltesGemuese);
showMessage ('Altes Sommer-Gemüse');
end;
Winni
- Winni
- Beiträge: 1577
- Registriert: Mo 2. Mär 2009, 16:45
- OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
- CPU-Target: 64Bit
- Wohnort: Fast Dänemark
Re: 2D Arrays - StringGrid
Es gibt halt Regeln in der Syntax und wenn da kein Semikolon hinter einer Anweisung steht, dann weiss der Compiler (eigentlich: der Parser), dass da jetzt irgendwas anders wird.nevermore2k hat geschrieben: Fr 21. Mai 2021, 14:20
eine kurze Frage zu" if then else" .
Das hat mich gerade 15 Minuten gekostet, und zwar nur deshalb bis ich aus Frust das Semikolon vor dem else in der Zeile davor gelöscht habe... wieso darf da keines hin ?Code: Alles auswählen
if (acol = 0) then StringGrid1.Canvas.TextOut(x, aRect.Top - 2, s) else StringGrid1.Canvas.TextOut(x - 28, aRect.Top - 2, s);
Syntax-Regeln sind halt streng. Nicht so wie deutsch nach der Rächtzschraibreform. Und von schweizerisch oder bayrisch wollen wir mal garnicht reden. Gibt halt keine Untertitel in Pascal.
Ist doch schön, dass der Compiler einem sagt, dass man wieder Blödsinn gehackt hat ....
Winni
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
ok also muss ich mir das "abs" wie eine Art unsigned Wandler vorstellen
und anstelle mit einem Pointer durchzuzählen kann ich "ord" nehmen und bekomme die Position zurück, richtig?


Winni hat geschrieben: Fr 21. Mai 2021, 20:39 Hi!
Abs ist der positive Wert - das MinusVorrzeichen wird entfernt.
Ord gibt Dir die Position in einem Aufzähl-Type.
Nimm meine Halbtonleiter;
sC : ord (sC) ist null
sCis : Ord (sCis) ist 1
sD : Ord(sD) ist 2
usw.
Kämpfe gerade mit der automatischen Erzwingung eines Barre-Griffes, wenn mehr als 4 Finger benötigt werden. Wenn man mit seinen großen Händen mit den Fingern zwei Quarten greift, und dann mit dem Daumen noch einen Halbton-Lauf auf der tiefen E spielt, gehört das ja wohl nicht in die Gitarrenschule (Jimi Hendrix: Wind Cries Mary)....
Winni
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
Hehe Der liebe Daumen auf der 6. Saite.
Hm Barre Griffe sind im groben nach der Theorie, nichts anderes als 3 Klänge ab der D Saite oder G Saite mit der jeweiligen benötigten Umkehrung. Wo der Grundton und die Quinte auf der A und bzw E Saite nach unten gedoppelt werden.
Hm Barre Griffe sind im groben nach der Theorie, nichts anderes als 3 Klänge ab der D Saite oder G Saite mit der jeweiligen benötigten Umkehrung. Wo der Grundton und die Quinte auf der A und bzw E Saite nach unten gedoppelt werden.
Winni hat geschrieben: Fr 21. Mai 2021, 20:39 Hi!
Abs ist der positive Wert - das MinusVorrzeichen wird entfernt.
Ord gibt Dir die Position in einem Aufzähl-Type.
Nimm meine Halbtonleiter;
sC : ord (sC) ist null
sCis : Ord (sCis) ist 1
sD : Ord(sD) ist 2
usw.
Kämpfe gerade mit der automatischen Erzwingung eines Barre-Griffes, wenn mehr als 4 Finger benötigt werden. Wenn man mit seinen großen Händen mit den Fingern zwei Quarten greift, und dann mit dem Daumen noch einen Halbton-Lauf auf der tiefen E spielt, gehört das ja wohl nicht in die Gitarrenschule (Jimi Hendrix: Wind Cries Mary)....
Winni
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid

Ich versuche gerade die Saiten in dem StringGrid etwas dicker zu machen, und gibt es ein kleines Problem das Vertikalen Linien irgendwie auch etwas dicker werden. weiss wer woran das liegen könnte ? und wie man das umgeht. Der Code ist noch ziemlich kraut und rüben.
Code: Alles auswählen
procedure TForm1.StringGrid1DrawCell(Sender: TObject; aCol, aRow: integer;
aRect: TRect; aState: TGridDrawState);
var
x, y, CenterX, a, b: integer;
s: string;
begin
b := 2;
y := (aRect.Bottom - aRect.Top) div 2 + aRect.Top;
StringGrid1.Canvas.Brush.Color := clBlack;
StringGrid1.Canvas.FillRect(aRect);
if (acol = 0) then
begin
StringGrid1.Canvas.Brush.Color := RGBToColor(150, 150, 150);
StringGrid1.Canvas.FillRect(aRect);
StringGrid1.Canvas.Pen.Width := 15;
CenterX := (aRect.Right - aRect.left) + aRect.Left;
StringGrid1.Canvas.Pen.Color := RGBToColor(123, 111, 123);
StringGrid1.Canvas.Line(CenterX, aRect.Top, CenterX, aRect.Bottom);
end;
StringGrid1.Canvas.Pen.Color := clGray;
StringGrid1.Canvas.Pen.Width := 2;
if arow = 5 then
begin
StringGrid1.Canvas.Pen.Width := 5;
StringGrid1.Canvas.Line(aRect.left, y, aRect.Right, y);
end;
if arow = 4 then
begin
StringGrid1.Canvas.Pen.Width := 4;
StringGrid1.Canvas.Line(aRect.left, y, aRect.Right, y);
end;
if arow = 3 then
begin
StringGrid1.Canvas.Pen.Width := 3;
StringGrid1.Canvas.Line(aRect.left, y, aRect.Right, y);
end;
StringGrid1.Canvas.Line(aRect.left, y, aRect.Right, y);
CenterX := (aRect.Right - aRect.left) + aRect.Left;
StringGrid1.Canvas.Pen.Color := clSilver;
StringGrid1.Canvas.Line(CenterX, aRect.Top, CenterX, aRect.Bottom);
StringGrid1.Canvas.font.color := clWhite;
StringGrid1.Canvas.Font.Size := 14;
s := StringGrid1.Cells[aCol, aRow];
x := CenterX - StringGrid1.Canvas.TextWidth(s) div 2;
if (acol = 0) then
begin
StringGrid1.Canvas.TextOut(x - 10, aRect.Top - 2, s);
// StringGrid1.Canvas.Brush.Color := clblack;
// StringGrid1.Canvas.font.color := clWhite;
end
else
StringGrid1.Canvas.TextOut(x - 28, aRect.Top - 2, s);
end;
-
- Beiträge: 81
- Registriert: Sa 1. Mai 2021, 15:39
Re: 2D Arrays - StringGrid
argh hab vergessen den pen wieder auf die richtige größte zu stellen... schön, wenn einem das erst beim Post durchlesen auffällt 
