Ich habe ein Problem mit einem TDBChart. Beim Zoomen soll die vertikale Achse nicht berücksichtigt werden. Es soll nur die horizontale Achse gezoomt werden.
Announcement
Collapse
No announcement yet.
vertikale Achse vom TDBChart nicht zoomen; dringend
Collapse
X
-
Hi Martin!<br>
Die einzige Möglichkeit die ich kenne ist ZoomRect zu verwenden.<br>
OnZoom Ereigniss abfangen und mit ZoomRect das neue Rechteck <br>
festlegen. Dabei die Vertikale Achse immer mit dem selben Wert <br>
definieren.Vorher die Höhe der Achse abfragen, da die angaben <br>
in Pixeln verlangt werden.<br>
Gruß Fre
-
Danke erstmal für den Tipp! Kannst du mir dabei evtl. noch etwas weiterhelfen? Ich habe der Komponente noch nicht alles so gut verstanden. Ich hab noch nicht so recht ne Ahnung, wie ich die Höhe auslesen soll. Kannst du mir evtl. da noch nen Tipp geben. Ich würde die Hilfe von C++ Builder so verstehen, dass man die Höhe über:
DBChart1->LeftAxis->Maximum
bzw.
DBChart1->LeftAxis->Minimum
ermitteln kann. liege ich da halbwegs richtig? Oder kannst du mir nen kompletten Text dazu liefern? Wäre echt nett von dir. Danke schonmal im Vorraus.
Ciao Marti
Comment
-
Hi Martin!<br>
Minimum und Maximum ist fast richtig.<br>
Da ich CB4 verwende habe ich mit der Chart-Componente einen<br>
Haufen Ärger. In der Hilfe sind Functionen beschrieben, die es<br>
gar nicht gibt, die man aber gebrauchen könnte.<br>
Beispiel Höhe Vertikale Achse: <br>
// !!! ChartRect ist nicht identisch mit Height & Width
int hoeheMax = Chart1->ChartRect.bottom-Chart1->ChartRect.top;<br>
int hoeheMin = Chart1->ChartRect.top;<br>
Beispiel Breite Horizontale Achse: <br>
int breiteMax = Chart1->ChartRect.right-Chart1->ChartRect.left;<br>
int breiteMin = Chart1->ChartRect.left;<br>
// jeztz ändern oder nicht !<br>
// aufpassen, der Ursprung liegt oben links<br>
Chart1->ZoomRect( breiteMin, hoeheMin, breiteMax, hoeheMax );<br>
viel Spaß<br>
Fre
Comment
-
Danke für den Quelltext. Soweit schaut die Sache schon ganz gut aus.
Also hoeheMin und hoeheMax funktionieren schon ganz gut, doch ein kleines Problem habe ich noch. Ich habe keinen Schimmer davon, wie ich die Koordinaten der Maus bekommen soll. Ich hab daran gedach mir die Werte der Maus beim Klick und bei OnZoom zu holen, aber ich denke dass ist zu aufwendig. Meine erfahrung lehrt mich, dass es da noch einen anderen Weg geben muss. Ich hab bis jetzt aber leider nichts brauchbares in der Hilfe gefunden. Hast du dazu noch eine Idee oder nen Tipp, wo man mal nachschauen oder Nachfragen kann?
Ciao! Marti
Comment
-
Hi Martin!<br>
Hilfe kommt! // Ansonsten in der TChart - Hilfe suchen<br>
Du hast mehrere Möglichkeiten : <br>
void __fastcall TFCamDaten::Chart1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
void __fastcall TFCamDaten::Chart1MouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
void __fastcall TFCamDaten::Chart1ClickSeries(TCustomChart *Sender,
TChartSeries *Series, int ValueIndex, TMouseButton Button,
TShiftState Shift, int X, int Y)
void __fastcall TFCamDaten::Chart1ClickBackground(TCustomChart *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
<br>
Nach diesen Beispielen findest Du den Rest in der Hilfe oder<br>
kannst ihn Dir denken.<br>
Gruß Fre
Comment
-
Danke für deine Hilfe hab die ganze Sache jetzt folgendermaßen gelöst:
void __fastcall TForm1:BChart1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
XM1 = X;
}
}
void __fastcall TForm1:BChart1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
if (Button == mbLeft)
{
DBChart1->LeftAxis->Automatic = false;
XM2 = X;
if (XM1 > XM2)
{
int buf = XM2;
XM2 = XM1;
XM1 = buf;
}
int hoeheMax = DBChart1->ChartRect.bottom;
int hoeheMin = DBChart1->ChartRect.top;
int breiteMin = XM1;
int breiteMax = XM2;
DBChart1->ZoomRect( Rect(breiteMin, hoeheMin, breiteMax, hoeheMax) );
}
}
Ich habe jetzt nur ein Problem! Wenn das Rechteck, dass mit der Maus gezogen wird, nach rechts gezogen wurde, dann wird die horizontale Achse trotzdem gezoomt. wird das Rechteck nach links gezogen, dann funktioniert die ganze Geschichte einwandfrei. Fällt dir dazu noch was ein?
Ciao und Danke für deine Hilfe!
Marti
Comment
-
Hi Martin! <br>
Na klar fällt mir was ein.<br>
Setze AllowZoom auf false( damit übernimmst Du die Zoomerei )<br>
Dann MouseMove und MouseKeyDown über ein Flag abfragen und <br>
mit ZoomRect selber um einen bestimmten Wert zoomen.<br>
Mache ich auch so, da so viele Bugs drinne sind, kriegst die<br>
Motten(In TChart).<br>
Das Flag solltest Du global definieren und ++ und -- setzen.<br>
Gruß Fre
Comment
-
joi,Joi Martin!<br>
<br>
In der .H Datei bei public(kann man auch von außen steuern)<br>
oder privat(ist besser) int isZomm; definieren.<br>
Bei FormCreate isZoom = 0; initialisieren.<br>
Wenn MouseKeyDown, dann isZoom++; <br>
In MouseMove abfragen ob Mausetaste gedrückt und isZoom, dann<br>
isZoom++.<br>
static int xPos;<br>
xPos = X;
if( Shift.Contains(ssLeft) && isZoom )<br>
{<br>
// Umwandeln der X-Y-Werte in Pixel für ZoomRect
int x = (Chart1)oder Series1->XScreenToValue( X );<br>
int y = (Chart1)oder Series1->YScreenToValue( Y );<br>
...<br>
Wenn die Maus nach links bewegt wird, dann isZoom--;
if( X < xPos ) <br>
isZoom--;<br>
else<br>
isZoom++;<br>
}<br>
In MouseKeyUp(Maustaste wieder losgelassen)<br>
if( isZoom > 1 ) // nur wenn beim drücken der Maustaste diese auch<br>
// bewegt wurde<br>
ZoomRect(...)<br>
if( isZoom < 0 )<br>
ZoomRect(....) // wieder zurück mit der Vergrößerung<br>
oder mit UnZoom() gleich Vergrößerung auf Null<br>
Am Ende von MouseKeyUp isZoom auf Null setzen nicht vergessen<br>
sonst endlos.<br>
isZoom = 0;<br>
Oder Du baust einen Zoom/UnZomm-Button mit ein, und bei jedem <br>
drücken wirst Du bis zum Limit größer.(Vielleicht am besten) <br>
Ich hoffe das reicht Dir.<br>
Gruß Fre
Comment
Comment