RAD Studio VCL Reference
|
Writes a string on the canvas, starting at the point (X,Y), and then updates the PenPos to the end of the string.
procedure TextOut(X: Integer; Y: Integer; const Text: string);
__fastcall TextOut(int X, int Y, const AnsiString Text);
Use TextOut to write a string onto the canvas. The string will be written using the current value of Font. Use the TextExtent method to determine the space occupied by the text in the image. To write only the text that fits within a clipping rectangle, use TextRect instead.
After a call to TextOut, the PenPos property indicates the point at the top right of the text on the canvas.
C++ Examples:
/* Add a THeaderControl to the form and call HeaderControl1DrawSection for the OnDrawSection event. */ void __fastcall TForm1::HeaderControl1DrawSection(THeaderControl *HeaderControl, THeaderSection *Section, const TRect &Rect, bool Pressed) { if (Pressed) HeaderControl->Canvas->Font->Color = clRed; else HeaderControl->Canvas->Font->Color = clBlue; HeaderControl->Canvas->TextOut(Rect.Left + HeaderControl->Canvas->Font->Size, Rect.Top + 2, "Custom " + IntToStr(Section->Index)); } void __fastcall TForm1::FormCreate(TObject *Sender) { THeaderSection *Section; for (int i = 0; i <= 4; i++) { Section = HeaderControl1->Sections->Add(); Section->Text = "Section " + IntToStr(i); Section->MinWidth = (Section->Text).Length() * HeaderControl1->Font->Size; // Owner draw every other section if (i % 2 == 0) Section->Style = hsOwnerDraw; else Section->Style = hsText; } }
/* The following code aborts a print job if the user presses Esc. Note that you should set KeyPreview to true to ensure that the OnKeyDown event handler of Form1 is called. */ #include <Printers.hpp> void __fastcall TForm1::FormCreate(TObject *Sender) { KeyPreview = True; } void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Key == VK_ESCAPE && Printer()->Printing) { Printer()->Abort(); MessageDlg("Printing aborted", mtInformation, TMsgDlgButtons() << mbOK,0); } } void __fastcall TForm1::Button1Click(TObject *Sender) { TMemo *Memo1 = new TMemo(Form1); // The parent (Form1) will clean up this object. Memo1->Parent = Form1; Memo1->Visible = True; Memo1->Width = 700; if (OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); Printer()->BeginDoc(); int X = 200; int Y = 200; for (int I = 0; I <= 10; I++) if (!Printer()->Aborted) { Printer()->Canvas->TextOut(X, Y, Memo1->Lines->Strings[I]); Y = Y + 80; if (Y > (Printer()->PageHeight - 300)) { Y = 200; Printer()->NewPage(); Sleep(1000); // to give you time to abort! } } if (!Printer()->Aborted) Printer()->EndDoc(); } }
/* The following code adds an object to MyList if it isn’t already in the list. */ #include <memory> //for STL auto_ptr class typedef struct AList { int I; char C; } TAList; typedef AList* PAList; TList *MyList; PAList ARecord1, ARecord2; void __fastcall DisplayTList(TList *theList) { PAList AStruct; // Go through the list, writing the elements to the // canvas of a paintbox component. int Y = 10; // position on canvas for (int i = 0; i < theList->Count; i++) { AStruct = (PAList) theList->Items[i]; Form1->PaintBox1->Canvas->TextOut(10, Y, IntToStr(AStruct->I)); Y += 30; // Increment Y Value again Form1->PaintBox1->Canvas->TextOut(10, Y, AStruct->C); Y += 30; //Increment Y Value } } void __fastcall TForm1::Button1Click(TObject *Sender) { if (MyList->IndexOf(ARecord1) == -1) MyList->Add(ARecord1); DisplayTList(MyList); } void __fastcall TForm1::Button2Click(TObject *Sender) { if (MyList->IndexOf(ARecord2) == -1) MyList->Add(ARecord2); DisplayTList(MyList); } void __fastcall TForm1::Button3Click(TObject *Sender) { if (MyList->Count != 0) { for (int B = MyList->Count - 1; B >= 0; B--) { PAList ARecord; ARecord = PAList(MyList->Items[B]); MyList->Remove(ARecord); } } Form1->PaintBox1->Repaint(); } void __fastcall TForm1::FormCreate(TObject *Sender) { static std::auto_ptr<TList> _MyListCleaner(MyList = new TList); static std::auto_ptr<TAList> _ARecord1Cleaner(ARecord1 = new TAList); ARecord1->I = 100; ARecord1->C = 'Z'; static std::auto_ptr<TAList> _ARecord2Cleaner(ARecord2 = new TAList); ARecord2->I = 200; ARecord2->C = 'X'; }
Delphi Examples:
{ Add a THeaderControl to the form and call HeaderControl1DrawSection for the OnDrawSection event. } procedure TForm1.FormCreate(Sender: TObject); var HeaderSection: THeaderSection; I: Integer; begin for I := 0 to 4 do begin HeaderSection := HeaderControl1.Sections.Add; HeaderSection.Text := 'Text Section ' + IntToStr(I); HeaderSection.MinWidth := length(HeaderSection.Text) * Font.Size; // Owner draw every other section if (I mod 2 = 0) then HeaderSection.Style := hsOwnerDraw else HeaderSection.Style := hsText; end; end; procedure TForm1.HeaderControl1DrawSection(HeaderControl: THeaderControl; Section: THeaderSection; const Rect: TRect; Pressed: Boolean); begin with HeaderControl.Canvas do begin // highlight pressed sections if Pressed then Font.Color := clRed else Font.Color := clBlue; TextOut(Rect.Left + Font.Size, Rect.Top + 2, 'Owner Drawn text'); end; end;
{ The following code aborts a print job if the user presses Esc. Note that you should set KeyPreview to true to ensure that the OnKeyDown event handler of Form1 is called. } uses Printers; procedure TForm1.Button1Click(Sender: TObject); var I, X, Y: Integer; Memo1 : TMemo; r: TRect; begin Memo1 := TMemo.Create(Form1); Memo1.Parent := Form1; Memo1.Visible := True; Memo1.Width := 700; if (OpenDialog1.Execute) then begin Memo1.Lines.LoadFromFile(OpenDialog1.FileName); Printer.BeginDoc; X := 200; Y := 200; for I := 0 to 140 do if (not Printer.Aborted) then begin Printer.Canvas.TextOut(X, Y, Memo1.Lines[I]); Y := Y + 80; if (Y > (Printer.PageHeight - 300)) then begin Y := 200; Printer.NewPage; Sleep(1000); // to give you time to abort! end; end; if (not Printer.Aborted) then Printer.EndDoc; end; end; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview := True; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key=VK_ESCAPE) and Printer.Printing then begin Printer.Abort; MessageDlg('Printing aborted', mtInformation, [mbOK],0); end; end;
{ The following code adds an object to MyList if it isn’t already in the list. } type PMyList = ^AList; AList = record I: Integer; C: Char; end; var Form1: TForm1; MyList: TList; ARecord1, ARecord2: PMyList; implementation {$R *.dfm} procedure DisplayTList(TheList: TList); var ARecord: PMyList; B: Byte; Y: Word; begin { Now paint the items onto the paintbox} Y := 10; {Variable used in TextOut function} for B := 0 to (TheList.Count - 1) do begin ARecord := TheList.Items[B]; Form1.PaintBox1.Canvas.TextOut(10, Y, IntToStr(ARecord^.I)); {Display I} Y := Y + 30; {Increment Y Value again} Form1.PaintBox1.Canvas.TextOut(10, Y, ARecord^.C); {Display C} Y := Y + 30; {Increment Y Value} end; end; procedure TForm1.Button1Click(Sender: TObject); begin if (MyList.IndexOf(ARecord1) = -1) then MyList.Add(ARecord1); DisplayTList(MyList); end; procedure TForm1.Button2Click(Sender: TObject); begin if (MyList.IndexOf(ARecord2) = -1) then MyList.Add(ARecord2); DisplayTList(MyList); end; procedure TForm1.Button3Click(Sender: TObject); var ARecord: PMyList; B: Integer; begin if (MyList.Count <> 0) then begin for B := (MyList.Count - 1) downto 0 do begin ARecord := MyList.Items[B]; MyList.Remove(ARecord); end; end; Form1.PaintBox1.Repaint; end; procedure TForm1.FormCreate(Sender: TObject); begin MyList := TList.Create; New(ARecord1); ARecord1^.I := 100; ARecord1^.C := 'Z'; New(ARecord2); ARecord2^.I := 200; ARecord2^.C := 'X'; end; procedure TForm1.FormDestroy(Sender: TObject); begin Dispose(ARecord1); Dispose(ARecord2); MyList.Free; end;
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
|
What do you think about this topic? Send feedback!
|