ADO Komponenten funktionieren nicht
-
Könnte darin das Problem liegen?Der Hauptunterschied zwischen TChart und TDBChart besteht darin, daß das letztgenannte die korrekt auf dem Zielsystem installierte Borland Database Engine BENÖTIGT, während TChart diese nicht benötigt.
ADO ist (m. E.) nicht BDE.
-
Hallo,
Wäre es hier nicht besser die normale TChart-Komponente (ohne direkte Datenbankanbindung) zu verwenden und die Updates dann manuell durchzuführen. Sowas läßt sich auf jedem Fall besser debuggen.
Ciao
-
Tja ich könnte allerdings eine normale Chart Komponente nehmen wenn ich wüsste wie! wenn ich meine Hile aufrufe kommt nähmlich freundlicherweise eine fehlermeldung
und das wo ich aufrufen kann ist mit Pascal-code beschrieben
wie bekomme ich dann eigentlich die werte aus meiner Query in das Chart?
muss ich in einer Schleife alle Punkte einzeln schreiben? ist das nicht langsam?
kann mir vieleicht jemand ein Beispiel posten wie ich die daten übertrage?
-
Ich weiß nun nicht was du genau darstellen möchtest. Wenn dein Chart ein oder mehrere Linien enthält kannst du Punkte mit der Methode TChartSeries::AddXY() hinzufügen. Vorausgesetzt die Serie existiert schon geht das z.Bsp. so
chart->Series[0]->AddXY(x,y,"",clTeeColor);Dies fügt einen Punkt am Ende der ersten Serie im Chart hinzu.
Es gibt auch die Funktion AddArray. Die habe ich aber noch nicht verwendet.
Wie du an die Daten kommst weiß ich ja auch nicht. Du mußt sie halt aus dem Ergebnis deiner SELECT Abfrage extrahieren.
Die Hilfe zu TChart bezieht sich allgemein nur auf Pascal-Code. Das ist aber nicht schwer zu verstehen.
-
Vielen dank erst mal, jetzt bin ich schon mal viel weiter! ich kann jetzt die Daten aus meiner DB darstellen. Allerdungs klappt jetzt etwas mit dem überschreiben nicht. Das müsste dann aber der letzte Fehler sein. RefreshData gibt es ja beim Chart nicht.
deshalb habe Ich habe schon folgende möglichkeiten probiert:Daten->Chart1->Series[0]->Clear(); Daten->Chart1->Refresh();jedoch hat es nicht funktioniert. Wenn ich einen anderen befehl absetze wird das Chart nicht überschrieben, auser wenn ich folgenden code eingebe:
for(int i=0;i<100;i++) { Chart1->Series[0]->AddXY(3,51,"",clTeeColor); Chart1->Series[0]->AddXY(34,56,"",clTeeColor); }dann ändert sich das Chart
aber dieser Befehl hat im Chart keine Auswirkung mehr:DataModule1->ADOQuery1->Close(); DataModule1->ADOQuery1->SQL->Clear(); DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1 WHERE (Tabelle1.AnlagenNr=" + tmp +") AND (Tabelle1.Zeitwert >#" + S + "#)"); DataModule1->ADOQuery1->Open(); Daten->Chart1->Series[0]->Clear(); //Delete(); while (!DataModule1->ADOQuery1->Eof) { int Leistung = (DataModule1->ADOQuery1->FieldByName("Spannung")->AsInteger) * (DataModule1->ADOQuery1->FieldByName("Strom")->AsInteger); Chart1->Series[0]->AddXY(DataModule1->ADOQuery1->FieldByName("Zeitwert")->AsDateTime,Leistung,"",clTeeColor); DataModule1->ADOQuery1->Next(); //Setzt u.a. Eof wieder auf f. }In der Query ändert sich die Datenmenge auch, nur das Chart nicht
-
Mach mal Chart1->Repaint() danach;
-
Hallo, ich glaube das problem ist das, das automatisch die Skaleneinteilung auf den größten wert eingestellt wird. wenn ich jetzt andere Daten mit kleineren Werten anzeigen will, zeigt er sie wohl an, aber die Skaleneinteilungen bleiben auf den max wert eingestellt. In meinem fall habe ich auf der x-Achse Datum, auf der y_Achse Daten aus der DB. Wenn ich z.B. mit einem Button Daten aus dem letzten Jahr anschaue und dann mit dem nächsten das letzte halbe jahr, passt sich die Leiste nicht an.
Ich finde aber nichts was explizit auf clear Axis oder AutoAxis->Enabled oder ähnliches verweist. die Funktion clear() löscht vieleicht nur die gezeichneten Punkte. Wie kann ich aber die Achsen Einteilung löschen?
-
Sieh mal nach TChartAxis::Automatic, TChartAxis::AutomaticMinimum, TChartAxis::AutomaticMaximum sowie TChartAxis::Minimum und TChartAxis::Maximum. Wenn Automatic true ist sollte sich die Axe entsprechend des Maximums und Minimums deiner Daten selbst skalieren.
PS:
mit TChartAxis::CalcMinMax() bekommst du Maximum und Minimum deiner der Axe zugeordneten Serie.
-
Also bei mir ist alles auf true eingestellt, habe sogar versucht per code extra auf true zu initialisieren! es tut aber auch nicht. Bei calcminmax() liefert mir übrigens immer nichts zurück, d.h. die übergebenen Variablen bleiben wie sie waren.
-
Ist deine Serie mit der Axe verbunden? Das kannst du mit Series->AssociatedToAxis(TChartAxis *ax); prüfen.
-
Tschuldige aber ich bekomme das nicht ganz hin mit der abfrage, weil ich finde keine hilfe dazu. ich habe es so versucht
Daten->Series1->AssociatedToAxis(Chart1->BottomAxis *ax);
aber er kennt ax nicht, habe es auch mit BottomAxis versucht, kennt er auch nicht. welchen namen erwartet er?
kann ich dir vieleicht die Form mit den Charts senden? dann siehst du ja gleich wie und was eingestellt ist?
-
Was ist dieses Daten?
Normalerweise geht die Abfrage soif(Chart1->Series[0]->AssociatedToAxis(Chart1->BottomAxis)) { // tu irgendwas }andere Variante
if( Chart1->BottomAxis == Series1->HorizAxis ) {}Wenn du die Hilfe zu TChart hast öffne sie bitte. Dann gib beim Index wahlweise
TChart
TChartAxis
TChartSeries an.
Dann findest du alle Methoden und Eigenschaften.
-
OK,ich habe die abfrage eingebaut. die Serie ist auf jeden fall asoziert.
Daten heißt meine Form. Ich habe jetzt mal einen Button gepostet.(von diesen Refresh(),repaint ist was zuviel,ich weiß). IsValid ist bei mir immer false, d.h. so zeigt er mir nichts an. wenn ich diese Abfrage wegmache zeigt er mir nach ein Diagramm,wenn Chart leer war.Ändere ich mit einem 2 Button das Chart(im prinzip dasselbe wie das gepostete) passierrt nichts mehr wenn ich diesen wieder drücke.if(Chart1->Series[0]->AssociatedToAxis(Chart1->BottomAxis)) { Daten->Chart1->LeftAxis->Automatic = true; Daten->Chart1->BottomAxis->Automatic = true; Daten->Chart1->LeftAxis->AutomaticMinimum = true; if(Daten->Chart1->IsValidDataSource(Series1,Chart1)) { DataModule1->ADOQuery1->Close(); DataModule1->ADOQuery1->SQL->Clear(); DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1 WHERE (Tabelle1.AnlagenNr=" + tmp +") AND (Tabelle1.Zeitwert >#" + S + "#)"); DataModule1->ADOQuery1->Open(); Daten->Chart1->Series[0]->Clear(); while (!DataModule1->ADOQuery1->Eof) { //Leistung Chart1 Zeichnen int Leistung = DataModule1->ADOQuery1->FieldByName("Leistung")->AsInteger; Chart1->Series[0]->AddXY(DataModule1->ADOQuery1->FieldByName("Zeitwert")->AsDateTime,Leistung,"",clTeeColor); DataModule1->ADOQuery1->Next(); //Setzt u.a. Eof wieder auffalse } Daten->Chart1->Repaint(); Daten->Chart1->Refresh();
-
Ist dein Chart vom Typ TChart oder TDBChart ?
Bei einem TChart macht die Funktion IsValidDatasource keinen Sinn.
Ändere das mal so// den auskommentierten Teil brauchst du nur einmal am Anfang //if(Chart1->Series[0]->AssociatedToAxis(Chart1->BottomAxis)) //{ // Daten->Chart1->LeftAxis->Automatic = true; // Daten->Chart1->BottomAxis->Automatic = true; // Daten->Chart1->LeftAxis->AutomaticMinimum = true; // ist hier nicht nötig, wenn keine Verbindung zu einer Datasource besteht // if(Daten->Chart1->IsValidDataSource(Series1,Chart1)) // { DataModule1->ADOQuery1->Close(); DataModule1->ADOQuery1->SQL->Clear(); DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1 WHERE (Tabelle1.AnlagenNr=" + tmp +") AND (Tabelle1.Zeitwert >#" + S + "#)"); DataModule1->ADOQuery1->Open(); Daten->Chart1->Series[0]->Clear(); Daten->Chart1->Series[0]->BeginUpdate(); //verhindert ständiges refresh while (!DataModule1->ADOQuery1->Eof) { //Leistung Chart1 Zeichnen int Leistung = DataModule1->ADOQuery1->FieldByName("Leistung")->AsInteger; double time = DataModule1->ADOQuery1->FieldByName("Zeitwert")->AsDateTime; Chart1->Series[0]->AddXY(time,Leistung,"",clTeeColor); DataModule1->ADOQuery1->Next(); //Setzt u.a. Eof wieder auf false } Daten->Chart1->Series[0]->EndUpdate(); Daten->Chart1->Repaint(); // Daten->Chart1->Refresh();Das sollte eigentlich gehen. Ansonsten geh mal mit dem Debugger durch und schau dir mal an was hier so passiert.
-
Er sagt mir beim Compilieren aber das Begin/EndUpdate kein element von TSeries ist.Diese Methoden in zusammenhang mit Charts und Series kennt er bei mir gar nicht. (ich habe übrigens den BCB 6 Profesional).
Sorry wegen IsValid, benutze natürlich TChart
-
Dann hast du wohl TeeChart4, da gibt es diese Funktionen noch nicht (ich hab Version 5). Dann lass sie halt weg. Sie dienen ja eh nur zur Performanceverbesserung.
Sorry, ich kann jetzt nicht weitermachen da ich weg muss
Ciao und schönes Wochenende
-
Hallo nochmal,mein problem hat sich leider noch nicht gelöst.
Ich kann das Chart nach wie vor nicht löschen, weder mit Clear() noch mit Repaint().
Ich habe meine Charts auf einen TabbedNotebook plazirt. Normalerweise sollte dies ja keinen Unterschie machen, aber könnte es sein das meine Probleme damit irgendwie zusammenhängen?
-
Durchaus möglich:
BCB-Hilfe schrieb:
TTabbedNotebook wird nur aus Gründen der Abwärtskompatibilität bereitgestellt. Verwenden Sie in neuen Anwendungen statt dessen die Komponente TPageControl.
-
Hallo
ich weiss nicht, wie man über der TChart-Komponente Daten aus einer Datenbank anzeigen lassen kann. Über der TDBChart wäre es ja kein Problem.
Ich müsste höchstwahrscheinlich eine LINE-Series erzeugen dann die Funktion ADDXY, die angeboten wird, benutzen. Ich muss die Time-Werte aus der Datenbank auf die x-Achse transferieren und die Messwerte auf die y-Achse übergeben. Jedoch kann ich meine Zielsetzung nicht programmtechnisch umsetzen.
Ich wäre für jede lehrreiche Antwort dankbar
-
Hallo,
leider funktioniert die erwünschte Transformation nicht. Wüsste irgend jemand wie ich daten aus der datenbank über die tchart-komponente anzeigen kann. ich möchte time-werte aus der DB auf die x-Achse übergeben und Messwerte auf die y-Achse .
ich bin sehr dankbar für jede Antwort, durch die ich meine Problemstellung beseitigen kann?