FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Hola amigos,
Ya descubrí porque no guarda ciertas propiedades del objeto, Resulta que cuando el objeto se está cargando de un archivo del disco duro, inmediatamente se ejecuta el metodo Create de dicho objeto, y es allí donde yo asigno ciertas propiedades por defecto, lo que quiere decir que así se hayan guardado éstas propiedades, igual se van a sobreescribir con los valores por defecto. Y no solo se ejecuta el método create, también se ejecuta los procedimientos de escritura de las propiedades. Si alguien puede sacarme del apuro se lo agradecería enormemente, que hago para que esto no suceda? Gracias... |
#2
|
||||
|
||||
Cuando se crea el componente, en el cosntructor se cargan las porpiedades por defecto, pero inmediatamente despues, se tienen que asignar los valores que tenías guardados en el archivo.
¿Porqué no nos muestras el código que estas utilizando?
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
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. |
#5
|
||||
|
||||
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. // Saludos |
#6
|
|||
|
|||
Cita:
Gracias...... |
#7
|
|||
|
|||
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...... |
#8
|
||||
|
||||
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. |
#9
|
|||
|
|||
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. |
#10
|
||||
|
||||
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 |
#11
|
||||
|
||||
¡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 |
#12
|
||||
|
||||
Cita:
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. |
|
|
|