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

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

Автор: data man
Дата сообщения: 06.09.2009 18:56
andrewtishkin
Хак совсем не обязателен. Можно сделать свой диалог. Получить список пользователей с их правами - не архисложная задача, IMO.
Автор: andrewtishkin
Дата сообщения: 06.09.2009 22:43

Цитата:
Можно сделать свой диалог.



Цитата:
И не в моём самодельном окне с edit-ами, а в стандартном системном (для солидности и безопасности; самоделкины решения вызывают подозрения у людей "чо это она у меня пароль просит так странно... небось трояна мне подсунули, сволочи!")

Автор: SANIOK_AV
Дата сообщения: 07.09.2009 15:02
Доброго времени суток!!!
Ситуация такова:
У меня в OpenDialog1.FileName полный путь к нужному мне файлу.
Подскажите пожалуйста, как получить размер и дату этого файла?
Заранее благодарен!
Автор: spasius
Дата сообщения: 07.09.2009 15:12
SANIOK_AV

Получить дату:

Код:
function GetFileDateTime(FileName: string): TDateTime;
var
intFileAge: LongInt;
begin
intFileAge := FileAge(FileName);
if intFileAge = -1 then
Result := 0
else
Result := FileDateToDateTime(intFileAge)
end;
Автор: SANIOK_AV
Дата сообщения: 07.09.2009 15:51
spasius
Спасибо...
буду пробовать...

Добавлено:
spasius

Цитата:
Result := FileDateToDateTime(intFileAge)

а как сделать чтоб ещё и время отображалось?
Автор: spasius
Дата сообщения: 07.09.2009 17:12
SANIOK_AV
на выходе получаешь TDateTime это и дата и время
конвертация в строку:
DateToStr - только дату
TimeToStr - только время
DateTimeToStr - дата+время в формате
Автор: SANIOK_AV
Дата сообщения: 07.09.2009 17:51
spasius
Спасибо...с датой и временем получилось...
сделал правда без функции:

Код: DateTimeToStr(FileDateToDateTime(FileAge(OpenDialog1.FileName)))
Автор: spasius
Дата сообщения: 07.09.2009 18:13
ну как вариант можно использовать:

Код:
function GetSizeOfFile(AFile : String) : Integer;
var FStream : TFileStream;
begin
try
FStream := TFileStream.Create(AFile, fmOpenRead + fmShareDenyWrite);
try
Result := FStream.Size;
finally
FreeAndNil(FStream);
end;
except
Result := 0;
end;
end;
Автор: data man
Дата сообщения: 07.09.2009 18:23
SANIOK_AV

Код:
uses
SysUtils;

function FileSize(const fileName: string): int64;
var
fHandle: DWORD;
begin
fHandle := CreateFile(PChar(fileName), 0, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if fHandle = INVALID_HANDLE_VALUE then
Result := -1
else try
Int64Rec(Result).Lo := GetFileSize(fHandle, @Int64Rec(Result).Hi);
finally CloseHandle(fHandle); end;
end; { DSiFileSize }
Автор: SANIOK_AV
Дата сообщения: 08.09.2009 11:31
spasius
data man
Спасибо всем огромное...
Сделал...
Автор: Smokeer
Дата сообщения: 09.09.2009 04:16
Добрый день.
Я хочу написать компонент. Конкретно интересует как добавлять и организовывать свойства в Object Inspector'е. Копания привели только к тому что нужно писать редактор свойств... без подробностей как именно его писать и как оформить взаимодействие со средой
Автор: ShIvADeSt
Дата сообщения: 09.09.2009 04:33
Оформлять взаимодействия не надо. Компонент - это по сути класс, только его потом еще регистрируют, чтобы он попал на панель компонентов. Обжект Инспектор видит те свойства которые объявлены как property в public свойствах класса. Чтобы понять как это пишется - скачай любой компонент (паки качать не советую, много буков) и посмотри организацию
Автор: Varenik
Дата сообщения: 09.09.2009 07:07

Цитата:
Обжект Инспектор видит те свойства которые объявлены как property в public свойствах класса
Не в public, а в published
Автор: Smokeer
Дата сообщения: 09.09.2009 16:37

Цитата:
Оформлять взаимодействия не надо. Компонент - это по сути класс, только его потом еще регистрируют, чтобы он попал на панель компонентов.

Взаимодействие не компонента, а этого самого редактора свойств(?). Получается он не нужен вообще.

PS: Спасибо. Возникает следующий вопрос: как организовать своства в дерево типа:

\Properties
|-\PropertyGroup1
| |-Property 1 from group 1
| =-Property 2 from group 1
|
|-\PropertyGroup2
| |-Property 1 from group 2
| =-Property 2 from group 2
...
Автор: volser
Дата сообщения: 10.09.2009 10:36
PropertyGroup1, PropertyGroup2 - сделай проперти наследники TPersistent.
Автор: SANIOK_AV
Дата сообщения: 10.09.2009 12:56
Доброго времени суток!
Ситуация такая:
Написал програмку...
на моём компьютере она запускается в виде окна (не на весь экран)
на другом компьютере то же самое :открывается окно примерно того же размера...
но одно но: с вертикальной и горизонтальной прокруткой...
подскажите пожалуйста, "где копать" ?
Заранее благодарен!
Автор: V1s1ter
Дата сообщения: 10.09.2009 13:18
SANIOK_AV
Как возможный вариант - дело в скинах или масштабах шрифтов Windows, например, при одном скине Heigth = 800; ClientHeigth = 777, а при другом скине (или масштабе шрифта) Heigth = 800; ClientHeigth = 765. В итоге если компоненты расположены так , что при ClientHeigth меньшем на 12 пикселей чем при "нормальном" размере не влазиют в эту самую ClientHeigth, то появляется вертикальный ScrollBar, который в свою очередь крадет ClientWidht.
Автор: DreamKHV
Дата сообщения: 10.09.2009 13:30
SANIOK_AV
Копать нужно в сторону ScaleBy, но она неадекватно работает с некоторыми шрифтами.[more=Source]
unit Scale;

interface

uses
Forms, WinTypes, WinProcs, SysUtils;

procedure ScaleForm(Sender: TObject);

implementation

procedure ScaleForm(Sender: TObject);

const

{измените это так, чтобы это соответствовало
режиму разрешения во время разработки}
DesignScrY: LongInt = 480;
DesignScrX: LongInt = 640;
DesignBorder: LongInt = 4; {значение в Панели Управления + 1}

var

SystemScrY: LongInt;
SystemScrX: LongInt;
SystemBorder: LongInt;
OldHeight: LongInt;
OldWidth: LongInt;

begin

SystemScrY := GetSystemMetrics(SM_CYSCREEN);
SystemScrX := GetSystemMetrics(SM_CXSCREEN);
SystemBorder := GetSystemMetrics(SM_CYFRAME);
with Sender as TForm do
begin
Scaled := True;
AutoScroll := False;
Top := Top * SystemScrX div DesignScrX;
Left := Left * SystemScrX div DesignScrX;
OldHeight := Height + (DesignBorder - SystemBorder) * 2;
OldWidth := Width + (DesignBorder - SystemBorder) * 2;
ScaleBy((OldWidth * SystemScrX div DesignScrX - SystemBorder * 2),
(OldWidth - DesignBorder * 2));
{
Для форм не имеющих границ измените предшествующие
три строки следующим способом:

OldHeight := Height;
OldWidth := Width;
ScaleBy(SystemScrX, DesignScrX);
}

Height := OldHeight * SystemScrY div DesignScrY;
Width := OldWidth * SystemScrX div DesignScrX;
end;
end;

begin
end.
[/more]
Автор: V1s1ter
Дата сообщения: 10.09.2009 13:47
Denion
Поскольку спросил в лике - оветил в личке, здесь повтор

Цитата:

Сам не сталкивался с такой необходимостью, но где копать знаю - реестр ветвь
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
Но там не все уже готовенькое, строки типа "\\?\Volume{fe9bf0a0-6259-11de-9c9a-806d6172696f}\" нужно собирать по ключам...
Начни с просмотра этой ветки реестра в RegEdit.exe
Автор: SANIOK_AV
Дата сообщения: 10.09.2009 14:08
V1s1ter
DreamKHV
Спасибо...
Тупо немного растянул форму и всё нормуль))
Автор: Smokeer
Дата сообщения: 10.09.2009 16:58

