Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   TLabel innerhalb TImage (https://www.delphipraxis.net/155111-tlabel-innerhalb-timage.html)

Zuckerberg 8. Okt 2010 18:19

TLabel innerhalb TImage
 
Hallo Liebe Community,
seid gegrüßt!

Also ich habe versucht so eine Art "GraffitiWand" zu programmieren ...

hier ist der Code ...

Delphi-Quellcode:
var
  GUI: TGUI;
  Spruch : array [1..50] of TLabel;
  //n : integer; //Anzahl der Labels

implementation

{$R *.DFM}

procedure TGUI.FormCreate(Sender: TObject);
var
   x,y : Integer;
begin
     Randomize;

     for x:=0 to GraffitiWand.Height do    // Macht Leinwand weiß
     for y:=0 to GraffitiWand.Width do
     GraffitiWand.Canvas.Pixels[x,y];
end;

procedure TGUI.GErzeugenBtnClick(Sender: TObject);
var
i : Integer;
begin
     for i:=1 to 50 do
     begin
     Spruch[i]:= TLabel.Create(self);//hier habe ich es mal mit (GraffitiWand) versucht und parent:=Graffitiwand KLAPPT ABER NICHT
     Spruch[i].parent:=self as TWincontrol;

     Spruch[i].Transparent:=True;  //wegen Hintergrund
     Spruch[i].Top:=Random(220);   // hier ist der Bereich der Leinwand die die Position der Label eingrenzen sollte ...
     Spruch[i].Left:=Random(230);// hier ist der Bereich der Leinwand die die Position der Label eingrenzen sollte ...
     Spruch[i].Font.Size:=17;
     Spruch[i].Font.Name:='Playbill';
     Spruch[i].Caption:=GEingabeEdt.Text;
     end;
end;
NUN das programm soll auf einer Leinwand (bei mir mit "GraffitiWand" benannt ; typ TImage)
Sprüche abbilden die vorher auf einem Edit gemacht wurden ...

Das Problem :
Ich bekomme es nicht hin das ich sage das die erzeugten Labels(die die Sprüche enthalten...) der Leinwand gehören, sprich wenn sie per Zufall erzeugt werden, werden sie auch außerhalb der Leinwand positioniert ...

Ok nun könnte man einfach die perfekte Position der Leinwand raus finden, dass ist aber nicht sehr elegant ... und birgt einen Fehler nämlich wenn das Label zu weit rechts positioniert wird, überschreitet es die Leinwand ...

Wunschlösung wäre das die Labelsprüche nur innerhalb dieser Leinwand angezeigt werden ... aber dafür müsste ich die Label's abhängig zur Leinwand machen , aber wie ????

bitte um Hilfe

PS : ach ja und noch etwas ...
Wenn ich die Label dann wieder Löschen möchte geht das mit free und einer for-schleife oder eher anders ... ?

PSS: ich will einfach mal einen smiley ausprobiern und hiermit tue ich das ... :thumb:

stahli 8. Okt 2010 18:29

AW: TLabel innerhalb TImage
 
Hallo Zuckerberg und herzlich willkommen!

Du kannst mit
Delphi-Quellcode:
GraffitiWand.Canvas.TextWidth(Spruch)
die benötigte Breite berechnen und bei der Positionierung berücksichtigen...

Björn Ole 8. Okt 2010 18:32

AW: TLabel innerhalb TImage
 
Hi und herzlich Willkommen. :wink:

Platziere doch deine Graffitiwand mit Align = alClient auf einem Panel (evtl Borders deaktivieren).
Dann weist du den Labels als Parent das Panel zu und brauchst vielleicht noch ein Label.BringToFront.
Bei der zufälligen Positionierung ziehst du einfach die Breite des Labels ab, damit es nicht zu weit rechts steht. Beachte aber, dass du die Caption davor setzen solltest.

Zitat:

Wenn ich die Label dann wieder Löschen möchte geht das mit free und einer for-schleife oder eher anders ... ?
Ja. :thumb:

Zuckerberg 8. Okt 2010 18:35

AW: TLabel innerhalb TImage
 
Danke das ist schonmal interessant ...

nur wie bau ich das am "elegantesten" da rein ... ? @stahli

Zuckerberg 8. Okt 2010 18:37

AW: TLabel innerhalb TImage
 
Danke Björn klingt interessant das probier ich jetzt mal :)

Björn

soll das Panel sich auf der ganzen GUI erstrecken ???

Zuckerberg 8. Okt 2010 18:53

AW: TLabel innerhalb TImage
 
Ok danke mit dem Panel klappt es ...

aber gibt es den keine Möglichkeit es das auch mit dem Image hinzubekommen ????

himitsu 8. Okt 2010 18:59

AW: TLabel innerhalb TImage
 
TLabel (und ich glaub auch TImage) haben kein eigenes Canvas.
Diese zeichnen einfach nur auf das Canvas des Parents.

Beim TLabel ist dieses Parent also die Form.
Die Form liegt hinter dem Image und wird demnach durch das Image verdeckt und ist somit nicht sichtbar.

Selbst wenn TImage auch nur auf das Canvas der Form zeichnet und somit das Label nicht wirklich verdeckt,
dann kommen sich immernoch die Zeichenroutinen der Beiden in die Quere und es funktioniert dennoch nicht richtig.

Besser also zu zeichnest den Text direkt in das Bild oder du mußt eine andere Textkomponente verwenden, welche über dem Image liegt.
TStaticText hat z.B. sein eigenes Canvas, worauf es sich zeichnet.

SirThornberry 8. Okt 2010 19:02

AW: TLabel innerhalb TImage
 
@Zuckerberg: Bitte benutze nächstes mal bitte den "Bearbeiten"-Button anstelle 3 Beiträge hintereinander zu verfassen. Das verfassen mehrere Beiträge hintereinander (also ohne das zwischenzeitlich jemand anderes was gepostet hat) nennt man pushen und ist hier im Forum innerhalb von 24 Stunden nicht erwünscht.

stahli 8. Okt 2010 19:04

AW: TLabel innerhalb TImage
 
Ähh, warte mal, ich habe da vorhin etwas falsch gelesen...

Halte Dich mal an den Tip von Björn.

Und geh das ganze etwas einfacher an.
Wenn Du Labels benutzt, kannst Du diese ja auf das Formular setzen oder auf ein Panel. Dem Formular bzw. dem Panel kannst Du einfach die Farbe weiß zuweisen.
Dann weist Du dem Label einen Text zu und kannst (wenn die Eigenschaft AutoSize gesetzt ist) im Label.Width die benötigte Preite ablesen.
Dann setzt Du Label.Left auf einen Wert von 0 .. ParentPanel.Widt - Label.Width.

So ungefähr sollte es klappen...



roter Kasten->
Du kannst auch auf einen Canvas direkt schreiben, dann würde mein erster Beitrag schon passen.
Du müsstest vielleicht mal genauer schildern, was Du genau erreichen willst.
Es gibt verschiedenste Lösungen, je nachdem was man genau machen will.


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