Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Acceso a procedures protected en canvas. (https://www.clubdelphi.com/foros/showthread.php?t=92227)

Karlo Magno 31-08-2017 18:05:08

Acceso a procedures protected en canvas.
 
Hola a todos. Soy nuevo en este foro y también en Delphi. Hace años usé mucho el Turbo Pascal 7, lo dejé. Cuando lo he querido retomar me he encontrado que está totalmente fuera de sitio, si quería aprovechar mi experiencia Pascal tenía que ser en Delphi, concretamente uso Lazarus.
Me he encontrado con que para funciones gráficas se usa canvas pero no he sido capaz de dibujar ni un solo punto, solamente he podido acceder a procedimientos no protegidos (rectangle, ellipse....), el problema es que setpixel es protegido y no veo como acceder a él.

Os pongo un ejemplo de lo que intento. ¿hay un alma caritativa por ahí que me quiera echar una mano?.

Gracias.


Código Delphi [-]
unit Unit1;

{$mode objfpc}{$H+}

interface

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

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure dibuja;
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
  procedure Tform1.dibuja;
  var contador : integer = 0;
    posicionx,posiciony : integer;
    begin
    randomize;
       while contador<5000 do
        begin
         canvas.brush.color:=Random($1000000);
         posicionx:=random(form1.width);
         posiciony:=random(form1.height);
         canvas.setpixel(posicionx,posiciony,canvas.brush.color);
         inc(contador);
         end;
        end;



procedure TForm1.Button1Click(Sender: TObject);
 begin
  dibuja;
 end;

Casimiro Notevi 31-08-2017 18:28:25

Bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración :)


Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

ecfisa 31-08-2017 19:59:36

Hola.

Lo primero que te conviene es convertir al procedimiento "Dibuja" como método de Form1, declarándolo dentro de la clase TForm1:
Código Delphi [-]
...
type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
      procedure Dibuja;   // <-- (1)
  public
    { public declarations }
  end;    
...
Posicionado en (1) presionas Ctrl+Shift+C y Lazarus generará la cabecera del método (esqueleto) de forma automática, luego escribes en él tu código:
Código Delphi [-]
...
implementation

procedure TForm1.Dibuja;
var
  i, PixCol: integer;
  Pto: TPoint;
begin
  Randomize;
  for i := 1 to 2000 do
  begin
    PixCol:= Random($FFFFFF);
    Pto.x := random(Width);
    Pto.y := random(Height);
    Canvas.Pixels[Pto.x, Pto.y] := PixCol;
  end;
end;
...
Fijate que accedes al color de cada píxel del form como un arreglo bidimensional mediante la propiedad Pixels.

Saludos :)

Karlo Magno 01-09-2017 17:01:05

Funciona¡¡¡¡¡
 
A la primera.

Veo que Canvas ofrece "propiedades" que permiten acceder a los procedimientos protegidos de forma fácil, ésto facilita mucho las cosas.

Las demás cosas que introduces son claras e intuitivas pero no acabo de ver claro porque recomiendas que declare el procedimiento "dibuja" dentro de los privados de Form1, de hecho también funciona poniéndolo arriba, en la declaración de procedimientos junto a Button1.

De todas formas el problema de fondo es mi poco manejo de la programación orientada a objetos, aprendí a programar hace mucho tiempo con Pascal 7 de Borland, en este compilador se podía programar también en POO pero no era imprescindible, todo era fácil, ordenado e intuitivo, no veía necesidad de manejar Objetos pero ahora me he encontrado con que en Delphi es prácticamente imprescindible, si no los controlas estás XXXXXXXX.

En fín, habrá que ponerse a ello. ¿Conoces algún buen tutorial, manual o cursillo on line?

Salud y muchas gracias.

ecfisa 01-09-2017 19:39:58

Hola.

Te aconsejé usarlo como método de Form1 por que sólo lo aplicas a él y es buena práctica en OOP. Pero tranquilamente lo podrías declarar como un procedimiento normal, al que le pasas el formulario como parámetro, vgr.:
Código Delphi [-]
procedure DibujaForm(aForm: TForm; const NumPix: Integer);
var
  i, PixCol: integer;
  Pto: TPoint;
begin
  Randomize;
  for i := 1 to NumPix do
  begin
    PixCol := Random($FFFFFF);
    Pto.x  := Random(aForm.Width);
    Pto.y  := Random(aForm.Height);
    aForm.Canvas.Pixels[Pto.x, Pto.y] := PixCol;
  end;
end;     

// Ejemplo de uso:
procedure TForm2.Button1Click(Sender: TObject);
begin
  DibujaForm(Self, 2000);
end;

Un buen libro sobre Delphi y OOP es: La cara oculta de Delphi 4, Aquí, en el FTP de Club Delphi, encontrarás mas material interesante de lectura sobre el tema.

Una pagina de consulta muy útil es: Delphi Basics.

Algunos tutoriales:y encontrarás mas información en los buscadores.

Saludos :)

Karlo Magno 12-09-2017 18:25:18

Muchas gracias. Da gusto preguntar por aquí.


La franja horaria es GMT +2. Ahora son las 19:36:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi