[fpc-pascal] gtk+ linux-windows

Graeme Geldenhuys graemeg at opensoft.homeip.net
Wed Jun 24 16:01:30 CEST 2009


kota kota wrote:
> ok here is an example,
> (look the red letters)

OK, I see what you mean... I improved the performance very slightly by
reducing the two for loops to a single one. I also updated the uses
clause to the latest revision of fpGUI Toolkit. I also removed all the
unnecessary .BeginDraw and .EndDraw calls. The whole HandlePaint method
that you override is alread wrapped in a begindraw..enddraw call for
double buffering support.

Unfortunately I am not sure how to show the image while it is being
generated. How is this done in Delphi VCL or Lazarus LCL?

Also, fpGUI Toolkit doesn't support painting to a Image via Canvas
calls. This is planned for later this year, when I implement support for
the Free Pascal fpimage and fpcanvas units (part of Free Pascal's FCL
packages).

PS:
I highly recommend you rather use the Source Code directly from the git
repository, and not the last released version. The v0.6 is rather old.
See the following url for more details:
  http://opensoft.homeip.net/fpgui/index.html#Sourcecode


======================================
program drawtest;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,
  fpg_main,
  fpg_base,
  fpg_form,
  Math,
  crt,
  fpg_imgfmt_bmp;

type

  TMainForm = class(TfpgForm)
  private
    R: real;
    n: integer;
    procedure PreCalculations;
    procedure GenerateImage;
  protected
    procedure HandlePaint; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

const
  m = 10000;
  l1 = 1;
  l2 = 2;

var
  results: array [1..m] of integer;
  intS:    array[1..m, 1..2] of integer;
  i:   longint;
  x2, y2: integer;

  function logos(c, b: integer): integer;
  begin
    Result := (1 * c + 1 * b) div 2;
  end;

  { TMainForm }

  constructor TMainForm.Create(AOwner: TComponent);
  begin
    inherited Create(AOwner);
    WindowTitle := 'Ελληνικά γράμματα ';
    SetPosition(10, 10, 1024, 768);
    Sizeable := False;

    PreCalculations;
  end;


procedure MainProc;
var
  frm: TMainForm;
begin
  fpgApplication.Initialize;
  frm := TMainForm.Create(nil);
  try
    frm.Show;
    fpgApplication.Run;
  finally
    frm.Free;
  end;
end;

  procedure TMainForm.PreCalculations;
  begin
    n  := 3;
    R  := intpower(380, n);
  end;

  procedure TMainForm.GenerateImage;
  begin

  end;

  procedure TMainForm.HandlePaint;
  var
    x, y, u: real;
    k: integer;
  begin
//    inherited HandlePaint;
    { We are doing all the painting, so no need to call inherited }
    Canvas.Clear(clWhite);

    k := 0;
    u := pi / 2;
    for i := 1 to n do
    begin
      x := power(R, (1 / n)) * cos(((2 * k * pi + u) / n)) + 512;
      y := power(R, (1 / n)) * sin(((2 * k * pi + u) / n)) + 384;
      ints[i, 1] := trunc(x);
      ints[i, 2] := trunc(y);
      k := k + 1;

    end;{For-loop}
    Canvas.SetColor(clBlack);
    Canvas.DrawLine(intS[1, 1], intS[1, 2], intS[n, 1], intS[n, 2]);
    for i := 2 to n do
      Canvas.DrawLine(intS[i - 1, 1], intS[i - 1, 2], ints[i, 1],
intS[i, 2]);

    { if m is very big (e.g 1000000) the user gets a black screen until
      all the points are drawn }
    X2 := 500;
    y2 := 500;
    for i := 1 to m do
    begin
      results[i] := random(n) + 1;
      x2 := logos(x2, intS[results[i], 1]);
      y2 := logos(y2, intS[results[i], 2]);
      Canvas.Pixels[x2, y2] := clBlack;
    end;{For-loop}

  end;

begin
  Randomize;
  MainProc;
end.

======================================



Regards,
  - Graeme -

_______________________________________________________
fpGUI - a cross-platform GUI toolkit using Free Pascal
http://opensoft.homeip.net/fpgui/




More information about the fpc-pascal mailing list