Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Ответить
Настройки темы
Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Итак,вопрос начинающего программиста заключается в следующем - имеется следующий текст кода:
Цитата:
// Показываем результат
lbOutput.Caption := Trim(edInput1.Text)+' '+cbSign.Items[cbSign.ItemIndex]+' '+
Trim(edInput2.Text)+' = ' ;
...для меня остаётся непонятным,по какому принципу выставляются знаки апострофа и плюса('+)в данном примере.
Не мог бы кто-нибудь разъяснить это дело?

P.S. Пример кода взят из книги Валерия Фаронова "Система программирования Delphi" .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:41, 19-11-2004

 

Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Можно так (используя WinAPI):
Код: Выделить весь код
program Project_test;

uses Windows, SysUtils; // Необходимые модули

var
  CreateTime,   // Дата создания
  LastAccess,   // Дата последнего доступа
  LastWrite     // Дата последней записи в файл
  : PFileTime;

  SystemTime: _SystemTime;

  FileHandle: THandle;

begin
  New(CreateTime);  // Создаем переменную под хранение даты/времени
  LastAccess:=nil;  // Не изменять эту дату/времени
  LastWrite:=nil;   // Не изменять эту дату/времени
  // Открываем некоторый файл
  FileHandle:=FileOpen('Project_test.dpr', fmOpenWrite or fmShareDenyNone);
  // Произошла ошибка - выводим диагностическое сообщение
  if FileHandle < 1 then MessageBox(0,'Не могу открыть файл','Ошибка',0);
  try
    GetSystemTime(SystemTime); // Получаем текущее системное время
    // Преобразовываем переменную к сжатому виду
    SystemTimeToFileTime(SystemTime,CreateTime^);
    // Устанавливаем дату и время для файла FileHandle
    SetFileTime(FileHandle,CreateTime,LastAccess,LastWrite);
  finally
    FileClose(FileHandle); // Закрываем дескриптор (файл)
    Dispose(LastWrite);    // Уничтожаем переменную под хранение даты/времени
  end;
end.

Отправлено: 22:46, 20-01-2005 | #31



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
...хм...хм...ну,ничего себе...в любом случае спасибо - попробую .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 23:04, 20-01-2005 | #32


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
Я тут сижу и думаю: какая идиллия!.. Я помогаю тебе осваивать Obj. Pascal , а frizzn по сути так же хелпает мне с Си/Си++
Нет, ну просто умора

Отправлено: 02:04, 21-01-2005 | #33


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
Взяв в пример код,приведённый тобой выше(который я,кстати,так и не компилировал,т.к. толку создавать программу,если я не до конца понимаю алгоритма её работы)...в общем,решил я залесть в дебри функций WinAPI(типа те,в модуле Windows.pas)и окончательно потерялся .

Во-первых,правильно ли,что...
PFileTime = ^TFileTime
...и можно ли так объявлять эти типизированные указатели,т.е. ...
CreationTime : ^TFileTime;

Во-вторых,как понимать запись:
_SystemTime
...т.е. именно это подчёркивание впереди?

Далее имеется API-функция:
function GetFileTime(hFile: THandle;
lpCreationTime, lpLastAccessTime, lpLastWriteTime: PFileTime): BOOL; stdcall;
Хотелось бы уточнить,что представляют из себя буквы lp,например: lpCreationTime ?

Результатом этой функции является значение логического типа BOOL,спрашивается: как я могу использовать это логиское значение,если я хочу вывести,к примеру,вывести дату создания файла в Label1.Caption?И ведь,по-моему,в модулях SysUtils.pas и Windows.pas нету какой-нибудь функции типа FileTimeToDateTime,или...?

Заранее прошу прощения,если уж очень пристаю со своими вопросами .

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Последний раз редактировалось DillerInc, 21-01-2005 в 21:39.


Отправлено: 21:07, 21-01-2005 | #34


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Цитата:
Во-первых,правильно ли,что...
PFileTime = ^TFileTime
Правильно. PFileType = pointer of variable of type FileTime, а TFileTime = variable of type FileTime.

Цитата:
...и можно ли так объявлять эти типизированные указатели,т.е. ...
CreationTime : ^TFileTime;
Объявлять можно, а вот использовать вместо PFileTime... Теоретически должна вылезти ошибка о несовместимости типов, хотя не пробовал.

Цитата:
Во-вторых,как понимать запись:
_SystemTime
...т.е. именно это подчёркивание впереди?
Просто название типа переменной. Введено в Делфи для избежание путаницы с системными типами SYSTEMTIME, FILETIME. Это в принципе не должно тебя волновать, т.к. меж собой эти типы фактически равны.

Цитата:
Далее имеется API-функция:
function GetFileTime(hFile: THandle; lpCreationTime, lpLastAccessTime, lpLastWriteTime: PFileTime): BOOL; stdcall;
Хотелось бы уточнить,что представляют из себя буквы lp,например: lpCreationTime ?
Опять же, это просто сокращенное для удобства название типа переменной. h*, например, = handle, lp* = long pointer (т.е. "расширенно" можно было написать long_pointer_CreationTime и программисту сразу становится ясно, что требуется передать в функцию указатель на переменную). В си (C/C++) это действительно нужно/полезно, в Делфи - не очень, хотя иногда обращаешь внимание.

Цитата:
Результатом этой функции является значение логического типа BOOL,спрашивается: как я могу использовать это логиское значение,если я хочу вывести,к примеру,вывести дату создания файла в Label1.Caption?
Логическое значение отражает лишь факт выполнения функции (0 или отрицательное значение обычно говорит об ошибке, положительное обычно об успехе, в Делфи это соответствует False и True). Все необходимые значение переменных (в данном случае различные времена файла) записываются в соотв. переменные.

Цитата:
И ведь,по-моему,в модулях SysUtils.pas и Windows.pas нету какой-нибудь функции типа FileTimeToDateTime,или...?
Нету. А что?
Кстати есть FileTimeToSystemTime();

Отправлено: 16:06, 22-01-2005 | #35


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Savant
В общем,насчёт функции GetFileTime - в одном месте подсмотрел :
Код: Выделить весь код
Procedure A;
var
 FileHandle : THandle;
 FileTime, LocalFileTime : TFileTime;
 SystemTime : TSystemTime;
 Date1 : String;
begin
 FileHandle := FileOpen(OpenDialog1.FileName, fmOpenWrite or fmShareDenyNone);
 GetFileTime(FileHandle, @FileTime,NIL,NIL);
 FileTimeToLocalFileTime(FileTime, LocalFileTime);
 FileTimeToSystemTime(LocalFileTime, SystemTime);
 Date1 := DateTimeToStr(SystemTimeToDateTime(SystemTime));
 Label1.Caption := Date1;
На основании этого хочется спросить,насколько в Delphi вообще актуально использование указателей на адреса в динамической памяти?Т.е. здесь(в представленном коде)вместо типа PFileTime используется простой TFileTime;процедура New для выделения памяти динамической переменной не используется;в месте,где необходимо использование lpпеременной используется знак @,который как я понял возвращает адрес данной переменной в памяти.Или всё-таки...?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 17:44, 22-01-2005 | #36


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
При использовании маленьких переменных - практически все равно, что использовать - динамическое создание/уничтожение переменных ( New(), Dispose() ) или статическое. Мне просто уже привычно работать с динамическим выделением буфера и поэтому я привёл свой пример в том виде в каком привёл . В данном случае я действительно немного переборщил, можно было обойтись одной "собачкой", которая возвращает адрес элемента, стоящего за ней (причем не только переменной, но также функции). Процедура New необходима, когда используются буферы (переменные) по несколько МБайт.

Отправлено: 17:59, 22-01-2005 | #37


Аватара для frizzn

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


Savant
Цитата:
Опять же, это просто сокращенное для удобства название типа переменной. h*, например, = handle, lp* = long pointer (т.е. "расширенно" можно было написать long_pointer_CreationTime и программисту сразу становится ясно, что требуется передать в функцию указатель на переменную). В си (C/C++) это действительно нужно/полезно, в Делфи - не очень, хотя иногда обращаешь внимание.
В Си ( и в C++) от этих lp*, sz* и dw* имхо пользы не больше, чем в Delphi.

-------
Здесь могла быть ваша реклама


Отправлено: 23:26, 22-01-2005 | #38


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Для начала - с челобитной к ув. Модераторам: с какой стати тему окрестили как Флейм?По-моему,здесь идёт самый настоящий процесс разгрызания гранита науки ,т.е. на мой взгляд точнее было бы назвать тему *Практика*|Delphi. Синтаксис или что-то наподобие.

Далее...помогите,господа,пожалуйста по следующему делу:
хочу вставить в программу возможность показа сообщения типа mtConfirmation(ну,если пользователь сделал какие-то изменения в открытом документе и хочет выйти из программы,не сохранив эти изменения.Т.к. подобного компонента-диалога в среде Delphi вроде нету,я написал пробный обработчик события нажатия кнопки:
Код: Выделить весь код
procedure TfmExample.bbRunClick(Sender: TObject);
const
 Msg : String = 'Changes you made are not saved yet.Would you like to save them?';
 DlgType : TMsgDlgType = mtConfirmation;
 Buttons : TMsgDlgButtons = mbYesNoCancel;
var
 d : Integer;
begin
   d := CreateMessageDialog(Msg, DlgType, Buttons).ShowModal;
case d of
 mrYes : SaveDialog1.Execute;
 mrNo  : fmExample.Close;
 mrCancel : Abort;
end

end;
Проблема же заключается в том,что я почему-то не могу нормально вызвать данный диалог в самой программе,т.е. когда сделаны изменения в файле и когда пользователь выходит,не сохранившись.
Насколько я понимаю,необходимо сделать обработчик события OnCloseQuery основной формы и,применяя условные операторы,вывести в нужный момент на экран диалоговое сообщение...а вот как это сделать логически правильно?

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 13:19, 07-02-2005 | #39


Аватара для Savant

Старожил


Сообщения: 300
Благодарности: 6

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: zip Project_onclosequery.zip
(1.7 Kb, 6 просмотров)

Объяснять долговато, лучше на примере.
Вот, наклепал по-быстрому, но хоть понятно что-то...

Отправлено: 17:16, 07-02-2005 | #40



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - *Флейм* | Delphi. Синтаксис. Использование WinAPI

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[флейм] GGK и уголовная ответственность за использование нелицензионного ПО SPB Лицензирование продуктов Microsoft 9 20-06-2007 12:38
Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке? XCodeR Программирование и базы данных 4 12-03-2007 19:51
Delphi - Win32 API | Delphi | Странности с Winapi Timer Mavlyudov Программирование и базы данных 4 14-11-2005 10:10
Delphi - Delphi, WinAPI | Корректное завершение программы fossil Программирование и базы данных 6 10-08-2005 14:52
Delphi - *Решено* | Использование WinAPI под Delphi Savant Программирование и базы данных 2 14-01-2005 21:40




 
Переход