como bien dice el compañero duidisola, no defines como tienes organizada la base de datos, pero bueno, me he creado un pequeño proyecto con una base de datos para simular como se podría hacer:
Parto de la base de que tenemos una base de datos a la que aquí llamo tconsultas, con dos campos que forman la tabla principal, dia + Hora, que definen las consultas confirmadas.
Este es el código, por supuesto es bastante mejorable , pero bueno , funcionar ,funciona..
Código:
unit foro2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, Buttons, Mask;
type
TForm3 = class(TForm)
BitBtn1: TBitBtn;
Tconsultas: TTable;
ListBox1: TListBox;
TconsultasFecha: TDateField;
TconsultasHora: TTimeField;
TconsultasPaciente: TStringField;
edfecha: TMaskEdit;
procedure BitBtn1Click(Sender: TObject);
private
function formateahora(Segundos: Integer): String;
function conviertehora( nhora:integer ):ttime;
{ Private declarations }
public
{ Public declarations }
end;
var
Form3: TForm3;
const n_consulta = 30; // duración de las consultas (en minutos)
h_comienzo_jornada = 8; // hora de comienzo de la jornada laboral
h_fin_jornada = 14; // hora de finalización de la jornada laboral
implementation
{$R *.dfm}
procedure TForm3.BitBtn1Click(Sender: TObject);
var hora_control : integer;
begin
tconsultas.open;
// nos posicionamos en el dia a visualizar
hora_control := h_comienzo_jornada*60*60; // en segundos
// controlamos que la última visita sea la de fin_jornada - minutos última
// visita
while (Hora_control <= ( (h_fin_jornada*60*60)-(n_consulta*60)) ) do
begin
// buscamos en la base de datos si la hora (hora_control) está libre.
if tconsultas.findkey( [strtodate( edfecha.text),
conviertehora(hora_control)] ) then
listbox1.items.add( formateahora( hora_control) +' --- si que tiene visita '+tconsultaspaciente.value ) else
listbox1.items.add( formateahora( hora_control )+' --- libre ');
// sumamos a la hora de control los minutos transcurridos.
hora_control := hora_control + ( n_consulta * 60 );
end;
end;
function tform3.formateahora(Segundos: Integer): String;
var
horas,
minutos: Integer;
dhora : tdatetime;
begin
horas := Segundos div 3600;
minutos := Segundos div 60 mod 60;
dhora := encodetime( horas,minutos,0,0);
Result:= formatdatetime('hh:mm', dhora );
end;
//
function tform3.conviertehora( nhora:integer ):ttime;
begin
result := strtotime( formateahora(nhora) );
end;
end.
El código se podría optimizar en el sentido de que se efectuan demasiados 'pinchazos' a la base de datos, es decir, se efectuan tantas búsquedas (Findkey) como intervalos existan en el día, lo cual es muy mejorable , pero como base puede servir.
Espero te pueda aportar un poco de luz este código a tu problema, saludos...