Ir al contenido


Foto

Recomendaciones de como llevar una GUI planificador


  • Por favor identifícate para responder
13 respuestas en este tema

#1 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 09:57

Pues eso: ando un poco lerdo (medio bobo) y ya me entra la duda de como encarar de forma "amigable" y relativamente sencilla cierta parte de un sistema que estoy realizando.

 

Necesito llevar una especie de "planificador de eventos" y si bien existe en CT una suite de componentes que "facilita" las cosas (Se llama PlanIt) no me termina convenciendo su forma de agregar eventos (de hecho, ni pude... daba error y al restablecer las cosas no aparecía nada), y que requiera forzozamente de una especie de base de datos a la que no le encuentro forma de como usar ni aprovechar, y ni le entiendo en cómo ni cuando se conecta, recupera ni almacena. La verdad es que no le entendí a la suite. :(

Una lástima.

 

La cuestión es que tal planificador debe ser semanal laborable. Es decir: Lunes a a Viernes, y de éstos días sólo requiero una franja horaria ya definida. Y más que nada lo que se espera registrar es un "recordatorio" de cuando el sistema tiene que efectuar procesos automáticos. Se espera que tal proceso pueda configurarse así:

 

* Detallado por día: X veces por día en horarios definidos por el usuario o bien que el sistema planifique esas x veces distribuído en el rango de horario.

* Fijado semanalmente: Que se fije que de lunes a viernes siempre las x veces por día; manualmente o de forma automática distribuído.

 

No se amerita el diseño basado en el calendario. Es decir, que esto no esté ligado puntualmente a una semana, ni mes concreto... como por ejemplo: Martes 5 de enero 2016 hay anotado 5 "eventos". Martes 12 de enero 2016 habrá anotado 2 "eventos". No... eso no es lo que se busca. Simplemente la idea es decir "Los Martes son 5 veces", "Los jueves son 2 veces", o bien, "De lunes a viernes se distribuyen 4 eventos a lo largo del día".

 

Si el usuario cambia algo en el planificador, se descarta lo anterior y empieza a correr desde la nueva configuración. No se espera llevar un registro de como se había configurado antes ni del historial de cambios.

 

¿Se me entiende?

Estuve pensando un poco en como "presentar" esto al usuario y en como ofrecer una manera relativamente sencilla para que el usuario pueda configurarlo a gusto. Por defecto estaba pensando en que esté configurado en modo "semanalmente distribuído". Pero claro, mis luces ya están apagadas...

 

¿Que recomendaciones pueden dar? ¿Necesariamente pasaría por emplear una Grid? ¡Tampoco es para ponerme a hacer mi propio componente visual! Ya dispongo de una clase propia que de forma abstracta lleva registro de esto, más el tema visualmente es lo que no le capto forma.

 

Saludos,


  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 enero 2016 - 05:19

Amigo Marchello,

 

Te recomiendo que veas el componente TPlaner de TMS Software, seguro te dará una idea de como hacerlo.

 

Saludos


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 05:32

Amigo Marchello,

 

Te recomiendo que veas el componente TPlaner de TMS Software, seguro te dará una idea de como hacerlo.

 

Saludos

 

Veré algunas screenshots, y si es posible descargar algunas demos gratuitas porque:

 

1. Uso CodeTyphon y TMS son exclusiva para Delphi.

2. Es pago y estoy en modo pobre :(

 

He estado buscando entre los tantos componentes como Planner, Scheduler, WeekEvents, etc. Y Si: existe una suite entera pensada para cosas como éstas que viene el CodeTyphon que en principio parece bastante buena. Pero no le encuentro forma de poner en marcha, aún cuando logré sortear algunos problemitas. Y requiere de una conexión a base de datos, que ni en ningún lado dice que motor es (ni se le puede configurar... sólo indicar un nombre de tabla). La verdad es que no le entiendo.

 

Saludos,


  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 05 enero 2016 - 05:46

Veré algunas screenshots, y si es posible descargar algunas demos gratuitas porque:

 

1. Uso CodeTyphon y TMS son exclusiva para Delphi.

2. Es pago y estoy en modo pobre :(

 

He estado buscando entre los tantos componentes como Planner, Scheduler, WeekEvents, etc. Y Si: existe una suite entera pensada para cosas como éstas que viene el CodeTyphon que en principio parece bastante buena. Pero no le encuentro forma de poner en marcha, aún cuando logré sortear algunos problemitas. Y requiere de una conexión a base de datos, que ni en ningún lado dice que motor es (ni se le puede configurar... sólo indicar un nombre de tabla). La verdad es que no le entiendo.

 

Saludos,

 

Asi es, por eso es que comenté que te daría una idea, no te sirven porque no son para CodeTyphon, son bastante fáciles de entender, yo lo intenté usar pero solo utilicé la versión demo, el proyecto que lo requería no se concretó y no hubo "money" para comprar la suite.

 

Saludos


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 05 enero 2016 - 06:05

Yo me iría al bajo nivel usando los eventos como punteros a funciones. Puedes definir un puntero general a una función y controlar el tipo de evento por parámetro, por ejemplo. En realidad no se que necesitas con exactitud por lo que no puedo precisar más, pero seguro que entiendes la idea. Esto te independiza de componentes de terceros y de extraño uso.

 

 

Saludos.


  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 06:05

Asi es, por eso es que comenté que te daría una idea, no te sirven porque no son para CodeTyphon, son bastante fáciles de entender, yo lo intenté usar pero solo utilicé la versión demo, el proyecto que lo requería no se concretó y no hubo "money" para comprar la suite.

 

Saludos

 

Entre algunas imágenes se ven algunas cosas que se le parece al TVpDayView y al TVpWeekView de la suite PlanIt que estuve probando. Lamentablemente no he logrado entenderla, y lo más importante: en agregar los "eventos". De algún modo esquivé unos errores y logré que aparezca una ventana propia que ofrece el componente, que aparentemente, es para añadir los eventos/tareas pero ni caso: no lo hacía.. no se agregan. Y además dicha interfaz tenía ya un diseño tan peculiar que desentona (y no se puede editar) con mi diseño.

Documentación del componente: CERO.

 

Saludos,


  • 0

#7 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 09:10

No te entendi muy bien

 

Igual es normal, yo tambien soy un queso para armar las ventanitas lindas y amigables :)

 

Agarre CT y meti un FlowPanel, un Header arriba con cada dia, y un ListView por dia

 

Queda esto, no se me ocurre mucho mas 

 

86cdb796bd4a6da005301c7304a33b96o.jpg


  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 09:31

No te entendi muy bien

 

Igual es normal, yo tambien soy un queso para armar las ventanitas lindas y amigables :)

 

Agarre CT y meti un FlowPanel, un Header arriba con cada dia, y un ListView por dia

 

Queda esto, no se me ocurre mucho mas 

 

86cdb796bd4a6da005301c7304a33b96o.jpg

 

Mi cabeza me andaba llevando hacia probar con grids. Tu imagen me pinta bien. Lo que me llama la atención es el TFlowPanel. No lo conozco, es más, al buscarlo entre los componentes no lo veo instalado. Si en cambio encuentro extensiones, o mejoras dadas por suites propias. Como ser TCyFlowPanel de la suite Cindy Visual. Estimo que debe ser bastante similar al de base sólo que con más pinturita. Quizá está disponible para instalarlo... en CT 5.5 no está en la barra, según veo tu tienes 5.6 asi que puede ser que algo que ha cambiado de versión a otra.

 

Lo que ando pensando es como permitirle al usuario que pueda decidir si "programa" los eventos por día a día si prefiere hacerlo semanalmente (es decir: fijar para todos los días los eventos a la misma hora). La técnica fácil es disponer un combobox y que elija opción y en base a éste habilitar unos u otros controles. Pero si pudiera pensar en una forma de aprovechar la propia interfaz "almanaque" para hacerlo sería un goce. No quisiera llenar de controles y que impliquen una seguidilla de pasos que quizá puedan ser innesarios si se pudiera hacer todo de una.

 

Saludos,


  • 0

#9 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 10:00

En realidad me hubiese gustado mas usar el TGridPanel de Delphi, pero al parecer no hay port en Lazarus; o por lo menos ninguno cuyo nombre sugiera algo. En realidad hay una buena cantidad de paneles que vaya a saber uno para que sirven :)

