Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   TImage Zoom (https://www.delphipraxis.net/170474-timage-zoom.html)

Davidlocke13 19. Sep 2012 12:27

TImage Zoom
 
Hallo

Bin Delphi einsteiger und habe ein Problem mit einer Zoom Funktion !

habe ein TImage und will das jetzt mit jeweils einem Button verkleiner bzw. vergrößern aber keine Ahnung wie ich das hinbekommen !?
Im TImage ist ein JPG geladen das nachher wehrend dem Anwendungslauf vergrößert werden soll

Könnt ihr mir da helfen ?

Gruß David ;-)

DeddyH 19. Sep 2012 12:33

AW: TImage Zoom
 
Billigste Lösung: Stretch, Center und Proportional des TImage auf true stellen und dieses dann vergrößern/verkleinern. Beispiel:
Delphi-Quellcode:
NewWidth := round(DeinImage.Width * 1.25);
NewHeight := round(DeinImage.Height * 1.25);
DeinImage.Width := NewWidth;
DeinImage.Height := NewHeight;
Das sieht vermutlich nicht besonders toll aus, aber probier es mal.

Davidlocke13 19. Sep 2012 12:48

AW: TImage Zoom
 
THX für deine Schnelle Antwort aber so 100 Blicke ich da noch nicht durch !

Wo soll der CODE hin und was soll ich da genau eintragen ;-)

Sorry das ich mich da was schwer tue und danke für deine Hilfe

DeddyH 19. Sep 2012 12:55

AW: TImage Zoom
 
Das oben sollte ein Beispielcode sein, der das Image (DeinImage genannt) um 25% vergrößern soll, er gehört also in das OnClick des "Größer"-Buttons. NewWidth und NewHeight sind dabei lokale Integer-Variablen.

Davidlocke13 19. Sep 2012 12:56

AW: TImage Zoom
 
Ah ok das verstehe ich jetzt schon besser noch mal Danke

Davidlocke13 19. Sep 2012 13:04

AW: TImage Zoom
 
So schaut das jetzt bei mir aus
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
NewWidth,NewHeight: Integer;

begin
NewWidth := round(Image1.Width * 1.25);
NewHeight := round(Image1.Height * 1.25);
Image1.Width := NewWidth;
Image1.Height := NewHeight;
end;
Nur da passiert bei mir leider nix !

Gruß

Medium 19. Sep 2012 13:05

AW: TImage Zoom
 
Zitat:

Zitat von DeddyH (Beitrag 1183529)
Stretch, Center und Proportional des TImage auf true stellen

Hast du diese Dinge auch getan?

DeddyH 19. Sep 2012 13:14

AW: TImage Zoom
 
Und Autosize auf false, hatte ich noch vergessen.

Davidlocke13 19. Sep 2012 13:18

AW: TImage Zoom
 
Mein Fehler das Teil darf bei Align nicht auf alClient sein ! ;-)

THX für eure Hilfe geht jetzt

Davidlocke13 19. Sep 2012 13:26

AW: TImage Zoom
 
In meiner TScrollBox geht das jetzt auch ordentlich !

Davidlocke13 19. Sep 2012 15:19

AW: TImage Zoom
 
2.
Es hat sich bei mir noch ein weiters Problem ergeben !
Ich wollte auf das Bild jetzt nen Button setzten hat auch in der TScrollBox so weit funktioniert das der auf ein und der Selben Stelle bleibt, nur seit dem Zoom klappt das halt nicht mehr da der Button seine Position nicht durch den Zoom hält und auch nicht mit vergrößert wir !

Gibt es dafür eine Lösung ?

Gruß

Bummi 19. Sep 2012 15:23

AW: TImage Zoom
 
Wenn der Button auch die Größe anpassen soll, könnte ScaleBy des Forms für Dich interessant sein (hat aber reichlich Seiteneffekte)

Davidlocke13 19. Sep 2012 15:35

AW: TImage Zoom
 
