PDA

Ver la Versión Completa : Ayudita con un codigo


kirios
20-03-2012, 19:40:36
Hola!
tengo este codigo y no tengo idea por que no funciona.

Antes corria perfecto. El programa compila bien, pero no me da el resultado que quiero. Este es el código

procedure Tformbar.preciobar;
var
i,j:integer;
chk: TCheckbox;
TOTAL: real;
begin
TOTAL:=0;
for i:= 0 to ControlCount - 1 do
begin
if controls [i] is tcheckbox then
begin
chk:=controls[i] as Tcheckbox;
if chk.Checked then
begin
for j:= 1 to n do
begin
if upcase(chk.caption) = upcase(copy(B[j],1,pos(';',B[j])-1))
then TOTAL:= TOTAL + strtofloat(Copy(B[j],pos(';',B[j])+1,maxint));
end;
end;
end;
end;

uncontbar.formcontbar.LBPrecioBar.Caption:=floattostr(Total);

end;

Consta basicamente de un formulario con checkbox's, y la idea es que los recorra, que encuetre cuales estan chequeados y compare su caption con una matriz con datos que ya esta cargada. Si encuentra ese nombre en la matriz, copia un dato de esa matriz y la guarda en la variable TOTAL. Al final, esa variable se imprime en un label en otro formulario.
Pero cuando ejecuto, siempre se queda en cero, nunca cambia.

Alguna ayudita por ahi...?

Graciass

ecfisa
20-03-2012, 20:39:55
Hola kirios.

Por favor cuando incluyas código en tus mensaje utiliza TAG's:

http://img403.imageshack.us/img403/3461/75416396.jpg

Con respecto a tu consulta, yo encararia el tema de otro modo; que a mi entender es más simple. Usaría la propiedad Tag de los TCheckBox como índices y en lugar de una matriz usaría un arreglo dinámico.

Un ejemplo como para darte una idea:

var
Valores: array of Double;

(* Cargar valores, asignar Tag *)
procedure TForm1.FormCreate(Sender: TObject);
var
i, c: Integer;
begin
for i:= 1 to 100 do
begin
SetLength(Valores,i+1);
Valores[i]:= i;
end;
c:= 1;
for i:= 0 to ComponentCount-1 do
if Components[i] is TCheckBox then
begin
TCheckBox(Components[i]).Tag:= c;
Inc(c);
end;
end;

(* Devolver total *)
function TForm1.preciobar: Double;
var
i:integer;
begin
Result:= 0;
for i:= 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
if TCheckBox(Components[i]).Checked then
Result:= Result + Valores[TCheckBox(Components[i]).Tag];
end;

(* Llamada *)
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:= FloatToStr(preciobar);
end;

(* Liberar memoria *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
Valores:= nil;
end;


Saludos.

kirios
20-03-2012, 20:47:32
Hola!
Buenisimo, no sabia lo de los tags. Igual te comento que la matriz que tengo se carga al iniciar el programa, desde un archivo de texto externo, donde tengo el nombre y el precio de cada cosa. Entonces, mi idea es comparar los caption de los checkbox's, compararlos con los nombres en la matriz, y sacar el precio desde ahi. El Caption esta tomado de la misma matriz, asique la comparacion no es el problema, son la misma cosa. Pudiste encontrar algun error en el codigo que pase antes?

Gracias!

adfa
20-03-2012, 21:09:47
Hola. Hace mucho que no escribo, pero me parece que no es el lugar correcto del foro para esto.
No veo problemas en tu codigo si antes te andaba y ahora quiza pueda ser la configuración regional con los separadores decimales...

kirios
20-03-2012, 21:14:15
Hola!
No creo que ese sea el problema, pero gracias igual. Me voy a fijar lo del foro, yo tambien hace mucho que no escribo, por aho entre en otro lado.
Gracias!

Casimiro Notevi
20-03-2012, 21:25:44
Hola, además de los tags para el código, recuerda nuestra guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php) y también recuerda poner títulos descriptivos a tus preguntas, sirven para luego hacer búsquedas.
Además no repitas preguntas.
Ya he borrado la otra.
Ya sabemos que llevas poquito tiempo aquí y todavía no estás familiarizado, te aconsejo que leas la guía de estilo (http://www.clubdelphi.com/foros/guiaestilo.php), no te llevará ni tres minutos.
Muchas gracias por tu colaboración.

ecfisa
20-03-2012, 21:26:21
Hola kirios.

Ahora creo que entendí lo que buscas.

A ver... tenés un archivo de texto con el nombre de un objeto y un valor separados por un ';' . Supongamos que se llame Archivo.txt y contenga lo siguiente:

cama;1
mesa;2
silla;3
vaso;4
plato;5
banco;6
cuchillo;7
tenedor;8
cuchara;9
fuente;10


Entonces sería mucho más fácil hacerlo usando TStrings :

var
TS: TStrings;

(* Cargar valores, asignar Tags *)
procedure TForm1.FormCreate(Sender: TObject);
var
i,c: Integer;
begin
TS:= TStringList.Create;
TS.LoadFromFile('C:\Archivo.txt'); // leer datos del archivo
c:=0;
for i:= 0 to ComponentCount-1 do
if Components[i] is TCheckBox then
begin
TCheckBox(Components[i]).Caption:= Copy(TS[c],1,Pos(';',TS[c])-1); // nombre del objeto
TCheckBox(Components[i]).Tag:= c; // índice
Inc(c);
end;
end;

(* Devolver total *)
function TForm1.preciobar: Double;
var
i,c:integer;
s: string;
begin
Result:= 0;
c:=0;
for i:= 0 to ComponentCount - 1 do
if Components[i] is TCheckBox then
if TCheckBox(Components[i]).Checked then
begin
s:= TS[TCheckBox(Components[i]).Tag]; // dato
Result:= Result + StrToFloat(Copy(s,Pos(';',s)+1, MaxInt)); // valor
Inc(c);
end;
end;

(* Llamada *)
procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:= FloatToStr(preciobar);
end;

(* Liberar *)
procedure TForm1.FormDestroy(Sender: TObject);
begin
TS.Free;
end;

Por supuesto tendrás que tener tantos CheckBoxs como datos haya en el archivo...

Saludos.

kirios
20-03-2012, 21:29:32
Hola! Repetí la pregunta porque estaba en la sección equivocada, pensé que tenia que volver a escribirla, no lo hice para molestar. Por favor podes habilitarla? A menos que la primera pregunta que hice se vea desde esta seccion del foro, necesito algunas respuestas para el problema. Voy a leer la guia.

Gracias!

Casimiro Notevi
20-03-2012, 22:13:11
¿No te gusta la respuesta de ecfisa? :):p:D