PDA

Ver la Versión Completa : Ayuda con nuevo componente


mosorio
07-07-2003, 11:28:12
Hola foristas!
Comento lo siguiente.
He desarrollado un componente para escribir numeros sin necesidad de colocar formatos decimales ni de miles, automáticamente lo hace, que es el fin de este, solo faltan unos pequeños detalles para finallizarlo tiene hasta un máximo de 18 ó 19 números con 2 decimales, debo terminar de modificarlo para que acepte el númerod e decimales que se desea, tiene la propiedad para asignarlo, pero no lo he controlado hasta el momento sino con 2 decimales, en fin el problema no es ese, solo les comento hasta donde voy, el problema es este.
El componente NO es DBAWARE, y es lo que necesito saber para poder implementarlo. He visto en el código del DBCtrls de donde desciende el TDBEdit (TMaskEdit) y he visto unas cosas que se que no necesito, se que tengo que hacer el componente desde 0 o algo asi, bueno de 0 no debe derivar de alguno que podría se el mismo que he desarrollado pero adicionandole las propiedades de accedo a datos.
Las pruebas que he estado haciendo con el TDBEdit al derivar el componente de éste al insertar el dato o al guardarlo me da un error en la conversión del formato, el separador de decimales es por defecto ',' y al hacer el post o al guardar el dato el mensaje que lanza es algo asi "No es un formato de punto flotante", no recuerdo muy ben pero es referente al formato decimal.

Lo que necesito saber es ya que desciende del TMaskEdti lee el formato de mascara, pero como no le he asihnado una porque todo lo controlo por código.

Espero que me ayuden o me den ideas ya que pienso colocar este componente en la web del club delphi pidiendo primero ell permiso del webmaster si asi lo permite.

Les pido el favor que no me pidan que publique el código son terminarlo, ya que es un reto para mi terminar este componente que me tiene entusiasmado, de hecho ya lo termine como habia icho pero no es dbaware.

Gracias de antemano y saludes a to2
;)

mosorio
13-07-2003, 19:00:18
Hola compañeros,
Tengo un inconveniente con el componente que estoy desarrollando, el principal funciona bien sib problemas depués de haberlo testeado varias veces, el inconveniente lo tengo con el derivado para acceso a datos y es los iguiente, segun lo que aparece en el curso de creación de componenstes de revuelta..
lo que hay que hacer es colocar unos metodos para que funcione lo mínimo, pero a my no me va, el código de lo que he hecho es el siguiente:


unit DBNumFormat;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls, NumFormat,
DB, DBCtrls;

type
TDBNumFormat = class(TNumFormat)
private
FDataLink : TFieldDataLink;
FReadOnly : Boolean;
function GetDataField: String;
procedure SetDataField(const Value : String);
function GetDataSource: TDataSource;
procedure SetDataSource(Value : TDataSource);
function GetReadOnly: Boolean;
procedure SetReadOnly(Value: Boolean);
procedure EditingChange(Sender: TObject);
protected
procedure UpdateData(Sender: TObject);
procedure DataChange(Sender : TObject);
procedure Notification(AComponent : TComponent; Operation : TOperation); override;
procedure CMExit(var Message: TWMNoParams); message CM_EXIT;
procedure Change;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
published
property DataField: string read GetDataField write SetDataField;
property DataSource: TDataSource read GetDataSource write SetDataSource;
property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Argades-[DA]', [TDBNumFormat]);
end;

{ TDBNumFormat }

function TDBNumFormat.GetDataField: String;
begin
Result := FDataLink.FieldName;
end;

procedure TDBNumFormat.SetDataField(const Value: String);
begin
FDataLink.FieldName := Value;
end;

function TDBNumFormat.GetDataSource: TDataSource;
begin
Result := FDataLink.DataSource;
end;

procedure TDBNumFormat.SetDataSource(Value: TDataSource);
begin
if FDataLink.DataSource <> Value then
begin
FDataLink.DataSource := Value;
if Value <> Nil then
Value.FreeNotification(Self);
end;
end;

function TDBNumFormat.GetReadOnly: Boolean;
begin
Result := FDataLink.ReadOnly;
end;

procedure TDBNumFormat.SetReadOnly(Value: Boolean);
begin
FDataLink.ReadOnly := Value;
end;

procedure TDBNumFormat.Notification(AComponent: TComponent;
Operation: TOperation);
begin
Inherited Notification(AComponent, Operation);
if (Operation = opRemove) And (FDataLink <> Nil) And
(AComponent = DataSource) then
DataSource := Nil;
end;

constructor TDBNumFormat.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := ControlStyle - [csReplicatable];
FReadOnly := False;
FDataLink := TFieldDataLink.Create;
FDataLink.OnDataChange := DataChange;
FDataLink.OnUpdateData := UpdateData;
FDataLink.OnEditingChange := EditingChange;
FDataLink.Control := Self;
end;

destructor TDBNumFormat.Destroy;
begin
FDataLink.Free;
FDataLink := Nil;
inherited Destroy;
end;

procedure TDBNumFormat.DataChange(Sender: TObject);
begin
if FDataLink.Field <> Nil then
Text := FDataLink.Field.Text
else
Text := Name
end;

procedure TDBNumFormat.UpdateData(Sender: TObject);
begin
FDataLink.Field.Text := Text;
end;

procedure TDBNumFormat.EditingChange(Sender: TObject);
begin
FReadOnly := Not FDataLink.Editing;
end;

procedure TDBNumFormat.CMExit(var Message: TWMNoParams);
begin
try
FDataLink.UpdateRecord;
except
SetFocus;
raise;
end;
inherited;
end;

procedure TDBNumFormat.Change;
begin
inherited Changed;
FDataLink.Modified;
end;

end.


Obviamente que haciendo las respecitas declaraciones donde se indica, el problema es que NO me refleja el cambio en el campo de la tabla, que sucede, no lo se, espero alguien me ayude a solucionarlo, tengo el proyecto bloqueado a falta del componente.
El componente original lo que hace es escribir el número comenzando por los decimales como en una caja registradora, sin necesidad de escibir el decimal ni los separadores de miles, esto se asigna en las propiedades, pero el de acceso a datos no me funciona como ya he dicho.

Espero su ayuda de antemano.
El link de la información es: http://personal.redestb.es/revueltaroche/ccu12.htm
http://www.marteens.com/trick29.htm
:mad: :confused:

andres1569
14-07-2003, 13:33:09
Hola:

Prueba a cambiar el código del método Change, no digo que con esto funcione, pero es para hacerlo como está en el TDBEdit:
procedure TDBNumFormat.Change;
begin
FDataLink.Modified;
inherited Change; // en vez de Changed
end;