Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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?

ausblenden 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);
 // Ausschnitt festlegen
 DeskRect.Left := 382;
 DeskRect.Top := 457;
 DeskRect.Right := 400;
 DeskRect.Bottom := 400;
 // an Image1 übergeben
 Image1.Canvas.CopyRect(Image1.ClientRect, DeskCanvas, DeskRect); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;



Danke =)

Lg

Henry


Moderiert von user profile iconMartok: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 22.09.2010 um 18:14
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 22.09.10 18:03 
Hilft Dir das, oder gibt es ein anderes Problem?
ausblenden 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); // Image1 ist auf der Form vorhanden
 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mi 22.09.10 18:19 
Pseudocode.....

GetShoot2Image(image1,Rect(380,450,380 + breite,450 + höhe),1);
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: 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
ausblenden 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); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1);
//  GetShoot2Image(image2,Rect(10,10,100,100),0.5);
//  GetShoot2Image(image3,Rect(10,10,100,100),2);
end;

procedure TForm1.Button2Click(Sender: TObject);
Image1.Picture.SaveToFile('c:\');   // haben mir ein paar Leute geraten, klappt aber leider nicht
end;



PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.09.10 19:59 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Aber wenn ich jetzt hier das Bild speichern will von Image1, wie klappt das?
Das Image wird doch als Parameter an die Prozedur übergeben. Und das ist in deinem Fall ja auch Image1. :gruebel:

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
PS:
Er zeigt als Fehler: [Error] Unit1.pas(54): Unknown directive: 'Image1' an.
Wenn du in der Prozedur auf Image1 zugreifen willst, solltest du eine Methode deines Formulars daraus machen. Also so wie der Buttonklick, der auch zum Formular gehört.
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mi 22.09.10 20:05 
Ok un wie würde das dann ungefähr aussehen?
ausblenden Delphi-Quelltext
1:
procedure Tform1.Image1.Picture.SavteToFile (Filename: String);					

Oder so? Klappt aber auch nicht...
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mi 22.09.10 20:34 
Wow danke ;)
Klappt perfekt.
Tja das Schuldelphi behandelt so Sachen halt nicht :P
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 =)

ausblenden 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); // Image1 ist auf der Form vorhanden
 DeskCanvas.Free;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  GetShoot2Image(image1,Rect(360,385,350 + 100,385 + 100),1);
//  GetShoot2Image(image2,Rect(10,10,100,100),0.5);
//  GetShoot2Image(image3,Rect(10,10,100,100),2);
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 22.09.10 20:41 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mi 22.09.10 20:53 
Klasse, vielen Dank für die Erklärungen und die Geduld :D

Lg

Henry
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mi 22.09.10 21:08 
Aber eine kleine Frage hätte ich doch noch :P

Wie kann ich den Anzeigebreite, also den Bereich der angezeigt wird ändern?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Mi 22.09.10 21:28 
Ja meine, dass mehr Bild gemacht wird.
Also das Bild vergrößern.
Ist das der Faktor?

Moderiert von user profile iconMartok: 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