Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TCanvas für TextWidth in Komponente verwenden (https://www.delphipraxis.net/93858-tcanvas-fuer-textwidth-komponente-verwenden.html)

Helmi 12. Jun 2007 13:34


TCanvas für TextWidth in Komponente verwenden
 
Hallo,

ich muss die Breite eines Textes in einem Panel wissen.
Das ganze passiert in einer Komponente.

Meine erste Version war so:
Delphi-Quellcode:
var
  Text_Width: Integer;

begin
  Text_Width := Application.MainForm.Canvas.TextWidth(S); //In "S" ist der String
end;
Da ich aber die Unit "Forms" in meiner Komponente nicht brauch und will, dacht ich mir, ich könnte ja ein Canvas erzeugen:
Delphi-Quellcode:
var
  Canvas   : TCanvas;

begin
  //Canvas ereugen
  Canvas         := TCanvas.Create;

  try
    Text_Width     := Canvas.TextWidth(S);
  finally
    FreeAndNil(Canvas);
  end;
end;
Wenn ich aber nun diesen Code ausführe, erhalte ich die Fehlermeldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EInvalidOperation aufgetreten. Meldung: 'Leinwand/Bild erlaubt kein Zeichnen'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
Also muss ich irgendwas falsch machen mit dem Canvas. Kann mir da jemand helfen?

Helmi 12. Jun 2007 13:41

Re: TCanvas für TextWidth in Komponente verwenden
 
Ach,

ich könnt mich in den Arsch beissen :-)

Wenn alles so simple wär:

Delphi-Quellcode:
var
  Canvas   : TCanvas;

begin
  //Canvas ereugen
  Canvas         := TCanvas.Create;

  try
    Canvas.Handle := FPanel.Handle;       //Das hat gefehlt!!  //FPanel ist das Panel

    Text_Width   := Canvas.TextWidth(S);
  finally
    FreeAndNil(Canvas);
  end;
end;

DeddyH 12. Jun 2007 13:47

Re: TCanvas für TextWidth in Komponente verwenden
 
Übrigens, wenn Du von TCustomPanel ableitest, ist Dein Panel ein TCustomControl, hat also bereits einen (wenn auch versteckten) Canvas. :zwinker:

Bernhard Geyer 12. Jun 2007 13:54

Re: TCanvas für TextWidth in Komponente verwenden
 
Wie wäre es mit:
Delphi-Quellcode:
Text_Width := FPanel.Canvas.TextWidth(S)
Wieso noch ein Extra Canvas erzeugen?

Helmi 12. Jun 2007 13:58

Re: TCanvas für TextWidth in Komponente verwenden
 
Zitat:

Zitat von Bernhard Geyer
Wieso noch ein Extra Canvas erzeugen?

Deswegen:
Zitat:

[Fehler] MaskPanelEdit.pas(148): Undefinierter Bezeichner: 'Canvas'
[Edit]
sooo: Nach etwas rumbasteln, hab ich jetzt die Textbreite abhängig von der Schrift:
Delphi-Quellcode:
  //Canvas ereugen
  Canvas           := TCanvas.Create;

  try
    //Handle zuweisen
    Canvas.Handle  := GetWindowDC(FPanel.Handle);

    Canvas.Font    := FPanel.Font;

    Text_Width     := Canvas.TextWidth(FPanel.Caption);
  finally
    FreeAndNil(Canvas);
  end;

Bernhard Geyer 12. Jun 2007 14:03

Re: TCanvas für TextWidth in Komponente verwenden
 
Falsch gelesen :wall:

Robert Marquardt 12. Jun 2007 14:10

Re: TCanvas für TextWidth in Komponente verwenden
 
Vorher den Font Canvas.Font zuweisen, sonst rechnet GetTextWidth falsch.
Das TPanel hat bereits wie erwaehnt einen Canvas. Er ist aber protected und daher nicht direkt zugreifbar. In einer TPanel-Ableitung Canvas einfach public machen.
Die implementierte Version ist zwar nicht falsch, aber heftig ineffizient.

Helmi 12. Jun 2007 14:14

Re: TCanvas für TextWidth in Komponente verwenden
 
Zitat:

Zitat von Robert Marquardt
Vorher den Font Canvas.Font zuweisen, sonst rechnet GetTextWidth falsch.

Mach ich doch... :gruebel: :gruebel:

Helmi 12. Jun 2007 15:47

Re: TCanvas für TextWidth in Komponente verwenden
 
Zitat:

Zitat von Robert Marquardt
Das TPanel hat bereits wie erwaehnt einen Canvas. Er ist aber protected und daher nicht direkt zugreifbar. In einer TPanel-Ableitung Canvas einfach public machen.

Wie macht man das public? *dummfrag*

DeddyH 12. Jun 2007 15:48

Re: TCanvas für TextWidth in Komponente verwenden
 
Delphi-Quellcode:
TMyPanel = class(TPanel)
   ...
  public
    property Canvas;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:50 Uhr.
Seite 1 von 2  1 2      

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