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 Image so gross machen das ein String genau reinpasst. (https://www.delphipraxis.net/2155-image-so-gross-machen-das-ein-string-genau-reinpasst.html)

Sharky 9. Jan 2003 13:37


Image so gross machen das ein String genau reinpasst.
 
Hai,

ich möchte ein Image (TImage) erzeugen das genau die Breite eines Strings hat den ich darauf zeichnen möchte.

Auf meiner Form sind:

1 Button
1 Edit
1 Image

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);

var
 MyRect            : TRect;

begin
 Image1.Canvas.Font.Size := 10;
 MyRect.Left := 0;
 MyRect.Top := 0;
 MyRect.Right := Image1.Canvas.TextWidth(Edit1.Text) + 5;
 MyRect.Bottom := Image1.Canvas.TextHeight(Edit1.Text) + 2;
 Image1.BoundsRect := MyRect;
 Image1.Canvas.TextOut(0, 0, Edit1.Text);
 Label1.Caption := Format('Das Image ist %d Pixel breit', [Image1.width]);
end;
Aber die Breite des Images wird nicht angepasst :-(

Hat jemand eine Idee?

eddy 9. Jan 2003 21:03

Hallo Sharky,

ich habe zwar keine Ahnung, wofür das Gut sein soll, aber ich habe es trotzdem ausprobiert. Wenn Du dafür sorgst, daß die Schrift in beiden Objekten identisch ist, sollte es funktionieren.

mfg
eddy

sakura 9. Jan 2003 22:38

Entscheidend für den Inhalt ist auch die Größe des Bitmap.

Image1.Bitmap.Width und Image1.Bitmap.Height. Die Größe des Images wird nur zur Darstellung, nicht aber für den Canvas genutzt. Kurz: Beide Image1 und Image1.Bitmap müssen die richtige Größe haben.

...:cat:...

Christian Seehase 9. Jan 2003 22:51

Moin sakura,

hättest Du in diesem Zusammenhang eine Idee, warum bei Canvas.ClipRect so beschrieben ist:

Zitat:

Zitat von Delphi-Hilfe
Die Eigenschaft ClipRect legt die Begrenzung des Clipping-Rechtecks fest.

dies aber eine Read Only Eigenschaft ist? :shock:

sakura 10. Jan 2003 08:36

Erst mal sorry. Es ist nicht Image.Bitmap sondern Image.Picture.Bitmap.

@C/S: Welches ClipRect meinst Du?

Sharky 10. Jan 2003 10:27

Zitat:

Zitat von sakura
Erst mal sorry. Es ist nicht Image.Bitmap sondern Image.Picture.Bitmap.

Danke. Jetzt geht es :lol:

@eddy:
Das ganze ist für folgendes Gut:
Ich beim dem Instrumentation Workshop von TMS-Softwre ist ein LED-Banner dabei. Dieses scrollt ein Bitmap und es sieht dann so aus wie diese LED-Werbebänder.

Da ich dort Text anzeigen möchte muss ich halt ein Bitmap mit Text erzeugen.

Anbei habe ich mal ein ganz kleines Demo gehängt

eddy 10. Jan 2003 10:46

Hallo Sharky,

Du Schreibst: Anbei habe ich mal ein ganz kleines Demo gehängt

Wo ist anbei und wie komme ich da ran?

Ich bin noch nicht allzu lange dabei, fehlt mir noch irgendeine Freigabe?

mfg
eddy

sakura 10. Jan 2003 10:54

Direkt unterhalb der Signatur von Sharky
Zitat:

><(((°>
Sharky
steht folgendes
Zitat:

Banner.exe - 141 KB
Da ist der Download.

eddy 10. Jan 2003 11:01

Hi Sharky,

ist schon manchmal seltsam.

Bevor ich die vorige Nachricht sandte, stand noch nichts von Banner.exe unter Deinem Text, nach dem Versenden bin ich wieder auf die Seite gegangen, da stand der Download bereit.

Hab ihn mir angesehen. Läuft prima. Jetzt fehlt nur noch ein Regler zum Einstellen der Farben.

mfg
eddy

sakura 10. Jan 2003 11:04

Zitat:

Zitat von eddy
Bevor ich die vorige Nachricht sandte, stand noch nichts von Banner.exe unter Deinem Text, nach dem Versenden bin ich wieder auf die Seite gegangen, da stand der Download bereit.

Das ist wohl eher unwahrscheinlich ;) Da ich mir das Sample bereits vor Deiner Nachricht gesaugt hatte.
...:cat:...

Sharky 10. Jan 2003 12:17

Zitat:

Zitat von eddy
Hab ihn mir angesehen. Läuft prima. Jetzt fehlt nur noch ein Regler zum Einstellen der Farben.

Ich habe hier mal eine neue Version des Demos abgelegt.

Christian Seehase 10. Jan 2003 13:36

Moin sakura,

also in D5 ist unter TCanvas die Eigenschaft ClipRect beschrieben (dto. TControlCanvas).
Nachdem ich die gelesen hatte dachte ich:

*freu* daran wird's liegen.

Pustekuchen... Read Only. :shock:

Das wird dann durch die Grösse der Bitmap eingestellt, aber darauf muss man erst mal kommen ;-)

Selbst mein "schmutziger Trick", wie beim Austausch eines Formulares (falls Du Dich erinnerst) lässt sich hier leider nicht anwenden, da ClipRect wohl über GetClipRect ausgelesen wird (ich hab's jetzt nicht extra nachgeschaut).

Warum dann kein SetClipRect implementiert wurde, dass die Bitmap entsprechend einstellt wird wohl ewig das Geheimnis von Borland bleiben.
(oder ich hab' mir die verschiedenen Eigenschaften nicht richtig angesehen ;-))

sakura 10. Jan 2003 13:54

Zitat:

Zitat von Christian Seehase
also in D5 ist unter TCanvas die Eigenschaft ClipRect beschrieben

Achso.
Zitat:

Zitat von Christian Seehase
Das wird dann durch die Grösse der Bitmap eingestellt, aber darauf muss man erst mal kommen

Schon recht viel Canvas-Graphik-Programmierung betrieben.
Zitat:

Zitat von Christian Seehase
Warum dann kein SetClipRect implementiert wurde, dass die Bitmap entsprechend einstellt wird wohl ewig das Geheimnis von Borland bleiben.

Nicht unbedingt. Da der (Control)Canvas ja nicht nur für Bitmaps sondern halt auch für Paintboxen, Labels und andere Controls da ist, kann der/die/das Canvas auch nicht direkt in seiner Größe verändert werden. Letzlich ist der Canvas auch nur ein weiteres Handle in der Control. Windows weiss anhand der Zuweisung des Canvas-Handels zu welcher Control dieses geöhrt und kann dann entsprechend "malen". In diese Richtung kann Windows auch die verfügbare Fläche ermitteln. Wenn man das weiss, dann ist die Schlußfolgerung für das "wie erhalte ich mehr Platz auf meinem Canvas" recht einfach. Stell Dir mal vor, das gänge anders herum.
Delphi-Quellcode:
...
Canvas.Handle := GetDC(0);
try
  Canvas.SetClipRect(0,0,45,300); // was für eine Bildschirmauflösung das jetzt wär...
...
...:cat:...

Christian Seehase 10. Jan 2003 14:25

Moin sakura,

danke für die Erklärung.
Bisher hab' ich noch nie mit Canvas direkt gearbeitet.

Allerdings wäre es vielleicht nicht so ganz sinnlos, wenn bei Komponenten wie TImage direkt ein ClipRect angegeben (und eben nicht für die Canvas) und eingestellt werden könnte. Das Setzen einer solchen Eigenschaft könnte dann auch solche von Dir genannten "Gemeinheiten" unterbinden.

BTW:
Auch wenn's komisch klingt scheint die Canvas wohl richtig zu sein.
Es steht ja schliesslich für Leinwand bzw. Zeichenfläche.

[EDIT]
und wie ist ClipRect in der englischen Hilfe beschrieben?
[/EDIT]

Daniel B 10. Jan 2003 14:30

Hallo Christian,

Zitat:

Specifies the boundaries of the clipping rectangle.

property ClipRect: TRect;

Description

Use ClipRect to determine where the canvas needs painting. ClipRect limits the drawing region of the canvas so that any drawing that occurs at coordinates outside the ClipRect is clipped and doesn’t appear in the image.

When handling a form’s OnPaint event, the canvas' ClipRect property is set to the rectangle that needs to be painted. Portions of the image that do not overlap the ClipRect do not need to be drawn. Thus, OnPaint routines can use the value of ClipRect to optimize painting, speeding the overall performance of the application.
Beispiel:

Delphi-Quellcode:
This example creates a region and selects this region as the clipping rectangle for the Image component's canvas. It then sets the canvas's brush color to red and calls FillRect using the ClipRect as the area to fill. Lastly, the ClipRect is reset to the original value that it contained by calling SelectClipRect with nil as the second parameter and deletes the region.

procedure Form1.Button1Click(Sender: TObject);
var

    MyRgn: HRGN ;

begin

    MyRgn := CreateRectRgn(100,100,200,200);
    SelectClipRgn(Image1.Canvas.Handle,MyRgn);
    Image1.Canvas.Brush.Color := clRed;
    Image1.Canvas.FillRect(Image1.Canvas.ClipRect);
    Image1.Invalidate;
    SelectClipRgn(Image1.Canvas.Handle,nil);
    DeleteObject(MyRgn);

end;
Grüsse, Daniel :hi:

Christian Seehase 10. Jan 2003 14:37

Moin Daniel B,

danke, dann war da mal wieder jemand an der Übersetzung, der sich mit englisch etwas schwer tut und/oder der sich mit der Materie nicht auskennt.
Und Korrekturlesen von jemandem der sich auskennt hat wohl auch nicht stattgefunden. :?
Typisch ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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