No se bien que tenes en mente para la parte de carga de eventos

 

Yo creo que simplemente cuando estoy cargando un evento, elijo "Miercoles tal cosa" para el planificador diario, o "todos los dias" si fuera semanal

 

Por que tendrias que habilitar unos u otros controles? No es cargar el mismo evento para cada dia a la misma hora?


  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 05 enero 2016 - 10:30

En realidad me hubiese gustado mas usar el TGridPanel de Delphi, pero al parecer no hay port en Lazarus; o por lo menos ninguno cuyo nombre sugiera algo. En realidad hay una buena cantidad de paneles que vaya a saber uno para que sirven :)

No se bien que tenes en mente para la parte de carga de eventos

 

Yo creo que simplemente cuando estoy cargando un evento, elijo "Miercoles tal cosa" para el planificador diario, o "todos los dias" si fuera semanal

 

Por que tendrias que habilitar unos u otros controles? No es cargar el mismo evento para cada dia a la misma hora?

 

Aún no lo tengo muy pensado.

Es cierto, el evento se resume en un único proceso que se repite x veces al día. La idea es que el usuario pueda jugar con su programación, configurando para que pueda indicar día a día si quiere variar las horas entre un día y otro. O bien si elije hacerlo semanalmente de modo que todos los días tenga la misma programación definida.

