| Autor |
Beitrag |
Platon
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Mi 25.04.07 16:22
Hallo Delphi-Freunde  !
Ich habe folgendes Probelm :
Ich hab seit ein paar Wochen ein interes Programm geschrieben für meine Firma. Ansich ist auch alles sehr schön. Ich konvertiere Daten aus einem TextFile in einen TChart, dann nach dortiger Auswahl von einem Bereich konvertiere ich die sichtbaren Daten in eine CSV Datein, also in eine ExcelDatei.
Dort pastele ich mit TExcelApplication. ... zwei Diagramme. Eins zeigt dann das gleiche Bild wie im TChart an.
Zu dem anderen Diagramm berechne ich vorher die KonzentrationsStufen der gemessenen Werte. Da gibt es auch Ausreiser etc. ... ist etwas schwerer als es aussieht...
Aber zu meinem Problem : in dem 2. Diagramm möchte ich nun eine Trendlinie einfügen. Wie funktioniert das ?
(in Excel -> rechtsklick auf die Punkte -> "tata")
Hab mir auch schon ein Makro dafür aufzeichnen lassen...aber das umbauen mit Delphi ???
Code:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| ... ExcelApplication.Charts.Add(emptyParam,emptyParam,emptyParam,emptyParam,0); with ExcelApplication.ActiveChart do begin ChartType := xlXYScatter; SetSourceData(Range2,xlColumns); Location(xlLocationAsNewSheet,'Diagramm 2'); HasTitle[0] := true; ChartTitle[0].Text := 'Linearity check '+ChartObjekt.Number+' '+FormatDateTime('yyyymmdd',now); HasAxis[xlCategory,xlPrimary,0] := true; HasAxis[xlValue,xlPrimary,0] := true; HasLegend[0] := true; Legend[0].Position := xlRight; end; |
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Platon am Mi 02.05.07 21:26, insgesamt 2-mal bearbeitet
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Mi 25.04.07 19:14
Also am Ende soll das ganze (Diagramm 2) dann so aussehen.
Würde mich sehr freuen, wenn mir jemand da helfen kann.
@Edit
das Makro dazu sieht folgendermassen aus :
ActiveChart.SeriesCollection(1).Trenndlines.Add...
nur gibt es in TExcelApplication.ActiveChart.SeriesCollection(1,0). ????
keine Trendlines oder ähnliches ???
Einloggen, um Attachments anzusehen!
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Mi 02.05.07 21:35
Ich bin ja fast der Meinung, dass da etwas mit der "ExcelXP.pas" nicht stimmt.
Sollte nicht "SeriesCollection(Index,0)" (in TExcelApplication.ActiveChart) "Series" zurückgeben ?
Dann würde ja auch das Makro so in etwa funktionieren, so wie bei den anderen Sachen auch.
Leider gibt aber "SeriesCollection(Index,0)" "IDispatch" zurück, was auch immer das genau ist.
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Do 03.05.07 06:36
Ähm die Unit kenne ich jetzt nicht, aber Excel ist sehr selten Base 0 und sehr oft Base 1. Das sollte man niemals vergessen. Und die SeriesCollection sollte den Namen zurückgeben, wenn du die richtige Linie triffst.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Do 03.05.07 21:13
Ok danke erstmal für die Antwort.
Um in Delphi mit Excel zu arbeiten, sei es mit TExcelApplication oder TExcelWorkbook etc. wird bei uses "ExcelXP" eingebunden... bzw in älteren Versionen dann wohl "Excel2000"...
Mmh...das mit der Null an der Stelle scheint da schon richtig zu sein, da es (siehe Code) dort auch überall ganz supi klappt.
Das mit dem Namen weiss ich jetzt nicht. So wie ich aber das Makro verstehe (der rest war ja auch so ähnlich) müsste da "Series" rauskommen.
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Fr 04.05.07 06:57
Das mit der Unit kann gut sein, nur habe ich noch nicht mit Delphi und Excel gearbeitet, wohl kenne ich aber 80% des ExcelVBA-Codes
Das hier:
SeriesCollection(1).Trenndlines.Add.
Ist aber etwas anderes als
SeriesCollection(Index,0)
Denn SeriesCollection(i) ist schon der Index und gibt ein Objekt zurück. Dein Code müsste dann eigentlich auch nur so aussehen:
Delphi-Quelltext 1:
| SeriesCollection(1).Trendlines.Add('Type:=xlLinear','Forward:=0','Backward:=0','DisplayEquation:=True','DisplayRSquared:=False') |
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Fr 04.05.07 07:50
hmm... danke.
Ich werde das mal ausprobieren.
Hab auch mitbekommen, dass es SeriesCollection mit einem, mit zwei und mit keinem Parameter gibt.
Ich selber hab nun mit Excel wenig am Hut, aber schon einiges mit Delphi. Sozusagen ist das hier mein Erstlingswerk mit Excel und Delphi. 
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Fr 04.05.07 08:09
Ich finde es total klasse, dass du mir helfen willst, aber es funktioniert leider nicht.
folgendes habe ich ausprobiert :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| FExcelApplication.Charts.Add(emptyParam,emptyParam,emptyParam,emptyParam,0); with FExcelApplication.ActiveChart do begin ChartType := xlXYScatter; SetSourceData(Range2,xlColumns); Location(xlLocationAsNewSheet,'Diagramm 2'); HasTitle[0] := true; ChartTitle[0].Text := 'Linearity check '+ChartObjekt.Number+' '+FormatDateTime('yyyymmdd',now); HasAxis[xlCategory,xlPrimary,0] := true; HasAxis[xlValue,xlPrimary,0] := true; HasLegend[0] := true; Legend[0].Position := xlRight; SeriesCollection(1).Trendlines.Add(xlLinear,0,0,0,0,0,false,false,'test'); end; |
Im Anhang (screenshot) siehst du genauere Fehlermeldung.
Einloggen, um Attachments anzusehen!
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Fr 04.05.07 11:01
Die Syntax ist aber eigentlich korrekt, versuchs sonst mal ohne Klammern für die Parameter. Damit kannst du definitv (VBA) eine Trendlinie hinzufügen:
Quelltext 1:
| ActiveChart.SeriesCollection(1).Trendlines.Add Type:=xlLinear |
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Fr 04.05.07 15:58
In VBA ist der Code sicher i.O., aber leider in Delphi nicht. 
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Mo 07.05.07 07:01
Versuche doch sonst mal mit der TLB von Excel zu arbeiten.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Di 29.05.07 10:04
Hoi ene,
danke für deine Mühen. Sorry dass ich mich jetzt erst melde. Hab noch an einem anderen Projekt gearbeitet.
Ich werd es mal mit TLB versuchen.
Aber gibt es eine Möglichkeit einen Makro in die csv zu schreiben (von Delphi aus) ?
Den könnte man ja dann ausführen...
z.B.
....BuildMakro(Makro: widestring);
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Mi 30.05.07 11:46
Also ich hab eine Antwort gefunden auf mein Problem. Mit der Server Componente "TExcelApplication" geht es nicht, da ist wohl etwas noch nicht so ganz fertig.
Für die Trendlinie und für noch ein paar andere Kleinigkeiten benutze ich nun den Typ Variant.
(ExcelV : Variant;)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| FExcelApplication.Charts.Add(emptyParam,emptyParam,emptyParam,emptyParam,0); with FExcelApplication.ActiveChart do begin ChartType := xlXYScatter; SetSourceData(Range2,xlColumns); Location(xlLocationAsNewSheet,'Diagramm 2'); HasTitle[0] := true; ChartTitle[0].Text := 'Linearity check '+ChartObjekt.Number+' '+ FormatDateTime('yyyymmdd',now); HasAxis[xlCategory,xlPrimary,0] := true; HasAxis[xlValue,xlPrimary,0] := true; HasLegend[0] := true; Legend[0].Position := xlRight; end; ExcelV := GetActiveOleObject('Excel.Application'); ExcelV.Sheets['Diagramm 2'].Select; for i := 1 to ChartObjekt.LineList.Count-1 do begin ExcelV.ActiveChart.SeriesCollection(i).Select; ExcelV.ActiveChart.SeriesCollection(i).Trendlines.Add (Type := xlLinear, Forward := 0, Backward := 0, DisplayEquation := True, DisplayRSquared := True).Select; end; ExcelV := unassigned; |
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Di 05.06.07 06:42
Die Selects solltest du lieber rausnehmen und die Objekte direkt ansprechen. Ansonsten kann das zu unangenehmen Nebeneffekten führen.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
Platon 
      
Beiträge: 42
WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
|
Verfasst: Do 07.06.07 18:13
Stimmt. Ok. 
|
|
|