AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Virtual Piano

Virtual Piano

Ein Thema von EWeiss · begonnen am 8. Mär 2011 · letzter Beitrag vom 13. Apr 2019
Antwort Antwort
Seite 30 von 35   « Erste     20282930 3132     Letzte » 
EWeiss
Projekt entfernt..

Geändert von EWeiss (24. Jul 2019 um 04:46 Uhr)
 
EWeiss
 
#291
  Alt 2. Jul 2011, 18:10
Kann es sein, dass DieNoten die Länge 0 hat? Im ersten Fall wird der Zugriff noch durch das 100 Bytes lange Boolean-Array HalbTon „aufgefangen“, im zweiten Fall kommt jedoch nach DieNoten keine Deklaration mehr, und der Zugriff geht ins Nirwana (nicht alloziierter Speicher) → Zugriffsverletzung.

Edit: Schalte mal in den Compiler-Optionen die Bereichsprüfung ein.
NÖ die ist korrekt und wird mit 12 zurück geliefert.
Deklariere die
DieNoten: TSplitStrArray;
mal public dann dürfte die Reihenfolge keine Rolle mehr spielen.

Zitat:
Keine Ahnung warum dies so passiert!!!
Weil Privat und nicht public.. bzw.. weil ich aus einer Privaten Deklaration auf ein als Global definiertes Array zugreifen will
Das scheint sich nicht zu vertragen.

Zitat:
weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte


gruss

Geändert von EWeiss ( 2. Jul 2011 um 18:21 Uhr)
  Mit Zitat antworten Zitat
alfold

 
Delphi 7 Enterprise
 
#292
  Alt 2. Jul 2011, 18:38
So habe DieNote entfernt und in Splitnotes ne local Variable dafür genommen.
Darauf hin musst ich NotenName noch wo anders hinsetzten sonst hat es da plötzlich geknallt.

Bereichsprüfung ist an hält ja auch an, an der Pos wo es knallt Fehlerhafte initialisierung! Warum auch immer!?

Zitat:
weil man das Array 'HalbTon' gar nicht benötigt! und ich entfernen wollte
Für was hast Du 'NotenName' damit geht es auch

@NamenLozer: Es kann immer nur auf das 1(0) array Element nicht zugegriffen werden bei Schreiben/lesen. Wenn alles in der Reihenfolge bleibt

Delphi-Quellcode:
 TMidiTracker = class
  private

    FHGrid: HWND;
    FWidth: integer;
    FHeight: integer;
    FTop: integer;
    FLeft: integer;
    Img: cardinal;
    dwStyle: DWORD;
    dwClass: PWideChar;
    IsInitialized: BOOL;
    FOffsetX: integer;
    FOffsetY: integer;

   //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN

    //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME
    //NotenNamen: array[0..127] of string;

    DimmedCol: array[0..15] of COLORREF;
    IsDrum: array[0..15] of Bool;
    DrumNum: array[0..15] of integer;
    NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!??
auch der Versuch Public zu setzten je nach reihenfolge peng?

NORMAL IST DIES ABER NICHT

Gruss
  Mit Zitat antworten Zitat
EWeiss
 
#293
  Alt 2. Jul 2011, 18:40
Kein ahnung was du machst.
Ich kann die reihenfolge setzen wie ich will da kracht nix.

Edit:
kann drehen wie ich will

Delphi-Quellcode:
    NotenNamen: array[0..127] of string;
    HalbTon: array[0..100] of Bool;
    DieNoten: TSplitStrArray;
gruss

Geändert von EWeiss ( 2. Jul 2011 um 23:21 Uhr)
  Mit Zitat antworten Zitat
alfold

 
Delphi 7 Enterprise
 
#294
  Alt 2. Jul 2011, 18:52
Delphi-Quellcode:
TMidiTracker = class
  private

    FHGrid: HWND;
    FWidth: integer;
    FHeight: integer;
    FTop: integer;
    FLeft: integer;
    Img: cardinal;
    dwStyle: DWORD;
    dwClass: PWideChar;
    IsInitialized: BOOL;
    FOffsetX: integer;
    FOffsetY: integer;

   //HalbTon: array[0..100] of Bool; <--das zuerst weggenommen knalls bei DIENOTEN

    //DieNoten: TSplitStrArray; <---das weggenommen peng bei NOTENNAME
    NotenNamen: array[0..127] of string;//<--wieder gesetzt!!!!!!

    DimmedCol: array[0..15] of COLORREF;
    IsDrum: array[0..15] of Bool;
    DrumNum: array[0..15] of integer;
    //NotenNamen: array[0..127] of string;// jetzt hier hin gesetzt funct!??
