MediaPlayer & TrackBar
-
oh, naja, hmm, problem *g* k.a. ich muss erstma nach hause, dann kann ich dir helfen, bin nämlich grad auf arbeit.
-
Ich werd' warten, danke. rolleyes:
-
Du kannst, zB. durch Überschreiben der WindowProc der TrackBar, die WM_LBUTTONDOWN- und WM_LBUTTONUP-Messages abfangen und dabei jeweils ein Flag setzen. Anhand dieses Flags kannst du im OnChange-Ereignis der TrackBar prüfen, ob das Ereignis vom User oder vom Timer ausgelöst wurde und entsprechend reagieren.
Als Flag könntest du eine externe bool-Variable oder zB. die Tag-Property der TrackBar benutzen. Beispiele uum Abfangen der Messages findest du in der FAQ unter "System".
Alternativ könntest du natürlich auch eine eigene Komponente von TTrackBar ableiten und OnMouseDown/OnMouseUp selbst implementieren. Oder du siehst dich auf Seiten wie www.torry.net nach fertigen Komponenten mit entsprechend erweiterten Fähigkeiten um.
-
Äh mal so ne unbedarfte frage: Wäre das nicht was für die On*Drag-Ereignisse?
Nur ne Frage.. hab noch nie mit der Trackbar gearbeitet...-junix
-
Nein, die Drag-Events betreffen wirklich nur das Herumziehen der Komponente selbst. In der Hilfe steht sinngemäss zwar auch was von "Objekten, die sich darauf befinden", der Slider der TrackBar ist aber offensichtlich keine eigenständiges Objekt.
-
Jansen schrieb:
Alternativ könntest du natürlich auch eine eigene Komponente von TTrackBar ableiten und OnMouseDown/OnMouseUp selbst implementieren.
Genau das habe ich vor, aber weiß nicht noch nicht genau wie.
Ich hab erstmal eine neue Header angelegt mit folgendem inhalt:
*#include <vcl\SysUtils.hpp>
#include <vcl\Controls.hpp>
#include <vcl\Classes.hpp>
#include <vcl\Forms.hpp>class PACKAGE MyTTrackBar : public TTrackBar
{
private:
protected:
public:__published:
__property OnMouseDown
__property OnMouseUp ;
};*Und irgendwie komm ich jetzt nicht weiter, weil ich nicht weiss wie ich auf die OnMouseDown/Up Ereignisse zugreifen kann, weil die ja nicht in TTrackBar enthalten sind.
Kann mir jemand von euch Profis einen kleinen Ansatz geben, damit ich es schaffe
bei der TrackBar auch die Fkt. OnMouseDown/Up benutzen zu können?Vielen Dank
Gruß, Christoph
-
Hallo
Du must die WIndowsbotschaft abfangen und verarbeiten
siehe FAQ, Abschnitt Komponenten entwickelnbis bald
akari
-
danke akari
hab mir jetzt einiges durchgelesen in der hilfe zum thema "komponentenentwicklung". aber es ist nicht ganz einfach alles herauszufiltern was ich brauch .
ich hab hier einen vorschlag. vielleicht kannst du mir ja noch ein paar tipps geben wie es weiter geht.
*class PACKAGE MyTTrackBar : public TTrackBar
{protected:
void __fastcall WMLBUTTONDOWN(TMessage* Message);BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_LBUTTONDOWN,???,????); //->Was muss da noch an Parametern rein?
END_MESSAGE_MAP(TTrackBar)
};void __fastcall MyTTrackBar::WMLBUTTONDOWN(TMessage* Message)
{
if (WM_LBUTTONDOWN == Message->LParam) //is das richtig?
{}
}
};*Vielen Dank