Цитата:
PropertyGroup1, PropertyGroup2 - сделай проперти наследники TPersistent.

Покажите, пожалуйста, пример.
Автор: volser
Дата сообщения: 10.09.2009 19:09
Smokeer
Посмотрите на свойство Constraints класса TControl.
Автор: SerBUser
Дата сообщения: 11.09.2009 08:20
Подскажите, плиз - пишу на Дельфи службу, которая по таймеру выполняет нужные мне действия. Нашел на сайте Королевство Дельфи хорошую статью "Создание служб Windows в Delphi с использованием VCL" - но так и не понял - как сделать так, чтоб при старте службы запускался таймер, а при стопе останавливался. Вот код:

Код:
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
Timer1.Enabled:=true;
Started:=true;
end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
Timer1.Enabled:=false;
Stopped := True;
end;

procedure TService1.Timer1Timer(Sender: TObject);
begin
// тут мои действия
end;
Автор: Hiken
Дата сообщения: 11.09.2009 08:22
SerBUser
К примеру, можете сделать цикл с Sleep(Milliseconds) внутри.
Автор: SerBUser
Дата сообщения: 11.09.2009 09:07
Hiken

Цитата:
К примеру, можете сделать цикл с Sleep(Milliseconds) внутри

Цикл где?
Автор: Hiken
Дата сообщения: 11.09.2009 09:18
В OnStart. Либо убрать OnStart унд OnStop, и задействовать OnExecute. Все по статье!
Автор: gorenski
Дата сообщения: 11.09.2009 09:19
SerBUser
В обработке таймера OnTime что-нибудь делай
Автор: SerBUser
Дата сообщения: 11.09.2009 10:33
gorenski

Цитата:
В обработке таймера OnTime что-нибудь делай

Так делаю. Раз в секунду.

Код:
procedure TService1.Timer1Timer(Sender: TObject);
var
f:text;
begin
Assignfile(f,'c:\hp\11.txt');
append(f);
writeln(f,timetostr(now)+'Отработал');
CloseFile(f);
end;
Автор: NOwlar
Дата сообщения: 11.09.2009 15:07
SerBUser
Нужно обязательно сделать обработчик OnExecute следующего вида

Код:
procedure TSvc.ServiceExecute(Sender: TService);
while not Terminated do begin
//тут что-то делаем
ServiceThread.ProcessRequests( True );
end;
end;
Автор: SerBUser
Дата сообщения: 14.09.2009 01:32
NOwlar
Хм. А в статье было написано - или пишем обработчики OnStart/OnStop или обработчик OnExecute. Т.е. я правильно понял, что надо в OnExecute и прописывать те действия, которые мне надо выполнить по таймеру, а таймер убрать совсем и код будет примерно такой:

Код:
procedure TSvc.ServiceExecute(Sender: TService);
while not Terminated do begin
//тут что-то делаем
ServiceThread.ProcessRequests( false );
Sleep(1000);
end;
end;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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