und peng! siehe Photo:
Das passiert ja währen der initialisierung!
Gruss
Miniaturansicht angehängter Grafiken
bereichpruefung.png  
  Mit Zitat antworten Zitat
EWeiss
 
#295
  Alt 2. Jul 2011, 18:57
Und kein Peng

Siehe oben angehängtes Foto.

PS:
Warum veränderst du jetzt alle Variablen Namen?

Wenn ich später da weiter Arbeiten will (möchte) finde ich keine
mir bekannte Function mehr.


gruss

Geändert von EWeiss ( 2. Jul 2011 um 19:00 Uhr)
  Mit Zitat antworten Zitat
Namenloser

 
FreePascal / Lazarus
 
#296
  Alt 2. Jul 2011, 20:08
Zitat:
Keine Ahnung warum dies so passiert!!!
Weil Privat und nicht public.. bzw.. weil ich aus einer Privaten Deklaration auf ein als Global definiertes Array zugreifen will
Das scheint sich nicht zu vertragen.
Aus einer privaten Deklaration auf ein globales Array zugreifen, sollte an sich funktionieren (ob es gutes Design ist, ist eine andere Frage). Man kann immer von niedrigeren Sichtbarkeitsstufen auf Elemente höherer Sichtbarkeitsstufe zugreifen. Nur umgekehrt geht es natürlich nicht, aber da meckert der Compiler schon rechtzeitig. Eine Zugriffsverletzung sollte auf keinen Fall auftreten können. Es muss an etwas anderem liegen.

Wie ist TSplitStrArray definiert? Und wie sieht Split() aus?
  Mit Zitat antworten Zitat
alfold

 
Delphi 7 Enterprise
 
#297
  Alt 2. Jul 2011, 20:29
Und kein Peng

Siehe oben angehängtes Foto.
Dann mach mal //HalbTon: array[0..100] of Bool; und dokumentiere mal halbton in Dragrid und PrintSidbar aus.
Soll ja nur zum Test sein, ob Du dann etwa in zeile 290 eine Fehlermeldung bekommst.

Obendrein sollst Du ja nicht von Deinem Rechner ausgehen.
Bei mir funct auch immer alles - aber wehe ich komm auf ein anderen Rechner. Sei es mit dem fertigen Prog oder mit den Quellcode, der mal überarbeitet werden soll

Egal, solange ich die original Reienfolge einhalte funct alles, aber wehe -siehe oben- . Dies gibt mir zu denken!!!!

Anbei:
Ich habe schon einiges vereinfachen können! Du hast manchmal unötiges gemacht.
Ich muss sowie so neue Proceduren schreiben. Die alten mach ich {} so
1. Grid[] wird dynamisch
2. werden die Daten so im Grid abgelegt wie die original MIDIFile
$0;$90;$76;$42;$97;$80,$00 als Beispiel
Somit kann man auch Akkorde in einem Track spielen, lautstärke für jede Note festlegen usw

Problem bei der ganzen Sache ist, das ich fast nichts nutzen kann von Dir, bis auf die Graphicroutinen und die muss ich auch anpassen

Wahrscheinlich ist es besser den MIDITRACKER gleich neu zu schreiben. Denn zur Zeit Doktore ich an zu vielen Stellen im jetztigen MidiTracker und dann kommt sowas raus siehe oben und such den Fehler. Der hat mir 3 Tage gekostet.
Und bleibt ein RÄÄÄÄTsel.

@NamenLozer:
Delphi-Quellcode:
 
{----------------in uGlobal.pas--------------}
type
  TSplitStrArray = array of string;
....
....
function Split(const Source, Delimiter: string): TSplitStrArray;
...
...

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;

{--------in uMidiTraker------------------------}
private
 DieNoten: TSplitStrArray;
...
...

procedure TMidiTracker.SplitNotes;
var
  IntA: integer;
  IntB: integer;
  IntC: integer;
  //mynoten: TSplitStrArray; <--war als test von mir

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;

end;
Problem ist solange alles in der Reihenfolge wie er es hat, funct es ja, aber wie oben beschrieben, sobald etwas nicht mehr in der Reihenfolge ist

Original:
HalbTon: array[0..100] of Bool;
DieNoten: TSplitStrArray;
NotenNamen: array[0..127] of string;

geändert: peng
DieNoten: TSplitStrArray;
HalbTon: array[0..100] of Bool;
NotenNamen: array[0..127] of string;

Gruss alfold

Geändert von alfold ( 2. Jul 2011 um 20:31 Uhr)
  Mit Zitat antworten Zitat
Namenloser

 
FreePascal / Lazarus
 
#298
  Alt 2. Jul 2011, 20:51
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.
  Mit Zitat antworten Zitat