Tja das mit dem ScaleBy muss ich erst mal begreifen bevor ich das umsetzen kann ! Ich lese mich da mal durch die Seiten ;-)

Davidlocke13 19. Sep 2012 17:18

AW: TImage Zoom
 
Irgendwie werde ich aus dem ScaleBy nicht so schlau :cry:
Hoffe könnt mir da noch mal helfen

THX

DeddyH 19. Sep 2012 17:23

AW: TImage Zoom
 
Mir ist nicht ganz klar, was daran nicht zu verstehen ist: TWinControl.ScaleBy :gruebel:

Davidlocke13 19. Sep 2012 17:33

AW: TImage Zoom
 
Sorry das ich so ein Idiot bin !
Mitbekommen für was das ist habe ich !
Aber bekomme es damit nicht hin ne vernünftige procedure für meine Buttons zu bastel damit die auf ein und der selben Stelle bleiben und mit dem Zoom größer und kleiner werden !

DeddyH 19. Sep 2012 17:51

AW: TImage Zoom
 
Definier doch erst einmal "an der selben Stelle". Ich nehme einmal an, dass alle 4 Ecken manipuliert werden müssen, damit sie relativ zum Bild bleiben, oder?

DeddyH 20. Sep 2012 08:02

AW: TImage Zoom
 
Mir ist der Gedanke gekommen, dass man das doch mit einfacher Prozentrechnung lösen könnte. Dazu merkt man sich den prozentualen Anteil (als Gleitkommazahl für größere Genauigkeit) der Koordinaten relativ zum gewünschten Rechteck. Der Einfachheit halber habe ich hier testhalber einen neuen Datentyp definiert und als privates Feld in meinem Formular deklariert:
Delphi-Quellcode:
type
  TPercentRect = record
    Left, Top, Width, Height: double;
  end;

  TFormTest = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
  private
    { Private-Deklarationen }
    FPercent: TPercentRect;
  public
    { Public-Deklarationen }
  end;
So, nun rechnet man vor der ersten Größenänderung den jeweiligen Anteil aus und merkt sich den im Record.
Delphi-Quellcode:
procedure TFormTest.FormCreate(Sender: TObject);
begin
  FPercent.Left := Button1.Left / ClientWidth * 100;
  FPercent.Top := Button1.Top / ClientHeight * 100;
  FPercent.Width := Button1.Width / ClientWidth * 100;
  FPercent.Height := Button1.Height / ClientHeight * 100;
end;
Wird nun die Größe geändert, rechnet man die neuen Koordinaten zurück und positioniert den Button neu.
Delphi-Quellcode:
procedure TFormTest.FormResize(Sender: TObject);
var
  NewLeft, NewTop, NewWidth, NewHeight: integer;
begin
  NewLeft := round(ClientWidth / 100 * FPercent.Left);
  NewTop := round(ClientHeight / 100 * FPercent.Top);
  NewWidth := round(ClientWidth / 100 * FPercent.Width);
  NewHeight := round(ClientHeight / 100 * FPercent.Height);
  Button1.SetBounds(NewLeft, NewTop, NewWidth, NewHeight);
end;
In einem kleinen Testprogramm funktioniert das abgesehen von logischerweise auftretenden kleinen Rundungsungenauigkeiten ganz gut. Normalerweise würde ich zwar eher den Button ableiten und den Record dort deklarieren, aber ich wollte es so einfach wie möglich halten.

Davidlocke13 20. Sep 2012 09:29

AW: TImage Zoom
 
unter Var bei der procedure TForm1.FormCanResize werden mir NewWidth, NewHeight mit folgendem Fehler angezeigt:

[Pascal Fehler] WerkPlan.pas(71): E2004 Bezeichner redefiniert: 'NewWidth'

[Pascal Fataler Fehler] Werk2Plan.dpr(5): F2063 Verwendete Unit 'WerkPlan.pas' kann nicht compiliert werden

DeddyH 20. Sep 2012 09:32

AW: TImage Zoom
 
