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);
TestCanvas.Free; end; |
Vielen Dank schon mal für jede Hilfe!!
Frankie
Moderiert von
Narses: 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
Frankieboy 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!