unit FFAMILIA;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, ExtCtrls, StdCtrls,tiposdefinidos,DBCLIENT,STRUTILS,
  DB, DBCtrls;

type
  TFAMILIA = class(TForm)
    Image1: TImage;
    procedure FormClick(Sender: TObject);
    procedure Panel2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure HACERClick(Sender: TObject);
  private
    { Private declarations }
    ELEMENTO:INTEGER;
    BTNAUX:TSPEEDBUTTON;
    FUNCTION CREARARTICULO(COD,PROF:STRING;APOSICION,APOSICIONUSO,ADESCRIPCION:STRING):BOOLEAN;
    FUNCTION NUMERODEFAMILIAS:SMALLINT;
    FUNCTION CAMBIAR(AUX:STRING):STRING;

  public
    { Public declarations }
    ANCHO,NUMEROXFILA,FILAS:INTEGER;
    NBOTON,NFILA,TOTALBOTONES:INTEGER;
    FUNCTION ENCONTRARFORM(NOMBRE:STRING):BOOLEAN;
    procedure crearfamilia(profundidad:integer;formulario:tform;dataset:tclientdataset);
    PROCEDURE DIBUJARBOTON(DESCRIPCION,COD_FAMILIA,PROFUNDIDAD:STRING;BIMAGEN,BDESCRIPCION:BOOLEAN);
    PROCEDURE DIBUJARBOTONSALIDA;
    PROCEDURE LOCALIZARPADRE(PADRE,PROFUNDIDAD:STRING);
    PROCEDURE LOCALIZARHIJO(PADRE,PROFUNDIDAD:STRING);
    procedure raiz(profundidad:integer);
    FUNCTION TIENEHIJOS(COD,PROF,APOSICION,APOSICIONUSO,ADESCRIPCION:STRING):BOOLEAN;
    PROCEDURE INSERTARFORMYARTICULO(LCOD_FAMILIA,PADRE:STRING;LPROFUNDIDAD,PADREPROFUNDIDAD:INTEGER);
  end;

var
  FAMILIA: TFAMILIA;
Implementation

uses UDMGS, FMUESTRA, FSUBFAMILIA, FESPERA, menu, FTICKET;

{$R *.dfm}

procedure TFAMILIA.FormClick(Sender: TObject);
VAR AUX:STRING;
begin
   IF (SENDER IS TSPEEDBUTTON) THEN
   BEGIN
    AUX:= '2';
   END;
end;

procedure TFAMILIA.Panel2Click(Sender: TObject);
VAR AUX:STRING;
begin
   IF (SENDER IS TSPEEDBUTTON) THEN
   BEGIN
    AUX:= '2';
   END;
end;
procedure TFAMILIA.FormCreate(Sender: TObject);
VAR j:variant;
    i:integer;
    B:VARIANT;
begin
  IMAGE1.Picture.SaveToFile('SALIDA.BMP');
  TOTALBOTONES := 0;
  B :=INT(592 * SCREEN.Width / 800 );
  SELF.Width := B ;
  ANCHO := SELF.Width ;
  B:= (ANCHO - 8) / (screen.Width /10);
  NUMEROXFILA:= B; // numero por fila
  NBOTON:=1;NFILA:=1;
end;

procedure TFAMILIA.HACERClick(Sender: TObject);
VAR AUX:STRING;
    I:INTEGER;
    ESTA:BOOLEAN;
    FRM:TFAMILIA;
    LETRA : CHAR;
begin
   ESTA:=FALSE;
   IF (SENDER IS TSPEEDBUTTON) THEN
   BEGIN
    AUX := (SENDER AS TSPEEDBUTTON).Name;
    LETRA := AUX[1];
    IF LETRA = 'B' THEN
    BEGIN
     AUX := 'F' + RIGHTSTR(AUX,LENGTH(AUX)-1); // LE QUITO LA B BUTTON  Y LE PONGO UNA F FORM
     I := 0;
     WHILE (I < SCREEN.FormCount) AND NOT ESTA  DO
     BEGIN
       IF (SCREEN.Forms[I].Name = AUX) THEN
       BEGIN
          FRM := SELF;
          SCREEN.FORMS[I].Show;
          ESTA := TRUE;
          FRM.HIDE;
       END;
       I:= I+1;
     END;
    END;
    IF LETRA='S' THEN
    BEGIN
      I := 0;
      WHILE (I < SCREEN.FormCount) AND NOT ESTA  DO
      BEGIN
        IF (SCREEN.Forms[I].Name = 'TICKET') THEN
        BEGIN
           FRM := SELF;
           SCREEN.FORMS[I].Show;
           SCREEN.FORMS[I].BringToFront;
           ESTA := TRUE;
           FRM.Hide;
        END;
        I:= I+1;
      END;
     END
   END;
end;

