AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Virtual Piano
Thema durchsuchen
Ansicht
Themen-Optionen

Virtual Piano

Ein Thema von EWeiss · begonnen am 8. Mär 2011 · letzter Beitrag vom 13. Apr 2019
Antwort Antwort
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Virtual Piano

  Alt 18. Jun 2011, 20:50
Leider nein
Beim Start kommt jetzt die Meldung im Anhang (vorher passierte gar nichts, und das Programm hing nur).
Miniaturansicht angehängter Grafiken
scr3940_20110618_.png  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Virtual Piano

  Alt 18. Jun 2011, 23:20
Leider nein
Beim Start kommt jetzt die Meldung im Anhang (vorher passierte gar nichts, und das Programm hing nur).
Hmm das hilft mir nicht wirklich weiter.
Kann mit dem Skin bzw.. dem einlesen der Instrumentenlisten zu tun haben wenn die nicht
korrekt sind. (Alte Version)

Danke für's testen.

Das linken auf die WinProc der Hauptanwendung sollte eigentlich so OK sein!

Delphi-Quellcode:
  FClientInstance,
  FPrevClientProc: TFNWndProc;
nachdem ich das Handle habe initialisiere ich die Subclass

SubClass(FHandle);

Delphi-Quellcode:
procedure TSkinListBox.SubClass(WinHandle: HWND);
begin
  FClientInstance := MakeObjectInstance(ClientWndProc);

  FPrevClientProc := Pointer(GetWindowLong(WinHandle, GWL_WNDPROC));
  SetWindowLong(WinHandle, GWL_WNDPROC, Integer(FClientInstance));
end;
Delphi-Quellcode:
procedure TSkinListBox.ClientWndProc(var Message: TMessage);

begin
  with Message do
  begin
    case Msg of
      WM_ERASEBKGND:
        Result := ListBoxProc(FHandle, integer(Msg), Message.WParam, Message.LParam);
      WM_MOUSEWHEEL:
        Result := ListBoxProc(FHandle, integer(Msg), Message.WParam, Message.LParam);
      WM_PAINT:
        Result := ListBoxProc(FHandle, integer(Msg), Message.WParam, Message.LParam);
      WM_LBUTTONUP:
        Result := ListBoxProc(FHandle, integer(Msg), Message.WParam, Message.LParam);
      WM_KILLFOCUS:
        Result := ListBoxProc(FHandle, integer(Msg), Message.WParam, Message.LParam);
    end;

    if (Result = 0) then
      Result := CallWindowProc(FPrevClientProc, FHandle, Msg, wParam, lParam);
  end;
end;


und dann.. bla bla

Delphi-Quellcode:
function TSkinListBox.ListBoxProc(WinHandle: HWND; Msg: UINT; wP: WParam; lP: LParam): LRESULT; stdcall;
begin
  ...
  Result := CallWindowProc(Pointer(FPrevClientProc), WinHandle, Msg, wP, lP);
end;
Kann mir jetzt nicht vorstellen das es daran liegen könnte (vermutung)
das die ListBoxProc privat deklariert ist.


gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Virtual Piano

  Alt 18. Jun 2011, 23:37
Moment mal – deine WndProc ist eine Methode eines Objekts? Woher soll denn dann der implizite Parameter self kommen, wenn die WndProc von Windows aufgerufen wird? Das könnte durchaus der Grund für den Crash sein.

Änder doch mal die Deklaration in class procedure TSkinListBox.ClientWndProc(var Message: TMessage); static; . Das ist dann quasi wie eine „normale“ Procedure, nur in einer Klasse deklariert.



edit: Okay, sorry, kannte MakeObjectInstance nicht. Gerade nachgelesen, was das ist – damit sollte es wohl doch in Ordnung sein.

edit 2: Allerdings könnte es sein, dass diese Methode mit der Datenausführungsverhinderung DEP (die ich aktiviert habe) in Konflikt gerät. Denn anscheinend wird dabei Code on-the-fly generiert/alloziiert, allerdings konnte ich nirgends sehen, dass für den Speicherbereich das PAGE_EXECUTE -Flag gesetzt würde. Vielleicht könntest du es ja doch mal so probieren, wie ich oben vorgeschlagen habe?

Geändert von Namenloser (18. Jun 2011 um 23:50 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Virtual Piano

  Alt 18. Jun 2011, 23:44

Moment mal – deine WndProc ist eine Methode eines Objekts? Woher soll denn dann der implizite Parameter self kommen, wenn die WndProc von Windows aufgerufen wird? Das könnte durchaus der Grund für den Crash sein.

Änder doch mal die Deklaration in class procedure TSkinListBox.ClientWndProc(var Message: TMessage); static; . Das ist dann quasi wie eine „normale“ Procedure, nur in einer Klasse deklariert.


edit: Okay, sorry, kannte MakeObjectInstance nicht. Gerade nachgelesen, was das ist – damit sollte es wohl doch in Ordnung sein.
Sollte nicht funktionieren.
Zitat:
[DCC Fehler] uListBox.pas(98): E2376 STATIC kann nur für nicht-virtuelle Klassenmethoden verwendet werden
Zitat:
Okay, sorry, kannte MakeObjectInstance nicht. Gerade nachgelesen, was das ist – damit sollte es wohl doch in Ordnung sein.
Kein problem

gruss
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Virtual Piano

  Alt 18. Jun 2011, 23:53
Ach sorry, mein Fehler. Ich habe völlig übersehen, dass in dem Archiv nur die geänderten Dateien enthalten waren. Deshalb ging es nicht. Ich habe jetzt dieses Dateien über eine ältere Version drüberkopiert, und siehe da: Es funktioniert Cool!

Glückwunsch, du hast den Fehler wohl doch behoben!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Virtual Piano

  Alt 18. Jun 2011, 23:59
Ach sorry, mein Fehler. Ich habe völlig übersehen, dass in dem Archiv nur die geänderten Dateien enthalten waren. Deshalb ging es nicht. Ich habe jetzt dieses Dateien über eine ältere Version drüberkopiert, und siehe da: Es funktioniert Cool

Glückwunsch, du hast den Fehler wohl doch behoben!
WOW Das ist doch mal was.. ohne Vista
OK das mit dem Selektieren aslo einen Rahmen um den Selektierten eintrag wird wohl nicht gehen da hier ein *png für benötigt wird..
Das nur mal so am Rande!
Dann danke nochmal für das Testen.

gruss

Geändert von EWeiss (23. Jun 2011 um 06:30 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Virtual Piano

  Alt 19. Jun 2011, 21:28
Wer's braucht!

Im Quelltext enthalten.. deshalb hier gelöscht!

Noch ein kleiner Fix für die Winproc uMiditracker.
SB_PAGEUP, SB_PAGEDOWN addiert und unnötige doppelte deklarationen entfernt.

gruss

Geändert von EWeiss (27. Jun 2011 um 17:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:59

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 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 by Thomas Breitkreuz