Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - TCanvas und dessen Funktion TextWidth()


Frankieboy - Mo 17.03.08 12:31
Titel: TCanvas und dessen Funktion TextWidth()
Hi,

ich hab ein bisschen Probleme mit TCanvas, mit der Delphi-Hilfe komm ich auch nicht wirklich weiter...

Es geht um eine Funktion, die einen Pfad einkürzt.
In der Funktion will ich die Länge eines Strings bei einer verwendeten Schrift (AFont) feststellen. Dafür benutze ich einen "Test"-Canvas und dessen Funktion TextWidth.
Allerdings bekomme ich immer den Fehler "Drawing not allowed on Canvas"!
Was muss ich machen, damit ich TestCanvas.TextLength(String) auch wirklich aufrufen kann?



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function ShortenPath(const APath: String; AMaxPixelWidth: Integer; APlaceHldr: String; APrefferedSection: TPrefferedSection;
   AFont: TFont): String;
var
  WorkStr: String;
  i,a,AvailPixels: Integer;
  DirParts: TStrings;
  TestCanvas.TCanvas;
begin
  if ACanvas.TextWidth(APath) <= AMaxPixelWidth then
  begin
    Result := APath;
    Exit;
  end;
  DirParts := TStringList.Create;
  TestCanvas := TCanvas.Create;
  TestCanvas.Font := AFont;
  AvailPixels := AMaxPixelWidth-TestCanvas.TextWidth(Copy(APath,1,2))-TestCanvas.TextWidth(APlaceHldr);  { <-- Fehler kommt hier }
  
  {[...]}

  TestCanvas.Free;
end{ ShortenPath }



Vielen Dank schon mal für jede Hilfe!!

Frankie


Moderiert von user profile iconNarses: Topic aus Multimedia / Grafik verschoben am Mo 17.03.2008 um 11:57


Narses - Mo 17.03.08 13:01

Moin!

Warum nimmst du nicht einfach das Canvas des Controls, über das die Ausgabe stattfinden soll. Textlength() verändert ja nix und du sparst dir das dauernde Erzeugen/Freigeben des TestCanvas-Objekts. :idea: :nixweiss:

cu
Narses


Frankieboy - Mo 17.03.08 15:18

Hm,

so weit war ich auch schon... :(
Dumm ist nur:
Wenn ich z.B. den Canvas einer Listbox an die Funktion übergebe, die nur Buchstaben enthält (also keine Bilder/Icons) kommt genauso "Drawing not allowed on Canvas". :roll: Um das ganze wirklich praktikabel zu machen (ich hab schon genug mit Exceptions zu kämpfen), brauch ich einen funktionseigenen Canvas, auf/in dem Textlength(Str) einen Wert zurückgibt. Das dauerne Create und Free kann ich verschmerzen!

CU

Frankie


Hidden - Mo 17.03.08 16:05

user profile iconFrankieboy hat folgendes geschrieben:
Hm,

so weit war ich auch schon... :(
Dumm ist nur:
Wenn ich z.B. den Canvas einer Listbox an die Funktion übergebe, die nur Buchstaben enthält (also keine Bilder/Icons) kommt genauso "Drawing not allowed on Canvas". :roll: Um das ganze wirklich praktikabel zu machen (ich hab schon genug mit Exceptions zu kämpfen), brauch ich einen funktionseigenen Canvas, auf/in dem Textlength(Str) einen Wert zurückgibt. Das dauerne Create und Free kann ich verschmerzen!

CU

Frankie

:?

Wenn sich die Fehlermeldung sonst nicht zurückverfolgen lässt, durchsuch doch mal die Grundunit(meinetwegen mit einem Programm) nach der Stelle, an der die Fehlermeldung generiert wird. Das dürfte Graphics sein und wahrscheinlich irgendwo beim create oder beim textlength des canvas. meines wissens baut die auf Windows auf...

Edit: Bezugsstelle des :? markiert.

mfG,


Frankieboy - Di 18.03.08 15:34

Ich hätte mal in das Beispiel der Delphihilfe für TCanvas.Create gucken sollen 8)

Nachdem man das Canvas mit dem Create constructor erstellt hat, muss man ihm ein Handle zuweisen... (Auch wenns das gar nicht gibt)
Dann geht das Zeichnen...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  TempCanvas: TCanvas;
  notUsed: HWND; 

begin
  tempCanvas := TCanvas.Create;
  tempCanvas.Handle := GetDeviceContext(notUsed);

  [...]
end;


Greetz Frankie