Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   teechartgrafik in groupbox speichern (https://www.delphipraxis.net/185209-teechartgrafik-groupbox-speichern.html)

Hartfrid Krause 22. Mai 2015 07:55

teechartgrafik in groupbox speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
delphi xe6
teechart 2014 pro xe6

Ich möchte die groupbox1 (rechter Teil) mit den drei unterschiedlichen Grafiken speichern.
Dazu müsste es einen relativ einfachen befehl gebebn, den ich so nicht kenne.

baumina 22. Mai 2015 08:18

AW: teechartgrafik in groupbox speichern
 
Meinst du vielleicht TChart.SaveToBitmapFile oder TChart.SaveToMetafile?

Sir Rufo 22. Mai 2015 08:19

AW: teechartgrafik in groupbox speichern
 
Ja, und der Befehl ist so geheim, wie das Format in das du speichern möchtest.

Tipp mal 42 in den Editor, dann wird da schon was gehen ... :roll:

Hartfrid Krause 22. Mai 2015 08:31

AW: teechartgrafik in groupbox speichern
 
Ich möchte die groupbox speichern (IN der groupbox sind die drei grafiken)

Perlsau 22. Mai 2015 08:33

AW: teechartgrafik in groupbox speichern
 
Du meinst sowas wie GroupBox.SaveToFile?

Hartfrid Krause 22. Mai 2015 10:05

AW: teechartgrafik in groupbox speichern
 
ja, schon, aber wie rufe ich das auf?
mit groupbox1.savetofile('123.png') etwas klappt das nicht

Sherlock 22. Mai 2015 10:46

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1302560)
ja, schon, aber wie rufe ich das auf?
mit groupbox1.savetofile('123.png') etwas klappt das nicht

Wieso nicht? Wie lautet die Fehlermeldung?

Sherlock

mkinzler 22. Mai 2015 11:11

AW: teechartgrafik in groupbox speichern
 
Delphi-Quellcode:
var
  Bitmap: TBitmap;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.SetSize(GroupBox1.Width, Groupbox1.Height);
    PaintToCanvas(Bitmap.Canvas);
    Bitmap.SaveToFile('123.png');
  finally
    Bitmap.Free;
  end;
end;

Hartfrid Krause 22. Mai 2015 13:10

AW: teechartgrafik in groupbox speichern
 
Das sieht ja ganz gut aus, aber der Befehl PaintToCanvas wird bei mir nicht übernommen.

Hartfrid Krause 22. Mai 2015 13:13

AW: teechartgrafik in groupbox speichern
 
nur mit diesem Befehl

groupbox1.savetofile('123.png') [/B]

lautet der Hinweis: [dcc32 Fehler] w31_WaehlerwanderungGrafik.pas(242): E2003 Undeklarierter Bezeichner: 'savetofile'

Der schöne Günther 22. Mai 2015 13:37

AW: teechartgrafik in groupbox speichern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich glaube, das meinte er auch nur eher als Witz. Aber wenn ich dich nicht falsch verstehe können wir uns ein "SaveToFile" doch so selber bauen, oder?

Delphi-Quellcode:
type
   TWinControlHelper = class helper for Vcl.Controls.TWinControl
      public
         procedure SaveToFile(const fileName: String); virtual;
   end;

procedure TWinControlHelper.SaveToFile(const fileName: String);
var
   DC:    HDC;
   bmp:   TBitmap;
begin
   DC := GetWindowDC(Handle);
   try
      bmp := TBitmap.Create();
      try
         bmp.SetSize(ClientWidth, ClientHeight);
         BitBlt(
            bmp.Canvas.Handle,
            0, 0, bmp.Width, bmp.Height,
            DC, 0, 0,
            WinApi.Windows.SRCCOPY
         );
         bmp.SaveToFile(fileName);
      finally
         bmp.Destroy();
      end;
   finally
      ReleaseDC(Handle, DC);
   end;