La diferencia está en que si se opta por día a día debo de preveer una forma de entrada que permita indicar por cada día:

1. La frecuencia del evento.

2. Si se desea asignar manualmente las horas debe hacerlo por cada vez. Y en caso de preferir que el sistema proponga de forma automática distribuído de manera "uniforme" a lo largo del día.

 

Si se opta por configurarlo semanalmente en lugar de configurar 5 veces (5 días de la semana) se pide directamente la frecuencia y el horario de cada una.

 

Por eso andaba pensando en algún juego de componentes.

 

Lo que me ha quedado pensando es el FlowPanel ¿Para que lo usaste? ¿Está alineado al cliente? ¿El Header y los demás componentes están metidos en él? Tu imagen me da entender eso... Nunca había escuchado sobre este y quice imitar tu interfaz con el FlowPanel de Cindy y cuando intento poner el Header o el ListView si bien se muestra en tiempo de diseño en el inspector de objetos no figuran... :wacko:  Quizá sea que al ser Cindy sólo "soporta" Cindy dentro... Tendré que probar.

 

Saludos,


  • 0

#11 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 06 enero 2016 - 07:01

Hola Delphius, te he desarrollado un pequeño y muy simple ejemplo en delphi XE7  (sin optimizar código), usando un StringGrid que se llena a partir de una base de datos de Firebird utilizando FireDAC. No debería haber problemas para llevarla a CT, puesto que no usa componentes de terceros.

 

Al hacer dobleclick sobre una celda, si esta contiene un evento, entonces  se podrá editar en un form modal. Si la celda en cuestión no tiene evento entonces se abre el form para agregar un nuevo evento.

 

Igual podrías agregar botones al panel superior y pasarles los procedimientos AgregarEvento o EditarEvento.

 

Base de datos:


