Помощь - Поиск - Пользователи - Календарь
Полная версия: Сравнение дат
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Atreides
Как сравнить дату из ячейки стрингрида формата дд.мм.гггг со значение взятым из комбокса месяцем и из едита года? Без учета числа.
volvo
Что значит "сравнить"? Найти, что больше, а что меньше? Или просто проверить, попадает ли заданная в СтрингГриде дата под месяц + год, определенные в Комбо/Эдит. Если первое - то тебе понадобится задать какой-то день, собрать дату, а потом - простым сравнением типов TDate.

Если второе - то разбей дату из СтрингГрида на месяц + год (MonthOf/YearOf), и сравнивай с заданными...
Atreides
а вот как разбить дату из стрнггрида?
volvo
Поскольку СтрингГрид хранит информацию в виде строки, то у тебя два пути:
1) с помощью Pos найти разделители даты (обычно это '/'), и взять из строки напрямую месяц и год. Это может подойти если дата в формате ShortString, т.е., вида 20/01/2010. Но работа на всех компьютерах не гарантируется, если установлен другой формат даты, скажем MM/DD/YYYY - пролетишь с этим способом.

2) сконвертировать строку в Дату (StrToDateTime) , указывая нужный формат, а потом из полученной даты функциями MonthOf/YearOf получить месяц и год. Этот способ подойдет для любого формата даты, хоть для ShortDate, хоть для LongDate...

Я бы выбрал второй вариант.
Atreides
Да, не подумал, сразу, зря тему только открыл. Собрал дату вот так:

procedure TForm2.ComboBox1Change(Sender: TObject);
var MonthSelected: Integer;

begin
MonthSelected := Form2.ComboBox1.ItemIndex + 1;
// Edit2.Text := FloatToStr(MonthSelected);
end;



procedure TForm2.Button2Click(Sender: TObject);
var
kod,provodka, ID_prov, oth :string; //
i,j, ID_OTCHM, coma:integer; //
vid, vnod, IDProv, god:string; //
namestat:string[30]; // имя станции
st:string; // запрос строкой
deb:string; // дебед - сумма
data1, data2:string;

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
Весь твой код (по первому вопросу) - ни о чем. Не надо показывать, как ты сделал, и спрашивать, как исправить... Ты скажи, ЧТО надо сделать. Итого: у тебя есть полная дата в Гриде, есть месяц, выбранный в Комбо, есть год (как он введен? Ты гарантируешь, что пользователь введет все 4 цифры, или он может и не сделать этого?) в Эдите. Это все, что известно на данный момент. Что тебе с этими тремя данными надо сделать? Я не понимаю, что значит "сравнить даты без учета дней". Без учета дней - это НЕ ДАТЫ. Формулируй вопрос как положено...

Цитата
Есть текстовый файл, В нем в столбик уложены значения 13 символов длиной. Я разбиваю их на первые 7 и укладываю в стрингГрид, оставшиеся 6 во второй столбик, там, где только первых 7 я пропускаю. Вот написал, только пишет мне все подряд и то местами не все.
Поразительная формулировка вопроса. Просто уникальная. А теперь перечитай ее сам, и попробуй понять, что там написано... Что за бред?
Цитата
В нем в столбик уложены значения 13 символов длиной
Запомним... значения длиной 13 (тринадцать!!!) символов.
Цитата
там, где только первых 7 я пропускаю
Чего пропускаешь? Какие только первых 7? Только что я тебе процитировал твое же утверждение, что символов в строке всегда 13, как их может быть "только первые 7"?
Atreides
В файле местами есть строки только с 7 символами, их нужно пропустить. Строки в которых по 13 символов, разбить на первых 7 и оставшиеся 6 и уложить в СтрингГрид. Я вот пробовал писать, но запутался несколько. Получается выводить все строки подряд, а так не надо...

С датами - Сравниваю я по отчетному месяцу и году, потому число мне не важно. А на счет правильности ввода, я думал о маске или проверке на пустое поле, но пока не знаю как это сделать. Если месяц и год совпадают из загруженного с заявленными, то выполняет запросы, а если нет, то остановка и вывод сообщения.
Гость
Есть возможность КомбоБокс возвращать значения типа 01,02,03...09? Или как можно определить, что если одна цифра, то подставить 0?
volvo
Комбобокс ничего не возвращает. Ты берешь из него индекс выбранного значения? Индекс - это число. Числа 01 не существует. Существует только 1.

Если тебе надо, чтобы при выборе месяца в Комбобоксе, в Эдит записывалось значение с лидирующим 0 - то это делается так:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Edit1.Text := Format('%.2d', [ComboBox1.ItemIndex + 1]);
end;
Atreides
а если КомбоБокс вернет 10 или 12, и встанет 0, выйдет 012, тут как быть?
volvo
Цитата
а если КомбоБокс вернет 10 или 12, и встанет 0, выйдет 012, тут как быть?
А если ты программу запустишь, и выяснится, что 0 ставится ТОЛЬКО когда надо дополнить до ДВУХ цифр, тогда как быть? Ты там двойку не заметил, или просто издеваешься?
Atreides
ой, не заметил, я с телефона был... я и не знал, что вот так можно...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.