Ausgehend vom textlichen Inhalt bei Midi-Dateien herrscht da wohl eher ein absolutes Chaos vor.
Hast Du eine Midi, bei der nix klapp und Du passt Deine Routine an, bis es klapp, dann klappt es für diese Midi. Nimmst Du nun eine andere und Du passt die Routine an ..., wird es bei der ersten Midi meist nicht mehr klappen.
Du brauchst "nur" eine Lösung, die meist in Ordnung ist.
Letzte Zeile:
Der Text wird immer im OnChange des lbLyrics (lbLyricsChange) übernommen. Dort wird immer der bisher vorhandene Text in den Gesamttext übernommen. Beim letzten (bisherigen) OnChange wird also alles bis zur vorletzten Zeile übernommen. Um die letzte Zeile zu bekommen, musst Du (höchstwahrscheinlich) das OnChange noch einmal "händisch" aufrufen, z. B. beim Beenden der Wiedergabe.
In EndSync setzt Du Caption auf ''. Dies dürfte das lbLyrics leeren, hier müsstest Du aber noch die letzte Zeile übernehmen die zwar schon in lbLyrics enthalten ist, deren Übernahme in die Ausgabe aber noch fehlt.
Ändere das bitte mal um z. B. so:
Delphi-Quellcode:
procedure EndSync(
Handle : HSYNC; Stream : HSTREAM; data : DWORD; user : Pointer);
stdcall;
begin
// Hierdurch müsste das Ereignis lbLyricsChange zweimal ausgelöst werden.
// Beim ersten mal kann dort die letzte Zeile übernommen werden.
// Beim zweiten Mal wird lbLyrics gelehrt.
// Da bei der bisherigen Logik immer die letzte Zeile fehlt, wäre die nun
// fehlende letzte Zeile halt '--- Ende ---', das können wir verschmerzen ;-)
TLabel(user).Caption := ProcessMarkText(TLabel(user).Caption, '
\--- Ende ---');
TLabel(user).Caption := '
';
// bzw.
TMemo(user).Text := ProcessMarkText(TMemo(user).Text, '
\--- Ende ---');
TMemo(user).Text := '
';
end;
{EndSync}
Ist halt 'nen Versuch wert, habe es aber nicht getestet.
Bzgl. TLabel(user).Caption und TMemo(user).Text hat mich gewundert, dass die erste Variante überhaupt funktioniert hat