sql
  1. CREATE GENERATOR GEN_EVENTOS_ID;
  2. SET GENERATOR GEN_EVENTOS_ID TO 107;
  3.  
  4. CREATE TABLE EVENTOS (
  5. ID_EVENTO INTEGER NOT NULL,
  6. DIA INTEGER,
  7. HORA TIME,
  8. EVENTO VARCHAR(20)
  9. );
  10.  
  11. ALTER TABLE EVENTOS ADD CONSTRAINT UNQ_EVENTOS UNIQUE (DIA, HORA);
  12.  
  13. ALTER TABLE EVENTOS ADD CONSTRAINT PK_EVENTOS PRIMARY KEY (ID_EVENTO);
  14.  
  15.  
  16. SET TERM ^ ;
  17.  
  18. CREATE TRIGGER EVENTOS_BI FOR EVENTOS
  19. ACTIVE BEFORE INSERT POSITION 0
  20. AS
  21. BEGIN
  22. IF (NEW.id_evento IS NULL) THEN
  23. NEW.id_evento = gen_id(gen_EVENTOS_id,1);
  24. END
  25. ^
  26. SET TERM ; ^

Código form principal:


delphi
  1. //Main form
  2.  
  3. type
  4. TfrmMain = class(TForm)
  5. Panel1: TPanel;
  6. Grid: TStringGrid;
  7. qHoras: TFDQuery;
  8. FDGUIxWaitCursor: TFDGUIxWaitCursor;
  9. qEventos: TFDQuery;
  10. FDPhysFBDriverLink: TFDPhysFBDriverLink;
  11. Con: TFDConnection;
  12. procedure FormCreate(Sender: TObject);
  13. procedure GridDblClick(Sender: TObject);
  14. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  15. private
  16. procedure InicializarHoras;
  17. procedure InicializarDias;
  18. procedure InicializarEventos;
  19. procedure LimpiarGrid;
  20. procedure InicializarGrid;
  21.  
  22. function IndiceFila(const AHora: string): smallInt;
  23. function IndiceDia(const ADia: string): smallInt;
  24.  
  25. procedure EditarEvento;
  26. procedure AgregarEvento;
  27. public
  28. { Public declarations }
  29. end;
  30.  
  31. var
  32. frmMain: TfrmMain;
  33.  
  34. implementation
  35.  
  36. {$R *.dfm}
  37.  
  38. uses UEvento;
  39. { TForm1 }
  40.  
  41. procedure TfrmMain.InicializarHoras;
  42. var
  43. i: integer;
  44. begin
  45. i := 1;
  46. qHoras.Close;
  47. qHoras.Open();
  48. qHoras.Last;
  49. Grid.RowCount := qHoras.RecordCount + 1;
  50. qHoras.First;
  51. while not qHoras.Eof do
  52. begin
  53. Grid.Cells[0, i] := qHoras.FieldByName('hora').Text;
  54. qHoras.Next;
  55. Inc(i);
  56. end;
  57. end;
  58.  
  59. procedure TfrmMain.InicializarDias;
  60. const
  61. Dias: array [1 .. 5] of string = ('LUNES', 'MARTES', 'MIÉRCOLES', 'JUEVES',
  62. 'VIERNES');
  63. var
  64. i: integer;
  65. begin
  66. for i := 1 to 5 do
  67. begin
  68. Grid.Cells[i, 0] := Dias[i];
  69. end;
  70. end;
  71.  
  72. procedure TfrmMain.InicializarEventos;
  73. begin
  74. qEventos.Close;
  75. qEventos.Open();
  76. qEventos.First;
  77. while not qEventos.Eof do
  78. begin
  79. Grid.Cells[qEventos.FieldByName('dia').AsInteger,
  80. IndiceFila(qEventos.FieldByName('hora').Text)] :=
  81. qEventos.FieldByName('evento').Text;
  82. qEventos.Next
  83. end;
  84. end;
  85.  
  86. procedure TfrmMain.AgregarEvento;
  87. var
  88. Dia: string;
  89. DiaInt: integer; // El tipo de dato en la db es entero
  90. Hora: TTime;
  91. Evento: string;
  92. begin
  93. Dia := Grid.Cells[Grid.Col, 0];
  94. DiaInt := IndiceDia(Dia);
  95. Hora := strToTime(Grid.Cells[0, Grid.Row]);
  96. Evento := '';
  97.  
  98. if TfrmEvento.Ejecutar(Dia, Hora, Evento, 'Agregando evento') = mrok then
  99. begin
  100. qEventos.Insert;
  101. qEventos.FieldByName('dia').AsInteger := IndiceDia(Dia);
  102. qEventos.FieldByName('hora').Value := Hora;
  103. qEventos.FieldByName('Evento').AsString := Evento;
  104. qEventos.Post;
  105. InicializarGrid;
  106. end
  107. end;
  108.  
  109. function TfrmMain.IndiceDia(const ADia: string): smallInt;
  110. const
  111. Dias: array [1 .. 5] of string = ('LUNES', 'MARTES', 'MIÉRCOLES', 'JUEVES',
  112. 'VIERNES');
  113. var
  114. i: integer;
  115. begin
  116. for i := 1 to 5 do
  117. if Dias[i] = ADia then
  118. begin
  119. result := i;
  120. break;
  121. end;
  122. end;
  123.  
  124. function TfrmMain.IndiceFila(const AHora: string): smallInt;
  125. var
  126. i: integer;
  127. begin
  128. for i := 1 to Grid.RowCount - 1 do
  129. begin
  130. if Grid.Cells[0, i] = AHora then
  131. begin
  132. result := i;
  133. break;
  134. end;
  135. end;
  136. end;
  137.  
  138. procedure TfrmMain.LimpiarGrid;
  139. var
  140. i: integer;
  141. begin
  142. for i := 0 to Grid.ColCount - 1 do
  143. Grid.Cols[i].Clear;
  144. end;
  145.  
  146. procedure TfrmMain.EditarEvento;
  147. var
  148. Dia: string;
  149. DiaInt: integer; // El tipo de dato en la db es entero
  150. Hora: TTime;
  151. Evento: string;
  152. begin
  153. Dia := Grid.Cells[Grid.Col, 0];
  154. DiaInt := IndiceDia(Dia);
  155. Hora := strToTime(Grid.Cells[0, Grid.Row]);
  156. Evento := Grid.Cells[Grid.Col, Grid.Row];
  157.  
  158. if Evento = '' then
  159. begin
  160. ShowMessage('No ha seleccionado un evento');
  161. Exit;
  162. end;
  163.  
  164. qEventos.Locate('Dia;Hora', VarArrayOf([DiaInt, Hora]), []);
  165.  
  166. if TfrmEvento.Ejecutar(Dia, Hora, Evento, 'Modificando evento') = mrok then
  167. begin
  168. qEventos.Edit;
  169. qEventos.FieldByName('dia').AsInteger := IndiceDia(Dia);
  170. qEventos.FieldByName('hora').Value := Hora;
  171. qEventos.FieldByName('Evento').AsString := Evento;
  172. qEventos.Post;
  173. InicializarGrid;
  174. end
  175. end;
  176.  
  177. procedure TfrmMain.GridDblClick(Sender: TObject);
  178. begin
  179. if Grid.Cells[Grid.Col, Grid.Row] <> '' then
  180. EditarEvento
  181. else
  182. AgregarEvento;
  183. end;
  184.  
  185. procedure TfrmMain.InicializarGrid;
  186. begin
  187. LimpiarGrid;
  188. InicializarHoras;
  189. InicializarDias;
  190. InicializarEventos;
  191. end;
  192.  
  193. procedure TfrmMain.FormCreate(Sender: TObject);
  194. begin
  195. InicializarGrid;
  196. end;
  197.  
  198. procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
  199. begin
  200. qHoras.Close;
  201. qEventos.Close;
  202. Con.Close;
  203. end;
  204.  
  205. end.

