PDA

Ver la Versión Completa : Agregar Nombre de campos en un array de DBText


CottonMouth
02-07-2007, 21:28:08
Hola a todos:p !Como les va? bueno les explico tengo que crear una array de DbText y que a medida que se vallan creando contengan un nombre de campo distinto segun la tabla, como debo hacer?. Hasta ahora esto es lo que hice:


for i:=1 to 6 do
begin
Campo[i]:=TDBText.Create(self);
with Campo[i] do
begin
DataSource:=DataSource1;
Width := 193; // ancho
Height := 21; //alto
Left :=32;//posicion X
Top := i* ConstHeight; //posicion Y
Parent := PanelDatos; //en donde se dibujan los botones
Visible := True; //para que se vean
end;
end;

intente con un if, con un case y la variable i y el datafield asignando le el nombre del campo pero no me funciono porque no me muestra nada obviamente lo estoy haciendo mal.si me pueden ayudar con esto se los agradeseria mucho!! Seguro debe ser una pavada para ustedes pero como soy novata no se me ocurre.Desde ya gracias!! besotes a todos!!

luly:p

CottonMouth
02-07-2007, 21:38:37
Queria agregar donde declare el array para los que estan igual que yo:

public
{ Public declarations }
Edit:array[1..6]of TEdit;
Campo:array[1..6] of TLabel;

Besotes!!:o
luly:p

gabrielkc
02-07-2007, 22:23:43
public
{ Public declarations }
Edit:array[1..6]of TEdit;
Campo:array[1..6] of TLabel;


El TLabel no tiene una propiedad DataSource , deberías cambiar tu declaración del array campo por :
Campo:array[1..6] of TDBText;

Porque además cuando lo creas igualas un TLabel a un TDBText:

Campo[i]:=TDBText.Create(Self);

Y como recomendación de OOP:

NO declares variables en la parte publica de tu forma; declarala en la parte privada, si necesitas que sean accesados desde otra unidad entonces usa propiedades;

gabrielkc
02-07-2007, 22:33:48
En cuando al nombre de los campos puedes usar el procedimiento de los DataSet GetFieldNames();

el cual recibe como parámetro un TStringList;


y en los items del stringlist tendrías los nombres de los campos accesibles con su indice:

Campos[i].Caption:=StringList[i-1];//i-1 porque el indice del primer elemento es 0 y tu manejas un array basado en 1

CottonMouth
03-07-2007, 01:20:26
gabielkc : perdona mi gran ignorancia pero no me quedo claro del todo como usar el procedimiento que me señalaste podrias enseñarmelo y como le paso los datos al stringlist, gracias igual por dedicarme tu tiempo!
Besos. Luly:p

gabrielkc
03-07-2007, 01:28:30
function ObtieneCampo(n:Integer):string;
var Lista:TStringList;
begin
Lista:=TStringList.Create;
Tabla1.GetFieldNames(Lista);
Result:=Lista[n];
Lista.Free;
end;


Ese sería basicamente el procedimiento para obtener el nombre de un campo cualquiera, no se te olvide que tu for inicia en 1 y el índice el TStringList inicia en 0, osea en tu caso lo llamarías mas o menos así:

Campos[i].Caption:=ObtieneCampo(i-1); ///campos quedaría declarada como un array de TLabel;

y la creación sería:

Campos[i]:=TLabel.Create;


Si quieres usar TDBText solo con especificar el campo al que quieres asociarlo es suficiente:

Campos[i].DataField:=Tabla1.Fields[i-1];

CottonMouth
03-07-2007, 02:11:22
Gracias gabrielkc sos un genio!:p
no me salio usando un TDBText me marca el siguiente error:
Incompatible types: String and TField:confused: obviamente se me escapo algo.
Tal vez vos sabes porque.Pero bueno el otro procedimiento anda perfecto y aprendi algo nuevo. Gracias!!! Besotes y gracias por tu tiempo.
luly:p

Lepe
03-07-2007, 09:06:22
¿No puedes usar una rejilla para ese propósito? suele ser más cómodo.

Saludos

CottonMouth
03-07-2007, 18:07:17
Hola Lepe!:) a que te refieres con una rejilla? Podrias explicarme?Gracias por tu tiempo. Besos. Luly:p

gabrielkc
03-07-2007, 18:18:31
Si ya se que la pregunta era para lepe........ pero no es un chat... es un foro:


Una regilla es un DBGrid..... una regilla como la de excel, en la parte superior los titulos de los campos y en el "cuerpo" del la regilla los datos.

En mi caso uso un StringGrid basicamente lo mismo, pero echo a mano

fjcg02
03-07-2007, 22:25:59
Hemos de suponer que en algún momento el dataset de DataSource1 cambia ( o lo cambias ), sino, no podrías utilizar los mismos dbtext para acceder a campos de distintas tablas.
Hemos de suponer, que además todas las tablas tienen 6 campos.

Dicho esto, creo que te falta únicamente asignar el nombre del campo en la creación de los dbtext ( solo la primera vez), y cuando cambia el dataset, cambiar los campos.


for i:=1 to 6 do
begin
// solo creo el dbtext la primera vez
if campo[i] = nil then Campo[i]:=TDBText.Create(self); // añadido
with Campo[i] do
begin
DataSource:=DataSource1;
Field:=Datasource1.Dataset.Field[i]; // añadido el nombre del campo
Width := 193; // ancho
Height := 21; //alto
Left :=32;//posicion X
Top := i* ConstHeight; //posicion Y
Parent := PanelDatos; //en donde se dibujan los botones
Visible := True; //para que se vean
end;
end;

Prueba y ya nos contarás.

Saludos

luisgutierrezb
04-07-2007, 02:26:13
nada mas como complemento para lo que menciona fjcg02, el arreglo de campos empieza en 0 no en 1, solo habra que corregir una linea para que quedara:
Field:=Datasource1.Dataset.Field[i-1];