Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Nombre componente en variable mas problemas (https://www.clubdelphi.com/foros/showthread.php?t=55122)

camino 08-04-2008 20:35:16

Nombre componente en variable mas problemas
 
Hola amigos
Felizmente he podido guardar en tablas las caracteristicas de los RichEdit utilizado "FindControl" y "FindComponent".

En la tabla guarde el nombre de los TRichEdit que los renombre como "Tecla1", "Tecla2" y asi sucesivamente.


Pero cuando quiero cargar los RichEdit con los datos guardados en tabla me da mensaje de error.

Código Delphi [-]procedure TPuntodeVentaForm.Button1Click(Sender: TObject);
var ComponentT : TComponent; VarEdit : string;
begin with datamodule2 do begin IbQuery3.Close; IbQuery3.SQL.Clear; IbQuery3.SQL.Add('Select * from MenuTeclas where Id_Producto <> 0');
IbQuery3.Prepare;
IbQuery3.Open;
if IbQuery3.EOF then Exit; IbQuery3.First; while not IbQuery3.EOF do begin VarEdit := IbQuery3.FieldByName('Id_Tecla').AsString;
componentT := FindComponent(VarEdit) as TRichEdit;
if Assigned( componentT ) then begin with componentT as TRichEdit do begin TRichEdit(componentT).Clear; TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea1').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea2').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea3').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea4').asString);
end;
end else MessageDlg(VarEdit + ' No Asignado', mtwarning,[mbOk],0);
IbQuery3.Next;
end;
IbQuery3.Close;
end;
end;

En un principio tenia la rutina en el Evento OnShow de la Form, pero para experimentar ejecuto la rutina con un Boton colocandole ademas la prueba si esta asignado.

Fracaso.
Si pueden ayudarme por favor haganlo.
Gracias.

eduarcol 08-04-2008 21:00:17

para comenzar, porq no colocas el mensaje de error, estas seguro que en el campo esta guardado correctamente el nombre?, verifica si en verdad encuentra algo

camino 08-04-2008 21:28:32

comprobe con un label
 
Gracias eduarcol, coloque un label que me da exactamente lo que quiero. Comprobe que la variable VarEdit silleva el nombre del componente.


Código Delphi [-]


procedure TPuntodeVentaForm.Button1Click(Sender: TObject);
var
ComponentT : TComponent;
VarEdit : string;
begin
with datamodule2 do
begin
 IbQuery3.Close;
 IbQuery3.SQL.Clear;
 IbQuery3.SQL.Add('Select * from MenuTeclas where Id_Producto <> 0');
 IbQuery3.Prepare;
 IbQuery3.Open;
 if IbQuery3.EOF then
  Exit;
 IbQuery3.First;
 while not IbQuery3.EOF do
 begin
  VarEdit := IbQuery3.FieldByName('Id_Tecla').AsString;
  Label1.Caption := VarEdit; //AQUI EL NOMBRE DEL COMPONENTE
  componentT := FindComponent(VarEdit) as TRichEdit;
  if Assigned( componentT ) then
  begin
   with componentT as TRichEdit do
   begin
  TRichEdit(componentT).Clear;
  TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea1').asString);
  TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea2').asString);
  TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea3').asString);
  TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea4').asString);
   end;
  end
  else
  MessageDlg(VarEdit + ' No Asignado', mtwarning,[mbOk],0);
  IbQuery3.Next;
 end;
 IbQuery3.Close;
end;
end;


Me pregunto, no habra que usar FindControl ademas?
sigo pidiendo ayuda.

santus 08-04-2008 22:19:56

Cita:

Empezado por camino (Mensaje 278396)
Gracias eduarcol, coloque un label que me da exactamente lo que quiero. Comprobe que la variable VarEdit silleva el nombre del componente.



Código Delphi [-]