FUNCTION TFAMILIA.CREARARTICULO(COD,PROF:STRING;APOSICION,APOSICIONUSO,ADESCRIPCION:STRING):BOOLEAN;
VAR b,j:variant;
    C,a,h,i,LONGPANEL2:integer;
    IX:SMALLINT;
    AUXCAR,NAME:STRING;
    AUX:TSPEEDBUTTON;
    ORDEN:STRING;
    ERROR:BOOLEAN;
begin
// Y SI HAY SUBFAMILIAS
  RESULT := FALSE;
  I:= 1;
  with DMGS.CDSQ_ARTICULOSAUX do
  BEGIN
     Close;
     DMGS.VARTICULOSAUX.ID := ' WHERE COD_FAMILIA='''+COD+''' AND PROFUNDIDAD= '+PROF;
     DMGS.VARTICULOSAUX.TIPO  :='4';
     DMGS.VARTICULOSAUX.BORRADO :='0';
     ORDEN := '';
     if trim(APOSICION) <> '0' then
        ORDEN := ' POSICION,DESCRIPCIONBOTON '
     ELSE IF TRIM(APOSICIONUSO) <> '0' THEN
        ORDEN := ' POSICIONUSO,DESCRIPCIONBOTON '
          ELSE IF TRIM(ADESCRIPCION) <> '0' THEN
             ORDEN := ' DESCRIPCIONBOTON ';
     IF ORDEN = '' THEN
        ORDEN := ' PROFUNDIDAD,COD_FAMILIA,DESCRIPCIONBOTON ';
     ORDEN := ' ORDER BY ' + ORDEN;
     dmgs.vARTICULOSaux.ORDEN :=ORDEN;
     Open;
  END;
  while not dmgs.cdsq_ARTICULOSaux.Eof do
  begin
    dmgs.cdsq_ARTICULOSaux.Last;
    IF DMGS.cdsq_ARTICULOSaux.Eof THEN
    try // para evitar el error de memoria bloqueada en el server.
       DMGS.cdsq_ARTICULOSaux.GetNextPacket ;
    except
    end;
  end;
  DMGS.CDSQ_ARTICULOSAUX.First;
  IF DMGS.CDSQ_ARTICULOSAUX.RecordCount > 0 THEN
  BEGIN
//     MUESTRA := TMUESTRA.Create(FAMILIA);
     RESULT := TRUE;
//     MUESTRA.Name := NOMBRE;
     B :=INT(592 * SCREEN.Width / 800 );
     MUESTRA.Width := B ;
     longpanel2 := MUESTRA.Width ;
     j:= (longpanel2 - 8) / (screen.Width /10);
     a:= j; // numero por fila
     b:= int(dmgs.cdsq_ARTICULOSaux.RecordCount / a);// numero de filas
     IF A > 0 THEN
        B:= B+1;//PARA QUE COJA LOS RESTOS SI NO HAY LINEA COMPLETA
     FOR I:=1 TO b DO
      for  h:=1 to a do
      BEGIN
       IF NOT (DMGS.CDSQ_ARTICULOSAUX.Eof ) THEN
       BEGIN
        AUX := TSPEEDBUTTON.Create(MUESTRA);
        aux.Parent := MUESTRA;
        B:= INT(SCREEN.Width/10);
        AUXCAR :='';
        IF (DMGS.CDSQ_ARTICULOSAUXDESCRIPCIONBOTON.AsString <> '') THEN
           AUXCAR :=TRIM(DMGS.CDSQ_ARTICULOSAUXDESCRIPCIONBOTON.AsString);
        B:=INT(B/AUX.Font.Size);
        C:=B;
        IF LENGTH(AUXCAR) > C THEN // PARA QUE CORTE LA DESCRIPCION
           AUXCAR := COPY(AUXCAR,1,C);
        AUX.CAPTION := AUXCAR;
        AUX.ENABLED := TRUE;
        AUX.FLAT := TRUE;
        AUX.Font.Color := $004080FF;
        AUX.Font.Size := 8;
        j:=SCREEN.Width/10; // EL FORMATO DE PANTALLA QUE TENGA LA DECIMA PARTE
        AUX.Height := j ;
        AUX.WIDTH := j ;
        j:=H;
        aux.Left := 8 + (j-1)*screen.Width /10;
        j:= (I-1)* SCREEN.Width/10;
        aux.top := j;
//        NAME :=STRINGREPLACE(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.AsString,'-','_',[rfReplaceAll, rfIgnoreCase]);
//        Name :=STRINGREPLACE(NAME,'/','_',[rfReplaceAll, rfIgnoreCase]);
//        AUX.NAME := 'A'+CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING);
    TRY
      AUX.NAME := 'A'+CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING);
    EXCEPT
      ERROR:=TRUE;IX:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='A'+CAMBIAR(DMGS.CDSQ_ARTICULOSAUXID_ARTICULO.ASSTRING)+INTTOSTR(IX);
          ERROR := FALSE;
        EXCEPT
          IX:=IX+1;
        END;
    END;

        // SU SIB NUMEROS QUE NO ME DE PROBLEMAS
        AUX.Transparent := TRUE;
        DMGS.CDSQ_ARTICULOSAUX.NEXT;
       END;
    END;
   END;
    DMGS.CDSQ_ARTICULOSAUX.CLOSE;
end;
procedure TFAMILIA.crearfamilia(profundidad:integer;formulario:tform;dataset:tclientdataset);
VAR b,j:variant;
    BOTONES,LPROFUNDIDAD,PADREPROFUNDIDAD,APADREPROFUNDIDAD,BORRAR,C,a,h,i,longpanel2:integer;
    AUXB,LCOD_FAMILIA,AUXCAR,FNOMBRE,PADRE,APADRE:STRING;
    AUX:TSPEEDBUTTON;
    HAY:BOOLEAN;
    DATASET2:TCLIENTDATASET;
    SIGUE,SIGUE2,ENRAIZ1:BOOLEAN;
    Save_Cursor:TCursor;
    ERROR:BOOLEAN;
    IX:SMALLINT;
begin
 TRY
 BEGIN
  ESPERA:= TESPERA.CREATE(NIL);
  Save_Cursor := Screen.Cursor;
  Screen.Cursor := crHourGlass;
  I:= 1;
  SIGUE := TRUE;
  ESPERA.LONGITUD(NUMERODEFAMILIAS);
  RAIZ(PROFUNDIDAD);
  b:= int(DMGS.CDSQ_FAMILIASAUX.RecordCount / NUMEROXFILA);// numero de filas
  FILAS := B;
  ESPERA.SHOW;
  ESPERA.Repaint;
  DIBUJARBOTONSALIDA;
  WHILE NOT DMGS.CDSQ_FAMILIASAUX.EOF DO
  BEGIN
      ESPERA.INCREMENTARBARRA(FALSE);
      dmgs.cdsq_familiasauximagen.savetoFile(DMGS.fichero);
      DIBUJARBOTON(DMGS.CDSQ_FAMILIASAUX.FIELDBYNAME('DESCRIPCIONBOTON').ASSTRING,
                  DMGS.CDSQ_FAMILIASAUX.FIELDBYNAME('COD_FAMILIA').ASSTRING,
                  DMGS.CDSQ_FAMILIASAUX.FIELDBYNAME('PROFUNDIDAD').ASSTRING,
                  DMGS.CDSQ_FAMILIASAUXMOSTRARIMAGEN.Asstring='1',
                  DMGS.CDSQ_FAMILIASAUXMOSTRARDESCRIPCION.Asstring='1');
      // GUARDO LA ULTIMA FAMILIA MOSTRADA
      LCOD_FAMILIA := DMGS.CDSQ_FAMILIASAUX.FIELDBYNAME('COD_FAMILIA').ASSTRING;
      PADRE := LCOD_FAMILIA;
      APADRE := LCOD_FAMILIA;
      PADREPROFUNDIDAD := LPROFUNDIDAD;
      APADREPROFUNDIDAD:=PADREPROFUNDIDAD ;
      LPROFUNDIDAD :=DMGS.CDSQ_FAMILIASAUX.FIELDBYNAME('PROFUNDIDAD').ASINTEGER;
      BOTONES := TOTALBOTONES + 1;
      sigue := true;
      WHILE SIGUE DO
      BEGIN
       WITH DMGS.CDSQ_FAMILIAS DO
       BEGIN
         LOCALIZARPADRE(LCOD_FAMILIA,INTTOSTR(LPROFUNDIDAD+1));
         // PRIMERO DIBUJO LAS FAMILIAS
         // EL FORMULARIO HIJO VA A TENER EL NOMBRE DE LA FAMILIA + LA PROFUNDIDAD
         IF NOT ENCONTRARFORM('F'+LCOD_FAMILIA+INTTOSTR(LPROFUNDIDAD)) THEN
             BOTONES := 1
         ELSE
             BOTONES := SUBFAMILIA.DBOTON + 1 ;
         // CON ESTO DESCARTO LOS REGISTROS QUE YA TIENEN BOTON
         FOR I:=1 TO BOTONES - 1 DO
             DMGS.CDSQ_FAMILIAS.Next;
         IF (RECORDCOUNT > 0)
         THEN
         BEGIN
  // ->
  // DIBUJO LOS BOTONES DE LAS FAMILIAS
            IF NOT ENCONTRARFORM('F'+LCOD_FAMILIA+INTTOSTR(LPROFUNDIDAD))
            then
            BEGIN
               SUBFAMILIA := TSUBFAMILIA.Create(FAMILIA);
//               SUBFAMILIA.Name := 'F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD);
    TRY
      SUBFAMILIA.NAME := 'F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD);
    EXCEPT
      ERROR := TRUE;IX:=0;
      WHILE ERROR DO
        TRY
          SUBFAMILIA.NAME:='F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD)+INTTOSTR(IX);
          ERROR := FALSE;
        EXCEPT
          IX:=IX+1;
        END;
    END;



               SUBFAMILIA.TOTALBOTONES := DMGS.CDSQ_FAMILIAS.RecordCount ;
               // NUMERO TOTAL DE FAMILIAS EN EL FORMULARIO
               SUBFAMILIA.PADRE := PADRE;// PADRE DEL FORMULARIO
               SUBFAMILIA.PADREPROFUNDIDAD := PADREPROFUNDIDAD; // PROFUNDIDAD
               SUBFAMILIA.APADRE := APADRE;// PADRE DEL FORMULARIO
               SUBFAMILIA.APADREPROFUNDIDAD := APADREPROFUNDIDAD; // PROFUNDIDAD
               dmgs.cdsq_familiasimagen.savetoFile(DMGS.fichero);
               ESPERA.INCREMENTARBARRA(FALSE);               
               SUBFAMILIA.DIBUJARBOTON('ATRAS',
                  'ATRAS',
                DMGS.CDSQ_FAMILIAS.FIELDBYNAME('PROFUNDIDAD').ASSTRING,2,
                FALSE,
                TRUE);
            END;
            APADRE := SUBFAMILIA.PADRE;
            APADREPROFUNDIDAD := SUBFAMILIA.PADREPROFUNDIDAD;
            SUBFAMILIA.PROFUNDIDAD :=DMGS.CDSQ_FAMILIAS.FieldByName('PROFUNDIDAD').ASINTEGER;
            SUBFAMILIA.COD_FAMILIA := DMGS.CDSQ_FAMILIAS.FieldByName('COD_FAMILIA').AsString;
            // SON NECESARIOS PARA CREAR LA SIGUIENTE SUBFAMILIA.
            PADRE := SUBFAMILIA.COD_FAMILIA;
            PADREPROFUNDIDAD := SUBFAMILIA.PROFUNDIDAD;
            dmgs.cdsq_familiasimagen.savetoFile(DMGS.fichero);
            SUBFAMILIA.DIBUJARBOTON(DMGS.CDSQ_FAMILIAS.FIELDBYNAME('DESCRIPCIONBOTON').ASSTRING,
                  DMGS.CDSQ_FAMILIAS.FIELDBYNAME('COD_FAMILIA').ASSTRING,
                  DMGS.CDSQ_FAMILIAS.FIELDBYNAME('PROFUNDIDAD').ASSTRING,0,
                  DMGS.CDSQ_FAMILIASMOSTRARIMAGEN.Asstring='1',
                  DMGS.CDSQ_FAMILIASMOSTRARDESCRIPCION.Asstring='1');
            LPROFUNDIDAD :=DMGS.CDSQ_FAMILIAS.FIELDBYNAME('PROFUNDIDAD').ASINTEGER;
            LCOD_FAMILIA :=DMGS.CDSQ_FAMILIAS.FIELDBYNAME('COD_FAMILIA').ASSTRING;
            BOTONES := SUBFAMILIA.DBOTON ;// BOTONES DIBUJADOS
// FIN DEL DIBUJO DE LAS FAMILIAS
// <-
        END
        ELSE
        BEGIN
         SIGUE2:=TRUE;
         WHILE SIGUE2 DO
         BEGIN                 
         // COMPRUEBO SI LA FAMILIA QUE NO TIENE SUBFAMILIAS, TIENE
         // ARTICULOS
          ENRAIZ1:= FALSE;
          IF RECORDCOUNT=0 THEN
             IF TIENEHIJOS(LCOD_FAMILIA,INTTOSTR(LPROFUNDIDAD),
                DMGS.CDSQ_FAMILIASAORDENPOSICION.ASSTRING,
                DMGS.CDSQ_FAMILIASAORDENPOSICIONUSO.ASSTRING,
                DMGS.CDSQ_FAMILIASAORDENDESCRIPCION.ASSTRING)
             THEN
             BEGIN
                INSERTARFORMYARTICULO(LCOD_FAMILIA,APADRE,LPROFUNDIDAD,APADREPROFUNDIDAD);
                ENRAIZ1:=TRUE;// EN EL CASO DE QUE UNA FAMILIA NO TIENE SUBFAMILIAS
                // DIBUJA LOS ARTICULOS
             END;
          ENCONTRARFORM('F'+ APADRE+INTTOSTR(APADREPROFUNDIDAD));
          IF SUBFAMILIA.DBOTON >= SUBFAMILIA.TOTALBOTONES THEN
          // DIBUJARARTICULOS
          BEGIN
            // CREO TODOS LOS BOTONES PARA LOS ARTICULOS
             IF NOT ENRAIZ1 THEN
             // SI ACABAN DE SER DIBUJADOS NO LOS VUELVE A DIBUJAR.
                SUBFAMILIA.CREARARTICULO(APADRE,INTTOSTR(APADREPROFUNDIDAD))
             ELSE
                ENRAIZ1:= FALSE;
             LOCALIZARHIJO(APADRE,INTTOSTR(APADREPROFUNDIDAD));
             APADRE := DMGS.CDSQ_FAMILIASCOD_FAMILIA.AsString;
             APADREPROFUNDIDAD :=  DMGS.CDSQ_FAMILIASPROFUNDIDAD.AsInteger;
          END
          ELSE
          BEGIN
           // SUBO HACIA EL FORMULARIO RAIZ
             SIGUE2 := FALSE;
             APADRE := SUBFAMILIA.PADRE;
             APADREPROFUNDIDAD := SUBFAMILIA.PADREPROFUNDIDAD;
          END;
          IF (DMGS.CDSQ_FAMILIASPROFUNDIDAD.AsInteger = 0)
          and (apadre='')
          THEN
          BEGIN
          // SI ESTOY EN EL RAIZ SALGO AL WHILE DEL FAMILIA AUX
             SIGUE2 := FALSE;
             SIGUE := FALSE;
          END;
         END;
         LPROFUNDIDAD := APADREPROFUNDIDAD;
         LCOD_FAMILIA := APADRE;
         IF LPROFUNDIDAD<> 0 THEN
            SIGUE := TRUE;
         // LO PONGO ARRIBA
         BOTONES := SUBFAMILIA.DBOTON + 1;// BOTONES DIBUJADOS
         // PARA QUE ADELANTE EL DATASET AL QUE TIENE QUE DIBUJAR, ESTA ARRIBA
        END;
      END;
     END;
     DMGS.CDSQ_FAMILIASAUX.Next;
  END;
  DMGS.CDSQ_FAMILIASAUX.CLOSE;
 END;
 FINALLY
 BEGIN
   Screen.Cursor := Save_Cursor;
   ESPERA.INCREMENTARBARRA(TRUE);
   ESPERA.Free;
   ESPERA := NIL;
 END;
 END
end;
PROCEDURE TFAMILIA.DIBUJARBOTON(DESCRIPCION,COD_FAMILIA,PROFUNDIDAD:STRING;BIMAGEN,BDESCRIPCION:BOOLEAN);
VAR AUX:TSPEEDBUTTON;
    B:VARIANT;
    C:INTEGER;
    AUXCAR,TEXTO,TEXTO2:STRING;
    ERROR:BOOLEAN;
    IX:SMALLINT;
BEGIN
//   TOTALBOTONES := TOTALBOTONES + 1 ;
   BTNAUX := TSPEEDBUTTON.Create(self);//familia
   AUX := BTNAUX;
   aux.Parent := FAMILIA;//familia
   B:= INT(SCREEN.Width/10);
   AUXCAR :='';
   IF (DESCRIPCION <> '') THEN
       AUXCAR :=TRIM(DESCRIPCION);
   B:=INT(B/AUX.Font.Size);
   C:=B;

   TEXTO := '';
   AUXCAR := TRIM(AUXCAR);
   TEXTO := TRIM(COPY(AUXCAR,1,POS(' ',AUXCAR)-1));
   // PONGO EL TEXTO EN DOS LINEAS SI LA PRIMERA LINEA ES MAYOR
   // QUE EL BOTON LA RECORTO.
   IF LENGTH(TEXTO) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
        TEXTO := COPY(TEXTO,1,C);
   IF TEXTO <> '' THEN
   BEGIN
       TEXTO2 := COPY(AUXCAR,POS(' ',AUXCAR),LENGTH(AUXCAR)-1);
   // PONGO EL TEXTO EN DOS LINEAS SI LA SEGIUNDA LINEA ES MAYOR
   // QUE EL BOTON LA RECORTO.
         IF LENGTH(TEXTO2) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
            TEXTO2 := TRIM(COPY(TEXTO2,1,C));
       AUXCAR := TEXTO + #13+ TEXTO2;
   END
   ELSE
   IF LENGTH(AUXCAR) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
      AUXCAR := COPY(AUXCAR,1,C);

   IF BDESCRIPCION THEN
      AUX.CAPTION := AUXCAR;
   IF BIMAGEN THEN
      AUX.Glyph.LoadFromfile(DMGS.fichero);

   aux.NumGlyphs := 1;
   aux.Layout := blglyphtop;
   AUX.ENABLED := TRUE;
   AUX.FLAT := TRUE;
   AUX.Font.Color := $00804000;
   AUX.Font.Size := 8;
   B:=SCREEN.Width/10; // EL FORMATO DE PANTALLA QUE TENGA LA DECIMA PARTE
   AUX.Height := B ;
   AUX.WIDTH := B ;
   B := NBOTON;
   aux.Left := 8 + (B-1)*screen.Width /10;
   B:= (NFILA-1)* SCREEN.Width/10;
   aux.top := 8 + B;
//   AUX.NAME := 'B'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD;
      TRY
      AUX.NAME := 'B'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD;
    EXCEPT
      ERROR := TRUE;IX:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='B'+CAMBIAR(COD_FAMILIA)+PROFUNDIDAD+INTTOSTR(IX);
          ERROR := FALSE;
        EXCEPT
          IX:=IX+1;
        END;
    END;


   AUX.TAG := STRTOINT(PROFUNDIDAD); // PARA DESPUES IDENTIFICAR AL ARTICULO
   AUX.Transparent := TRUE;
   AUX.OnClick := HACERCLICK;
   aux.NumGlyphs := 1;
   aux.Layout := blglyphtop;
   IF NBOTON = NUMEROXFILA THEN
   BEGIN
     NBOTON := 1;
     NFILA := NFILA +1;
   END
   ELSE
     NBOTON := NBOTON + 1;
END;
FUNCTION TFAMILIA.ENCONTRARFORM(NOMBRE:STRING):BOOLEAN;
VAR I:INTEGER;
    AUX:BOOLEAN;
BEGIN
  I := 0;
  AUX := FALSE;
  RESULT := FALSE;
  WHILE (I < SCREEN.FormCount ) AND
       NOT AUX
  DO
  BEGIN
    IF SCREEN.Forms [I].Name =  NOMBRE THEN
    BEGIN
         SUBFAMILIA := (SCREEN.FORMS [I] AS TSUBFAMILIA);
       AUX := TRUE;
       RESULT := TRUE;
    END;
    I:=I+1;
  END;
END;
PROCEDURE TFAMILIA.LOCALIZARPADRE(PADRE,PROFUNDIDAD:STRING);
VAR AUX:STRING;
BEGIN
       WITH DMGS.CDSQ_FAMILIAS DO
       BEGIN
        CLOSE;
        DMGS.VFAMILIAS.ID := ' WHERE PROFUNDIDAD='+PROFUNDIDAD+
            ' AND PADRE='''+PADRE+''' ';
        DMGS.VFAMILIAS.TIPO := '4';
     aux := '';
     if trim(fmenu.FPOSICION) <> '0' then
        aux := ' POSICION,DESCRIPCIONBOTON  '
     ELSE IF TRIM(FMENU.FPOSICIONUSO) <> '0' THEN
        AUX := ' POSICIONUSO,DESCRIPCIONBOTON  '
          ELSE IF TRIM(FMENU.FDESCRIPCION) <> '0' THEN
             AUX := ' DESCRIPCIONBOTON ';
     IF AUX = '' THEN
        AUX := ' PROFUNDIDAD,COD_FAMILIA,DESCRIPCIONBOTON  ';
     AUX := ' ORDER BY ' + AUX;
     DMGS.VFAMILIAS.ORDEN := AUX;

        OPEN;
        WHILE NOT EOF DO
        BEGIN
            Last;
            IF Eof THEN
            try // para evitar el error de memoria bloqueada en el server.
               GetNextPacket ;
            except
            end;
        END;
        FIRST;
       END;
END;
PROCEDURE TFAMILIA.LOCALIZARHIJO(PADRE,PROFUNDIDAD:STRING);
VAR LPADRE,AUX:STRING;
BEGIN
       WITH DMGS.CDSQ_FAMILIAS DO
       BEGIN
        CLOSE;
        DMGS.VFAMILIAS.ID := ' WHERE PROFUNDIDAD='+PROFUNDIDAD+
            ' AND COD_FAMILIA='''+PADRE+''' ';
        DMGS.VFAMILIAS.TIPO := '4';
     aux := '';
     if trim(fmenu.FPOSICION) <> '0' then
        aux := ' POSICION,DESCRIPCIONBOTON  '
     ELSE IF TRIM(FMENU.FPOSICIONUSO) <> '0' THEN
        AUX := ' POSICIONUSO,DESCRIPCIONBOTON  '
          ELSE IF TRIM(FMENU.FDESCRIPCION) <> '0' THEN
             AUX := ' DESCRIPCIONBOTON  ';
     IF AUX = '' THEN
        AUX := ' PROFUNDIDAD,ID_FAMILIA,COD_FAMILIA,DESCRIPCIONBOTON  ';
     AUX := ' ORDER BY ' + AUX;
        DMGS.VFAMILIAS.ORDEN := AUX;
        OPEN;
        LPADRE := DMGS.CDSQ_FAMILIASPADRE.ASSTRING;
        CLOSE;
        DMGS.VFAMILIAS.ID := ' WHERE PROFUNDIDAD='+INTTOSTR(STRTOINT(PROFUNDIDAD)-1)+
            ' AND COD_FAMILIA='''+LPADRE+''' ';
        DMGS.VFAMILIAS.TIPO := '4';
        DMGS.VFAMILIAS.ORDEN := AUX;
        OPEN;
        WHILE NOT EOF DO
        BEGIN
            Last;
            IF Eof THEN
            try // para evitar el error de memoria bloqueada en el server.
               GetNextPacket ;
            except
            end;
        END;
        FIRST;
       END;
END;
PROCEDURE TFAMILIA.RAIZ(PROFUNDIDAD:INTEGER);
var aux:string;
BEGIN
  with DMGS.CDSQ_FAMILIASAUX do
  BEGIN
     Close;
     DMGS.VFAMILIASAUX.ID :=' WHERE PROFUNDIDAD='+inttostr(profundidad);
     DMGS.VFAMILIASAUX.TIPO  :='4';
     aux := '';
     if trim(fmenu.FPOSICION) <> '0' then
        aux := ' POSICION,DESCRIPCIONBOTON  '
     ELSE IF TRIM(FMENU.FPOSICIONUSO) <> '0' THEN
        AUX := ' POSICIONUSO,DESCRIPCIONBOTON  '
          ELSE IF TRIM(FMENU.FDESCRIPCION) <> '0' THEN
             AUX := ' DESCRIPCIONBOTON ';
     IF AUX = '' THEN
        AUX := ' PROFUNDIDAD,COD_FAMILIA,DESCRIPCIONBOTON  ';
     AUX := ' ORDER BY ' + AUX;
     dmgs.vfamiliasaux.ORDEN := AUX;
     Open;
  END;
  while not DMGS.CDSQ_FAMILIASAUX.Eof do // dmgs.DMGS.CDSQ_FAMILIASAUX
  begin
    DMGS.CDSQ_FAMILIASAUX.Last;
    IF DMGS.CDSQ_FAMILIASAUX.Eof THEN
    try // para evitar el error de memoria bloqueada en el server.
       DMGS.CDSQ_FAMILIASAUX.GetNextPacket ;
    except
    end;
  end;
  DMGS.CDSQ_FAMILIASAUX.First;
  TOTALBOTONES := DMGS.CDSQ_FAMILIASAUX.RECORDCOUNT; // NO + 1 PQ ESTE FORMULARIO
  // NO LLEVA BOTON DE SALIR

END;
FUNCTION TFAMILIA.TIENEHIJOS(COD,PROF,APOSICION,APOSICIONUSO,ADESCRIPCION:STRING):BOOLEAN;
VAR ORDEN:STRING;
begin
  RESULT := FALSE;
  with DMGS.CDSQ_ARTICULOSAUX do
  BEGIN
     Close;
     DMGS.VARTICULOSAUX.ID := ' WHERE COD_FAMILIA='''+COD+''' AND PROFUNDIDAD= '+PROF;
     DMGS.VARTICULOSAUX.TIPO  :='4';
     DMGS.VARTICULOSAUX.BORRADO := '0';
     ORDEN := '';
     if trim(APOSICION) <> '0' then
        ORDEN := ' POSICION,DESCRIPCIONBOTON '
     ELSE IF TRIM(APOSICIONUSO) <> '0' THEN
        ORDEN := ' POSICIONUSO,DESCRIPCIONBOTON '
          ELSE IF TRIM(ADESCRIPCION) <> '0' THEN
             ORDEN := ' DESCRIPCIONBOTON ';
     IF ORDEN = '' THEN
        ORDEN := ' PROFUNDIDAD,COD_FAMILIA,DESCRIPCIONBOTON ';
     ORDEN := ' ORDER BY ' + ORDEN;
     dmgs.vARTICULOSaux.ORDEN := ORDEN;
     Open;
     while not Eof do
     begin
      Last;
      IF Eof THEN
      try // para evitar el error de memoria bloqueada en el server.
         GetNextPacket ;
      except
      end;
     end;
     First;
     IF RecordCount > 0 THEN
        RESULT := TRUE
     ELSE
        CLOSE;
  END;
end;
PROCEDURE TFAMILIA.INSERTARFORMYARTICULO(LCOD_FAMILIA,PADRE:STRING;LPROFUNDIDAD,PADREPROFUNDIDAD:INTEGER);
VAR ERROR:BOOLEAN;
    I:SMALLINT;
BEGIN
       IF NOT ENCONTRARFORM('F'+LCOD_FAMILIA+INTTOSTR(LPROFUNDIDAD))
       then
       BEGIN
            SUBFAMILIA := TSUBFAMILIA.Create(FAMILIA);
//            SUBFAMILIA.Name := 'F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD);
    TRY
      SUBFAMILIA.NAME := 'F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD);
    EXCEPT
      ERROR := TRUE;I:=0;
      WHILE ERROR DO
        TRY
          SUBFAMILIA.NAME:='F'+CAMBIAR(LCOD_FAMILIA)+INTTOSTR(LPROFUNDIDAD)+INTTOSTR(I);
          ERROR := FALSE;
        EXCEPT
          I:=I+1;
        END;
    END;


            SUBFAMILIA.TOTALBOTONES := DMGS.CDSQ_FAMILIAS.RecordCount ;
            // NUMERO TOTAL DE FAMILIAS EN EL FORMULARIO
            SUBFAMILIA.PADRE := PADRE;// PADRE DEL FORMULARIO
            SUBFAMILIA.PADREPROFUNDIDAD := PADREPROFUNDIDAD; // PROFUNDIDAD
            // A ESTE NIVEL LO ANTERIOR NO LO USO
            SUBFAMILIA.APADRE := PADRE;// PADRE DEL FORMULARIO
            SUBFAMILIA.APADREPROFUNDIDAD := PADREPROFUNDIDAD; // PROFUNDIDAD

            SUBFAMILIA.DIBUJARBOTON('ATRAS',
                 'ATRAS',
                INTTOSTR(PADREPROFUNDIDAD),2,
                FALSE,
                TRUE);
       END;
            SUBFAMILIA.CREARARTICULO(LCOD_FAMILIA,INTTOSTR(LPROFUNDIDAD))
END;
FUNCTION TFAMILIA.NUMERODEFAMILIAS:SMALLINT;
BEGIN
   RESULT := 0;
   DMGS.CDSQ_MAXIMO.Close;
   DMGS.CDSQ_MAXIMO.CommandText := ' SELECT COUNT(cod_familia) FROM FAMILIAS';
   DMGS.CDSQ_MAXIMO.OPEN;
   IF DMGS.CDSQ_MAXIMO.FIELDS[0].AsInteger > 0 THEN
      RESULT := DMGS.CDSQ_MAXIMO.FIELDS[0].AsInteger ;
END;
FUNCTION TFAMILIA.CAMBIAR(AUX:STRING):STRING;
VAR NOMBRE:STRING;
    I:SMALLINT;
BEGIN
   NOMBRE := AUX;
   FOR I:= 1 TO 47 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   FOR I:= 58 TO 64 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   FOR I:= 123 TO 255 DO
     NOMBRE := STRINGREPLACE(NOMBRE,CHR(I),'_',[RFREPLACEALL,rfIgnoreCase]);
   RESULT := NOMBRE;
END;

PROCEDURE TFAMILIA.DIBUJARBOTONSALIDA;
VAR AUX:TSPEEDBUTTON;
    B:VARIANT;
    C:INTEGER;
    AUXCAR,TEXTO,TEXTO2:STRING;
    ERROR:BOOLEAN;
    IX:SMALLINT;
BEGIN
   BTNAUX := TSPEEDBUTTON.Create(self);//familia
   AUX := BTNAUX;
   aux.Parent := FAMILIA;//familia
   B:= INT(SCREEN.Width/10);
   AUXCAR :='SALIR';
   B:=INT(B/AUX.Font.Size);
   C:=B;

   IF LENGTH(AUXCAR) > C THEN // PARA QUE CORTE LA DESCRIPCION Y QUEPA EN EL BOTON
      AUXCAR := COPY(AUXCAR,1,C);
   AUX.Glyph.LoadFromfile('SALIDA.BMP');

   aux.NumGlyphs := 1;
   aux.Layout := blglyphtop;
   AUX.ENABLED := TRUE;
   AUX.FLAT := TRUE;
   AUX.Font.Color := $00804000;
   AUX.Font.Size := 8;
   B:=SCREEN.Width/10; // EL FORMATO DE PANTALLA QUE TENGA LA DECIMA PARTE
   AUX.Height := B ;
   AUX.WIDTH := B ;
   B := NBOTON;
   aux.Left := 8 + (B-1)*screen.Width /10;
   B:= (NFILA-1)* SCREEN.Width/10;
   aux.top := 8 + B;
   TRY
      AUX.NAME := 'S'+'SALIR'
   EXCEPT
      ERROR := TRUE;IX:=0;
      WHILE ERROR DO
        TRY
          AUX.NAME:='S'+'SALIR'+INTTOSTR(IX);
          ERROR := FALSE;
        EXCEPT
          IX:=IX+1;
        END;
    END;

   AUX.Transparent := TRUE;
   AUX.OnClick := HACERCLICK;
   aux.NumGlyphs := 1;
   aux.Layout := blglyphtop;

   IF NBOTON = NUMEROXFILA THEN
   BEGIN
     NBOTON := 1;
     NFILA := NFILA +1;
   END
   ELSE
     NBOTON := NBOTON + 1;
END;


end.

