Autor Beitrag
Frankieboy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: Mo 17.03.08 12:31 
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?


ausblenden 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


Zuletzt bearbeitet von Frankieboy am Di 18.03.08 15:06, insgesamt 1-mal bearbeitet
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10184
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Frankieboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: 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,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Di 18.03.08 16:33, insgesamt 1-mal bearbeitet
Frankieboy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65



BeitragVerfasst: 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...

ausblenden 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