Código form edición


delphi
  1. type
  2. TfrmEvento = class(TForm)
  3. Label1: TLabel;
  4. Label2: TLabel;
  5. Label3: TLabel;
  6. cbxDias: TComboBox;
  7. dtpHora: TDateTimePicker;
  8. edtEvento: TEdit;
  9. btnOk: TButton;
  10. btnCancel: TButton;
  11. private
  12. { Private declarations }
  13. public
  14. class function Ejecutar(var ADia: string; var AHora: TTime;
  15. var AEvento: string; ACaption: string; AOwner: TComponent = nil)
  16. : TModalResult;
  17. end;
  18.  
  19. implementation
  20.  
  21. {$R *.dfm}
  22. { TfrmEvento }
  23.  
  24. class function TfrmEvento.Ejecutar(var ADia: string; var AHora: TTime;
  25. var AEvento: string; ACaption: string; AOwner: TComponent = nil)
  26. : TModalResult;
  27. begin
  28. if AOwner = nil then
  29. AOwner := Application.MainForm;
  30. with Create(AOwner) do
  31. try
  32. caption := ACaption;
  33. cbxDias.Text := ADia;
  34. dtpHora.Time := AHora;
  35. edtEvento.Text := AEvento;
  36. Result := ShowModal;
  37. if Result = mrOk then
  38. begin
  39. ADia := cbxDias.Text;
  40. AHora := dtpHora.Time;
  41. AEvento := edtEvento.Text;
  42. end;
  43. finally
  44. Free;
  45. end;
  46. end;
  47.  
  48. end.