In der CanResize-Methode werden NewWidth und NewHeight als Parameter übergeben, Du kannst also entweder auf OnResize ausweichen wie in meinem Beispiel oder Du benennst die lokalen Variablen um.

Davidlocke13 20. Sep 2012 09:38

AW: TImage Zoom
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt NewWidth und NewHeight raus geworfen, da ich die als Variablen schon mal wo anders eingetragen habe ! Mein Fenster schaut jetzt so komisch aus und lässt sich auch in keiner Größe mehr ändern ! Anhang 37683

DeddyH 20. Sep 2012 09:41

AW: TImage Zoom
 
Welche Änderungen hast Du denn gemacht (Code)?

Davidlocke13 20. Sep 2012 09:42

AW: TImage Zoom
 
Code:
unit WerkPlan;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, jpeg, Grids;

type
    TPercentRect = record
    Left, Top, Width, Height: double;
    end;
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    ScrollBox1: TScrollBox;
    Image1: TImage;
    Button3: TButton;
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure FormCreate(Sender: TObject);
    procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);


  private
    { Private-Deklarationen }
     FPercent: TPercentRect;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation



{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
NewWidth,NewHeight: Integer;
begin
NewWidth := round(Image1.Width * 1.25);
NewHeight := round(Image1.Height * 1.25);
Image1.Width := NewWidth;
Image1.Height := NewHeight;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
NewWidth,NewHeight: Integer;
begin
NewWidth := round(Image1.Width / 1.25);
NewHeight := round(Image1.Height / 1.25);
Image1.Width := NewWidth;
Image1.Height := NewHeight;
end;

procedure TForm1.FormCanResize (Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
var
  NewLeft, NewTop: integer;
begin
  NewLeft := round(ClientWidth / 100 * FPercent.Left);
  NewTop := round(ClientHeight / 100 * FPercent.Top);
  NewWidth := round(ClientWidth / 100 * FPercent.Width);
  NewHeight := round(ClientHeight / 100 * FPercent.Height);
  Button1.SetBounds(NewLeft, NewTop, NewWidth, NewHeight);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FPercent.Left := Button1.Left / ClientWidth * 100;
  FPercent.Top := Button1.Top / ClientHeight * 100;
  FPercent.Width := Button1.Width / ClientWidth * 100;
  FPercent.Height := Button1.Height / ClientHeight * 100;
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
NewWidth,NewHeight: Integer;
begin
NewWidth := round(Image1.Width / 1.03);
NewHeight := round(Image1.Height / 1.03);
Image1.Width := NewWidth;
Image1.Height := NewHeight;
end;

procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
var
NewWidth,NewHeight: Integer;
begin
NewWidth := round(Image1.Width * 1.03);
NewHeight := round(Image1.Height * 1.03);
Image1.Width := NewWidth;
Image1.Height := NewHeight;
end;

end.

DeddyH 20. Sep 2012 09:48

AW: TImage Zoom
 
Du weißt, was ein Var-Parameter ist? Im CanResize setzt Du ja Höhe und Breite neu, wohingegen in meinem Beispiel die Variablen nur der Berechnung dienen. Schau doch einmal hier: TCanResizeEvent

Davidlocke13 20. Sep 2012 09:55

AW: TImage Zoom
 
Vielleicht sollte ich mir erst mal Delphi für Dummies kaufen und das auswendig lernen :wink:

DeddyH 20. Sep 2012 09:56

AW: TImage Zoom
 
Vielleicht hilft das hier zum Verständnis: Deklaration von Funktionsparametern

Davidlocke13 20. Sep 2012 10:38

AW: TImage Zoom
 
Zitat:

Zitat von DeddyH (Beitrag 1183686)

Hab es gelesen aber umgesetzt bekomme ich da von was da steht NIX :(

DeddyH 20. Sep 2012 10:46

AW: TImage Zoom
 
Es ging ja nicht um das Umsetzen, sondern um das Verständnis. Im OnCanResize sind NewWidth und NewHeight Variablenparameter, d.h. vereinfacht gesagt sie werden "außerhalb" deklariert und Dir zur Bearbeitung übergeben. Schreibst Du also dort Werte hinein, werden sie übernommen und wirken sich damit aus, das ist der Grund für das von Dir beobachtete Verhalten.

[edit] Ansonsten kann ich Dir für die ersten Schritte die Grundlagentutorials und das E-Book vom Delphi-Treff empfehlen. [/edit]

Davidlocke13 20. Sep 2012 11:01

AW: TImage Zoom
 
THX für die Seiten vom Delphi Treff arbeit damit auch schon ne zeit lang ;-)

Davidlocke13 20. Sep 2012 12:34

AW: TImage Zoom
 
Tja ich komme da einfach nicht mehr weiter :cry:

DeddyH 20. Sep 2012 12:44

AW: TImage Zoom
 
Ich weiß auch nicht, wie ich noch helfen soll, ohne das Programm selbst zu schreiben :|

p80286 20. Sep 2012 12:49

AW: TImage Zoom
 
Zitat:

Zitat von Davidlocke13 (Beitrag 1183717)
Tja ich komme da einfach nicht mehr weiter :cry:

Womit kommst Du nicht weiter?
versuch doch mal zu beschreiben wo/was da hakt.

Gruß
K-H

Davidlocke13 20. Sep 2012 12:54

AW: TImage Zoom
 
Mein Problem ist, dass ich Nen Button auf ein TImage setzen will und das wenn ich das Bild Scrolle oder vergrößere bzw. verkleinere das der Button sich in der Größe und Position auf dem Bild an einer Bestimmten stelle anpasst !

DeddyH 20. Sep 2012 13:01

AW: TImage Zoom
 
Dass es generell mit Prozentrechnung funktioniert habe ich ja gezeigt. Du hast aber 2 Probleme:
- Du brauchst das richtige Ereignis
- Du brauchst die korrekten Bezugskoordinaten
Das Ereignis ist ja noch einfach: sobald sich die Bildgröße ändert, muss sich auch die Buttongröße ändern. Da Du das per Code vergrößerst/verkleinerst, musst Du anschließend auch den Button per Code ändern. Schwieriger wird es mit den Koordinaten, je nach Einstellungen (Stretch, Center, Proportional, AutoSize, Align) des TImage. Du musst ja dann ggf. nicht die der Komponente, sondern die der enthaltenen Grafik verwenden, da ist etwas Rechnerei notwendig.

Davidlocke13 20. Sep 2012 13:09

AW: TImage Zoom
 
Tja das ist genau die Schwierigkeit die ich dabei habe :wink:

DeddyH 20. Sep 2012 13:11

AW: TImage Zoom
 
Und das Bild soll sich in alle 4 Richtungen ausdehnen, richtig?

Davidlocke13 20. Sep 2012 13:17

AW: TImage Zoom
 
Ja ! außerdem ist es an der Oberen - Linken - Ecke positioniert !

p80286 20. Sep 2012 13:18

AW: TImage Zoom
 
Ich stelle mir das so vor:
Du setzt einen ein Pixel großen Button auf eine bestimmte Position.(zentralpos)
Du zeichnest den Button in der gewünschten Größe.
Wenn du das Bild verschiebst, wird diese Zentralpos ebenfalls verschoben,


Du vergrößerst/Verkleinerst das Bild:
Du änderst die Abmessungen des Buttons entsprechend.
Du zeichnest den Button in der gewünschten Größe.

Gruß
K-H

DeddyH 20. Sep 2012 13:26

AW: TImage Zoom
 
Zitat:

Zitat von Davidlocke13 (Beitrag 1183731)
Ja ! außerdem ist es an der Oberen - Linken - Ecke positioniert !

Ja, wie denn nun? Soll es sich nur nach rechts und unten ausdehnen oder auch nach links und oben?

Davidlocke13 20. Sep 2012 13:32

AW: TImage Zoom
 
nur nach rechts und unten ausdehnen


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.
Seite 1 von 2  1 2      

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