Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2016, 17:36   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

2-3 в день, а если 4-5? Мало ли. По нормальному наверно ни как. Хотя можно конечно в ячейке прорисовывать текст в несколько строк. И фон многоцветным сделать. А надо? Эту информацию можно отображать и в другом месте. Хотя бы в том же мемо. Прояви фантазию )) Но циферку типа 2 человека и можно где-то в уголочке ячейки нарисовать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.12.2016 в 17:41.
Аватар вне форума Ответить с цитированием
Старый 26.12.2016, 18:08   #12
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
2-3 в день, а если 4-5? Мало ли.
Ну на канве можно и пяти цветами в полоску закрасить ячейку даты )

Цитата:
Сообщение от Аватар Посмотреть сообщение
Хотя можно конечно в ячейке прорисовывать текст в несколько строк. И фон многоцветным сделать.
Ну вот и получается то же самое "ручное" рисование в таблице, что и на канве

Цитата:
Сообщение от Аватар Посмотреть сообщение
Эту информацию можно отображать и в другом месте. Хотя бы в том же мемо. Прояви фантазию )) Но циферку типа 2 человека и можно где-то в уголочке ячейки нарисовать
Можно и так, но цифры в уголке хуже визуально воспринимаются, чем цвета. А мемо вообще не даст понятной визуальной картины. Моя фантазия как раз к этому меня и привела от всяких мемо )
Кстати, с канвой можно и не в ячейке рисовать закрашиванием периоды отпусков, а под ними линиями. Это, пожалуй, даже нагляднее будет. Надо только отступы между неделями побольше сделать.
Ship_1 вне форума Ответить с цитированием
Старый 27.12.2016, 10:06   #13
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Попробуй поработать с моим календарем,может почерпнешь что-то оттуда.
create_calendar(po_kalen,start_p.Da te,end_p.Date);//Процедура создание календаря.
po_kalen- панель на которой создать календарь
start_p-Дата начала
end_p-Дата окончания

c_sel_dat:tcolor=clWhite;//Фон лейба , если дата выделена
c_this_dat:tcolor=$00C1FFFF;//Фон лейба при наведении мышки
sel_fon_dat:tcolor=clBlack;//Цвет текста при раскрашеном фоне c_sel_dat
day_nor_dat:tcolor=clWindow;//Общий цвет текста

P/S Мне он нужен был строго для определенной цели и строго 48 дней с сдвигом дат "от понедельника". М.б подход с массивом будет для тебя интересней. Поскольку внутрь массива с датой пихай что душе угодно и создавай календарь по массиву как угодно.
У меня массив заполняется внутри, в твоем случае можно создать календарь по заранее заполненому массиву. Для "отмерки" отпусков и прочей редакции значения будешь переписывать в массиве (массив можно создать сразу с данными за 2 года). Ячейки массива будут содержать сведения о том-кто в отпуске, каким цветом покрасить , период отпуска и.т.д. индефикатором будет являться дата. Вывод на экран организуется "рисованием" через create_calendar с дополнительным дроблением по месяцам (у меня только по неделям) за любой временной отрезок. Лейблы созданные процедурой "живые",так что можно повесить обработчики на клики и прочую активность пользователя. (пример в коде)
Мог косануть немного код, правил тут руками. Если что-то будет нужно пиши.
Код:
procedure Tosn_f.create_calendar(pans: Tpanel;d1,d2:Tdate);
var  razm,tops,lefts,fix_left,i,j,betw,inde,repeat_yes,font_siz,day_otstup:integer;
date:Tdate;
begin
setlength(massiv_kalendar,1,2);//Массив с датами
massiv_kalendar[0,0]:=datetostr(d1);//Дата
massiv_kalendar[0,1]:='0';//Активация даты (выбрана или нет)
date:=d1;
while datetostr(date)<>datetostr(d2) do
begin
date:=date+1;
setlength(massiv_kalendar,length(massiv_kalendar)+1,2);
massiv_kalendar[length(massiv_kalendar)-1,0]:=datetostr(date);
massiv_kalendar[length(massiv_kalendar)-1,1]:='0';
end;
i:=0;
razm:=20;
font_siz:=9;
tops:=razm+4;
fix_left:=round((pans.Width-razm*7)/2);
if fix_left>10 then   fix_left:=10;
lefts:=fix_left;
repeat_yes:=1;
while repeat_yes=1 do
begin
repeat_yes:=0;
  for i:=0 to pans.ComponentCount-1  do //Зачищаю панельку
  begin
     if (pans.Components[i].ClassType=Tlabel) then
    if ((pos('labess'+pans.Name,pans.Components[i].Name)<>0) or (pos('DNI_nedel'+pans.Name,pans.Components[i].Name)<>0)) then
    begin
    pans.Components[i].Free;
    repeat_yes:=1;
    break;
    end;
  end;
end;

 {$REGION 'Дни недели'}
for I := 1 to 7 do //Заполнение заголовка дней недели
    with TLabel.Create(pans) do
    begin
      left := lefts;
      top:=1;
      Autosize:=false;
      Transparent:=true;
      Height:=razm;
      Width:=razm;
      Font.Size:=font_siz;
      Alignment:=taCenter;
      Layout:=tlCenter;
      Font.Color:=clYellow;
      Color:=clBlack;
      Name := 'DNI_nedel'+pans.Name+IntToStr(I);
       case I of
       1:Caption :='ПН';
       2:Caption :='ВТ';
       3:Caption :='СР';
       4:Caption :='ЧТ';
       5:Caption :='ПТ';
       6:begin
       Caption :='СБ';
       Font.Color:=$00A4A4FF;
       end;
       7: begin
       Font.Color:=$00A4A4FF;
       Caption :='ВС';
       end;
       end;
      lefts:=lefts+razm;
      Parent := pans;
   end;
 lefts:=fix_left;
{$ENDREGION}





   try
   date:=d1;
   betw:=48;//Сколько выводить дней
   except
   exit;
   end;
   i:=1;
   j:=0;
   inde:=0;
   day_otstup:=0;

   while DayOfWeek(date)<>2 do  //Ищу понедельник,сдвиг по датам тут,все что до понедельника не активно
    begin
     date:=date-1;
     day_otstup:=day_otstup+1;
    end;
     betw:=betw-day_otstup;
    for I := 1 to day_otstup do
    begin
    inde:=inde+1;
    j:=j+1;
    with TLabel.Create(pans) do
    begin
      left := lefts;
      top:=tops;
      Autosize:=false;
      Transparent:=true;
      Height:=razm;
      Width:=razm;
      Font.Size:=font_siz-2;
      Alignment:=taCenter;
      Layout:=tlCenter;
      Enabled:=false;
      Color:=clBlack;
      Name := 'labess'+pans.Name+IntToStr(inde);
      showhint:=true;
      hint:=datetostr(date);
      Caption := inttostr(dayof(date));
      lefts:=lefts+razm;
      Parent := pans;
      date:=date+1;
   end;
    end;


   while betw>=0 do //Создаем лейблы дат
   begin
   inde:=inde+1;
   j:=j+1;
   with TLabel.Create(pans) do
    begin
      left := lefts;
      top:=tops;
      Autosize:=false;
      Height:=razm;
      Width:=razm;
      Font.Size:=font_siz;
      Transparent:=true;
      Alignment:=taCenter;
      Layout:=tlCenter;
      Name := 'labess'+pans.Name+IntToStr(inde);
      showhint:=true;
      hint:=datetostr(date);
      Caption := inttostr(dayof(date));
      lefts:=lefts+razm;
      Parent := pans;
      Cursor:=crHandPoint;
      Font.Color:=day_nor_dat;
      Color:=clBlack;
      OnMouseEnter:=MouseEnter_col_dat;
      OnMouseLeave:=MouseLeave_col_dat;
      OnClick:= calendar_dat_click;
      end;
   end;
    if j=7 then //Тут сдвигаем лейблы вниз если 1 неделя заполнена(вроде тут, 100 лет коду уже непомню что я курил когда писал код)
    begin
    j:=0;
    i:=i+1;
    tops := tops+razm;
    lefts:=fix_left;
    end;
    betw:=betw-1;
    date:=IncDay(date, 1);
   end;
