![]() |
AW: Virtual Piano
Zitat:
Deklariere die
Delphi-Quellcode:
DieNoten: TSplitStrArray;
mal public dann dürfte die Reihenfolge keine Rolle mehr spielen. Zitat:
Das scheint sich nicht zu vertragen. Zitat:
gruss |
AW: Virtual Piano
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:wink: Fehlerhafte initialisierung! Warum auch immer!? Zitat:
@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:
auch der Versuch Public zu setzten je nach reihenfolge peng?
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!?? NORMAL IST DIES ABER NICHT:? Gruss |
AW: Virtual Piano
Kein ahnung was du machst.
Ich kann die reihenfolge setzen wie ich will da kracht nix. :wink: Edit: kann drehen wie ich will
Delphi-Quellcode:
gruss
NotenNamen: array[0..127] of string;
HalbTon: array[0..100] of Bool; DieNoten: TSplitStrArray; |
AW: Virtual Piano
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
und peng! siehe Photo:
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!?? Das passiert ja währen der initialisierung! Gruss |
AW: Virtual Piano
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 |
AW: Virtual Piano
Zitat:
Wie ist
Delphi-Quellcode:
definiert? Und wie sieht
TSplitStrArray
Delphi-Quellcode:
aus?
Split()
|
AW: Virtual Piano
Zitat:
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:shock: 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:wink: Problem bei der ganzen Sache ist, das ich fast nichts nutzen kann von Dir, bis auf die Graphicroutinen und die muss ich auch anpassen:cry: 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:
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{----------------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; Original: HalbTon: array[0..100] of Bool; DieNoten: TSplitStrArray; NotenNamen: array[0..127] of string; geändert: peng :shock: DieNoten: TSplitStrArray; HalbTon: array[0..100] of Bool; NotenNamen: array[0..127] of string; Gruss alfold |
AW: Virtual Piano
Hmm, seh da jetzt nichts, was eine AV auslösen könnte. Ich hab mal ein kleines Testprojekt gebastelt:
Delphi-Quellcode:
Egal, wie man die Variablen anordnet, es kommt zu keiner AV. Das Problem muss woanders liegen.
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. 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. |
AW: Virtual Piano
Zitat:
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:
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 |
AW: Virtual Piano
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:wink: Und wenn ich sage es gibt Dinge die man nicht brauch, wie ebend HalbTon: array[0..100] of Bool; oder im Resize
Delphi-Quellcode:
und schon flackert es auf XP nicht mehr.
// 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; Warum wirst Du also sauer? Das ist doch kein schlecht machen:cry: 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:wink: 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz