[Delphi] Canvas does not allow drawing

Pagina: 1
Acties:
  • 541 views sinds 30-01-2008
  • Reageer

  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
Ik zit met een probleem, ik ben bezig met een programma waarin ik een stuk tekst wil af drukken. Omdat ik ook gebruik wil maken van een print preview wil ik een tijdelijk canvas gebruiken. De inhoud van dit canvas wil ik vervolgens copieren naar de printer of de TImage.Canvas. Maar dat is het probleem (nog) niet.

Ik heb (ongeveer) het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure Preview;
Var cTemp : TCanvas;
Begin
   cTemp := Maakafdruk;
   //Copy C naar Image.Canvas
   cTemp.Free;
end;

Function Maakafdruk : Tcanvas;
 
Begin
   Result := TCanvas.Create;
   //Hieronder tekenen op canvas B.V.:
   Result.TextOut(x,y, 'Hoi'); // x en y hebben al een waarde!!
End;

Bij het compilen gaat alles nog goed, maar als ik het programma run krijg ik een exception bij Result.TextOut(x,y,'Hoi');
'Canvas does not allow drawing'... :(

Wat gaat er fout, en waarom gaat het fout?

In times of war the law falls silent


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-08 22:41

Creepy

Tactical Espionage Splatterer

In de Delphi help staat een voorbeeld van TCanvas.create. Hierin wordt ook nog een canvas.handle toegekent. Kijk eens of dat helpt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MerijnB
  • Registratie: Oktober 2000
  • Laatst online: 08:06
een canvas opzich is niet echt wat

je kan beter op een TBitmap tekenen en daar het canvas van naar de printer sturen

A software developer is someone who looks both left and right when crossing a one-way street.

Dé antenne-innovatie voor de korte golf


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
MerijnB schreef op 11 December 2002 @ 08:48:
een canvas opzich is niet echt wat

je kan beter op een TBitmap tekenen en daar het canvas van naar de printer sturen
Een TBitmap dus... zal ff wat proberen.

In times of war the law falls silent


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
Dat van die Handle heb ik ook even geprobeerd, maar levert niet zo veel op... :'(

Ik ben dus verder aan het borduren op tBitmap, de preview gaat goed (behalve dat het formaat niet helemaal juist is, maar daar kijk ik nog wel naar), Maar bij afdrukken krijg ik de melding:
Not enough storage is available to process this command
Dit komt doordat ik de de Bitmap net zo hoog en breed maak als het printerpapier:
code:
1
2
3
4
5
6
7
8
9
10
   if Print then
   Begin
      Result.Height:=Printer.PageHeight;
      Result.Width:= Printer.PageWidth;
   end
   Else
   Begin
      Result.Height:=Image.Height;
      Result.Width:=Image.Width;
   End;

Als ik in plaats van een TBitmap een TImage gebruik Gaat het hier nog wel goed, maar krijg ik de zelfde melding bij:
code:
1
Result.Canvas.TextOut(x,y, sTemp);

In times of war the law falls silent


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 25-08 14:38

OZ-Gump

terug van weggeweest

Heb je al eens geprobeerd om de bitmap net zo groot te maken als het BEDRUKBARE GEDEELTE van 't papier? Enne... mag ik vragen waarom je met die Canvassen gaat zitten rommelen en niet 'gewoon' iets met een rapportje doet? QuickReport (standaard in Delphi) doet wat dat betreft zijn werk best goed hoor...

My personal website


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-08 22:41

Creepy

Tactical Espionage Splatterer

Om rechtsteeks op een canvas te kunnen tekenen, MOET het canvas een bitmap bevatten. Dit geld ook voor een TImage.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
OZ-Gump schreef op 11 december 2002 @ 10:01:
Heb je al eens geprobeerd om de bitmap net zo groot te maken als het BEDRUKBARE GEDEELTE van 't papier? Enne... mag ik vragen waarom je met die Canvassen gaat zitten rommelen en niet 'gewoon' iets met een rapportje doet? QuickReport (standaard in Delphi) doet wat dat betreft zijn werk best goed hoor...
Een qReport is momenteel niet zo bruikbaar omdat het niet om een rapport gaat maar om een stukje reclame text wat uit een appart opmaak bestandje gelezen moet worden. Dit wordt vervolgens in een lege ruimte geprint op een blad wat tegelijk ook geprint wordt ;)

Beetje wazig, maar als qreport mogelijk was zou ik die echt wel gebruiken... :)

En de bedrukbare ruimte van het papier moet ik ook nog uitzoeken, maar dat speelt nog niet. Ik ben immers aan het tekenen op een canvas wat gewoon een bepaalde grote heeft...
Creepy schreef op 11 december 2002 @ 10:26:
Om rechtsteeks op een canvas te kunnen tekenen, MOET het canvas een bitmap bevatten. Dit geld ook voor een TImage.
Euh... wat? TCanvas is een property van TBitmap (of TImage) En moet tcanvas dan nog weer een bitmap bevatten???

ik vat het niet helemaal...

In times of war the law falls silent


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Een losse TCanvas is niet bruikbaar omdat het niets is. Pas als het verbonden is aan een bijvoorbeeld een TBitmap of een TControl en een Handle heeft kan er op getekend worden. De eigenschappen van de canvas hangen sterk samen met het device waar het meer verbonden is. Zoals bijvoorbeeld een scherm, printer of bmp.