end;
Der Button2 sagt
Delphi-Quellcode:
procedure TForm15.Button2Click(Sender: TObject);
begin
   GroupBox1.SaveToFile('x:\myGroupbox.bmp);
end;
. Was dabei herauskommt siehst du im Anhang. Ist doch richtig so, oder?

bernerbaer 22. Mai 2015 13:42

AW: teechartgrafik in groupbox speichern
 
Na ja, so ab und zu wäre doch bei einigen Antworten doch ein kleines Smiley sinnvoll gewesen, oftmals nimmt man die Antworten sonst zu ernst.

Nun zur Frage und eine mögliche Lösung:

1. Bei der Groupbox ist Canvas (leider) nicht published, also müssen wir als erstes eine Ableitung der Groupbox erstellen und den Canvas als published definieren:

Delphi-Quellcode:
type TNewGroupBox = class(TGroupBox)
  public
    property Canvas;
  end;
2. Jetzt sollte das Speichern der Groupbox als Bild eigentlich keine Probleme mehr darstellen:

Delphi-Quellcode:

var
  Bitmap: TBitmap;
  Rect: TRect;
begin
   Rect.Left:= 0;
   Rect.Top:= 0;
   Rect.bottom:= groupbox1.Height;
   Rect.Right:= groupbox1.Width;
   Bitmap := TBitmap.Create;
   Bitmap.SetSize(Groupbox1.Width, Groupbox1.Height);
   Bitmap.Canvas.CopyRect(Rect,TNewGroupBox(groupbox1).Canvas, Rect);
   Bitmap.SaveToFile(filename); //irgendetwas.bmp

...
Bitmap.free;

mkinzler 22. Mai 2015 13:50

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1302580)
Das sieht ja ganz gut aus, aber der Befehl PaintToCanvas wird bei mir nicht übernommen.

Delphi-Quellcode:
BitBlt(GroupBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle,
    0, 0, SrcCopy);

bernerbaer 22. Mai 2015 13:58

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von mkinzler (Beitrag 1302586)
Delphi-Quellcode:
BitBlt(GroupBox1.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle,
    0, 0, SrcCopy);

Ab welcher Delphiversion ist das Canvas bei der Groupbox public?

Der schöne Günther 22. Mai 2015 14:33

AW: teechartgrafik in groupbox speichern
 
Ab keiner. Einfach Klassenhelfer machen (siehe oben) und gut ist ;-)

bernerbaer 22. Mai 2015 14:36

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1302594)
Ab keiner. Einfach Klassenhelfer machen (siehe oben) und gut ist ;-)

Das habe ich ja in meinem Beispiel auch gemacht.

Aber: Eigentlich erwarte ich in einem Beispielcode eines Moderators schon entweder Code der funktioniert, oder der Hinweis, wie der Code zum funktionieren gebracht werden kann. So wie der Code da steht, wird jeder Anfänger verzweifeln, wenn er das Beispiel umsetzen möchte.

Perlsau 22. Mai 2015 14:52

AW: teechartgrafik in groupbox speichern
 
Offensichtliche Witze müssen also ab jetzt gekennzeichnet werden, Moderatoren haben gefälligst funktionierenen Code zu posten und du bist hier der Chef. Alles klar, Boß, dein Wunsch ist mir Befehl :P Vielleicht sollte man bei derartigen Ansprüchen einfach eine Gebühr einführen: Du willst funktionierenen Code? Kein Problem, was zahlst du? :lol:

Mit einer ausgeprägten Verzweiflungsneigung steht man sich beim Lernen selbst im Weg. Letztendlich kommt die Verzeiflung daher, daß man ohne Basiskenntnisse einfach drauflosklickt und die unbehandelte Verzeiflungsneigung dann sofort zuschlägt, wenn's nicht gleich auf Anhieb klappt. Anders ausgedrückt: Anfänger, denen man immer nur funktionierenden Code präsentiert, den sie nicht verstehen, lernen nichts dazu. Copy&Paste <> Umsetzen.

Woher nur kommt diese ausufernde Anspruchshaltung?

Der schöne Günther 22. Mai 2015 15:05

AW: teechartgrafik in groupbox speichern
 
Wir haben jetzt schon drei Leute die, im Kern, den selben Code posten. Hartfrid könnte sich darüber freuen. Wir könnten alle das schöne Wetter genießen. Stattdessen fangen wahrscheinlich wieder gleich alle an sich zu bewerfen. :|

bernerbaer 22. Mai 2015 15:08

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von Perlsau (Beitrag 1302598)
Offensichtliche Witze müssen also ab jetzt gekennzeichnet werden, Moderatoren haben gefälligst funktionierenen Code zu posten und du bist hier der Chef. Alles klar, Boß, dein Wunsch ist mir Befehl :P Vielleicht sollte man bei derartigen Ansprüchen einfach eine Gebühr einführen: Du willst funktionierenen Code? Kein Problem, was zahlst du? :lol:

Mit einer ausgeprägten Verzweiflungsneigung steht man sich beim Lernen selbst im Weg. Letztendlich kommt die Verzeiflung daher, daß man ohne Basiskenntnisse einfach drauflosklickt und die unbehandelte Verzeiflungsneigung dann sofort zuschlägt, wenn's nicht gleich auf Anhieb klappt. Anders ausgedrückt: Anfänger, denen man immer nur funktionierenden Code präsentiert, den sie nicht verstehen, lernen nichts dazu. Copy&Paste <> Umsetzen.

Woher nur kommt diese ausufernde Anspruchshaltung?

