Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (все версии) - часть 3

Автор: xy
Дата сообщения: 10.03.2008 11:17
Подскажите пожалуйста такую проблему:
как надежно определять последние числа месяца, года и т.п.

Возьмем для примера месяц:
Дело в том, что функции EndOfTheMonth(Date), он возвращает последнюю секунду месяца, но из-за округления (я так полагаю) мы в итоге нередко получаем первое число следующего месяца, когда делаем что-то типа
DateTimeToString(lStr, 'dd.mm.yy', EndOfTheMonth(Date))
или просто в дебаггере смотрим эту дату и она там целым числом прописана, т.е. без времени

пока борюсь заменяя EndOfTheMonth(Date) на StartOfTheDay(EndOfTheMonth(Date))

Такой вариант пока работает надежно, кроме того за функциями Start* я такого глюка не замечал, хотя по логике он может выдавать последний день предыдущего периода, вместо первого у текущего..

Подскажите плиз, как лучше и надежнее такие штуки обрабатывать :-?
Автор: MsdLamer
Дата сообщения: 10.03.2008 11:59

Цитата:
CopyFile('c:\1\'+ pchar(fn), 'c:\2\', true);


ту же самую ошибку выдает..... Incompatible types: 'String' and 'PChar'
Автор: Minissota
Дата сообщения: 10.03.2008 12:32
Доброго всем дня!
Подскажите, пожалуйста... У меня есть два DateTimePicker, мне нада от одной даты отнять другую и количество дней записать в edit. Как это можно сделать?
Заранее благодарен...
Автор: xy
Дата сообщения: 10.03.2008 12:41
Minissota
DateUtils.DaysBetween/DaySpan ;)
Автор: Jokerjar79
Дата сообщения: 10.03.2008 14:57
MsdLamer