procedure TPuntodeVentaForm.Button1Click(Sender: TObject);
var
ComponentT : TComponent;
VarEdit : string;
begin
with datamodule2 do
begin
IbQuery3.Close;
IbQuery3.SQL.Clear;
IbQuery3.SQL.Add('Select * from MenuTeclas where Id_Producto <> 0');
IbQuery3.Prepare;
IbQuery3.Open;
if IbQuery3.EOF then
Exit;
IbQuery3.First;
while not IbQuery3.EOF do
begin
VarEdit := IbQuery3.FieldByName('Id_Tecla').AsString;
Label1.Caption := VarEdit; //AQUI EL NOMBRE DEL COMPONENTE
componentT := FindComponent(VarEdit) as TRichEdit;
if Assigned( componentT ) then
begin
with componentT as TRichEdit do
begin
TRichEdit(componentT).Clear;
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea1').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea2').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea3').asString);
TRichEdit(componentT).Lines.Add(IbQuery3.FieldByName('Linea4').asString);
end;
end
else
MessageDlg(VarEdit + ' No Asignado', mtwarning,[mbOk],0);
IbQuery3.Next;
end;
IbQuery3.Close;
end;
end;







Me pregunto, no habra que usar FindControl ademas?
sigo pidiendo ayuda.

Debes decirnos que error te tira porque la verdad que no veo que cosa puede estar mal.
Lo unico mejorable que veo en tu codigo puede ser :

Código:

componentT := FindComponent(VarEdit) as TRichEdit;
antes de asignarlo podrias preguntar algo como si realmente es un trichedit: algo como esto.

Código:

if (findComponet(VarEdit) is TrichEdit )  then Showmessage('Es un trichedit')
else Showmessage('Esto no parece ser un trichedit...');

fijate si esto te sirve.
Saludos.

camino 09-04-2008 01:34:31

Al fin la SOLUCION
 
Cuando capturaba el componente a traves del boton derecho del mouse, era la instruccion FindControl que me colocaba el nombre en una variable.

Pero como bien saben Uds no podia hacer lo contrario.

Pues bien nunca colocar las rutinas en un Form.Activate o en un Form.Show.

Aqui van las rutinas:

Código Delphi [-]

procedure TPuntodeVentaForm.FormActivate(Sender: TObject);
var
LastRow : Integer;
begin
LimpiaGrilla;
with datamodule2 do
begin
 IbQuery3.Close;
 IbQuery3.SQL.Clear;
 IbQuery3.SQL.Add('Select * from MenuTeclas where Id_Producto <> 0');
 IbQuery3.Prepare;
 IbQuery3.Open;
 if IbQuery3.EOF then
  Exit;
 IbQuery3.First;
 LastRow := 0;
 while not IbQuery3.EOF do
 begin
  Inc(LastRow);
  if  LastRow > 1 then
   StringGrid2.RowCount := StringGrid2.RowCount + 1;
  StringGrid2.Cells[0,LastRow] := IbQuery3.FieldByName('Id_Tecla').asString;
  StringGrid2.Cells[1,LastRow] := IbQuery3.FieldByName('Linea1').asString;
  StringGrid2.Cells[2,LastRow] := IbQuery3.FieldByName('Linea2').asString;
  StringGrid2.Cells[3,LastRow] := IbQuery3.FieldByName('Linea3').asString;
  StringGrid2.Cells[4,LastRow] := IbQuery3.FieldByName('Linea4').asString;
  IbQuery3.Next;
 end;
 IbQuery3.Close;
end;
end;



procedure TPuntodeVentaForm.FormShow(Sender: TObject);
var
a : Integer;
RichMemo :TComponent;
Nombre : string;
begin
  MessageDlg('Click para cargar variables',mtInformation, [mbOk],0);
  Button2.Perform(WM_LButtonDown,0,0);
  Sleep(250);
  Button2.Perform(WM_LButtonUp,0,0);
 end;
end;


procedure TPuntodeVentaForm.Button2Click(Sender: TObject);
var
RichMemo :TComponent;
Nombre : string;
a : Integer;
begin
 For a := 1 to StringGrid2.RowCount -1 do
 begin
  Nombre := StringGrid2.Cells[0,a];
  RichMemo := FindComponent(Nombre) as TRichEdit;
  TRichEdit(RichMemo).Clear;
  TRichEdit(RichMemo).Paragraph.Alignment:=TaCenter;
  TRichEdit(RichMemo).Lines.Add(StringGrid2.Cells[1,a]);
  TRichEdit(RichMemo).Lines.Add(StringGrid2.Cells[2,a]);
  TRichEdit(RichMemo).Lines.Add(StringGrid2.Cells[3,a]);
  TRichEdit(RichMemo).Lines.Add(StringGrid2.Cells[4,a]);
 end;
end;

Por favor analizar y corregir si es posible


La franja horaria es GMT +2. Ahora son las 17:44:19.

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