end;
Наведение
Код:
procedure Tosn_f.MouseEnter_col_dat(Sender: TObject);
begin
if (Sender as TLabel).Color<>c_sel_dat then
begin
(Sender as TLabel).Color:= c_this_dat;
 (Sender as TLabel).Font.Color:= sel_fon_dat;
 (Sender as TLabel).Transparent:=false;
 (Sender as TLabel).Refresh;
end;
end;
Уход мышки

Наведение
Код:
procedure Tosn_f.MouseLeave_col_dat(Sender: TObject);
begin
if (Sender as TLabel).Color<>c_sel_dat then
 begin
  (Sender as TLabel).Color:= clBlack;
    (Sender as TLabel).Font.Color:= day_nor_dat;
  (Sender as TLabel).Transparent:=true;
  (Sender as TLabel).Refresh;
 end;
end;
Клик по лейблу
Код:
procedure Tosn_f.calendar_dat_click(Sender: TObject);
begin
  if ((Sender as TLabel).Parent as Tpanel).Name='po_kalen' then
  begin
  вдруг понадобится
  end;
end;
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2016 в 11:09.
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 13:59   #14
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Heneken87, спасибо, вначале тоже начал было делать на массивах и записях, но потом решил, что слишком уж заморочено получается При наличии времени обязательно погляжу код - вдруг действительно что интересное попадётся.

А, может, как-то можно завязать регионы на форме с OnMouseEnter и OnMouseLeave?

Последний раз редактировалось Ship_1; 27.12.2016 в 14:30.
Ship_1 вне форума Ответить с цитированием
Старый 27.12.2016, 14:43   #15
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
А, может, как-то можно завязать регионы на форме с OnMouseEnter и OnMouseLeave?
Напрямую можно если есть соответствующий Event OnMouse OnLeave.
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 14:44   #16
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
Heneken87, спасибо, вначале тоже начал было делать на массивах и записях, но потом решил, что слишком уж заморочено получается При наличии времени обязательно погляжу код - вдруг действительно что интересное попадётся.
А раскидывать доп.инфу по мемо и другим компонентам не заморочено? =)
Если по уму, то 60% кода написанного мной можно просто грохнуть, тебе это не нужно будет.
У тебя задача прочитать-создать по разному в зависимости от условий,а в приведенном коде: прочитать-упорядочить-создать по разному в зависимости от условий
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2016 в 14:52.
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 14:58   #17
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
Напрямую можно если есть соответствующий Event OnMouse OnLeave.
Есть просто форма.

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
А раскидывать доп.инфу по мемо и другим компонентам не заморочено?
Так я как раз и не раскидываю ничего. Будет всего одно что-то, содержащее в себе ФИО, дату начала отпуска и количество дней. Программа будет отрисовывать это на календаре. И всё.
Ship_1 вне форума Ответить с цитированием
Старый 27.12.2016, 15:11   #18
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
Есть просто форма.
Если на форме просто нарисовано, то только через позицию мышки.
Нет компонентов, нет событий.
Цитата:
Сообщение от Ship_1 Посмотреть сообщение
Так я как раз и не раскидываю ничего. Будет всего одно что-то, содержащее в себе ФИО, дату начала отпуска и количество дней. Программа будет отрисовывать это на календаре. И всё.
Просто идеальные условия для массива =)))))))))))))))
Пишу много и развернуто
Heneken87 вне форума Ответить с цитированием
Старый 27.12.2016, 16:55   #19
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
Сообщение от Heneken87 Посмотреть сообщение
Просто идеальные условия для массива =)))))))))))))))
Да. Пока не попробовать его заполнить датами из календаря в том виде, в котором он должен отображаться на экране. Как я уже написал выше - сначала я и делал массивом.
Ship_1 вне форума Ответить с цитированием
Старый 27.12.2016, 16:59   #20
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего еще в каком виде. Просто двумя датами С и По, которые специфически отображаются в календаре
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VB как правильно задать условие в запросе на выборку? SvarogIS Microsoft Office Access 3 26.12.2015 17:56
Построить график любой функции+как задать условие Kornegi Общие вопросы Delphi 10 13.10.2014 14:52
Как правильно задать функцию ? L6go1as C# (си шарп) 3 23.04.2014 20:03
как задать условие в Excel Юлия21 Помощь студентам 2 26.04.2012 11:58
Как задать условие DDiKey Microsoft Office Excel 3 23.03.2012 01:52