unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  LCLTranslator, Classes, SysUtils, FileUtil, Printers, PrintersDlgs, Forms, Controls, Graphics, Dialogs,
  StdCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    FontDialog1: TFontDialog;
    Speichern: TImage;
    Oeffnen: TImage;
    NeuerText: TImage;
    Ende: TImage;
    Drucken: TImage;
    Schriftart: TImage;
    Label1: TLabel;
    Memo1: TMemo;
    OpenDialog1: TOpenDialog;
    PrintDialog1: TPrintDialog;
    SaveDialog1: TSaveDialog;
    Shape1: TShape;
    procedure FormCreate(Sender: TObject);
    procedure SpeichernClick(Sender: TObject);
    procedure OeffnenClick(Sender: TObject);
    procedure NeuerTextClick(Sender: TObject);
    procedure EndeClick(Sender: TObject);
    procedure DruckenClick(Sender: TObject);
    procedure SchriftartClick(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  Schrift: TFont;
  SchriftGroesse: TFont;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.SpeichernClick(Sender: TObject);
begin
  SaveDialog1.Filter := 'Texte|*.txt';
  SaveDialog1.DefaultExt:='txt';
  SaveDialog1.Title:= 'Datei speichern als ...';
  if SaveDialog1.Execute
  then Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetDefaultLang('de');
  NeuerText.Hint:= 'Neuer Text';
  NeuerText.ShowHint:= true;
  Speichern.Hint:= 'Datei speichern';
  Speichern.ShowHint:= true;
  Oeffnen.Hint:= 'Datei öffnen';
  Oeffnen.ShowHint:= true;
  Drucken.Hint:= 'Datei drucken';
  Drucken.ShowHint:= true;
  Schriftart.Hint:= 'Schriftart wählen';
  Schriftart.ShowHint:= true;
  Ende.Hint:= 'Programm beenden';
  Ende.ShowHint:= true;
  Memo1.Font.Size:= 10;

end;

procedure TForm1.OeffnenClick(Sender: TObject);
begin
   OpenDialog1.Filter := 'Texte|*.txt';
   OpenDialog1.Title:= 'Datei öffnen ...';
   if OpenDialog1.Execute
   then Memo1.Lines.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.NeuerTextClick(Sender: TObject);
begin
  Memo1.clear;
end;

procedure TForm1.EndeClick(Sender: TObject);
begin
  SaveDialog1.Filter := 'Texte|*.txt';
  SaveDialog1.DefaultExt:='txt';
  SaveDialog1.Title:= 'Datei speichern als ...';
  if SaveDialog1.Execute
  then Memo1.Lines.SaveToFile(SaveDialog1.FileName);
  Application.Terminate;
end;

procedure TForm1.DruckenClick(Sender: TObject);
var
  Zaehler, LinkerRand, ZeilenAbstand: Integer;
  SchriftInPixel: Double;
begin
  PrintDialog1.Title:= 'Datei drucken ...';
  If PrintDialog1.Execute then
  begin
    // Schrifart aus Memo übernehmen
    Printer.Canvas.Font := FontDialog1.Font;

   // Druck starten
    Printer.BeginDoc;
    // 5 % oberer Rand
    ZeilenAbstand:= Round(Printer.PageHeight * 0.05);
    // 10 % linker Rand
    LinkerRand:= Round(Printer.PageWidth * 0.1);
    // Schriftgröße in Pixel umrechnen
    SchriftInPixel:= Printer.PageHeight/1000 * FontDialog1.Font.Size * 1.33;

    // zeilenweise bis zur letzten Zeile drucken
    for Zaehler:=0 to Memo1.Lines.Count-1 do
    begin
       Printer.Canvas.TextOut(LinkerRand, ZeilenAbstand, Memo1.Lines[Zaehler]);
       // Zeilenabstand entsprechend der Schriftgröße
       ZeilenAbstand:= ZeilenAbstand + Round(SchriftInPixel);
       // Zeilenabstand > Höhe der Seite - 10% -> neue Seite
       if ZeilenAbstand > Printer.PageHeight - Round(Printer.PageHeight * 0.1) then
       begin
         Printer.NewPage;
         ZeilenAbstand:= Round(Printer.PageHeight * 0.1);
       end;
    end;
    // Druck beenden
    Printer.EndDoc;
  end;
end;

procedure TForm1.SchriftartClick(Sender: TObject);
var
  Zaehler: Integer;
begin
    if FontDialog1.Execute then
    begin
       FontDialog1.Title:= 'Schriftart wählen ...';
       // Standard-Font bestimmen
       FontDialog1.Font.Name:= 'Arial';
       Memo1.Font:= FontDialog1.Font;
    end;
end;

end.

