Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Utilizacion del With (https://www.clubdelphi.com/foros/showthread.php?t=88657)

lgarcia 10-07-2015 18:57:59

Utilizacion del With
 
Hola:
Tengo una duda porque siempre estube programando con Delphi 7 y recientemente he estado incursionando en Delphi y C++ XE2 y en D7 en el codigo uno podia poner una sintasis como esta para una simple consulta a un BD:
Código Delphi [-]
with Prueba do
begin
  Close;
  Open;
end;

y estuve buscando en la ayuda de ambos y no lo vi. Aunque el Delphi XE2 cuando compila, no lo muestra como error el C++ si. Es que esa expresion caduco o es que hay algo que lo sustituyo, porque la expresion with ahorraba buena cantidad de codigo.

Saludos
Luis Garcia

gatosoft 10-07-2015 19:09:42

Hola Luis,

Hasta donde se, no ha caducado. No veo un por qué. Sin embargo siempre se ha advertido sobre el cuidado de utilizarlo pues podría generar ambiguedades que no advierte el compilador (warnings)

Te dejo este enlace

saludo,

AgustinOrtu 10-07-2015 19:12:23

Nunca uses with, te vas a ahorrar un millardo de problemas

Al González 10-07-2015 19:24:57

Yo también considero que el With actual es muy nocivo si no se utiliza responsablemente, hay que tratar de evitarlo. Pero les recomiendo leer mi respuesta en la discusión enlazada por gatosoft:
Cita:

Empezado por gatosoft (Mensaje 494274)
Te dejo este enlace

Aparece hasta el final. :p

Saludos.

lgarcia 10-07-2015 19:42:54

Utilizacion del With
 
Voy a mirar el enlace y muchas gracias por sus comentarios.

Saludos
Luis Garcia

ecfisa 10-07-2015 21:17:31

Hola lgarcia.
Cita:

Empezado por lgarcia (Mensaje 494272)
...
Aunque el Delphi XE2 cuando compila, no lo muestra como error el C++ si.
...

Lo último que mencionas es totalmente normal y de esperar; ya que C++ no posee un comando equivalente al with de Delphi, que como bién te han comentado hay que usar con cuidado.

Saludos :)

nlsgarcia 10-07-2015 23:27:08

lgarcia,

Cita:

Empezado por lgarcia
...Utilizacion del With...

:rolleyes:

Adicionalmente a todo lo mencionado, te sugiero revisar esta información referente al uso de la sentencia With:
Espero sea útil :)

Nelson.

Neftali [Germán.Estévez] 13-07-2015 10:22:06

Si fuera por mi, habría que prohibirlo directamente...
:p

Casimiro Notevi 13-07-2015 12:20:56

Cita:

Empezado por Neftali (Mensaje 494330)
Si fuera por mi, habría que prohibirlo directamente...
:p

Yo nunca lo uso.

Caminante 13-07-2015 16:54:47

Cita:

Empezado por Neftali (Mensaje 494330)
Si fuera por mi, habría que prohibirlo directamente...
:p

Pues yo si suelo utilizarlo aunque, como ya se dijo, teniendo cuidado. Nunca anido sentencias with.

Saludos

olbeup 14-07-2015 09:06:23

Yo utilizo with continuamente ya que me ahorra mucho código y, nunca he tenido ningún problema.

He combinado with con dos componentes a la vez, TEdit y TStaticText y sin problema aparente y, aún lo sigo utilizando por la gran cantidad de código que me ahorro.

Si sabes utilizarlo y sabes cuales son sus beneficios y perjuicios, utilízalo en beneficio tuyo.

Un saludo.

Neftali [Germán.Estévez] 14-07-2015 09:59:59

No digo que se no sea útil y ahorre tiempo, pero eso provoca que el código sea menos claro y más difícil de debuggar.
por ende más propenso a errores.
Y esas son dos cosas que para mi tienen suma importancia, la claridad y la seguridad en cuanto a fallos.

AgustinOrtu 14-07-2015 20:33:13

Si mal no recuerdo lo lei en StackOverflow. Pero seamos sinceros, el with lo usamos porque a veces tenemos declaradas variables (bueno mas que variables, componentes) asi:

Código Delphi [-]
 { TFormX Private Declarations } 
  Tabla_Registro_Historico_Ventas: TADOQuery;

..
procedure HacerAlgoConLaTabla;
begin
  // esto es realmente tedioso
  if not(Tabla_Registro_Historico_Ventas.Active) then
    Tabla_Registro_Historico_Ventas.Open;

  Tabla_Registro_Historico_Ventas.Edit;
  Tabla_Registro_Historico_Ventas.FieldByName('Apellidos_Y_Nombres_Cliente').AsString := 
                                               Tabla_Registro_Historico_Ventas.FieldByName('Apellido').AsString + ', ' + 
                                               Tabla_Registro_Historico_Ventas.FieldByName('Nombres').AsString
  Tabla_Registro_Historico_Ventas.Post;
end;

procedure MasFacil;
var
  t: TADOQuery;
