Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 17:21
Hi,
ich habe ein Problem mit einem Screenshot Programm.
Hab ich hier aus dem Forum =)
Und zwar ich habe Koordinaten vom Screen aber immer nur 2. Wie trage ich die hier ein?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button1Click(Sender: TObject); var DeskCanvas: TCanvas; DeskRect: TRect; begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); DeskRect.Left := 382; DeskRect.Top := 457; DeskRect.Right := 400; DeskRect.Bottom := 400; Image1.Canvas.CopyRect(Image1.ClientRect, DeskCanvas, DeskRect); DeskCanvas.Free; end; |
Danke =)
Lg
Henry Moderiert von Martok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 22.09.2010 um 18:14
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 22.09.10 18:03
Hilft Dir das, oder gibt es ein anderes Problem?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm5.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(10,10,100,100),1); GetShoot2Image(image2,Rect(10,10,100,100),0.5); GetShoot2Image(image3,Rect(10,10,100,100),2); end; |
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 18:13
Danke erstmal, klappt soweit mit dem screenshot.
Aber wenn ich zb. die Koordinaten 380 und 450 hab, wie gebe ich die dann ein? Hab von Bildern in Delphi kaum Ahnung.
Danke nochmal =)
|
|
bummi
      
Beiträge: 1248
Erhaltene Danke: 187
XP - Server 2008R2
D2 - Delphi XE
|
Verfasst: Mi 22.09.10 18:19
Pseudocode.....
GetShoot2Image(image1,Rect(380,450,380 + breite,450 + höhe),1);
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 19:37
Ok, Danke hat super geklappt!
Aber wenn ich jetzt hier das Bild speichern will von Image1, wie klappt das?
Hier nochmal der Code
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm1.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1); end;
procedure TForm1.Button2Click(Sender: TObject); Image1.Picture.SaveToFile('c:\'); end; |
PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 19:59
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 20:05
Ok un wie würde das dann ungefähr aussehen?
Delphi-Quelltext 1:
| procedure Tform1.Image1.Picture.SavteToFile (Filename: String); |
Oder so? Klappt aber auch nicht...
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TFormImage(Sender: TObject); VAR Bitmap : TBitmap; Filename : string; begin Image1.Picture.SavteToFile (Filename: String); end; |
Danke =)
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 20:26
Wie gesagt: Hier wird Image1 ohnehin schon an die Prozedur übergeben und benutzt. Deshalb verstehe ich nicht das Problem...
Um eine Prozedur als Methode dem Formular hinzuzufügen musst du das entsprechend machen wie auch bei dem Buttonklick usw.: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| type TFormX = class(TForm) ... private procedure MyMethod(); end;
...
implementation
...
procedure TFormX.MyMethod(); begin
end; | Du musst also in der Deklaration des Formulars die Methode als zum Formular gehörig deklarieren. Genauso musst du bei der Implementierung auch dazuschreiben, dass die Methode zum Formular gehört.
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 20:34
Wow danke
Klappt perfekt.
Tja das Schuldelphi behandelt so Sachen halt nicht
Aber zum Verständnis würde mich interessieren wieso ich eine extra Methode anlegen muss, bevor der Befehl Image1.Picture.SaveToFile ('D:\image.bmp'); klappt.
Vielleicht hat ja noch jemand das gleiche Problem wie ich, so hab ich es geschafft =)
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:
| Procedure GetShoot2Image(image:Timage;Bounds:TRect;Faktor:Double); var DeskCanvas: TCanvas;
begin DeskCanvas := TCanvas.Create; DeskCanvas.Handle := GetDC(0); image.Width := Round((Bounds.Right - Bounds.left) * Faktor); image.Height := Round((Bounds.Right - Bounds.Left) * Faktor); Image.Canvas.CopyRect(Image.ClientRect, DeskCanvas, Bounds); DeskCanvas.Free; end;
procedure TForm1.Button1Click(Sender: TObject); begin GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1); end;
procedure TForm1.SaveImage(); begin Image1.Picture.SaveToFile ('D:\image.bmp'); end;
procedure TForm1.Button2Click(Sender: TObject); begin Image1.Picture.SaveToFile ('D:\image.bmp'); end; |
Nochmal ein großes Danke!
Lg
Henry
Btw., tolles Forum!
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 20:41
HenryHux hat folgendes geschrieben : | Aber zum Verständnis würde mich interessieren wieso ich eine extra Methode anlegen muss, bevor der Befehl Image1.Picture.SaveToFile ('D:\image.bmp'); klappt. |
Stell dir einmal vor du möchtest, dass jemand z.B. den Beamer an der anderen Zimmerecke einschaltet. Dann musst du auch sagen, dass derjenige den Schalter des Beamers betätigen soll.
Wenn du nur sagst, dass jemand den Schalter betätigen möchte, weiß derjenige auch nicht welchen.
Genauso ist es hier: Du kannst in der Methode einfach Image1 benutzen, weil Delphi davon ausgeht, dass du das aus deinem eigenen Objekt meinst. Denn du bist ja quasi gerade im Formular.
Wenn du aber außerhalb eine einzelne Prozedur hast, kann Delphi ja nicht wissen, dass du das Image1 in dem Formular meinst. Du kannst in der Unit auch z.B. zwei Klassen mit Image1 darin deklarieren. Deshalb muss Delphi immer herausbekommen können was du eigentlich meinst.
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 20:53
Klasse, vielen Dank für die Erklärungen und die Geduld
Lg
Henry
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 21:08
Aber eine kleine Frage hätte ich doch noch
Wie kann ich den Anzeigebreite, also den Bereich der angezeigt wird ändern?
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 22.09.10 21:19
Du gibst die Breite im Code ja an. Du kannst auch die Größe des Images ändern.
Oder wie meinst du das sonst?
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Mi 22.09.10 21:28
Ja meine, dass mehr Bild gemacht wird.
Also das Bild vergrößern.
Ist das der Faktor?
Moderiert von Martok: Beiträge zusammengefasst.
Ok glaube unklar ausgedrückt.
Ich will das Bild vertikal ca in der Mitte teilen und nach rechts erweitern ohne das es gestreckt oder gestaucht wird.
Also den Ausschnitt ändern.
Lg
|
|
|