Gruß
-
Hallo
MESSAGE_HANDLER(WM_LBUTTONDOWN,???,????); //->Was muss da noch an Parametern rein?
MESSAGE_HANDLER(WM_LBUTTONDOWN,TMessage,WMLBUTTONDOWN); // Der dritte Parameter ist deine Funktion, die mit der Message aufgerufen werden sollif (WM_LBUTTONDOWN == Message->LParam) //is das richtig?
Wenn ich mich nicht irre, muß die Abfrage so aussehen :
if (Message->WParam &= MK_LBUTTON)/Edit : bitte für Quellcode statt dem Kursiv den C/C++ Tag benutzen (gleich der erste Button in der selben Spalte)
/Edit : Operator in Abfrage verbessert
bis bald
akari
-
hallo
ich hab jetzt folgenden code so eingegeben wie du gesagt hast
class PACKAGE MyTTrackBar : public TTrackBar { protected: void __fastcall WMLBUTTONDOWN(TMessage *Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_LBUTTONDOWN,TMessage,WMLBUTTONDOWN); //->Zeile 15 END_MESSAGE_MAP(TTrackBar) }; void __fastcall MyTTrackBar::WMLBUTTONDOWN(TMessage *Message) { if ((Message->WParam & MK_LBUTTON) == MK_LBUTTON) { } }´
es kommt aber leider noch folgende fehlermeldung:
**[C++ Fehler] mytrackbar.h(15): E2034 Konvertierung von 'TMessage' nach 'TMessage ' nicht möglich
[C++ Fehler] mytrackbar.h(15): E2342 Keine Übereinstimmung des Typs beim Parameter 'Message' ('TMessage ' erwartet, 'TMessage' erhalten)sitz hier schon ein paar stunden, komm aber nicht drauf was falsch sein könnte
Gruß
-
Hallo
das liegt daran, das du falsch aus der FAQ abgeschrieben hast und ich es nicht gemerkt habe

Die Deklaration der Methode bekommt den Message-Wert als Referenz, nicht als Pointervoid __fastcall WMLBUTTONDOWN(TMessage &Message);bis bald
akari
-
hallo und danke
das heisst doch aber auch das ich auch hier in der paramaeterübergabe der funktion
die message als referenz übergeben muss und damit auf WPARAM zugreif den . statt -> verwenden muss.
so wie ich es jetzt hab kommt kein fehlervoid __fastcall MyTTrackBar::WMLBUTTONDOWN(TMessage &Message) //auch Referenz statt Pointer { if ((Message.WParam & MK_LBUTTON) == MK_LBUTTON) //Zugriff auf WParam über Punkt statt -> { } }wenn das jetzt so richtig ist, wie wird dann die funktion über meine TrackBar1 aufgerufen? oder muss jetzt über Komponente->Komponente installieren gehen und die unit angeben?
Danke
-
Hallo
das heisst doch aber auch das ich auch hier in der paramaeterübergabe der funktion
die message als referenz übergeben muss und damit auf WPARAM zugreif den . statt -> verwenden muss.
so wie ich es jetzt hab kommt kein fehlerJa, genau das heißt es.
wenn das jetzt so richtig ist, wie wird dann die funktion über meine TrackBar1 aufgerufen? oder muss jetzt über Komponente->Komponente installieren gehen und die unit angeben?
Du must die Komponente jetzt kompilieren und anstatt der normalen TTrackbar verwenden. Das machst du am besten über den von die genannten Menüpunkt. Erstell in ein neues Package, und dann öffnet sich ein weiteres Fenster mit den Optionen Kompilieren und Installieren, welche du beide in der Reihenfolge ausführst. Dann sollte die Erfolgsmeldung kommen.
Danach solltest du noch zur Vorsicht die Headerdatei deiner Komponente z.B. nach <BCB-Path>\Include kopieren, damit du diese immer in allen Pprojekten verwenden kannst.bis bald
akari
-
hallo, ich hab das gefühl daß das problem bald gelöst wird, aber vorher gibts noch ein kleines problem

und zwar folgendes..
ich hab diese .h - header datei mit folgendem inhalt:
#include <vcl\SysUtils.hpp> #include <vcl\Controls.hpp> #include <vcl\Classes.hpp> #include <vcl\Forms.hpp> class PACKAGE MyTTrackBar : public TTrackBar { //Zeile 10 protected: void __fastcall WMLBUTTONDOWN(TMessage &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_LBUTTONDOWN,TMessage,WMLBUTTONDOWN); END_MESSAGE_MAP(TTrackBar) //Zeile 17 (kommt da vielleicht TControl in die Klammer?) };und diese .cpp - unit mit folgendem inhalt:
#include "mytrackbar.h" void __fastcall MyTTrackBar::WMLBUTTONDOWN(TMessage &Message) { if ((Message.WParam &MK_LBUTTON) == MK_LBUTTON) { } }wenn ich jetzt über "Komponente->Komponente installieren->In neues Package"
die Unit compilieren möchte, kommt folgende fehlermeldung:[C++ Fehler] mytrackbar.h(10): E2303 Typname erwartet
[C++ Fehler] mytrackbar.h(17): E2090 Qualifizierer 'TTrackBar' ist kein Name einer Klasse oder einer Struktur
[C++ Fehler] mytrackbar.h(17): E2379 In Anweisung fehlt ;
-
Hallo
mir fällt erstmal auf, das
#include <ComCtrls.hpp>fehlt, um überhaupt TTrackBar zu benutzen. Aber wenn ich mal schnell eine Ableitung von TTrackBar erstelle wird das automatisch eingefügt... hats du die Komponentendateien per Hand erstellt?
bis bald
akari
-
Hallo
wenn du mit komponentendateien die .h und .cpp die ich eben gepostet hab meinst, ja die habe ich mit hand erstellt. geht denn das auch anders?

aufjedenfall hat's jetzt ohne fehlermeldung kompiliert. bin schon ganz happy
jetzt bleibt mir bloß noch die frage wie ich die komponente in mein projekt einbinden kann?
vielen dank
-
Hallo
wenn du mit komponentendateien die .h und .cpp die ich eben gepostet hab meinst, ja die habe ich mit hand erstellt. geht denn das auch anders?
Ja, mit dem Menü Komponente/Neue Komponente
jetzt bleibt mir bloß noch die frage wie ich die komponente in mein projekt einbinden kann?
Das habe ich dir bereits geschrieben, 2 Posts vorher.
bis bald
akari
-
jetzt funktioniert alles. jupi
1000 dank für die hilfe und die gedult

Gruß Christoph
-
hallo
soweit funktioniert ja echt alles super, bloß lässt sich der Slide-Button der TrackBar keinen Millimeter verschieben.
Ich hab das mal mit dem Debugger überprüft und an der markierten Stelle in der CPP-Datei bleibt der immer hängen.
Header-Datei:
#ifndef TrackBar6H #define TrackBar6H //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Classes.hpp> #include <ComCtrls.hpp> #include <Controls.hpp> //--------------------------------------------------------------------------- class PACKAGE TTrackBar6 : public TTrackBar { private: protected: void __fastcall MYWMLBUTTONDOWN(TMessage &Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_LBUTTONDOWN,TMessage,MYWMLBUTTONDOWN); END_MESSAGE_MAP(TTrackBar) public: __fastcall TTrackBar6(TComponent* Owner); __published: }; //--------------------------------------------------------------------------- #endifCPP-Datei:
#include <vcl.h> #pragma hdrstop #include "TrackBar6.h" #pragma package(smart_init) //--------------------------------------------------------------------------- // Mit ValidCtrCheck wird sichergestellt, daß die erzeugten Komponenten // keine rein virtuellen Funktionen besitzen. // static inline void ValidCtrCheck(TTrackBar6 *) { new TTrackBar6(NULL); } //--------------------------------------------------------------------------- __fastcall TTrackBar6::TTrackBar6(TComponent* Owner) : TTrackBar(Owner) { } //--------------------------------------------------------------------------- namespace Trackbar6 { void __fastcall PACKAGE Register() { TComponentClass classes[1] = {__classid(TTrackBar6)}; RegisterComponents("Datensteuerung", classes, 0); } } //--------------------------------------------------------------------------- void __fastcall TTrackBar6::MYWMLBUTTONDOWN(TMessage &Message) { if(Message.Msg == WM_LBUTTONDOWN) { maus_gedrueckt=true; } else { TWinControl::WndProc(Message) ; // Hier bleibt er hängen } }aber auch wenn ich überhaupt nichts zwischen if und else schreibe kann man den slide button nicht bewegen.
Vielen Dank
-
Hallo
soll das nicht
TTrackBar::WndProc(Message) ;heißen? Du must die Funktion der nächst untergeordneten Klasse aufrufen.
bis bald
akari