Autor Beitrag
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 16:38 
Hi Leute,
Ich möchte ein Bild aus der Zwischenablage Speichern. Das Problem ist , dass ich es in einer neuen Datei Speichern möchte. D.h. das jedesmal wenn ich auf meinen Button 1 drücke oder den Shortcut dazu, das Bild aus der Zwischenablage in einer neuen Datei gespeichert wird.

ausblenden volle Höhe 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:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, clipbrd, StdCtrls, ActnList;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ActionList1: TActionList;
    Action1: TAction;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  bitmap :TBitmap;

implementation

{$R *.dfm}

procedure SaveClipboardToFile(filename:String);
begin
Try
  bitmap:=TBitmap.Create;
  bitmap.Assign(Clipboard);
  bitmap.SaveToFile(filename);
Except
  on EInvalidgraphic do
    begin Showmessage('Die Zwischenablage enthält kein Bild!');  end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SaveClipboardToFile('c:\programme\eigene_Dateien');
end;

end.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.10.08 16:46 
1. gibst Du keinen Dateinamen an.
2. erstellst Du die Bitmap immer wieder neu, ohne sie vorher freizugeben.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 17:19 
Definiere eine Variable Counter, die den Dateinamen hochzählt. Diese inkrementierst du nach jedem Speichern mit inc(Counter);. Wo ist da das Problem?
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 17:37 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
1. gibst Du keinen Dateinamen an.
2. erstellst Du die Bitmap immer wieder neu, ohne sie vorher freizugeben.


1. Das heißt :  SaveClipboardToFile('c:\programme\eigene_Dateien\MeinName.bmp'); erzeugt schon eine neue Datei. Oder wie?
2. Wie gebe ich die Bitmap frei??

3. Yogu: Das was du sagst hatte ich mir schon vorgenommen, wollte aber erst mal das Grundgerüst zum laufen bringen.


Zuletzt bearbeitet von JungerIslaender am Mo 20.10.08 17:59, insgesamt 1-mal bearbeitet
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 17:48 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
 SaveClipboardToFile('c:\programme\eigene_Dateien\MeinName.bmp'); erzeugt schon eine neue Datei. Ower wie?

Genauer gesagt, bitmap.SaveToFile(filename); erstellt die Datei filename und speichert die Bitmap rein. Aber der Aufruf deine Funktion natürlich dann auch.

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
2. Wie gebe ich die Bitmap frei??

Mit bitmap.Free;

Aber bastel am besten ein Sicherheits-Grundgerüst um deine Bitmap, um auch bei Exceptions kein Speicherleck zu bekommen:

ausblenden Delphi-Quelltext
 
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
{ ... }
procedure SaveClipboardToFile(filename:String);
// Lokale Variablen bitte immer auch als solche deklarieren!
var Bitmap: TBitmap;
begin
  try
    Bitmap := TBitmap.Create;
    try
      Bitmap.Assign(Clipboard);
      Bitmap.SaveToFile(filename);
    finally
      Bitmap.Free;
    end;
  except
    on EInvalidgraphic do
      Showmessage('Die Zwischenablage enthält kein Bild!');
  end;
end;
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 17:55 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
 
// Lokale Variablen bitte immer auch als solche deklarieren!


Damit hast du Recht, mir war aber nicht klar ob ich die Variable später noch in einer anderen Prozedur oder so brauche.


Zuletzt bearbeitet von JungerIslaender am Mo 20.10.08 18:25, insgesamt 2-mal bearbeitet
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 18:03 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
 
// Lokale Variablen bitte immer auch als solche deklarieren!


Damit hast du Recht, mir war aber nicht klar ob ich die Variable später noch in einer anderen Prozedur oder so brauche.

Wenn du die Bitmap noch brauchst, musst du sowieso dein Konzept überarbeiten. Das Objekt darf in diesem Fall nicht am Ende der Prozedur freigegeben werden.
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 18:08 
Im Moment brauch ich sie auch nicht aber es hätte sein können. Aber danke für den tipp.

Edit: Welche möglichkeiten gibt gibt es variablen zu initialisiren? Denn wenn ich in einer Prozedur sage i:=0; ist i dann ja immer wenn die Prozedur anläuft.

Das einzige was mir jetzt einfallen würde, wäre i global zu deklarieren und dann in form1.create zu initialisieren.
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 18:42 
So, dass Programm funktioniert jetzt soweit. Wie schaffe ich es jetzt, dass er den shortcut auch animmt wenn das Programm nicht das aktive Programm ist?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 18:51 
Verknüpfung erstellen und Shortcut einstellen ;)
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 18:54 
Häh???? :?: :?: :?: :?: :?: :?:

Das musst du näher erklären...
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 19:20 
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Verknüpfung erstellen

Programm markieren, Strg und Shift gedrückt halten, Maus drücken, Maus ca. 1cm in eine beliebige Richtung verschieben, Maus loslassen.

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
und Shortcut einstellen

Rechtsklick auf die soeben erstellte Verknüpfung, Eigenschaften, unter "Verknüpfen" die Shortcut eintragen.

:mrgreen:
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mo 20.10.08 19:26 
Nein, dann hast du mich nicht richtig verstanden: Die Prozedur vom Button1 wird durch einen Shortcut durch eine actionlist gestartet. Jetzt möchte ich während ich mit Gimp etwas male durch str+c und danach meinem Shortcut, schnell viele Bilder Abspeichern.

Wie mache ich das jetzt so, dass obwohl Gim meinen aktives Programm ist, Mein Programm auf den Shortcut reagiert?
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Mo 20.10.08 19:36 
Die oben beschriebene Variante funktioniert doch systemweit :gruebel:

Alternativ dazu kannst du auch Suche in der Entwickler-Ecke HOOKS anlegen, aber ich denke, die Windows-Variante wäre sicherlich einfacher und außerdem leichter zu verwalten (Über den Eigenschafts-Dialog der Verknüpfung)