Sorry! Was für ein Teufel hat dich geritten? Ich will hier gar nichts, ich habe ein funktionierendes Beispiel auf eine gestellte Frage vorgelegt und darauf hingewiesen, dass der Code des Moderators (mindestens mit meiner Delhiversion) nicht funktionieren wird.

Ich fühle mich angegriffen von Dir und erwarte eine Entschuldigung!

Grundsätzlich bin ich aber der Meinung, wer etwas Konstruktives zu einem Beitrag beisteuern kann soll dies auch tun, wer nicht bereit ist auf eine Frage einzugehen soll doch besser schweigen. Was ist falsch daran andere darauf hinzuweisen, dass ein Code nicht funktioniert? Nicht funktionieren kann ohne weiteres Grundwissen?

Vorwürfe an konstruktive Teilnehmer im Forum, ist es wirklich das was du wolltest?

Perlsau 22. Mai 2015 15:48

AW: teechartgrafik in groupbox speichern
 
Sorry, ich habe dich nicht angegriffen, das ist dein subjektives Empfinden, entspricht jedoch nicht meiner Intention. Dennoch hattest du geschrieben:

Zitat:

Zitat von bernerbaer (Beitrag 1302597)
Eigentlich erwarte ich in einem Beispielcode eines Moderators schon entweder Code der funktioniert, oder der Hinweis, wie der Code zum funktionieren gebracht werden kann. So wie der Code da steht, wird jeder Anfänger verzweifeln, wenn er das Beispiel umsetzen möchte.

Das empfand ich als unverschämt und habe daher mein Empfinden auf lustige und nicht ganz ernstzunehmende Weise (man beachte die Smilys) zum Ausdruck gebracht. Dasselbe gilt auch für den obigen Hinweis mit dem GroupBox.SaveToFile. Das war ganz eindeutig ein Witz, der TE hätte spätestens beim Eintippen erkennen müssen, daß es diesen Befehl nicht gibt und er selbst etwas programmieren muß, um sein Ziel zu erreichen. Einige hatten den Witz sofort verstanden, andere vermutlich nicht.

Meiner Ansicht nach hat hier keiner einen Anspruch auf funktionierenden Code. Es gibt hier nicht einmal einen Anspruch darauf, daß Anfragen beantwortet werden. Wenn du der Meinung bist, du müßtest den gepostesten Code eines Users korrigieren, damit er funktioniert, steht dir das jederzeit frei. Hier zeigst du ganz eindeutig eine Überreaktion :-D

Des weiteren habe ich auf die Tatsache hingewiesen, daß gerade Anfänger durch Code, den sie lediglich in der Erwartung, er funktioniere auf Anhieb, kopieren, nicht wirklich etwas lernen. Das würde nämlich darauf hinauslaufen, daß die User hier einem Anfänger die Programmierarbeit abnehmen und für ihn das Programm schreiben. Diese Thematik wurde nicht nur in diesem Forum bereits bis zum Abwinken durchgekaut und sollte jedem, der hier bereits ein paar Jahre dabei ist, geläufig sein. Wieso du dich dadurch angegriffen fühlst, ist mir zwar ein Rätsel, aber letztendlich deine Sache – ich muß es nicht verstehen.

Es ist aber wohl noch gestattet, sich über gewisse überzogene Ansprüche lustig zu machen. Auch wenn du hier im Grunde nicht wirklich der Boß bist, möchte ich dich darum bitten, mir weiterhin zu gestatten, hin und wieder eine Aussage in witziger Form zu kommentieren und nicht sofort alles auf dich zu beziehen.

Wie gesagt kann ich hier keinen persönlichen Angriff erkennen und sehe daher auch keine Veranlassung, irgend eine erzwungene und damit geheuchelte Entschuldigung auszusprechen. Wieso schreibst du mir nicht einfach via PM, wodurch du dich nun so angegriffen gefühlt hast, sondern schreist* stattdessen hier das Forum zusammen? Dann können wir das nämlich in Ruhe klären und müssen damit nicht die User belästigen.

* Fettschrift wird gewöhnlich als Schreien interpretiert, insbesondere dann, wenn damit ein Vorwurf formuliert wird.

bernerbaer 22. Mai 2015 15:50

AW: teechartgrafik in groupbox speichern
 
So nicht mit mir Bye Bye Delphipraxis

Perlsau 22. Mai 2015 16:09

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von bernerbaer (Beitrag 1302604)
So nicht mit mir Bye Bye Delphipraxis

Tja, PM geht nicht, hast du gecancelt. Und jezt wegen Überempfindlichkeit gleich abmelden??? Ich erfahre ja nicht einmal, wodurch du dich so angegriffen fühlst :roll:

Hartfrid Krause 22. Mai 2015 16:25

AW: teechartgrafik in groupbox speichern
 
an bernaber
danke so klapptshttp://www.delphipraxis.net/images/smilies/icon_biggrin.gif

Hartfrid Krause 22. Mai 2015 16:55

AW: teechartgrafik in groupbox speichern
 
Das Speichern der bitmap im selben Unterverzeichnis wie das Gesamtprojekt klappt mit:

procedure Tform31.Button1Click(Sender: TObject);
var Bitmap: TBitmap;
Rect: TRect;
begin
Rect.Left:= 0;
Rect.Top:= 0;
Rect.bottom:= groupbox1.Height;
Rect.Right:= groupbox1.Width;
Bitmap := TBitmap.Create;
Bitmap.SetSize(Groupbox1.Width, Groupbox1.Height);
Bitmap.Canvas.CopyRect(Rect,TNewGroupBox(groupbox1 ).Canvas, Rect);
Bitmap.SaveToFile('123name.bmp');
Bitmap.Free;
end;

Wie manipuliere ich die Einstellung, dass ich zunächst einen freien Namen wähle und dann den Speicherort?
In der vorliegenden Version wird beim Speichern einer 2. Grafik natürlich die Datei 123name.bmp überschrieben.

Perlsau 22. Mai 2015 17:16

AW: teechartgrafik in groupbox speichern
 
Dafür gibt es TSavePictureDialog.

Hartfrid Krause 22. Mai 2015 17:21

AW: teechartgrafik in groupbox speichern
 
Ja, das weiß ich ,
aber bei :

procedure Tform31.SpeedButton2Click(Sender: TObject);
var Bitmap: TBitmap;
Rect: TRect; //speichert nicht obwohl name und ort frei gewählt wird
begin
savepicturedialog1.Execute;
Rect.Left:= 0;
Rect.Top:= 0;
Rect.bottom:= groupbox1.Height;
Rect.Right:= groupbox1.Width;
Bitmap := TBitmap.Create;
Bitmap.SetSize(Groupbox1.Width, Groupbox1.Height);
Bitmap.Canvas.CopyRect(Rect,TNewGroupBox(groupbox1 ).Canvas, Rect);
// Bitmap.SaveToFile('name123.bmp');
Bitmap.Free;
savepicturedialog1.Free;
end;

kann ich zwar Namen und Ort definieren (und bmp als appendix),
aber dort wird nicht gespeichert , warum auch immer??
Da muss noch etwas falsch sein

Perlsau 22. Mai 2015 17:29

AW: teechartgrafik in groupbox speichern
 
Mein lieber Hartfried, so ein bißchen was muß man hin & wieder auch selber programmieren. Schau dir doch einmal die Beispiele zu TSavePictureDialog an. Dann wirst du vielleicht bemerken, daß ein solcher Dialog auch abgebrochen werden kann, weshalb man selbigen gewöhnlich so verwendet:
Delphi-Quellcode:
If SavePictureDialog1.Execute Then
Begin
  ...
End;
Denn dabei, du wirst es vielleicht inzwischen bemerkt haben, handelt es sich um eine Function, die als Result einen Boolean zurückliefert. Wenn der Anwender den Dialog abbricht, wird False zurückgeliefert. Enthält das Property FileName einen gültigen Wert oder ist die Stringlist Files gefüllt, wird True zurückgegeben.

Nun mußt du aber auch das Property FileName in deinem Programm verwenden, denn wenn du einfach nur die Zeile mit dem SaveToFile auskommentierst, hast du dafür ja noch keinen Ersatz. Statt 'name123.bmp' nimmst du nun SavePictureDialog1.FileName, und schon funktioniert's mit dem Speichern. Steht übrigens alles in der Online-Hilfe, die ich hier noch einmal mit eigenen Worten ausführlichst wiedergebe.

Und, Hartfried, setze doch bitte deine Codezeilen, die du hier postest, in Delphi-Tags. Am einfachsten erreichst du das, indem du deine Code-Zeilen im Foren-Editor mit der Maus markierst und dann auf den Delphi-Helm klickst.

Hartfrid Krause 22. Mai 2015 18:00

AW: teechartgrafik in groupbox speichern
 
Ja so klappts, danke.
PS:Meine online-hilfe funktioniert nicht, deshalb schwimme ich so sehr

Sir Rufo 22. Mai 2015 19:51

AW: teechartgrafik in groupbox speichern
 
Zitat:

Zitat von Hartfrid Krause (Beitrag 1302632)
Ja so klappts, danke.
PS:Meine online-hilfe funktioniert nicht, deshalb schwimme ich so sehr

Nun ja, das Internet scheint ja noch zu funktionieren, dann geht also http://docwiki.embarcadero.com/RADSt.../de/Hauptseite ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz