Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Alpha Zeichen auf Label machen (https://www.delphipraxis.net/94902-alpha-zeichen-auf-label-machen.html)

Christian18 27. Jun 2007 21:20


Alpha Zeichen auf Label machen
 
Hallo,

wie kann ich ein Alpha zeichen (ich meine den griech. Buchstaben, womit man Winkel kennzeichnet) als Caption eines Labels machen?

LG Chris

SirThornberry 27. Jun 2007 21:22

Re: Alpha Zeichen auf Label machen
 
du musst eine Schriftart finden welche das Zeichen unterstützt. Am besten schaust du da in der Zeischentabelle noch (Startmenü->Programme->Zubehör->Systemprogramme->Zeichentabelle)

Christian18 27. Jun 2007 21:25

Re: Alpha Zeichen auf Label machen
 
Hallo,

so schlau bin ich auch schon gewesen. hat abeer leider nichts gebracht. Ich kann das Alpha Zeichen in der Schrift Arial finden. Wenn ich versuche es zu kopieren, erscheint aber ein ?

Was kann ich nun tun? Ich brauche dieses Zeichen dringend und kann auch leider nicht Alpha hinschreiben.

LG Chris

3_of_8 27. Jun 2007 21:29

Re: Alpha Zeichen auf Label machen
 
Nimm Symbol. In Arial gibts das Alpha nur in Unicode, und da die VCL kein Unicode unterstützt, kannst du das vergessen.

mkinzler 27. Jun 2007 21:31

Re: Alpha Zeichen auf Label machen
 
Zitat:

Zitat von 3_of_8
Nimm Symbol. In Arial gibts das Alpha nur in Unicode, und da die VCL kein Unicode unterstützt, kannst du das vergessen.

Höchstens er nimmt Unicode-Komponenten von TNT/TMS oder EiPack

3_of_8 27. Jun 2007 21:45

Re: Alpha Zeichen auf Label machen
 
Wenn das nicht etwas Overkill ist. ;)

mkinzler 27. Jun 2007 21:47

Re: Alpha Zeichen auf Label machen
 
Nur für diesen Fall. Könnte sich aber langfristig lohnen. Oder er wartet bis nächstes jahr.

Christian18 27. Jun 2007 22:13

Re: Alpha Zeichen auf Label machen
 
hi,

ich habe das problem schon ein bisschen anders gelöst. ist bestimmt nicht die eleganteste variante, aber es funktioniert auch. Ich habe einfach einen Screenshot gemacht, dann habe ich mir das zeichen ausgeschnitten und dann als Image in mein Projekt hinzugefügt.

PS: Trotzdem vielen dank für die zahlreichen antworten. Das mir einem Jahr waren überlege ich mir nochmal in ruhe :D

LG Chris

bitsetter 27. Jun 2007 23:00

Re: Alpha Zeichen auf Label machen
 
Hi,

eventuell könntest mit TextOutW oder DrawTextW den Text selber zeichnen.
Delphi-Quellcode:
var
  WText: PWideChar;
begin
  GetMem(WText, 20);
  StringToWideChar(' = 3°',WText, 6);
  PWidechar(WText)^:= WideChar($03B1);//Alpha Zeichen
  canvas.Font.Name := 'Arial';
  TextOutW(canvas.Handle, 10, 10, WText, 5);
  FreeMem(WText, 20);

SirThornberry 28. Jun 2007 08:08

Re: Alpha Zeichen auf Label machen
 
@bitsetter: Welchen Sinn hat es das du 20 Byte speicher anforderst obwohl du nicht soviel nutzt. Und warum schreibst du ' = 3°' in den WideChar? Und warum castest du WText zu PWideChar wenn es doch schon von dem Typ ist? Das ist jetzt keine blose Kritik sondern sind ernst gemeinte Fragen da ich micht mit der Handhabung von Unicode nicht so recht auskenne und man ja nur dazu lernen kann wenn man auch versteht was man tippt.

[Edit]
ok, das mit dem ' = 3°' versteh ich jetzt. Da wird das erste Zeichen (Leerzeichen) dann durch's Alphazeichen ersetzt.

Anstelle der festen 5 bei TextOutW kann man auch mit Length arbeiten

Nach meinem Verständnis wäre das ganze doch so am besten (zwecks einfacher Änderung des Textes ohne die Zahlen für die Länge gesondert anpassen zu müssen)
Delphi-Quellcode:
var
  WText : PWideChar;
  lStr : String;
begin
  lStr := ' = 3°';
  GetMem(WText, Length(lStr) * 2);
  StringToWideChar(lStr, WText, Length(lStr) + 1);
  PWidechar(WText)^:= WideChar($03B1);//Alpha Zeichen
  canvas.Font.Name := 'Arial';
  TextOutW(canvas.Handle, 10, 10, WText, Length(WText));
  FreeMem(WText);
[/Edit]

24karatboy 28. Jun 2007 10:35

Re: Alpha Zeichen auf Label machen
 
wo schreibt der das wurzelzeichen dann rein ? sorry bin noch nicht so fortgeschritten ;)

wie würde das aussehen wenn ich es in speedbuttonwu.caption rein schreiben möchte ?

SirThornberry 28. Jun 2007 10:38

Re: Alpha Zeichen auf Label machen
 
in eine speedbutton-caption kannst du es nicht schreiben weil diese vom Typ TCaption ist und somit nicht unicodefähig.
Das Zeichen würde an die erste Stelle geschrieben werden

24karatboy 28. Jun 2007 10:50

Re: Alpha Zeichen auf Label machen
 
schlecht das gleiche problem hatte ich nämlich auch mit dem wurzelzeichen bzw. habs immernoch ...

mkinzler 28. Jun 2007 10:53

Re: Alpha Zeichen auf Label machen
 
Zitat:

schlecht das gleiche problem hatte ich nämlich auch mit dem wurzelzeichen bzw. habs immernoch ...
Das könnte aber gelöst sein, wenn du den Tipps hier gefolgt wärst.

24karatboy 28. Jun 2007 10:54

Re: Alpha Zeichen auf Label machen
 
ja das mit den unicode controls ist mir atm ein wenig zu aufwendig um ein wurzelzeichen darzustellen dann schreib ich lieber WU

mkinzler 28. Jun 2007 10:58

Re: Alpha Zeichen auf Label machen
 
Die Installation ist in wenigen Minuten erledigt.

24karatboy 28. Jun 2007 11:16

Re: Alpha Zeichen auf Label machen
 
ja aber die einarbeitung nicht und möchte mir das mal ansehen und nicht nur drüberfliegen..

mkinzler 28. Jun 2007 11:22

Re: Alpha Zeichen auf Label machen
 
Da gibt es eigentlich nichts einzuarbeiten. Die Sammlung von TNT (welche nun von TMS weiterentwickelt wird) beinhaltete Komponenetn, die sich außer der Unicodefähigkeit nicht von den VCL-Originalen unterscheiden.

24karatboy 28. Jun 2007 11:43

Re: Alpha Zeichen auf Label machen
 
un da gibts dann ne speedbutton komponente die unicodefähig ist oder ist dann delphi komplett unicode fähig?

mkinzler 28. Jun 2007 12:21

Re: Alpha Zeichen auf Label machen
 
man könnte ja selber nachschauen, es gibt aber sicher andere hier die das für dich erledigen.

24karatboy 28. Jun 2007 12:24

Re: Alpha Zeichen auf Label machen
 
ne brauchen die nicht danke für deine mühe markus ich werde die unicode komponenten mal installen

danke

mfg

mkinzler 28. Jun 2007 12:26

Re: Alpha Zeichen auf Label machen
 
Oder auf der Homepage nachschauen:
www.tmssoftware.com/tmsuni.htm

24karatboy 28. Jun 2007 12:34

Re: Alpha Zeichen auf Label machen
 
danke ttntspeedbutton wird unterstützt ;)

24karatboy 28. Jun 2007 12:40

Re: Alpha Zeichen auf Label machen
 
die ordner design packages und source einfach ins delphi installverz ?

bitsetter 28. Jun 2007 13:21

Re: Alpha Zeichen auf Label machen
 
Zitat:

Zitat von SirThornberry
@bitsetter: Welchen Sinn hat es das du 20 Byte speicher anforderst obwohl du nicht soviel nutzt.

Da war ich mir noch nicht sicher, ob ich 10 oder 12 Byte Speicher anfordern muss. Denn bei
Delphi-Quellcode:
StringToWideChar(lStr, WText, Length(lStr) + 1);
werden doch 12 Byte in den Speicher geschrieben wegen des NULL-Zeichens, oder sehe ich das falsch?Edit:war qatsch


Zitat:

Zitat von SirThornberry
Und warum castest du WText zu PWideChar wenn es doch schon von dem Typ ist?

Ich wollte den Text quasi patchen und dabei nicht die Länge von 5 auf 1 setzen. Aber die Frage hast du dir mehr oder weniger schon selber beantwortet.


Zitat:

Zitat von SirThornberry
Anstelle der festen 5 bei TextOutW kann man auch mit Length arbeiten

Das ist schon richtig, ist dann schon mehr Codeoptimierung. Mir ging es dabei mehr ums Prinzip, als um Copy & Paste Code, zumal sich Christian18 anscheinend schon entschieden hat.

SirThornberry 28. Jun 2007 13:40

Re: Alpha Zeichen auf Label machen
 
die Ausgangsfrage betreffend hab ich mal fix ein label gebastelt welches Unicode kann
Delphi-Quellcode:
unit uUnicodeLabel;

interface

uses
  windows, graphics, classes, controls, StdCtrls;

type
  TUnicodeLabel = class(TGraphicControl)
  strict private
    fAlignment   : TAlignment;
    fCaption     : WideString;
    fLayout      : TTextLayout;
    fTransparent : Boolean;
    fWordWrap    : Boolean;
    procedure SetAlignment(AValue: TAlignment);
    procedure SetCaption(ACaption: WideString);
    procedure SetLayout(AValue: TTextLayout);
    procedure SetTransparent(AValue: Boolean);
    procedure SetWordWrap(AValue: Boolean);
  published
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy(); override;

    procedure Paint(); override;
  published
    property Align;
    property Alignment: TAlignment read fAlignment write SetAlignment default taLeftJustify;
    property Anchors;
    property AutoSize default True;
    property Caption: WideString read fCaption write SetCaption;
    property Color;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Font;
    property HelpContext;
    property HelpKeyword;
    property HelpType;
    property Hint;
    property Layout: TTextLayout read fLayout write SetLayout default tlTop;
    property Margins;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property ShowHint;
    property Transparent: Boolean read fTransparent write SetTransparent default True;
    property WordWrap: Boolean read fWordWrap write SetWordWrap default False;
  end;

implementation

{ TPSUnicodeLabel }

constructor TUnicodeLabel.Create(AOwner: TComponent);
var
  lStyle : TControlStyle;
begin
  inherited Create(AOwner);
  lStyle := ControlStyle;
  Include(lStyle, csSetCaption);
  ControlStyle := lStyle;

  AutoSize     := True;
  fCaption     := '';
  fAlignment   := taLeftJustify;
  fLayout      := tlTop;
  fTransparent := True;
  fWordWrap    := True;
end;

destructor TUnicodeLabel.Destroy;
begin

  inherited Destroy();
end;

procedure TUnicodeLabel.Paint;
var
  lFormat : Cardinal;
  lRect,
  lRect2  : TRect;
  lSize  : TSize;
begin
  Canvas.Font.Assign(Font);

  if Transparent then
    Canvas.Brush.Style := bsClear
  else
  begin
    Canvas.Brush.Color := Color;
    Canvas.FillRect(Rect(0, 0, Width, Height));
  end;
 
  //TextOutW(Canvas.Handle, 0, 0, @fCaption[1], Length(fCaption));
  lFormat := 0;
  case fAlignment of
    taLeftJustify : lFormat := lFormat or DT_LEFT;
    taRightJustify: lFormat := lFormat or DT_RIGHT;
    taCenter     : lFormat := lFormat or DT_CENTER;
  end;

  if fWordWrap then
    lFormat := lFormat or DT_WORDBREAK;

  lRect  := Rect(0, 0, Width, Height);

  lRect2 := lRect;
  DrawTextW(Canvas.Handle, @fCaption[1], Length(fCaption), lRect2, lFormat or DT_CALCRECT);
  if (fLayout <> tlTop) then
  begin
    if (fLayout = tlBottom) then
    begin
      lRect.Top    := Height - (lRect2.Bottom - lRect2.Top);
      lRect.Bottom := Height;
    end
    else
    begin
      lRect.Top    := (Height - (lRect2.Bottom - lRect2.Top)) div 2;
      lRect.Bottom := lRect.Top + (lRect2.Bottom - lRect2.Top);
    end;
  end;
 

  DrawTextW(Canvas.Handle, @fCaption[1], Length(fCaption), lRect, lFormat);

  if AutoSize and (caption <> '') then
  begin
    lSize.cx := lRect2.Right - lRect2.Left;
    lSize.cy := lRect2.Bottom - lRect2.Top;
    if (lSize.cx <> Width) or (lSize.cy <> Height) then
    begin
      SetBounds(Left, Top, lSize.cx, lSize.cy);
      Invalidate();
    end;
  end;
end;

procedure TUnicodeLabel.SetAlignment(AValue: TAlignment);
begin
  if (AValue <> fAlignment) then
  begin
    fAlignment := AValue;
    Invalidate();
  end;
end;

procedure TUnicodeLabel.SetCaption(ACaption: WideString);
begin
  fCaption := ACaption;
  Invalidate();
end;

procedure TUnicodeLabel.SetLayout(AValue: TTextLayout);
begin
  if (AValue <> fLayout) then
  begin
    fLayout := AValue;
    Invalidate();
  end;
end;

procedure TUnicodeLabel.SetTransparent(AValue: Boolean);
begin
  if (AValue <> fTransparent) then
  begin
    fTransparent := AValue;
    Invalidate();
  end;
end;

procedure TUnicodeLabel.SetWordWrap(AValue: Boolean);
begin
  if (AValue <> fWordWrap) then
  begin
    fWordWrap := AValue;
    Invalidate();
  end;
end;

end.

Muetze1 28. Jun 2007 18:21

Re: Alpha Zeichen auf Label machen
 
Schickes Ding. Ein kleiner Hinweis noch:

Die lokale Variable im Konstruktor kann man sich sparen:
Delphi-Quellcode:
ControlStyle := ControlStyle + [csSetCaption];
Ausserdem habe ich mir angewöhnt bei Komponenten bei den Setter'n immer noch vor dem Invalidate folgende Bedingung zu setzen:
Delphi-Quellcode:
if not ( csLoading in ComponentState ) then
um Windows die ganzen Akkumulationen zu ersparen über die dreckigen Bereiche, schliesslich malst du als TGraphicControl auf dem DC deines Parents...

Christian18 28. Jun 2007 19:18

Re: Alpha Zeichen auf Label machen
 
Hey super,

das mit dem neuen Label funktioniert echt super. Jetzt kann ich auch andere Zeichen darstellen. Ich bin dafür wenn das in die CodeLib. kommt.

LG Chris

Muetze1 28. Jun 2007 19:32

Re: Alpha Zeichen auf Label machen
 
Zitat:

Zitat von Christian18
das mit dem neuen Label funktioniert echt super. Jetzt kann ich auch andere Zeichen darstellen. Ich bin dafür wenn das in die CodeLib. kommt.

Ja und? Hast du denn auch dem Vorschlag Taten folgen lassen und den entsprechenden Button neben dem Beitrag von SirThornberry gedrückt? Schliesslich kannst du dies selber auslösen...

Christian18 28. Jun 2007 19:39

Re: Alpha Zeichen auf Label machen
 
ich versteh gerade deinen beitarg nicht sorry

bitsetter 28. Jun 2007 19:44

Re: Alpha Zeichen auf Label machen
 
Hi,

er meinte bestimmt die Glühlampe http://www.delphipraxis.net/images/p...odelibrary.gif neben den Beitrag von
SirThornberry.

Christian18 28. Jun 2007 19:49

Re: Alpha Zeichen auf Label machen
 
Achso,

dann kann er das doch so sagen. Ich finde er hat ein bisschen um das eigentliche problem herrumgeredet. :D:D:D

nicht böse gemeint!!!

Ja das mit der Glühbirne habe ich schon gemacht.

LG Chris

Muetze1 28. Jun 2007 20:45

Re: Alpha Zeichen auf Label machen
 
Zitat:

Zitat von Christian18
dann kann er das doch so sagen. Ich finde er hat ein bisschen um das eigentliche problem herrumgeredet. :D:D:D

Sorry, ich bin leider dafür bekannt viel um ein Thema herum zu reden anstatt es direkt anzusprechen. Irgendwas muss schliesslich kompliziert sein neben dem Leben...

Nächstes mal lasse ich es einfach und klick den Button selber. Sorry..


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