2D Arrays - StringGrid

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
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

Beitrag von Winni »

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

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

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.

Benutzeravatar
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

Beitrag von Winni »

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:

Code: Alles auswählen

Type    TChord = array[0..5] of Integer;
Damit kannst Du dann ganz schnell ein ganzes Diagramm in 6 Integer packen. Z.B.:

Code: Alles auswählen


var  CMajor : TChord= (0,1,0,2,3,0);
Und jetzt : Ein Image auf eine Form packen, und dann:

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;
Beispiel ist im Anhang.

Winni
Dateianhänge
Image_G-Dur.png
Image_G-Dur.png (5.37 KiB) 1677 mal betrachtet

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

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.

Benutzeravatar
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

Beitrag von Winni »

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
Dateianhänge
GuitarChords.zip
(127.95 KiB) 53-mal heruntergeladen
Image_A-Dur.png
Image_A-Dur.png (34.21 KiB) 1658 mal betrachtet

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

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 :)

Benutzeravatar
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

Beitrag von Winni »

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

charlytango
Beiträge: 843
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

Beitrag von charlytango »

Winni 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)....
hab ein sehr breites Grinsen im Gesicht wenn man sieht welche Talente da außer den digitalen vorhanden sind ;)
Leider kann ich da nur etwas mit meinen Füßen beitragen.

Chapeau

Timm Thaler
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

Beitrag von Timm Thaler »

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 ?
Weil das im Prinzip eine durchgehende Anweisung ist:

Code: Alles auswählen

 if (acol = 0) then DasEine else DasAndere;    
Ich schreibe prinzipiell IMMER in begin... end. Zu oft drüber gestolpert, dass ich doch noch eine Anweisung einfügen wollte und dann passte das nicht.

Benutzeravatar
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

Beitrag von Winni »

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:

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;
Solche if-Kaskaden sind durchaus alltäglich, wenn case nicht helfen kann.

Winni

Benutzeravatar
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

Beitrag von Winni »

nevermore2k hat geschrieben:
Fr 21. Mai 2021, 14:20

eine kurze Frage zu" if then else" .

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);    
  
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 ?
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.

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

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

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

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

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.
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

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

Bild

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;      

nevermore2k
Beiträge: 81
Registriert: Sa 1. Mai 2021, 15:39

Re: 2D Arrays - StringGrid

Beitrag von nevermore2k »

argh hab vergessen den pen wieder auf die richtige größte zu stellen... schön, wenn einem das erst beim Post durchlesen auffällt :)

Antworten