Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayudita con un codigo (https://www.clubdelphi.com/foros/showthread.php?t=78104)

kirios 20-03-2012 19:40:36

Ayudita con un codigo
 
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:



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:
Código Delphi [-]
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 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, 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:
Código:

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 :
Código Delphi [-]
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


La franja horaria es GMT +2. Ahora son las 15:37:22.

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