Код: CopyFile(pchar('c:\1\' + fn), 'c:\2\', true);
Автор: Minissota
Дата сообщения: 10.03.2008 17:26
xy
Спасибо...
Автор: vidic777
Дата сообщения: 10.03.2008 19:41
Jokerjar79

Цитата:
это на С.

Да, сорри, писал ночью ответ и недоглядел , вопрос был по Object Pascal.
Автор: Minissota
Дата сообщения: 10.03.2008 21:25
Как сделать прокрутку строк БД скролером мыши с использованием DBGrid????
Если пытаться прокрутить строки таблицы, выводимую через DBGrid, с помощью скроллера мыши, перемещается только курсор DBGrid'а а позиция в таблице остается неизменной. Искуственно ее крутить тоже не получается - событие формы OnMouseWheel при использовании DBGrid почему-то не вызывается.
Может кто-нибудь знает как связать курсор DBGrid с DataSet'ом для такого случая????
Заранее благодарен!!!
Автор: xy
Дата сообщения: 10.03.2008 21:39
Minissota
Скачай себе http://www.drkb.ru/ и первым делом туда ;)
Автор: Minissota
Дата сообщения: 10.03.2008 21:45
xy
Благодарю, за полезную информацию!!!
Автор: greenpc
Дата сообщения: 11.03.2008 09:03
xy

Цитата:
как надежно определять последние числа месяца

1 число след месяца - 1 день
DateToStr(StrToDate('01.03.2008')-1)
Автор: RostY
Дата сообщения: 11.03.2008 09:26
function DaysInMonth(m,y:integer):integer;
const
DInMonth: array[1..12] of Integer = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Begin
Result:=DInMonth[m];
if (Y mod 4 = 0) and ((Y mod 100 <> 0) or (Y mod 400 = 0)) //Leap year
then if M=2 then inc(Result);
End;
Автор: greenpc
Дата сообщения: 11.03.2008 09:42
RostY
есть такая ф-ция DateUtils
function DaysInAMonth(const AYear, AMonth: Word): Word;
xy
формат TDateTime - целая часть дата, а вещественная - время
соотвественно
DateTimeToString(lStr, 'dd.mm.yy', Trunc(EndOfTheMonth(Date)))
будет точно давать последний день месяца
Автор: xy
Дата сообщения: 11.03.2008 10:02
greenpc
Фактически Trunc - это и есть StartOfTheDay ;)
DateUtils.pas:

Код:
function StartOfTheDay(const AValue: TDateTime): TDateTime;
begin
Result := Trunc(AValue);
end;
Автор: skinash
Дата сообщения: 11.03.2008 11:23
Настройки программы хранятся в INI-файле.
При чтении программа считывает значения ключа (параметра), если ключ не
существует - она создает его. Хотелось бы к созданному ключу в INI-файле
добавить комментарий.
Знаю, что можно оставлять комментарий с помощью ;

Код:
[Section]
; Комментарий к KeyName
KeyName=KeyValue
Автор: akaGM
Дата сообщения: 11.03.2008 11:38
skinash

Цитата:
Какие варианты реализации возможны?


--следить и таскать за собой ещё парочку...
[Section]
; Комментарий к KeyName
KeyName=KeyValue
KeyNameComment=KeyValueCommentStr

--отказаться от комментариев, не фиг юзерам туда лазить и править

--забить на ini и перейти на xml
Автор: skinash
Дата сообщения: 11.03.2008 11:57
akaGM
про xml - хорошая мысль. спасибо.
Автор: akaGM
Дата сообщения: 11.03.2008 12:12
skinash
не за что...

если оч сильно всё завязано именно на ini, то ещё можно
сделать отдельную секцию

Код: [GlobalCommentsSection]
KeyName предназначен для бла-бла-бла и может принимать значения
KeyValue1 -- bla-bla-bla
KeyValue2 -- bla2-bla2-bla2
Автор: Jokerjar79
Дата сообщения: 11.03.2008 13:44
А я в таком случае обычно сам руками создаю ini файл с комментариями, а параметры оставляю пустыми. Вкладываю этот ini в инсталлятор. При первом запуске программа заполняет параметры, а комментарии не перемешиваются
Автор: xy
Дата сообщения: 11.03.2008 18:32
akaGM

Цитата:
--забить на ini и перейти на xml

хм.. а какой класс работает с xml так же просто и доступно как TIniFile + читабельно для ручной настройки :-?
Автор: akaGM
Дата сообщения: 11.03.2008 19:18
xy
хороший вопрос...
также просто и доступно -- увы...
я родной TXMLDocument использую, но можно нарыть что-нибудь попроще...
Автор: fcdobpiy
Дата сообщения: 12.03.2008 07:48
xy
да, с xml просто работать не получится.
искал себе билиотечку для чтения xml. самое оптимаьное по мне оказалось _http://www.destructor.de/xmlparser/index.htm

_____________________

вопрос
нужно заданную строку вписать в строку из одних 0 или пробелов, где длина результирующе строки определна , меньше 255.
функция вида
function left_zero(len:integer;s:string):string; //длина строки и строка для вписания
var i:integer;
t:string;
begin
for I := 1 to len-length(s) do t:=t+'0';
Result:=t+s;
end;

я так понимаю совсем не оптимальна, и ужасна по производительности.
у меня есть мысль делать так - задать строку в коде из 255 нулей (пробелов). в функции её укоротить до нужной длины и вписать внутрь нужную строку.

или есть получше варианты?
Автор: lerthe61
Дата сообщения: 12.03.2008 08:52
Рекомендую сделать так:

function PadRight(s: string; pad: char; len: integer): string;
begin
Result := s+StringOfChar(pad, len-Length(s));
SetLength(Result, len);
end;

или

function PadLeft(s: string; pad: char; len: integer): string;
begin
Result := StringOfChar(pad, len-Length(s))+s;
SetLength(Result, len);
end;
Автор: RostY
Дата сообщения: 12.03.2008 09:32
fcdobpiy
с пробелами можно так:

format('%255.255s',[s]);
Автор: akaGM
Дата сообщения: 12.03.2008 14:32
fcdobpiy
тогда не понятно в вопросе

Цитата:
заданную строку вписать в строку

почему не задаётся с какой позиции?

тогда Insert() именно для твоего случая и предназначена...

-----------
xy
забыл...

Цитата:
+ читабельно для ручной настройки

а с другой стороны, ты много знаешь редакторов с подсветкой *.ini,
a *.xml?
Автор: fcdobpiy
Дата сообщения: 12.03.2008 15:28
lerthe61
когда символ, из кторой ссостоит строка неизвестен, то самое то. минус в том, что функция StringOfChar по сути просто прибавляет к строке символ , что было у меня выше
RostY
спасибо. кратко и четко. но по производит. тоже плохо, ибо анализурует строку.
akaGM
конкретнее - в строке состоящей из одного и того же символа вписать слева или справа (выровнять по левому краю или правому) заданную строку.
тут больше вопрос в том что лучше - хранить строку из нулей или пробелов готовую и пользоваться инсертом, либо генерировать эту строку в рантайме и добавлять к ней нужную
Автор: akaGM
Дата сообщения: 12.03.2008 15:46
fcdobpiy
для производительности лучше пользуйся FillChar()
Автор: Iron Demon
Дата сообщения: 12.03.2008 19:06
Приветствую благородных прогммеров, если кто занимался или знает что нибуть о функции реструктурирования таблиц DbiDoRestructure, очень прошу помочь.
Проблема заключаеться в том что почемуто не хочет правильно работать:
после выполнения, изменяет некоторые типы полей и из размерность, в результате при открытии таблицы в место данных представлен полный бред...
Задача заключаеться в том чтобы переименовать поле в структуре таблицы, не меняя ни типов, ни размерность полей, не хотелось бы делать закат солнца в ручную, т.к. файлов более 800 штук, и в нутрь файла стандартными средствами OpenFile и в наглуюю писать не хочеться т.к. гибкой эта прога не будет, кроме как переименовывание она не чего не сделает, а хотелось бы большего.
Автор: Maks150988
Дата сообщения: 13.03.2008 00:19
Здраствуйте. Никак не разберусь с функцией SetWindowPOs. А именно ситуация такая. В ресурсах допустим есть статусбар и трекбар. Вот мне надо постоянно на диалоге отображать трекбар поверх статуса, когда трекбар расположен на самом статусе. Сейчас код такой:
SetWindowPos(GetDlgItem(hApp, CTRL_STATUSBAR_PANEL), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW or SWP_NOZORDER);
SetWindowPos(GetDlgItem(hApp, CTRL_TRACKBAR_VOLUME), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
Пробовал убирать ноузордер и менять ноутопмост, но бесполезно. Тупизм какой-то. При инициализации диалога трекбар упорно не видно, хотя стоит навести курсор на его место и он появляется. Пробовал invalidaterect, showwindow потом, updatewindow и не помогает. Что за такое!!!...
Автор: Maks150988
Дата сообщения: 13.03.2008 11:41
И еще хотел бы разобраться с двойной буферизацией. На данный момент процелура такая:

Код:
if (XMGetRow() mod 8 = 0) and (Module <> nil) then
begin
DeleteObject(hBmp);
hBmp := LoadImage(hInstance, PChar(RES_BITMAP_APPBANNER_2), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
SendMessage(GetDlgItem(hAbt, CTRL_STATIC_ABOUTBANNER), STM_SETIMAGE, IMAGE_BITMAP, hBmp);
end
else
begin
DeleteObject(hBmp);
hBmp := LoadImage(hInstance, PChar(RES_BITMAP_APPBANNER_1), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE);
SendMessage(GetDlgItem(hAbt, CTRL_STATIC_ABOUTBANNER), STM_SETIMAGE, IMAGE_BITMAP, hBmp);
end;

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: 1С: Конвертация данных 2.0


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.