begin
  t := Tabla_Registro_Historico_Ventas;
  // esto es mucho mas amigable :)
  if not(t .Active) then
    t .Open;

  t .Edit;
  t .FieldByName('Apellidos_Y_Nombres_Cliente').AsString := t .FieldByName('Apellidos').AsString + ', ' + t.FieldByName('Nombres').AsString 
  t .Post;
end;

Neftali [Germán.Estévez] 15-07-2015 13:11:28

Justamente lo segundo es lo ideal.

(1) La declaración de componentes es clara.
(2) Escribimos lo mínimo posible.
(3) El debug y seguimiento es claro y sin errores.

^\||/^\||/

olbeup 15-07-2015 15:28:18

Código Delphi [-]
 { TFormX Private Declarations } 
  Tabla_Registro_Historico_Ventas: TADOQuery;

..
procedure HacerAlgoConLaTabla;
begin
  // esto es realmente tedioso
  if not(Tabla_Registro_Historico_Ventas.Active) then
    Tabla_Registro_Historico_Ventas.Open;

  Tabla_Registro_Historico_Ventas.Edit;
  Tabla_Registro_Historico_Ventas.FieldByName('Apellidos_Y_Nombres_Cliente').AsString := 
                                               Tabla_Registro_Historico_Ventas.FieldByName('Apellido').AsString + ', ' + 
                                               Tabla_Registro_Historico_Ventas.FieldByName('Nombres').AsString
  Tabla_Registro_Historico_Ventas.Post;
end;

procedure OtraForma;
begin
  // esto también puede ser
  with Tabla_Registro_Historico_Ventas do
  begin
    if (not Active) then
      Open;

    Edit;

    FieldByName('Apellidos_Y_Nombres_Cliente').AsString :=
      FieldByName('Apellido').AsString + ', ' + 
      FieldByName('Nombres').AsString;

    Post;
  end;
end;

procedure OtraMas;
var
  FadoCnn: TADOConnection;
begin
  FadoCnn := TADOConnection.Create(nil);
    FadoCnn.LoginPrompt := False;
    FadoCnn.ConnectionString := ;

  with TADOQuery.Create(nil) do
  begin
    Connection := FadoCnn;

    SQL.Add('SELECT');
    SQL.Add('    Apellidos_Y_Nombres_Cliente');
    SQL.Add('    ,Apellido');
    SQL.Add('    ,Nombres');
    SQL.Add('  FROM Clientes');

    Open;
    
    Edit;

    FieldByName('Apellidos_Y_Nombres_Cliente').AsString :=
      FieldByName('Apellido').AsString + ', ' + 
      FieldByName('Nombres').AsString;

    Post;

    FadoCnn.Free;
    Free;
  end;
end;

Para gustos los colores.

Un saludo.

Casimiro Notevi 15-07-2015 15:33:59

Cita:

Empezado por olbeup (Mensaje 494492)
Para gustos los colores.

No es cuestión de gustos :)

olbeup 16-07-2015 15:42:05

Cita:

Empezado por Casimiro Notevi (Mensaje 494493)
No es cuestión de gustos :)

Bueno, yo lo utilizo bastante por no decir siempre y me va muy bien.

Un saludo.

Casimiro Notevi 16-07-2015 17:25:23

Cita:

Empezado por olbeup (Mensaje 494529)
Bueno, yo lo utilizo bastante por no decir siempre y me va muy bien.

Bueno, yo no lo utilizo nunca y también me va muy bien :D:D:D

ecfisa 16-07-2015 19:38:15

Cita:

Empezado por olbeup (Mensaje 494529)
Bueno, yo lo utilizo bastante por no decir siempre y me va muy bien...

Cita:

Empezado por Casimiro Notevi (Mensaje 494531)
Bueno, yo no lo utilizo nunca y también me va muy bien...

Moraleja: El uso u omisión de la sentencia with no afecta en absoluto el progreso personal. :D

Saludos :)

nlsgarcia 16-07-2015 19:53:10

Daniel,

Cita:

Empezado por ecfisa
...El uso u omisión de la sentencia with no afecta en absoluto el progreso personal...

:D ^\||/

Nelson.

Lepe 16-07-2015 20:36:32

Coincido en que hay que prohibirlo.

http://stackoverflow.com/questions/7...with-in-delphi

Si se usa como :
Código Delphi [-]
with Tquery.create(nil) do begin 
  open
  sql := 'blah blha';
  ExecSql;
  Free;
end;
Pues vale... aunque eso debería ser una función llamada ExecSql( const sql : string) con todo el código dentro, así que aún así no debería usarse el with.

El problema que he visto en varios sitios es este:
Código Delphi [-]
procedure TForm3.HazAlgo();
with Form1, Form2 do begin
  ... un chorro código aquí
  ClientWitdth := 300;
  ... un chorro código aquí
end;
end;
A qué se refiere el Clientwidth, a Self, a Form1, a Form2... y las rutinas que se llaman dentro del with, ¿donde están definidas?.

Pues eso, claridad, legibilidad, seguridad... Mejor "sin" que "con" ;), y si conduces, mejor "sin" :p.

