Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Como sería ese PHP en delphi? (https://www.clubdelphi.com/foros/showthread.php?t=58800)

cslbcn 01-08-2008 10:19:59

Como sería ese PHP en delphi?
 
Hola. Quiero hacer una estructura repetitiva en la cual el nombre de un objeto vaya tomando diferentes nombres:

tengo una caja de texto con un name: textbox1
en php tendría esta forma:

Código PHP:

for ($iPos=1;$iPos<10;$iPos++)
{
echo 
"<input type='text' name='textbox.$iPos'";


Así, mientras la variable $iPos sea más pequeño que 10, mostrará una caja de texto con un nombre diferente cada vez (textbox1, textbox2, textbox2...)

Ese código php cómo se mostraría en lenguaje Delphi?

Gracias :)
Saludos

Ñuño Martínez 01-08-2008 10:29:47

¿Exactamente dónde tienes el problema? Porque el bucle es bien simple, o eso me parece.

cslbcn 01-08-2008 10:36:15

el problema es como se escribe en delphi

dec 01-08-2008 12:20:16

Hola,

El bucle se escribe de una forma muy similar:

Código Delphi [-]
var
  i: integer;
begin
  for i := 0 to i <= 10 do begin
    // Here your code   
  end;
end;

cslbcn 01-08-2008 12:26:57

gracias por la respuesta, pero lo que mas me interesaría es saber como se le cambia el nombre a un objeto dentro del bucle

en php es:
name='textbox.$iPos'

y en delphi?

dec 01-08-2008 12:40:02

Hola,

Bueno. Antes de nada deja que rectifique el código del bucle que he mostrado antes, y es que, ni siquiera compilaría. Últimamente escribo más PHP que Delphi, de ahí el error que se aprecia. He aquí el bucle modificado:

Código Delphi [-]
var
  i: integer;
begin
  for i := 0 to 10 do begin

  end;
end;

La diferencia está en la condición "i <= 10", que, en Delphi, no está permitida. Otrosí, es posible indicar un entero, de forma que el bucle terminará cuando "i" alcance su valor.

Respecto de cambiar el nombre de un objeto... tú sabrás para qué demonios quieres hacerlo (claro está, por otro lado), pero, en todo caso, es posible y aquí se muestra cómo:

Código Delphi [-]
var
  i: integer;
begin
  for i := 0 to Self.ControlCount-1 do begin
    if(Self.Controls[i] is TEdit) then begin
      TEdit(Self.Controls[i]).Name :=
       TEdit(Self.Controls[i]).Name + IntToStr(i);
    end;
  end;
end;

El anterior código recorre todos los controles de un supuesto formulario. A cada paso por el bucle se comprueba si un determinado control es un "TEdit". Y, si es así, cambiamos el nombre del "TEdit", siendo dicho nombre el que ya tiene, añadiéndole el valor de "i".

Dicho más pronto, el operador de concatenación de cadenas, que en PHP es un punto ".", en Delphi es un signo más "+".

cslbcn 06-08-2008 10:46:35

Hola.
la palabra "self" que aparece el el codigo no la detecta. dice que una expresion no identificada..

tcp_ip_es 06-08-2008 11:05:25

Self es el nombre del formulario que contiene los elementos de los cuales estamos hablando.

Por si acaso para que no haya confusiones....
Edit.name es el Nombre del objeto
Edit.text es el valor que contiene el objeto

cslbcn 06-08-2008 11:10:56

es que creo que no me comprendió bien.

Los Edits no están creador inicialmente. A medida que hace el for, van apareciendo los cajones de texto.

En php, para que algo se muestre en pantalla es con "echo". Cual es su equivalente en delphi?

tcp_ip_es 06-08-2008 11:27:26

el equivalente es sería :

Código:

showmessage('Hola Mundo');
o si es el contenido de un edit....

Código:

showmessage(Edit1.text)
No se si te comprendemos lo que quieres hacer....

cslbcn 06-08-2008 11:36:47

Explico mi caso particular.
Se trata de un calendario. Usando un datetimepicker se selecciona una fecha (06/08/2008), por ejemplo.

Cuando la fecha ha sido seleccionada, se pulsa un botón y cuando se pulsa el botón debe ejecutar este código (en PHP):

Código PHP:

for ($iPos=1;$iPos<10;$iPos++) 

    echo 
"<input type='text' name='textbox.$iPos'"


Este código significa que iPos=1 y mientra iPos sea inferior a 10, la variable IPos valdrá +1 en cada ejecución del FOR. Si la condición se cumple, en la pantalla veremos aparecer un <input type='text' name="iPos"> con el nombre del objeto sujeto a la variable.

>Se inicia el programa. Hace el primer input y sale un cuadro que se llama 1.
Como que 1 es inferior a 10 me crea otro cuadro que se llama 2...

No creo que en delphi varie mucho a PHP. Algo como:
Código Delphi [-]
begin
  for i := 0 to 10 do begin
      TEdit.Name + IntToStr(i);
  end;
  end;

end;

no serviría?


P.D: faltan los controladores para que haga el salto de linea cuando llegue a domingo.

tcp_ip_es 06-08-2008 12:13:05

Supongo que querrás algo como esto..... dinos algo

Código:

procedure TForm1.Button1Click(Sender: TObject);
var i,cizq,ctop:integer;
begin
 cizq:=10;
 ctop:=10;
 for i:=0 to 10 do
  begin
  with TEdit.Create(Self) do
    begin
    Parent := form1;
    Top := ctop;
    Left := cizq;
    Width := 100;
    Name := 'Edit' + inttostr(i);
    Text := 'Dentro Edit ' + inttostr(i);
    ctop:=ctop +(Height+15);
    end;
  end;
end;


cslbcn 06-08-2008 12:16:10

with TEdit.Create(Self) do

Dice que el Self: Undeclared Indentifier

tcp_ip_es 06-08-2008 12:21:32

es muy raro que Self no te lo reconozca.... bueno cambialo por el nombre de tu formulario por ejemplo ...

Código:

with TEdit.Create(form1) do

cslbcn 06-08-2008 12:26:50

Excelente! Funciona a la perfeccion!

Muchisimas gracias de nuevo amigo.
Creo que te voy a contratar :D

cslbcn 07-08-2008 11:13:10

!!!!!!!
Hola. El código funciona correctamente, pero hoy estaba haciendo el calendario para mas de un mes y me ha salido un error.
Cuando se crean los Edit en el primer mes, los Name de cada cajon se quedan guardados en memoria, entonces cuando selecciono el segundo mes, me sale un error y dice que Edit1 ya existe. Los nombres se quedan grabados y no deja repetirlos.

Esto se puede solucionar liberando la memoria o algo parecido?

tcp_ip_es 07-08-2008 11:49:40

Logicamente si están creados no puedes crear otros con el mismo nombre. Como realmente no se lo que haces tampoco te puedo orientar.... pero puedes hacer lo siguiente; Buscar el componente si esta creado no lo creas y si no lo está lo creas.

Código Delphi [-]
  
//donde editx es el nombre de tu componente..
if form1.ContainsControl(Tedit(findcomponent('editx'))) then 
 showmessage('está')
else 
 showmessage('no está');

Para destruir un edit pues sencillo....

Código Delphi [-]
form1.controls[x].destroy; // donde x es el número de componente creado

cslbcn 07-08-2008 12:05:50

mirar si está creado no serviría porque siempre detectaría que edit1 hasta edit31 existe y haría más codigo.

Me decanto más por la destruccion del edit. Pero donde pones "x" es el numero de componente, si es edit1, pongo: form1.controls[edit1].destroy; no?

tcp_ip_es 07-08-2008 12:21:37

No, x es el número por orden de creación del componente. aunque si quieres también puedes utilizar lo siguiente:

Código Delphi [-]
form1.findcomponent('editx').destroy;

Dónde editx es el nombre del componente a destruir. Ya me dirás como te va....

cslbcn 07-08-2008 12:40:36

mmmm, que falla?

Código Delphi [-]
for i:=1 to 29 do
begin
    form1.findcomponent('edit + inttostr(i)').destroy;

[...]


La franja horaria es GMT +2. Ahora son las 12:16:47.

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