Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TImage zur Laufzeit positionieren (https://www.delphipraxis.net/60511-timage-zur-laufzeit-positionieren.html)

bluescreen25 8. Jan 2006 10:37


TImage zur Laufzeit positionieren
 
Hallo,
mein Ziel ist, jpg-Bilder zur Erzeugung der gesamten Grafik meines MP3-Players aus einem Ordner zu laden,sowie die Positionen(ggf weitere Properties) in .Ini aufzuzeigen.Zum Testen habe ich allerdings hier erstmal die jpgs direkt bezogen.

Mein Problem hier ist, das der Button im Code die Position des TImage auf meinem Formular annimmt.
Ich möchte aber nicht nur die Position des jpg innerhalb des TImage angeben können (siehe Code),sondern die Position des Timage selbst, unabhängig davon, wo ich es zur Entwicklungszeit hingesetzt habe.

Ist das ganze hier überhaupt die richtige Art und Weise für mein Anliegen ?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var hintergrund :tjpegimage;
    button :tjpegimage;
begin

hintergrund:=tjpegimage.Create;
Image1.Width := 800;
Image1.Height := 600;
hintergrund.LoadFromFile(extractfilepath(paramstr(0))+'back.jpg');
Image1.Canvas.Draw(0,0,hintergrund);
hintergrund.Free;

button:=tjpegimage.Create;
button.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
Image2.Width := 210;
Image2.Height := 60;
Image2.Canvas.Draw(0,0,button);
button.Free;
end;

procedure TForm1.Image2Click(Sender: TObject);
begin
Form1.Close;
end;

Khabarakh 8. Jan 2006 10:42

Re: TImage zur Laufzeit positionieren
 
Du solltest ein einziges Image mit Align = alClient benutzen und auf dieses alle Jpegs zeichnen. Dann brauchst du nur eine Positionsangabe.

bluescreen25 8. Jan 2006 10:44

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von Khabarakh
Du solltest ein einziges Image mit Align = alClient benutzen und auf dieses alle Jpegs zeichnen. Dann brauchst du nur eine Positionsangabe.

Du meinst jetzt für das Hintergrundbild,OK ! Aber wie kann ich die Positionen denn für einen Button setzen ?

Matze 8. Jan 2006 10:46

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von bluescreen25
Aber wie kann ich die Positionen denn für einen Button setzen ?

Ich verstehe nicht ganz? Mit Left und Top kannst du das TImage doch positionieren. :gruebel:

bluescreen25 8. Jan 2006 10:53

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von Matze
Zitat:

Zitat von bluescreen25
Aber wie kann ich die Positionen denn für einen Button setzen ?

Ich verstehe nicht ganz? Mit Left und Top kannst du das TImage doch positionieren. :gruebel:

:-D Das war es schon, danke. Ich zerbrech mir den Kopf. :wall: Ist das erste Mal, das ich mir die Grafik versuche selbst zu erstellen.

Ist das hier denn die Art und Weise, wie man so Art Skins zusammenstellt?

Aenogym 8. Jan 2006 11:17

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von bluescreen25
Ist das hier denn die Art und Weise, wie man so Art Skins zusammenstellt?

hi bluescreen,

ja so ähnlich mache ich es auch.
für den hintergrund nutze ich ein TImage. für den rest (buttons etc.) nutze ich eine eigene komponente, die von TPaintBox abgeleitet ist (darin sind dann drei bilder gespeichert - für mouseOut, mouseOver und Clicked).
einige dinge werden dann einfach per normaler Paintbox selbst gezeichnet (spektrum visualisierung, "action-display" [eine art multifunktionsbutton])

aeno

Matze 8. Jan 2006 11:18

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von bluescreen25
Ist das hier denn die Art und Weise, wie man so Art Skins zusammenstellt?

Wenn du es mit dem Canvas machen möchtest, kannst du das machen, doch gibt es auch Skinkomponenten wie Almdev, die das etwas professioneller erledigen und meist auch "exotischere" Designs kreieren können.

bluescreen25 8. Jan 2006 11:36

Re: TImage zur Laufzeit positionieren
 
@ Aenogym:
das hört sich nicht schlecht an mit der eigenen Komponente, das OnMouseOver ist nämlich beim TImage nicht enthalten. Würdest du mir deine Komponente überlassen ?

@ Matze:
ja dies Komponente DynamicSkinForm habe ich im Moment eingesetzt,da brauchte ich mich überhaupt nicht im die Grafik kümmern. Mit den vorgefertigten Skins habe ich soweit mal meinen Player bestückt. Auf Dauer muss ich sagen, möchte ich gerne selbst mal einen SkinEditor zusammenstellen und zuvor mein Projekt (ist etwas größer als nur der Player) von Grund auf neu aufbauen, deshalb suche ich gerade nach einer geeigneten Möglichkeit, um nacher nicht wieder alles "hinterher" zu programmieren.

Was ist eigendlich der grobe Unterschied vom Einlesen der Jpegs (siehe Code oben) zu diesem hier?

Delphi-Quellcode:
Image4.Width := 210;
Image4.Height := 60;
Image4.Top := 250;
Image4.left := 10;
Image4.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
[edit=sakura] Zitat anstatt Edit. Original gelöscht, "Editiertes" beibehalten (-QUOTE Tage) Mfg, sakura[/edit]

Matze 8. Jan 2006 11:36

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von bluescreen25
das OnMouseOver ist nämlich beim TImage nicht enthalten.

Irgendwie driften wir vom Ursprungsthema ab, doch dazu kannst du dir mal das Projekt von mir angucken: Tum von Hanoi. Dort habe ich transparante Labels über die Image-Buttons gelegt, damit mir die OnMouse-Events zur Verfügung stehen. Ist zwar keine saubere Lösung, aber eine. :zwinker:

bluescreen25 8. Jan 2006 11:41

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von Matze
Zitat:

Zitat von bluescreen25
das OnMouseOver ist nämlich beim TImage nicht enthalten.

Irgendwie driften wir vom Ursprungsthema ab, doch dazu kannst du dir mal das Projekt von mir angucken: Tum von Hanoi. Dort habe ich transparante Labels über die Image-Buttons gelegt, damit mir die OnMouse-Events zur Verfügung stehen. Ist zwar keine saubere Lösung, aber eine. :zwinker:

dein Projekt habe ich mir schon angesehen.Jetzt erinnere ich mich, dafür hast du eine Grafik "fest" integriert, auf denen ein Label für das onclick oder onmouseover zuständig war bzw eine durchsichtige Grafik überlagert.

Hmm , auch nicht schlecht, nur dafür muss man ja 3 Dinge für eine Sache hinterlegen,wenn ich gerade an das Auslagern der jpgs denke, dann muss ich ja das Label auch immer mitziehen.....oder?
Der User soll ja später mal seinen Skin basteln können.

Matze 8. Jan 2006 11:44

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von bluescreen25
Der User soll ja später mal seinen Skin basteln können.

Acho, korrekt dafür ist das gänzlich ungeeignet. War nur einer meiner ersten Tests damals. Ich wusste nicht, dass der Anwender seinen Skin basteln können soll.

bluescreen25 8. Jan 2006 11:57

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von Matze
Zitat:

Zitat von bluescreen25
Der User soll ja später mal seinen Skin basteln können.

Acho, korrekt dafür ist das gänzlich ungeeignet. War nur einer meiner ersten Tests damals. Ich wusste nicht, dass der Anwender seinen Skin basteln können soll.

da ich aber hingegen zu dir überhaupt gar keine Ahnung von der Grafik in Delphi habe, hatte ich mir schonmal ein paar Möglichkeiten angesehen. Bin erst seit 8 Wochen an Delphi dran und kümmerte mich erstmal im Funktionen meines Programms.

Kannste evt nochmal hierdrauf eingehen ?

Was ist eigendlich der grobe Unterschied vom Einlesen der Jpegs? (ausser, das man innerhalb des Timage das JPG nochmal verschieben kann) Verhält sich das Speichermäßig anders? oder warum geht man über den umständlichen Weg des TJpegimage.create ?

Delphi-Quellcode:
Image2.Width := 210;
Image2.Height := 60;
Image2.Top := 250;
Image2.left := 10;
Image2.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
oder
Delphi-Quellcode:
button:=tjpegimage.Create;
button.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
Image2.Width := 210;
Image2.Height := 60;
Image2.Top := 250;
Image2.left := 10;
Image2.Canvas.Draw(0,0,button);
button.Free;

SirThornberry 8. Jan 2006 12:07

Re: TImage zur Laufzeit positionieren
 
Zitat:

Image2.Width := 210;
Image2.Height := 60;
Image2.Top := 250;
Image2.left := 10;
Leute? was soll das? Nen größeren Performancekiller gibts kaum. Dadurch wird 4 mal SetBounds aufgerufen was beim TImage ein 4maliges neu berechnen des anzuzeigenden Bildes bewirkt!!
Wenn dann doch bitte so
Delphi-Quellcode:
Image2.SetBounds(10, 250, 210, 60);

bluescreen25 8. Jan 2006 12:28

Re: TImage zur Laufzeit positionieren
 
Zitat:

Zitat von SirThornberry
Zitat:

Image2.Width := 210;
Image2.Height := 60;
Image2.Top := 250;
Image2.left := 10;
Leute? was soll das? Nen größeren Performancekiller gibts kaum. Dadurch wird 4 mal SetBounds aufgerufen was beim TImage ein 4maliges neu berechnen des anzuzeigenden Bildes bewirkt!!
Wenn dann doch bitte so
Delphi-Quellcode:
Image2.SetBounds(10, 250, 210, 60);

Also nochmal: Welchen Unterschied gibt es zwischen den folgenden Möglichkeiten ?

Delphi-Quellcode:
Image2.SetBounds(0, 164, 210, 60); //left,top,width,height
Image2.Picture.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
und dieser hier:
Delphi-Quellcode:
button:=tjpegimage.Create;
button.LoadFromFile(extractfilepath(paramstr(0))+'button.jpg');
Image2.SetBounds(0, 164, 210, 60); //left,top,width,height
Image2.Canvas.Draw(0,0,button); //x,y innerhalb des image2
button.Free;

Matze 8. Jan 2006 12:38

Re: TImage zur Laufzeit positionieren
 
Beim zweiten Code wird ein TImage für den Button erstellt und dieses dann auf das erste Image gezeichnet, was nicht notwendig ist. Erste Variante lädt den Button direkt ins Image1, was auf jedenfall schneller geht und kurzzeitig weniger Resourcen benötigt, da nur ein Image erstellt werden muss.

bluescreen25 8. Jan 2006 12:49

Re: TImage zur Laufzeit positionieren
 
dann danke ich euch allen hier für die hilfreichen Infos... :-D

fehlt eigendlich nur noch die OnMouseOver Möglichkeit, damit man jetzt anständige Buttons erzeugen kann... kennt jemand eine Komponente , welche das TImage um sowas erweitert ? Mit selber schreiben, da bin ich noch nicht soweit !


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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-2025 by Thomas Breitkreuz