Label in einer Unit
-
Hallo,
es muß nicht sichtbar sein. benötige es nur, um die länge des Labels mit Canvas auszulesen, um die größe des Feldes in der statusbar anzupassen.
Gruß Siegfried
-
Meinst du für TCanvas::TextWidth ?
Dafür brauchst du doch aber kein Label. Wenn du nur die Länge brauchst, übergib die Länge, wenn du das canvas brauchst, übergib das Canvas. Ein neu erstelltes nicht sichtbares Label macht für mich keinen Sinn.
-
GetTabbedTextExtent
-
Wozu das jetzt? TextWidth sollte es auch tun.
-
Hallo,
AnsiString asDateTime = FormatDateTime(" dddd d. mmmm yyyy hh:mm:ss",DateTimeToStr(Now())); TLabel *MyLabel = new TLabel(0); MyLabel->Caption = asDateTime; int iWidth = MyLabel->Canvas->TextWidth(asDateTime); delete MyLabel;bei
int iWidth = MyLabel->Canvas->TextWidth(asDateTime);bekomme ich die Fehlermeldung "hat kein übergeordnetes Fenster".
Gruß Siegfried
-
Ist doch logisch. Du hast dem Label kein Parent zugewiesen. Woher soll es da wissen worauf es Zeichnen soll. Deswegen sagte ich ja, übergib deine Funktion das Canvas auf dem gezeichnet werden soll. Beim StatusBar eben von dort.
Beispielfunktionint getTextLength(TCanvas* canv) { AnsiString asDateTime = FormatDateTime(" dddd d. mmmm yyyy hh:mm:ss",DateTimeToStr(Now())); int iWidth = canv->TextWidth(asDateTime); return iWidth; }oder kürzer
int iWidth = canv->TextWidth(FormatDateTime(" dddd d. mmmm yyyy hh:mm:ss",DateTimeToStr(Now())));
-
Eben aus diesem Grunde.
-
Wäre es nicht einfacher, irgendwo ein unsichtbares Label hinzupacken, dort den Text reinlegen und dann den Wert abzufragen?
-
Ich sehe hier immer noch keine Grund für diese API-Funktion.
Dort mußt du eine Handle deines Fensters und noch diverse andere Sachen übergeben, hier nur einen Pointer auf das Canvas und den String.
-
Es war ja nur als Alternative zu VCL gedacht, da es ja (ihm) offenbar mit dem Label ärger macht.
Es gibt ja auch noch GetTextExtentPoint32.
Ein HDC braucht ma immer-> hier in der VCL der Canvas-> auf irgendwas muss sich ja die Berechnung stützen.
Vielleicht doch das unsichtbare Label..
-
was ich nicht verstehe, warum man ein unsichtbares Label nehmen muss, nur um den Canvas zu brauchen.
die Statusbar liefert doch ein Canvas schon mit TStatusBar::Canvas
-
Er braucht doch gar kein Label. Das Canvas des Objektes in das er schreiben will reicht völlig. Auch sein StatusBar hat ein Canvas.
Die Funktion, die ich oben hingeschrieben habe läßt sich doch einfach so aufrufenint width = getTextLength(StatusBar1->Canvas);Wo braucht man hier ein unsichtbares Label?
@BigNeal
Sag ich ja die ganze Zeit
[edit]Hab deinen Post erst nach dem Abschicken gesehen[edi]
-
hallo,
mit dem "unsichbarem Label" wollte ich nur die "grafische " Länge nutzen. Ein Label auf eine andere Form möchte ich nicht setzen, da die Routiene mit dem unsichbarem Label auch in anderen Projekte eingesetzt werden. Daher ist die Routine nur in einer Unit ohne Form geschrieben. Möchte dies später in einer Komponente verpacken, da von hier es einfacher zu verwalten ist.
schade, das ich nicht zum Ziel gekommen bin. Trotzdem an alle vielen Dank. Muß dies dann anderst lösen.
Gruß Siegfried

-
Was gefällt die an der Variante mit dem Canvas nicht?
-
Hallo,
ich verfolge alle Informationen sehr sorgfältig. Auch die Variante Canvas ist großartig. Leiter habe ich bei der Zeileint iWidth = canv->TextWidth(asDateTime);immer noch Fehlermeldung "hat kein übergeordnetes Fenster".
schade.
Gruß Siegfried
-
Wo hast du das Canvas in canv denn her? Hoffentlich nicht von deinem unsichtbaren Label. Das muß schon das Canvas eines existierenden und sichtbaren Objektes sein. z.Bsp. der Statusbar deiner Form.
-
Hallo,
du hast mich erwischt. habe dies vom unsichtbarem Label genommen. Sollte eine Pause machen.
Gruß Siegfried