La sentencia de qHoras es: SELECT DISTINCT HORA FROM EVENTOS ORDER BY HORA

 
La sentencia de qEventos es:  SELECT * FROM EVENTOS ORDER BY DIA, HORA
 

Es solo una idea.

 

Saludos.

 

PD: Adjunto archivo con ejecutable, DB y fuentes. Ajusta la ruta de la DB en el archivo ini. La DB tiene 100 registros agregados aleatoriamente.

Archivos adjuntos


  • 3

#12 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 06 enero 2016 - 11:02

¡Wilson te pasaste! Te super agradezco que te hayas tomado el tiempo para preparar un ejemplo. Voy a estudiarlo y ver que tal me sale a mi.

 

Saludos,


  • 0

#13 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 18 abril 2016 - 08:45

Marcelo, ya paso algun tiempo

 

Pudiste resolver? Ando muy interesado, como en el titulo se dice, en la parte GUI de esto

 

Yo tengo que hacer una "planilla Excel" con los horarios que dan clase los profesores de un gimnasio

 

Y mi idea fue usar un StringGrid. Click en la Celda, te trae un form, grabas el profe + la disciplina que imparte, eso divino

 

No le encuentro la vuelta a la presentacion, admito que soy bastante de cuerta para esto :)

 

Siempre dicen que las imagenes valen mas que mil palabras:

 

Esto es lo que tengo:

 

a7bf258a035ee70bd522c1e9849c7f0do.jpg

 

 

Me gustaria algo como esto (no me va mucho mejor con el paint que digamos...)
 
3b341f4aed7606647a6f0e36efa6c723o.jpg
 
 
 
Algun genio puede darme una idea? O deberia usar otro componente y StringGrid es de suicidas?

Editado por Agustin Ortu, 18 abril 2016 - 08:47 .

  • 0

#14 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 abril 2016 - 08:30

Hola Agustín, la verdad que no he podido dedicarme mucho a esto. Y no, no he podido darle forma definitiva a mi diseño. El ejemplo de Wilson es una aproximación Interesante, y es bastante probable que me termine inclinando a tomar prestado algunas cosas de su propuesta.

Al igual que tu pensaba en algo como tu segunda imagen, pero no he llegado a buen puerto todavía.

 

Mi caso es algo particular ya que la forma de entrada o de llenar tal "agenda" no es tan tradicional y eso me hace replantear otras opciones.

 

No se si es de Suicidas el StringGrid. Es racional pensar en uno. Al menos para mi caso, donde si bien el rango de horario es concreto, la naturaleza del problema hace medio impráctica tener tantas filas como horarios posibles. No me gusta mucho la idea de que se extienda demasiado "verticalmente".

Yo estaría volviendo a retomar esta parte recién dentro de una semana. Ando liado con mis tiempos.

 

Al igual que tu no se me da tan fácil el diseño de ventanas :

 

Saludos,


  • 1




IP.Board spam blocked by CleanTalk.