EWeiss
 
#299
  Alt 2. Jul 2011, 20:53
Zitat:
Ich habe schon einiges vereinfachen können! Du hast manchmal unötiges gemacht.
Meine Routinen sind auf Fixed Noten 1/4 4/4 ausgelegt incl Grid.
Und alles was da verwendet wird hat einen bezug dazu.

Das was du manchmal unnötig nennst (von dir entfernt bzw. gelöscht wurde)
habe ich in dem Update von dir gesehen
Leider auch wenn es noch nicht fertig war .. hat danach so gut wie nichts mehr funktioniert.
Wenn ich die Maus nach links gezogen habe hatte ich plötzlich an irgendeiner stelle im Grid 20 und mehr Noten hintereinander gezeichnet.
Du siehst also da kann man nicht einfach mal so irgendetwas löschen wenn man den bezug nicht dazu kennt(unötiges gemacht).
Wenn du den ganzen kram mit im und export von Midi zur seite schiebst war das alles Korrekt geschrieben.
Schließlich habe ich mir etwas dabei gedacht.

Mal abgesehen das alle button auch keine Funktion mehr hatten.
Also stelle mich hier nicht als ein NOB hin das ich schreiben kann habe ich schon genug bewiesen hier denke ich mal!
Ich kann Kritik vertragen sehr gut sogar aber nur dann wenn Sie berechtigt und im bezug steht zu meinem Konzept feste Noten fester Takt.
Durch die änderung auf das jetzige importieren und Exportieren von Hexadezimalen Midi Daten (war nicht mein konzept)
kann das alles nicht mehr korrekt funktionieren und dann, und nur dann wird einiges unnötig und nicht mehr von belang sein!

Ich habe dir von anfang an gesagt das es nicht einfach ist mein konzept zu verwerfen da ich mit Fixen Daten arbeite
und dir gesagt das ich in dem fall den Miditracker komplett neu schreiben muss.
Mache meine Arbeit jetzt also nicht schlecht nur weil du den Tracker auf dein Konzept umlegen willst (was ja kein Problem für mich darstellt).


Aber was soll's.

@NamenLozer
Zitat:
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.
Das war ja meine Vermutung da TSplitStrArray static bzw.. Global definiert ist.

Allerdings tritt das problem bei mir nicht auf MidiPiano startet immer egal in welcher Reihenfolge.

PS:
Auch wenn ich Notenname ganz entferne gibt es kein AV und alles Daten werden korrekt gesplittet..
Siehe Bild!

Bild gelöscht sonst zuviel Müll im Forum!

gruss Emil

Geändert von EWeiss ( 2. Jul 2011 um 23:22 Uhr)
  Mit Zitat antworten Zitat
alfold

 
Delphi 7 Enterprise
 
#300
  Alt 2. Jul 2011, 21:28
Na na na, was denn jetzt!
Ich mache Dein Prog nicht schlecht. Im Gegenteil möchte ich es ja noch besser machen, weil es so schick ist

Und wenn ich sage es gibt Dinge die man nicht brauch, wie ebend
HalbTon: array[0..100] of Bool; oder im Resize
Delphi-Quellcode:
// Neuzeichnen sperren
  //LockWindowUpdate(WinHandle);
  SendMessage(WinHandle, WM_SETREDRAW, 0, 0);
  //FVisible := False;

  //SKAERO_AnchorEnum(WinHandle);
....
....


  // Aktualisiere die Seiten und TopBars
  //PrintSideBar;
  //PrintTopBar;
  //FVisible := True;
  // Neuzeichnen wieder erlauben
  SendMessage(WinHandle, WM_SETREDRAW, 1, 0);
  //LockWindowUpdate(0);

  //Resizing := False;
und schon flackert es auf XP nicht mehr.
Warum wirst Du also sauer? Das ist doch kein schlecht machen
So gibt es noch andere Stellen um Originalen, wo man sagen kann, ja kann man machen, muss nicht.

Und wenn mein Beispiel bei Dir nicht gefunct hat, bei mir funct es

Wobei wir wieder beim Thema sind. Also nmh.... RÄAAAATSEL.
Hab das jetzt so:

//HalbTon: array[0..100] of Bool;
//DieNoten: TSplitStrArray;

DimmedCol: array[0..15] of COLORREF;
IsDrum: array[0..15] of Bool;
DrumNum: array[0..15] of integer;
NotenNamen: array[0..127] of string;//<--- hier hingesetzt und es funct
.....

Also sooooory @EWeiss falls es falsch rübergekommen ist!

Gruss alfold
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
Delphi-Forum.de - Array statisch/dynamisch oder TList fr Midi-Events This thread Refback 20. Sep 2011 14:59

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz