Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 18-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Este es el código, le quite gran cantidad de las lineas pero deje lo que me parece mas relevante.

Este no es propiamente el objeto hay unos objetos que se llaman así
TGenerador,TCarga,TTransformador.... Todos ellos heredan las propiedades de TElemento y le agregan otras como voltajes, corrientes, Potencias y otras que son vectores dinámicos y que los necesito guardar en disco para que el usuario pueda cargar un circuito que haya diseñado.

El programa que estoy haciendo se llama "Simulación de flujos de carga" es para mi trabajo de grado de "Ingenieria eléctrica" y estoy realmente necesitado de la ayuda, gracias por colaborarme

Código:
unit Elemento;

type
  TKeyEvent = procedure (Sender: TObject; var Key: Word; Shift: TShiftState) of object;
  TElemento = class(TGraphicControl)
  private
    { Private declarations }

    //*************************************************
    FMatImage:TPointArray;

    procedure SetMatImage(const Valor:TPointArray); 

    //Arrastrar Imagen
    procedure ElementoClick(Sender:TObject);

  protected
    { Protected declarations }
    procedure Paint; override;

  public
    { Public declarations }
    FormDeDibujo:TComponent; //padre de todos los componentes
    FImage:TImage; //imagen virtual para poder leer su matriz correspondiente
    property MatImage:TPointArray read FMatImage write SetMatImage;
    procedure GetMatImage(Elemento:TImage); //Guardar la matriz de la imagen
    procedure Rotar;

    constructor Create(AOwner: TComponent); override;
    destructor  Destroy;override;

  published
    { Published declarations }
    property PermisoMover:Boolean read FPermisoMover write SetPermisoMover;// default True;

end;

//**********************************************

implementation

{TElemento}

constructor TElemento.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
 
 {Se crea una imagen Virtual
 Para poder llenar la matriz}

 FImage:=TImage.Create(Self);
 FImage.Picture.LoadFromFile('C:\FlujoDePotencia\BMP\Generador.bmp');
 FImage.AutoSize:=True;
 Width:=FImage.Width; //Para hacer un AutoSize manual
 Height:=FImage.Height;
 GetMatImage(FImage);    //  GetMatImage(FImage);
 FImage.Destroy; 
 
 //Propiedades por defecto del elemento
 ControlStyle := ControlStyle + [csReplicatable];
 FLineColor:=clBlack;
 FSeleccionado:=True;
 FPermisoMover:=True;
 FColorSelect:=clRed;
 FDireccion:=0;
 FSizeVectorId:=0;
 //Eventos del elemento
 OnClick:=ElementoClick;
 FormDeDibujo:=AOwner;
end;

procedure TElemento.SetMatImage(const Valor:TPointArray);
var i:Integer;
begin
// if Valor<>FMatImage then
  SetLength(FMatImage,Length(Valor));
  for i:=0 to Length(FMatImage)-1 do
  begin
    FMatImage[i].X:=Valor[i].X;
    FMatImage[i].Y:=Valor[i].Y;
  end;
end;

procedure TElemento.SetDireccion(const valor:Integer);
begin
 if FDireccion<>valor then
  FDireccion:=valor;
end;

procedure TElemento.GetMatImage(Elemento:TImage);
var i,j,k:Integer;
   // var FMatImageTemp:TPointArray;
begin
  k:=0;
  for j:=0 to Elemento.Height-1 do
  begin
    for i:=0 to Elemento.Width-1 do
      begin
        if Elemento.Canvas.Pixels[i,j]=clBlack then
         begin
           k:=k+1;
           SetLength(FMatImage,k);
           FMatImage[k-1].X:=i; //Columna
           FMatImage[k-1].Y:=j; //Fila
         end;
      end;
  end;

  MatImage:=FMatImage;

end;

procedure TElemento.Rotar;
var i,temporal:Integer;
    h,k:Integer;
    Ancho:Integer;
//    FMatImageTemp:TPointArray;
begin

if PermisoMover then

  if Seleccionado=True then
   begin
     //Eje sobre el que va a rotar la imagen
     h:=Round(Width/2);
     k:=Round(Height/2);

     //Cambiamos propiedades de elemento
     Left:=(Left+h) - k;
     Top:= (Top+k) - h;
     Ancho:=Width;
     Width:=Height;
     Height:=Ancho;

     for i:=0 to Length(FMatImage)-1 do
     begin
       temporal:=FMatImage[i].X; //Columna
       FMatImage[i].X:=FMatImage[i].Y; //Columna lleve fila
       FMatImage[i].Y:=(Height-1)-Temporal;
     end;

     MatImage:=FMatImage;

     FDireccion:=FDireccion+90;
     if FDireccion=360 then FDireccion:=0;

     Invalidate;

   end;
end;

procedure TElemento.Paint;
var i,j,k:Integer;
begin
  //Colocar Imagen
  for i:=0 to Length(MatImage)-1 do
   begin
    if FSeleccionado=False then
     Canvas.Pixels[MatImage[i].X,MatImage[i].Y]:=FLineColor
    else
     Canvas.Pixels[MatImage[i].X,MatImage[i].Y]:=FColorSelect;
   end;
end;

//**********************************************************//
// Esta propiedad bloquea la propiedad de arrastrar y rotar*//
//                  de un Elemento                         *//
//**********************************************************//
procedure TElemento.SetPermisoMover(const valor:Boolean);
begin
 if FPermisoMover<>valor then
   FPermisoMover:=valor;
end;
//**********************************************************//

procedure TElemento.ElementoClick(Sender:TObject);
var Edit:TEdit;
begin
//if not ConstruyendoLine then
 DesSeleccionar(Form2);//lo selecciona a él y le quita la seleccion
               //al resto
end;
end.

Última edición por Majo fecha: 18-02-2004 a las 16:50:37.
Responder Con Cita
  #22  
Antiguo 18-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
A simple vista te faltaría el definir la forma para guardar la propiedad MatImage, si es que quieres que se guarde.
¿Por otro ládo, cuál es el código que usas para generar el archivo?
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #23  
Antiguo 18-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Este es el código para guardar y cargar los componentes de una form.

De cualquier manera de tanto ensayar y ensayar, hice el intento de guardar en un archivo un arreglo declarándolo así:

a:File of Array of integer;
y sale el siguiente error
[Error] WindowsDesigner.pas(107): Type 'dynamic array' needs finalization - not allowed in file type

pero cuando lo declaro así
a:File of Array[1..100] of integer;
al compilar no sale error

¿Tiene esto algo que ver con que Los componentes de la form no se guarden completamente?.

Mi gran problema es que realmente necesito en la propiedades arreglos.
!y vaya la contradicción ¡.... cuando declaro la propiedad como un arreglo dinámico no sale error, y cuando declaro la propiedad como un arreglo estático sale el error de que una propiedad no se puede declarar como arreglo


Código:
procedure TForm2.Load;
var
  Stream: TFileStream;
  i:Integer;
