Как сравнить дату из ячейки стрингрида формата дд.мм.гггг со значение взятым из комбокса месяцем и из едита года? Без учета числа.
volvo
19.01.2010 22:37
Что значит "сравнить"? Найти, что больше, а что меньше? Или просто проверить, попадает ли заданная в СтрингГриде дата под месяц + год, определенные в Комбо/Эдит. Если первое - то тебе понадобится задать какой-то день, собрать дату, а потом - простым сравнением типов TDate.
Если второе - то разбей дату из СтрингГрида на месяц + год (MonthOf/YearOf), и сравнивай с заданными...
Atreides
20.01.2010 5:38
а вот как разбить дату из стрнггрида?
volvo
20.01.2010 9:44
Поскольку СтрингГрид хранит информацию в виде строки, то у тебя два пути: 1) с помощью Pos найти разделители даты (обычно это '/'), и взять из строки напрямую месяц и год. Это может подойти если дата в формате ShortString, т.е., вида 20/01/2010. Но работа на всех компьютерах не гарантируется, если установлен другой формат даты, скажем MM/DD/YYYY - пролетишь с этим способом.
2) сконвертировать строку в Дату (StrToDateTime) , указывая нужный формат, а потом из полученной даты функциями MonthOf/YearOf получить месяц и год. Этот способ подойдет для любого формата даты, хоть для ShortDate, хоть для LongDate...
Я бы выбрал второй вариант.
Atreides
20.01.2010 20:14
Да, не подумал, сразу, зря тему только открыл. Собрал дату вот так:
procedure TForm2.ComboBox1Change(Sender: TObject); var MonthSelected: Integer;
MonthSelected: Integer; //месяц MonthSelected1: string; begin data1:=Form2.StringGrid1.Cells[3,2]; Form2.Edit2.text:=Form2.StringGrid1.Cells[3,2];
MonthSelected := Form2.ComboBox1.ItemIndex + 1; //получаем значение месяца MonthSelected1:=FloatToStr(MonthSelected); data2:=MonthSelected1 + '.' +Edit1.text; Form2.Edit3.text:=data2; // if data1<>data2 then // ShowMessage('указанная дата занрузки не соотвествует');
// if data1=data2 then
Только проблема. Как мне у даты из СтрингГрида формата дд.мм.гггг отбить дни, чтобы сравнить уже дату формата мм.гггг? И еще проблема – у меня месяца которые просто единицы идут с нулем, а комбобокс мне возвращает просто одно число, как нолик подставить там, где это нужно? Как выплнить оставку от дальнейшего выполнения, если даты не соответствуют?
И еще немножко не в тему, но дабы не плодить темы. Есть текстовый файл, В нем в столбик уложены значения 13 символов длиной. Я разбиваю их на первые 7 и укладываю в стрингГрид, оставшиеся 6 во второй столбик, там, где только первых 7 я пропускаю. Вот написал, только пишет мне все подряд и то местами не все. В чем косяк, найти не могу.
procedure TForm5.Button1Click(Sender: TObject); var infile:textfile; s,str,cod7,cod6:string; x,num_lines:integer; line: string; i:integer;
begin Form5.StringGrid1.Cells[0,0]:='Семизначный код станции'; Form5.StringGrid1.Cells[1,0]:='Шестизначный код станции'; assignfile(infile, 'D:\КОАСУФР\tbk'); reset(infile); read(infile,str); while not Eof(infile) do begin if length(str) > 7 then for i:=1 to StringGrid1.RowCount-1 do begin // cod7:= copy(str,1,7); Readln(infile, str); Form5.StringGrid1.Cells[0,i]:=cod7; cod6:= copy(str,8,6); Form5.StringGrid1.Cells[1,i]:=cod6; Readln(infile, str); end; end; end; // Close(infile);
volvo
20.01.2010 20:36
Весь твой код (по первому вопросу) - ни о чем. Не надо показывать, как ты сделал, и спрашивать, как исправить... Ты скажи, ЧТО надо сделать. Итого: у тебя есть полная дата в Гриде, есть месяц, выбранный в Комбо, есть год (как он введен? Ты гарантируешь, что пользователь введет все 4 цифры, или он может и не сделать этого?) в Эдите. Это все, что известно на данный момент. Что тебе с этими тремя данными надо сделать? Я не понимаю, что значит "сравнить даты без учета дней". Без учета дней - это НЕ ДАТЫ. Формулируй вопрос как положено...
Цитата
Есть текстовый файл, В нем в столбик уложены значения 13 символов длиной. Я разбиваю их на первые 7 и укладываю в стрингГрид, оставшиеся 6 во второй столбик, там, где только первых 7 я пропускаю. Вот написал, только пишет мне все подряд и то местами не все.
Поразительная формулировка вопроса. Просто уникальная. А теперь перечитай ее сам, и попробуй понять, что там написано... Что за бред?
Цитата
В нем в столбик уложены значения 13 символов длиной
Запомним... значения длиной 13 (тринадцать!!!) символов.
Цитата
там, где только первых 7 я пропускаю
Чего пропускаешь? Какие только первых 7? Только что я тебе процитировал твое же утверждение, что символов в строке всегда 13, как их может быть "только первые 7"?
Atreides
20.01.2010 21:48
В файле местами есть строки только с 7 символами, их нужно пропустить. Строки в которых по 13 символов, разбить на первых 7 и оставшиеся 6 и уложить в СтрингГрид. Я вот пробовал писать, но запутался несколько. Получается выводить все строки подряд, а так не надо...
С датами - Сравниваю я по отчетному месяцу и году, потому число мне не важно. А на счет правильности ввода, я думал о маске или проверке на пустое поле, но пока не знаю как это сделать. Если месяц и год совпадают из загруженного с заявленными, то выполняет запросы, а если нет, то остановка и вывод сообщения.
Гость
24.01.2010 11:17
Есть возможность КомбоБокс возвращать значения типа 01,02,03...09? Или как можно определить, что если одна цифра, то подставить 0?
volvo
24.01.2010 11:59
Комбобокс ничего не возвращает. Ты берешь из него индекс выбранного значения? Индекс - это число. Числа 01 не существует. Существует только 1.
Если тебе надо, чтобы при выборе месяца в Комбобоксе, в Эдит записывалось значение с лидирующим 0 - то это делается так:
а если КомбоБокс вернет 10 или 12, и встанет 0, выйдет 012, тут как быть?
volvo
24.01.2010 18:04
Цитата
а если КомбоБокс вернет 10 или 12, и встанет 0, выйдет 012, тут как быть?
А если ты программу запустишь, и выяснится, что 0 ставится ТОЛЬКО когда надо дополнить до ДВУХ цифр, тогда как быть? Ты там двойку не заметил, или просто издеваешься?
Atreides
24.01.2010 19:14
ой, не заметил, я с телефона был... я и не знал, что вот так можно...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.