Al González 17-07-2015 01:16:50

Yo insisto en que hay que quitarle todo lo malo (anidación, cabecera multivalor y ausencia de marcador) y agregarle un marcador/calificador especial para los miembros referidos dentro del bloque. De esa manera se solucionan TODOS los problemas que conlleva el uso de With. Aquí una propuesta que va en esa línea de razonamiento.

Hace un año tuve el placer de debatir el tema con Jeroen Pluimers (recomiendo esta lectura): http://www.delphifeeds.com/go/f/1138...hiFeeds.com%29

Estoy seguro de que mi boba propuesta puede mejorarse con la participación de muchos otros colegas. ¿Se animan también a corregir el With?

Saludos. :)

Casimiro Notevi 17-07-2015 10:14:04

Cita:

Empezado por Al González (Mensaje 494552)
Yo insisto en que hay que quitarle todo lo malo (anidación, cabecera multivalor y ausencia de marcador) y agregarle un marcador/calificador especial para los miembros referidos dentro del bloque. De esa manera se solucionan TODOS los problemas que conlleva el uso de With. Aquí una propuesta que va en esa línea de razonamiento.

Hace un año tuve el placer de debatir el tema con Jeroen Pluimers (recomiendo esta lectura): http://www.delphifeeds.com/go/f/1138...hiFeeds.com%29

Estoy seguro de que mi boba propuesta puede mejorarse con la participación de muchos otros colegas. ¿Se animan también a corregir el With?

Saludos. :)

^\||/^\||/^\||/

Ñuño Martínez 17-07-2015 14:39:21

Cita:

Empezado por Al González (Mensaje 494552)
Yo insisto en que hay que quitarle todo lo malo (anidación, cabecera multivalor y ausencia de marcador) y agregarle un marcador/calificador especial para los miembros referidos dentro del bloque. De esa manera se solucionan TODOS los problemas que conlleva el uso de With. Aquí una propuesta que va en esa línea de razonamiento.

Hace un año tuve el placer de debatir el tema con Jeroen Pluimers (recomiendo esta lectura): http://www.delphifeeds.com/go/f/1138...hiFeeds.com%29

Estoy seguro de que mi boba propuesta puede mejorarse con la participación de muchos otros colegas. ¿Se animan también a corregir el With?

Saludos. :)

Mi madre, ya no me acordaba. Incluso comenté algo. ¡Y leí cosas! :eek: ¿Y fue hace poco más de un año? Tengo problemas de memoria. :(

De todas formas, como dije en su momento, el uso de las comillas no me convence. En la conversación que enlaza Lepe alguien comenta que VisualBasic prefija con un punto. Sería una adición interesante.

olbeup 20-07-2015 12:46:01

Cita:

Empezado por Lepe (Mensaje 494543)
Coincido en que hay que prohibirlo.

http://stackoverflow.com/questions/7...with-in-delphi

Si se usa como :
Código Delphi [-]
with Tquery.create(nil) do begin 
  open
  sql := 'blah blha';
  ExecSql;
  Free;
end;
Pues vale... aunque eso debería ser una función llamada ExecSql( const sql : string) con todo el código dentro, así que aún así no debería usarse el with.

El problema que he visto en varios sitios es este:
Código Delphi [-]
procedure TForm3.HazAlgo();
with Form1, Form2 do begin
  ... un chorro código aquí
  ClientWitdth := 300;
  ... un chorro código aquí
end;
end;
A qué se refiere el Clientwidth, a Self, a Form1, a Form2... y las rutinas que se llaman dentro del with, ¿donde están definidas?.

Pues eso, claridad, legibilidad, seguridad... Mejor "sin" que "con" ;), y si conduces, mejor "sin" :p.

El último objecto (Form2) es el que prevalece y el ClienteWidth sólo afectara el cambio al Form2.
Código Delphi [-]
with Form1, Form2 do begin
es igual a
Código Delphi [-]
with Form1 do
  with Form2 do begin
    ClientWitdth := 300;
    ...
    ...
  end;
Si los objetos obj1, obj2, objn son iguales, sólo afectara al último objecto, si tienes todo esto claro, pues NO tendrás problema con el with.

ejemplo:
Código Delphi [-]
type TDate = record
  Day: Integer;
  Month: Integer;
  Year: Integer;
end;
var OrderDate: TDate;
La siguiente con la declaración.
Código Delphi [-]
with OrderDate do
  if Month = 12 then
  begin
    Month := 1;
    Year := Year + 1;
  end
  else
    Month := Month + 1;
Esto es equivalente a
Código Delphi [-]
if OrderDate.Month = 12 then
begin
  OrderDate.Month := 1;
  OrderDate.Year := OrderDate.Year + 1;
end
else
  OrderDate.Month := OrderDate.Month + 1;
Y si quieres coger el año del Form2
Código Delphi [-]
with OrderDate do
  begin
    Year := Form2.Year;
    ...
  end;
Un saludo.


La franja horaria es GMT +2. Ahora son las 21:03:28.

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