Waarom een raport bij jouw niet zo werken is mij niet helemaal duidelijk. Een rapport is niets anders dan een leeg blad. Wat jij er wel of niet op wilt zetten is jouw zaak. Er hoeft niet altijd tekst op te staan of verbonden zijn met een data source.

We adore chaos because we like to restore order - M.C. Escher


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
LordLarry schreef op 11 December 2002 @ 10:46:
Een losse TCanvas is niet bruikbaar omdat het niets is.
Tot hier snap ik het nog ongeveer :)
Pas als het verbonden is aan een bijvoorbeeld een TBitmap of een TControl en een Handle heeft kan er op getekend worden. De eigenschappen van de canvas hangen sterk samen met het device waar het meer verbonden is. Zoals bijvoorbeeld een scherm, printer of bmp.
En die 'handle' hoe verkrijg ik die? Ik de help staat dit:
code:
1
2
with Source as TControl do
      tempCanvas.Handle := GetDeviceContext(notUsed);

Na hier nog wat mee gekloot te hebben krijg ik wel iets... op me image wordt nu een afbeelding van mijn form weer gegeven... is niet echt de bedoeling :D
Waarom een raport bij jouw niet zo werken is mij niet helemaal duidelijk. Een rapport is niets anders dan een leeg blad. Wat jij er wel of niet op wilt zetten is jouw zaak. Er hoeft niet altijd tekst op te staan of verbonden zijn met een data source.
ik wil niet met een rapport doen... ;)

In times of war the law falls silent


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Skimmer schreef op 11 december 2002 @ 11:24:
En die 'handle' hoe verkrijg ik die? Ik de help staat dit:
code:
1
2
with Source as TControl do
      tempCanvas.Handle := GetDeviceContext(notUsed);

Na hier nog wat mee gekloot te hebben krijg ik wel iets... op me image wordt nu een afbeelding van mijn form weer gegeven... is niet echt de bedoeling :D
[...]
ik wil niet met een rapport doen...
Dan moet je niet je form als device nemen voor je canvas. Neem nou gewoon een TBitmap en ga daar lekker op tekenen. Je weet het zo te lezen toch allemaal beter wat je wilt en wilt geen advies over printen en printpreviews.

We adore chaos because we like to restore order - M.C. Escher


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
LordLarry schreef op 11 December 2002 @ 12:04:
[...]


Dan moet je niet je form als device nemen voor je canvas. Neem nou gewoon een TBitmap en ga daar lekker op tekenen. Je weet het zo te lezen toch allemaal beter wat je wilt en wilt geen advies over printen en printpreviews.
Dan moet je beter lezen.

Ik ben juist bezig om iets leren over het werken met canvas. Dan heb ik niet zo veel aan goed bedoeld advies om voor qreports te kiezen. En of deze dingen in mijn situatie nou wel of niet bruikbaar zijn is niet de isue.

Momenteel doe ik dit voor de handle:
code:
1
2
3
4
5
6
7
Var notUsed: Hwnd;
Begin
Source:=FindComponent('Image');
With Source As Tcontrol do
   Result.Handle := GetDeviceContext(notused);
   //Bla
End;

Zoals je kan zien is dit groten deels overgenomen uit de Help. Zoals ik eerder al noemde krijg ik op deze manier als ik de inhoud van het canvas kopieer naar mijn Image.canvas een deel van het form te zien. Bij printen komt er enkel een wit blad uit.

In times of war the law falls silent


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 27-08 22:41

Creepy

Tactical Espionage Splatterer

Misschien moet je zelf eens beter lezen (en zoeken)!
Uit de Delphi help
Note: Delphi canvases use device-dependent bitmaps to implement the Draw, StretchDraw, or CopyRect methods. Because of this, you can’t use these methods with most printers. Instead, to create graphic images on the printer’s canvas, create a device-independent bitmap and draw it directly to the canvas’s Handle property.
Er is dus een verschil tussen het canvas van een form of image en het canvas van een printer.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Skimmer
  • Registratie: Augustus 2001
  • Laatst online: 02-01 11:03

Skimmer

Inter Arma Enim Silent Leges

Topicstarter
Creepy schreef op 11 december 2002 @ 12:38:
Misschien moet je zelf eens beter lezen (en zoeken)!

[...]

Er is dus een verschil tussen het canvas van een form of image en het canvas van een printer.
Noem me maar dom, maar ik snap het nog steeds niet... :X (UTS)

Maar ik ga wel verder zoeken met de antwoorden die hier staan.

In times of war the law falls silent


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Kijk je moet het zo zien. Een canvas is een ondergrond waarop je gaat schilderen. Je kan schilderen op een muur, of een stuk hout of papier of linnen. Het blijft een canvas, maar er zijn verschillende canvassen met verschillende eigenschappen. Zo heeft een printer device andere eigenschappen dan een scherm dan een bitmap. Zoals kleuren, dpi, afmetingen enz...Welke jij wilt hebben hangt dus van je wensen af. Als je gewoon even wilt tekenen en het op het scherm laten zien kan je het makkelijkste de canvas van een TImage nemen. Deze toont het ook meteen op het scherm namelijk.

We adore chaos because we like to restore order - M.C. Escher

Pagina: 1