begin
   Form3.OpenDialog1.Execute;
   Stream := TFileStream.Create(Form3.OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
  //Borre todo lo que hay en la form de diseño
  LimpiarForm;
  //Lee los componentes del archivo y lo inserta en la form de diseño
  try
    Stream.ReadComponent(Self);
  finally
    Stream.Free;
  end;
end;

procedure TForm2.Save;
var
  Stream: TFileStream;
begin
  Form3.SaveDialog1.Execute;
  Stream := TFileStream.Create(Form3.SaveDialog1.FileName, fmCreate);
  try
    Stream.WriteComponent(Self);
  finally
    Stream.Free;
  end;
end;

procedure TForm2.LimpiarForm;
var i,a:Integer;
begin
   a:=ComponentCount;
   for i:=0 to a-1 do
      Components[ComponentCount-1].Free;  
end;

Última edición por Majo fecha: 18-02-2004 a las 16:49:15.
Responder Con Cita
  #24  
Antiguo 18-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Majo

Por favor utiliza la etiqueta [ code ] (Puedes ver instrucciones para usarla en el enlace de mi firma) y te agradecería que edites por lo menos este último mensaje para darle formato al código. Es muy pesado leer código sin indentar.

// Gracias
Responder Con Cita
  #25  
Antiguo 18-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
En la sección ejemplos de mi página, te he dejado un ejemplo de un componente con una propiedad que es un array dinámico de TPoint.
Si este componente lo registráramos, necesitaríamos crear un editor de propiedades para que el usuario pueda interactuar con el mismo.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #26  
Antiguo 18-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Caray! Hasta pena me da ¡Con negritas y todo!

Vamos a ver, ¿revisaste el código de TStrings como te propuso delphi.com.ar?

Propiedades de tipo arreglo dinámico, aunque sí pueden publicarse como ya nos dijo delphi.com.ar no se guardan en automático porque Delphi no sabe cómo hacerlo y hay que darle su ayudadita usando DefineProperties para decirle a Delphi qué propiedad queremos almacenar y con qué métodos (uno para leer los datos y otro para guardarlos).

Sin embargo pienso que quizá nos estemos complicando demasiado ya que me parece que la mayor parte de los datos que deseas guardar son de tus propias componentes de manera que no es mucha ayuda utilizar el mecanismo integrado de Delphi.

Creo que en tu lugar yo intentaría más por trabajar en la parte de guardarlas tú mismo. Quizá usando Collections como dice delphi.com.ar ya que además piensa que el mecanismo de Delphi no está pensado para muchos datos y quizá no sea muy eficiente. Otra posibilidad sería que usaras una base de datos para almacenar los datos.

// Saludos
Responder Con Cita
  #27  
Antiguo 18-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por roman
Vamos a ver, ¿revisaste el código de TStrings como te propuso delphi.com.ar?
TStringGrid!!

PD: Vean mi mensaje anterior, pues me tomé el trabajo de hacer un ejemplo por favor no lo desperdicien!!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #28  
Antiguo 18-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¡Uy! Disculpe usted.

Me fuí por el lado del reader y writer.

Y sí, ya ví tu ejemplo (lo hice inmediatamente de que pusiste el mensaje anterior pero después de que escribí el último, no me había dado cuenta, sorry!)

// Saludos
Responder Con Cita
  #29  
Antiguo 18-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Entre a Tu pagina pero no encontré la sección de ejemplos. Observé ciertos componentes que habían alli, pero no se cual es.

Si puedes indicarme te lo agradecería....
Responder Con Cita
  #30  
Antiguo 18-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
delphi.com.ar

Hoy no es mi día. Lo que pusiste en tu página es un ejemplo de cómo usar la componente que, supongo, viene en la unidad ArrayDemo. ¿Esa la escribimos nosotros o te olvidaste de ponerla?

// Saludos
Responder Con Cita
  #31  
Antiguo 18-02-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Pero... Ustedes quieren todo resuelto!!!


Ya lo actualicé!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #32  
Antiguo 18-02-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Vamos a ver:

Ayer hice algo así:

Código:
unit Element;

interface

uses
  Windows, Classes;

type
  TPoints = array of TPoint;
  TElement = class(TComponent)
  private
    FPoints: TPoints;
    procedure SetPoints(const Value: TPoints);

    procedure ReadPoints(Reader: TReader);
    procedure WritePoints(Writer: TWriter);

  protected
    procedure DefineProperties(Filer: TFiler); override;

  public
    property Points: TPoints read FPoints write SetPoints;
  end;

procedure Register;

implementation

{ TElement }

procedure TElement.DefineProperties(Filer: TFiler);
begin
  inherited;

  Filer.DefineProperty('Points', ReadPoints, WritePoints, Length(FPoints) > 0);
end;

procedure TElement.ReadPoints(Reader: TReader);
var
  I: Integer;

begin
  Reader.ReadListBegin;
  I := 0;
  while not Reader.EndOfList do
  begin
    SetLength(FPoints, I + 1);
    FPoints[i].X := Reader.ReadInteger;
    FPoints[i].Y := Reader.ReadInteger;
    Inc(I);
  end;
  Reader.ReadListEnd;
end;

procedure TElement.SetPoints(const Value: TPoints);
begin
  FPoints := Copy(Value);
end;

procedure TElement.WritePoints(Writer: TWriter);
var
  I: Integer;

begin
  for I := 0 to Length(FPoints) - 1 do
  begin
    Writer.WriteInteger(FPoints[i].X);
    Writer.WriteInteger(FPoints[i].Y);
  end;
end;

procedure Register;
begin
  RegisterComponents('Samples', [TElement]);
end;

end.
Entonce no estaba tan errado. Claro que es mejor usar como tú un contador de los puntos.

// Saludos
Responder Con Cita
  #33  
Antiguo 18-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Cita:
Empezado por delphi.com.ar
Pero... Ustedes quieren todo resuelto!!!


Ya lo actualicé!
Perdoname .... pero entré al enlace de componetes.... Supuse que alli estaba el ejemplo... ya lo encontré y lo voy a mirar....

Gracias......
Responder Con Cita
  #34  
Antiguo 19-02-2004
Majo Majo is offline
Miembro
 
Registrado: jun 2003
Posts: 43
Poder: 0
Majo Va por buen camino
Entendí perfectamente el ejemplo, lo DefineProperties no lo conocía, y no sabía como utilizarlo. ahora ya arreglé el problema que tenía. Quero darle las gracias A Roman y a Delphi.com.ar por sacarme de este apuro y por su colaboración. !Ni hablar de ClubDelphi ¡ que me ha servido tanto


Suerte y gracias......
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:17:34.


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
Copyright 1996-2007 Club Delphi