![]() |
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 ;-) |
AW: TImage Zoom
Billigste Lösung: Stretch, Center und Proportional des TImage auf true stellen und dieses dann vergrößern/verkleinern. Beispiel:
Delphi-Quellcode:
Das sieht vermutlich nicht besonders toll aus, aber probier es mal.
NewWidth := round(DeinImage.Width * 1.25);
NewHeight := round(DeinImage.Height * 1.25); DeinImage.Width := NewWidth; DeinImage.Height := NewHeight; |
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 |
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.
|
AW: TImage Zoom
Ah ok das verstehe ich jetzt schon besser noch mal Danke
|
AW: TImage Zoom
So schaut das jetzt bei mir aus
Delphi-Quellcode:
Nur da passiert bei mir leider nix !
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; Gruß |
AW: TImage Zoom
Zitat:
|
AW: TImage Zoom
Und Autosize auf false, hatte ich noch vergessen.
|
AW: TImage Zoom
Mein Fehler das Teil darf bei Align nicht auf alClient sein ! ;-)
THX für eure Hilfe geht jetzt |
AW: TImage Zoom
In meiner TScrollBox geht das jetzt auch ordentlich !
|
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ß |
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)
|
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 ;-)
|
AW: TImage Zoom
Irgendwie werde ich aus dem ScaleBy nicht so schlau :cry:
Hoffe könnt mir da noch mal helfen THX |
AW: TImage Zoom
Mir ist nicht ganz klar, was daran nicht zu verstehen ist:
![]() |
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 ! |
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?
|
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:
So, nun rechnet man vor der ersten Größenänderung den jeweiligen Anteil aus und merkt sich den im Record.
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;
Delphi-Quellcode:
Wird nun die Größe geändert, rechnet man die neuen Koordinaten zurück und positioniert den Button neu.
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;
Delphi-Quellcode:
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.
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; |
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 |
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.
|
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
|
AW: TImage Zoom
Welche Änderungen hast Du denn gemacht (Code)?
|
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. |
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:
![]() |
AW: TImage Zoom
Vielleicht sollte ich mir erst mal Delphi für Dummies kaufen und das auswendig lernen :wink:
|
AW: TImage Zoom
Vielleicht hilft das hier zum Verständnis:
![]() |
AW: TImage Zoom
Zitat:
|
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 ![]() ![]() |
AW: TImage Zoom
THX für die Seiten vom Delphi Treff arbeit damit auch schon ne zeit lang ;-)
|
AW: TImage Zoom
Tja ich komme da einfach nicht mehr weiter :cry:
|
AW: TImage Zoom
Ich weiß auch nicht, wie ich noch helfen soll, ohne das Programm selbst zu schreiben :|
|
AW: TImage Zoom
Zitat:
versuch doch mal zu beschreiben wo/was da hakt. Gruß K-H |
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 !
|
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. |
AW: TImage Zoom
Tja das ist genau die Schwierigkeit die ich dabei habe :wink:
|
AW: TImage Zoom
Und das Bild soll sich in alle 4 Richtungen ausdehnen, richtig?
|
AW: TImage Zoom
Ja ! außerdem ist es an der Oberen - Linken - Ecke positioniert !
|
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 |
AW: TImage Zoom
Zitat:
|
AW: TImage Zoom
nur nach rechts und unten ausdehnen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz