Autor |
Beitrag |
JungerIslaender
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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.
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 public 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
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.10.08 17:37
DeddyH hat folgendes geschrieben : | 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.10.08 17:48
JungerIslaender hat folgendes geschrieben : | 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.
JungerIslaender hat folgendes geschrieben : | 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:
Delphi-Quelltext 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| { ... } procedure SaveClipboardToFile(filename:String); 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 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.10.08 17:55
Zuletzt bearbeitet von JungerIslaender am Mo 20.10.08 18:25, insgesamt 2-mal bearbeitet
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.10.08 18:03
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.10.08 18:51
Verknüpfung erstellen und Shortcut einstellen 
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mo 20.10.08 18:54
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.10.08 19:20
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: 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
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Mo 20.10.08 19:36
Die oben beschriebene Variante funktioniert doch systemweit
Alternativ dazu kannst du auch 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)
|
|