![]() |
Problem beim ändern der Größe eines TImage
Folgendes Problem: Ich will die Größe zweier TImages verändern. Soweit ich das beurteilen kann (mit einer Ausgabe durch ShowMessage()), wird auch die Größe geändert. Allerdings tritt dann folgendes auf (dazu erst mal zwei Bilder zur besseren Erläuterung; oben vorher; unten nachher;):
![]() ![]() Die beiden TImages liegen übereinander und sind exakt gleich groß. Das eine repräsentiert das Raster/Gitter. Das andere repräsentiert das Streckennetz (einer Modellbahn). Dass durch die Größenänderung die Bilder verworfen werden, habe ich mittlerweile kapiert. dasJetzt bin ich dabei das Gitter neu zu zeichnen (siehe 2. Bild), allerdings hört das Programm immernoch am selben rechten Rand auf zu zeichnen, wie oben. Die methoden (funktioniert mit lineTo/moveTo) werden aber so wie ich das beurteilen kann ausgeführt, nur passiert eben nichts. So nun hoffe ich, dass jeder mein Problem verstanden hat und irgend einer mir helfen kann. (Ich sitze da nun schon ewig dran und komme mit der Delphi Hilfe einfach nicht weiter.) Schonmal im Voraus vielen Dank. Achja, wenn jemand irgend welchen Code sehen will, einfach melden. Ich wollte jetzt nur nicht wahllos einen Haufen Code hinknallen, den dann niemand versteht. |
Re: Problem beim ändern der Größe eines TImage
Code wäre schon ganz praktisch! Ich vermute, dass du irgendwie auf das Form zeichnest und nicht auf das Image. Aber das kann man nur am Code sehen. Willst du, dass die Bilder nicht verworfen werden, so gucke dir mal CopyRect bzw. StrechDraw an.
|
Zeichenmethode für das Raster
Delphi-Quellcode:
pb_gitter ist die die TImage Komponente (Name noch historisch bedingt)
procedure Tfrm_track.PaintGitter;
var dummy: integer; begin with pb_gitter.canvas do begin Pen.Color:=$00B6B6B6; Pen.Width:=2; end; for dummy:=0 to TrackWindow.Breite do //zeichnet die vertikalen Linien begin pb_gitter.Canvas.MoveTo(dummy*FeldSize,0); pb_gitter.Canvas.LineTo(dummy*FeldSize,TrackWindow.Hoehe*FeldSize); end; for dummy:=0 to TrackWindow.Hoehe do //zeichnet die horizontalen Linien begin pb_gitter.Canvas.MoveTo(0,dummy*FeldSize); pb_gitter.Canvas.LineTo(TrackWindow.Breite*FeldSize,dummy*FeldSize); end; with pb_gitter.canvas do //fügt eine weiße linie am unteren Rand hinzu, damit weiß die transparente Farbe ist begin Pen.Color:=clwhite; Pen.Width:=1; MoveTo(0,TrackWindow.Hoehe*FeldSize); LineTo(TrackWindow.Breite*FeldSize,TrackWindow.Hoehe*FeldSize); end; end; TrackWindow.Breite gibt die anzahl an Spalten an TrackWindow.Hoehe gibt die Anzahl an Zeilen an FeldSize gibt die Kästchengröße an |
Re: Problem beim ändern der Größe eines TImage
Passt du diese Werte auch irgendwo an:
TrackWindow.Breite TrackWindow.Hoehe Desweiteren ist ein TImage nicht zum Zeichnen geadcht, sondern dienst zur Darstellung fertiger Grafiken. Zum Zeichnen nimmt man eine Painbox. Und auch auf die zeichnet man nicht direkt, sondern auf ein Bitmap im Speicher un kopiert selbiges bei Bedarf auf den Canvas der Painbox. |
Re: Problem beim ändern der Größe eines TImage
Ja, beide Werte werden verändert. Deshalb wird auch das fenster größer.
Der Grund warum ich TImage verwende ist, dass ich die Eigenschaft Transparent benötige. Wenn ich mal eine gute Anleitung zu grafischen Komponenten gehabt hätte, hätte ich sicherlich auch anders verfahren. Da suche ich auch schon eine Weile. |
Re: Problem beim ändern der Größe eines TImage
Schon mal auf die Idee gekommen mal Schritt für Schritt durch die Schleife zu gehen und zu kucken, was da für Werte stehen in den Variablen?
Zitat:
TBitmap kennt auch die Eigenschaften TransparentColor und TransparentMode. |
Re: Problem beim ändern der Größe eines TImage
Hier werden sowohl das Fenster als auch die beiden TImages in der Größe geändert
Delphi-Quellcode:
Die beiden Bilder werden auch gleich nochmal gelöscht. Die beiden Methoden werden in folgender Methode aufgerufen.
procedure Tfrm_track.ResizeObjects;
begin ClientWidth:=(TrackWindow.Breite*FeldSize+16); ClientHeight:=(TrackWindow.Hoehe*FeldSize+16); with pb_gitter do begin Width:=(TrackWindow.Breite*FeldSize); Height:=(TrackWindow.Hoehe*FeldSize)+1; canvas.Pen.Style:=pssolid; canvas.Pen.color:=clwhite; canvas.Brush.Color:=clwhite; canvas.Rectangle(0, 0, pb_gitter.width-1, pb_gitter.height-1); end; with im_TrackParts do begin Width:=(TrackWindow.Breite*FeldSize); Height:=(TrackWindow.Hoehe*FeldSize); canvas.Pen.Style:=pssolid; canvas.Pen.Color := clWhite; canvas.Brush.Color := clWhite; canvas.Rectangle(0, 0, im_TrackParts.width, im_TrackParts.height); end; end;
Delphi-Quellcode:
Ergänzend sollte ich vielleicht erwähnen, dass die Bilder per Default in der Größe 10x10 vorliegen (200x200Pixel). Danach lade ich erst das konkrete Gleisbild was die Größe erst einmal ändert. Erst das geänderte kann ich nicht mehr ändern.
procedure Tfrm_track.EditTrackParameters;
begin ResizeObjects; Caption:=TrackWindow.Name + ' - Editormodus'; Paintgitter; end; Zweck der beiden verschiedenen Images ist, dass ich das Gitter zeitweise verstecke (.Hide), je nachdem in welchem Zustand das programm ist. Naja, morgen probiere ich mal ein bitmap zu kopieren. |
Re: Problem beim ändern der Größe eines TImage
@sledgehammer: Ich würde dir empfehlen eine grafische Komponente zu schreiben die das alles macht. Dazu einfach eine Neue Komponente erstellen und diese von TGraphicControl oder TCustomControl ableiten. Wenn die Komponente Transparent sein soll musst du TGraphicControl nehmen. Wenn du TCustomControl nimmst hast du ein Handle und kannst somit deine Komponente auch über messages ansprechen (von anderen Anwendungen aus). Dann brauchst du nur noch die Paint-Methode überschreiben und darin dein Bild auf die Canvas malen. Falls du nicht weiterkommst dabei einfach nochmal posten oder per icq (125336749) melden...
|
Re: Problem beim ändern der Größe eines TImage
Also nach meinen Erfahrungen ändert sich die Größe des BitMaps (Canvas) im inneren von TImage nicht, wenn man die Größe des Images ändert, also kannst du nicht weiter Zeichnen, als das Image am Anfang breit/hoch war.
also mußt du am Anfang (vom neuzeichnen, nach der Größenänderung) natülich noch das BitMap vergrößern. z.B.:
Delphi-Quellcode:
Dabei kannst du zwar weiteerhin zum Zeichnen auf Image.Canvas zugreifen, aber wenn du statt dessen Image1.Picture.Bitmap.Canvas verwendest ist die Verbindung zu Image1.Picture.Bitmap.Width... leichter ersichtlich ^^
Image1.Picture.Bitmap.Width := ClientWidth;
Image1.Picture.Bitmap.Height := ClientHeight; |
Re: Problem beim ändern der Größe eines TImage
Da ich im Moment nicht viel Zeit habe, habe ich bislang nur versucht himitsu's Tipp zu probieren. Bislang scheint es zu funktionieren (Danke!). Ich schau mir aber auf alle Fälle noch die Möglichlichkeit von SirThornberry an, schließlich will man sich ja fortbilden.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:43 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