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 Problem beim ändern der Größe eines TImage (https://www.delphipraxis.net/31420-problem-beim-aendern-der-groesse-eines-timage.html)

sledgehammer 8. Okt 2004 21:56


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;):
http://sledgehammers.gmxhome.de/stuff/myTrack1.jpg
http://sledgehammers.gmxhome.de/stuff/myTrack2.jpg
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.

maxk 8. Okt 2004 22:06

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.

sledgehammer 8. Okt 2004 22:39

Zeichenmethode für das Raster
 
Delphi-Quellcode:
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;
pb_gitter ist die die TImage Komponente (Name noch historisch bedingt)
TrackWindow.Breite gibt die anzahl an Spalten an
TrackWindow.Hoehe gibt die Anzahl an Zeilen an
FeldSize gibt die Kästchengröße an

Luckie 8. Okt 2004 23:00

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.

sledgehammer 8. Okt 2004 23:15

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.

Luckie 8. Okt 2004 23:18

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:

Ja, beide Werte werden verändert. Deshalb wird auch das fenster größer.
Ach das ist das Fenster? Und wo machst du das TImage größer?

TBitmap kennt auch die Eigenschaften TransparentColor und TransparentMode.

sledgehammer 8. Okt 2004 23:44

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:
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;
Die beiden Bilder werden auch gleich nochmal gelöscht. Die beiden Methoden werden in folgender Methode aufgerufen.
Delphi-Quellcode:
procedure Tfrm_track.EditTrackParameters;
begin
  ResizeObjects;
  Caption:=TrackWindow.Name + ' - Editormodus';
  Paintgitter;
end;
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.
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.

SirThornberry 9. Okt 2004 07:22

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...

himitsu 9. Okt 2004 08:18

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:
Image1.Picture.Bitmap.Width := ClientWidth;
Image1.Picture.Bitmap.Height := ClientHeight;
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 ^^

sledgehammer 9. Okt 2004 12:09

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 19:53 Uhr.

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