Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 943
от 03.10.2007, 20:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 461, Экспертов: 86
В номере:Вопросов: 6, Ответов: 12


Вопрос № 103638: Здраствуйте эксперты. Суть вопроса: var size: DWord; path: string; .......................... path:='D: ratatafile.dat'; ShowMessage(IntToStr(size)); так вот, как присвоить переменной size размер файла по ...
Вопрос № 103658: Здравствуйте! Как подсчитать кол-во секунд, минут и часов между двумя датами. Например между датами '25.09.07 07:24:43' и '06.10.07 14:33:08'. Важно, что дни и месяцы должны заменятся эквивалентным количеством часов. Заранее спасибо за ре...
Вопрос № 103664: здравствуйте, подскажите пожалуйста литературу по написанию многопоточных приложений на Delphi....
Вопрос № 103668: Здравствуйте уважаемые эксперты. В программе парсер msxml ругается на строчку в файле <?xml version="1.0" encoding="windows-1251"?>. И выдается ошибку: 'Переключение с текущей кодировки на указанную не поддерживается'. При э...
Вопрос № 103676: Необходимо подать звуковой сигнал через системный динамик. Использую Windows.Beep, но пока она работает происходит остановка всей остальной программы, а нужно чтобы выполнялось и то и другое. Что посоветуете? Если можно небольшой примерчик....
Вопрос № 103692: Уважаемые эксперты ! Начинающий. Посоветуйте какие использовать средства для представления данных из двух и более таблиц (1:М) в виде дерева. Хотелось бы сделать что-то наподобие "Проводника" Windows, чтобы щелкнув по у...

Вопрос № 103.638
Здраствуйте эксперты.
Суть вопроса:
var
size: DWord;
path: string;
..........................
path:='D: ratatafile.dat';
ShowMessage(IntToStr(size));

так вот, как присвоить переменной size размер файла по адресу path?
Заранее спасибо.
Отправлен: 27.09.2007, 22:10
Вопрос задал: Иван Ивановввв (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Иван Ивановввв!

Вам достаточно будет описать такую функцию:
function GetFileSize(const fileName: String; out fileSize: Integer): Boolean; forward;

Код функции:
function GetFileSize(const fileName: String; out fileSize: Integer): Boolean;
var
SRec: TSearchRec;
begin
Result:=FindFirst(fileName, faAnyFile, SRec) = 0;
if Result then
try
fileSize := SRec.Size;
finally
FindClose(SRec);
end;
end;


В функции мы ищем файл по указаному пути и получаем его размер в байтах.

Тогда применить ее можно будет так:
var
size: integer;
path: string;
..........................
path:='D: ratatafile.dat';
if GetFileSize(path,size) then
ShowMessage(IntToStr(size));


Good Luck!!!

P.S. Полный код смотрите в приложении.

Приложение:

---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.

Ответ отправил: Gh0stik (статус: Профессор)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 27.09.2007, 23:26
Оценка за ответ: 5
Комментарий оценки:
Спасибо за полный и точный ответ, именно то что нужно.

Отвечает: PGM
Здравствуйте, Иван Ивановввв!

К предыдущему ответу есть небольшое уточнение. Если файл больше 2Гб, то будут проблемы. Предпочтительней использовать Int64, как размер файла

FileSize := (Int64(SR.FindData.nFileSizeHigh) shl 32) + Int64(SR.FindData.nFileSizeLow);
Ответ отправил: PGM (статус: 10-ый класс)
Ответ отправлен: 28.09.2007, 21:13
Оценка за ответ: 5
Комментарий оценки:
Спасибо, мелочь а приятно.


Вопрос № 103.658
Здравствуйте!
Как подсчитать кол-во секунд, минут и часов между двумя датами.
Например между датами '25.09.07 07:24:43' и '06.10.07 14:33:08'. Важно, что дни и месяцы должны заменятся эквивалентным количеством часов.
Заранее спасибо за решение проблемы!
Отправлен: 28.09.2007, 06:03
Вопрос задал: Red Spirit (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: din
Здравствуйте, Red Spirit!
Насколько я вас понял необходимо получить разницу между датами в часах.
Для этого подключаем в секции Uses юнит DateUtils, а уже там у нас есть все необходимые функции:
HoursBetween(const ANow: TDateTime; const AThen: TDateTime): Int64;
где ANow - дата и время окончания временного периода,
AThen - дата и время начала временного периода, возвращаемый тип Int64
.
В данном модуле также есть функции для расчета лет, месяцев, дней, минут, секунд между двумя датами, думаю Вы их найдете без труда.

Удачи!
---------
Есть только одно зло - невежество, и только одно благо - знания
Ответ отправил: din (статус: Специалист)
Ответ отправлен: 28.09.2007, 06:25
Оценка за ответ: 4

Отвечает: kopfschwarz
Здравствуйте, Red Spirit!
Если у вас заданы строки с датами, то их сначала надо перевести в формат DateTime. Смотрите пример..

var A,B:TDateTime;
H,M,S:integer;
begin
A:=StrToDateTime('25.09.07 07:24:43');
B:=StrToDateTime('06.10.07 14:33:08');
H:=HoursBetween(A,B);
M:=MinutesBetween(A,B) mod 24;
S:=SecondsBetween(A,B) mod 60;
Label1.Caption:=IntToStr(H)+':'+IntToStr(M)+':'+IntToStr(S);
end.
---------
Please, don't say you're sorry & Express yourself, don't repress yourself!
Ответ отправил: kopfschwarz (статус: Студент)
Ответ отправлен: 28.09.2007, 07:01
Оценка за ответ: 5
Комментарий оценки:
Как раз то, что нужно! Спасибо! Только в подсчете минут, нужно поставить не 24, а 60 ;)

Отвечает: Владик
Здравствуйте, Red Spirit!
(6-25)+(10-9)*30+(2007-2007)*365 - получишь количество дней, умножаешь на 24 получаешь часы. Примерно такая же операция и со временем
Ответ отправил: Владик (статус: 1-ый класс)
Ответ отправлен: 28.09.2007, 07:53
Оценка за ответ: 3
Комментарий оценки:
Спасибо за ответ, но этот способ не точен.. мне нужно было узнать, как это сделать через готовые функции.


Вопрос № 103.664
здравствуйте, подскажите пожалуйста литературу по написанию многопоточных приложений на Delphi.
Отправлен: 28.09.2007, 08:14
Вопрос задал: Evgeni_s (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Drbear
Здравствуйте, Evgeni_s!

Попробуйте сходить на http://lab18.ipu.rssi.ru/
может там найдёте
Ответ отправил: Drbear (статус: 2-ой класс)
Ответ отправлен: 28.09.2007, 10:12
Оценка за ответ: 2
Комментарий оценки:
Не, че то не подходит


Вопрос № 103.668
Здравствуйте уважаемые эксперты. В программе парсер msxml ругается на строчку в файле <?xml version="1.0" encoding="windows-1251"?>. И выдается ошибку: 'Переключение с текущей кодировки на указанную не поддерживается'. При этом на одном компьютере с Windows XP все работает нормально, а на другом с Windows 2000 выдает ошибку. Как это можно исправить?
Отправлен: 28.09.2007, 09:11
Вопрос задал: Radik (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Narsereg
Здравствуйте, Radik!

Это не поможет?

http://xmlhack.ru/forum/xml/viewtopic.php?p=9106&highlight=

Последний ответ.
Ответ отправил: Narsereg (статус: 1-ый класс)
Ответ отправлен: 28.09.2007, 11:52


Вопрос № 103.676
Необходимо подать звуковой сигнал через системный динамик.
Использую Windows.Beep, но пока она работает происходит остановка всей остальной программы, а нужно чтобы выполнялось и то и другое. Что посоветуете? Если можно небольшой примерчик.
Отправлен: 28.09.2007, 10:33
Вопрос задал: Mina (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Drbear
Здравствуйте, Mina!

Application.PeocessMessage;
Beep;
Application.PeocessMessage;
Beep;
Application.PeocessMessage;
Beep;
....

Чтобы приложение не подвисало при выполнении дляительных операций можно использовать Application.PeocessMessage.
Ответ отправил: Drbear (статус: 2-ой класс)
Ответ отправлен: 28.09.2007, 10:40
Оценка за ответ: 2
Комментарий оценки:
Мне надо задавать частоту и продолжительность. А с Windows.Beep Application.PeocessMessage не помогает.

Отвечает: Narsereg
Здравствуйте, Mina!

Если вам не понравился предыдущий ответ, то единственный способ (наверно) создать еще один Thread и синхронизировать их.
Ответ отправил: Narsereg (статус: 1-ый класс)
Ответ отправлен: 28.09.2007, 11:54
Оценка за ответ: 4
Комментарий оценки:
Спасибо!

Отвечает: Igor_
Здравствуйте, Mina!

Нужно beep запускать в отдельном потоке.
Сделать класс-наследник TThread.

В Delphi есть мастер, который сделает каркас класса
File->New->Other->Thread Object

Примера рабочего кода дать не могу - нет примера..

Но в вашем случае достаточно будет в функции Execute вашего класса-потока написать вызов Beep
И свойство FreeOnTerminate = true, чтобы после завершения поток сам удалялся.

Обманул - начал Вам писать и быстро создал пример
Модуль с классом для потока с Beep
-------------------------------
unit u_beepTh;

interface

uses
Classes;

type
ThBeep = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

implementation
uses
Windows;

procedure ThBeep.Execute;
var
i: integer;
begin
for i := 0 to 10 do begin
Beep(500, 500);
end;
end;

end.
-------------------------------

Запуск потока
-------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
tBeep: ThBeep;
begin
tBeep := ThBeep.Create({createSuspended}true);
tBeep.FreeOnTerminate := true;
tBeep.Resume();

end;
-------------------------------



Ответ отправил: Igor_ (статус: 4-ый класс)
Ответ отправлен: 28.09.2007, 12:40
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое, как раз то что нужно!


Вопрос № 103.692
Уважаемые эксперты !
Начинающий.
Посоветуйте какие использовать средства для представления
данных из двух и более таблиц (1:М) в виде дерева.
Хотелось бы сделать что-то наподобие "Проводника" Windows,
чтобы щелкнув по узлу дерева, открывать соответствующую форму.
Заранее благодарен.
Отправлен: 28.09.2007, 14:01
Вопрос задал: Тарасенок Сергей (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Drbear
Здравствуйте, Тарасенок Сергей!

Попробуйте используовать запрос на объединение таблиц
в таблицах должны быть столбцы с номером уровня узла (0,1,2,3,...) и, если надо какую-то хитрую сортировку, номером ветви в узле (0,1,2,3,ююю).
Поиск строки в таблице или запросе можно организовать стандартными средствами по щелчку на строке дерева.
При динамическом создании дерева старайтесь не использовать String и Integer, пользуйтесь переменными TTreeView, TTreeNode.

Приложение:

Ответ отправил: Drbear (статус: 2-ой класс)
Ответ отправлен: 28.09.2007, 16:21
Оценка за ответ: 5

Отвечает: Виктор Пырлик
Здравствуйте, Тарасенок Сергей!

Ваш вопрос в реализации не сложен. Но не так просто в описании… «Родных» компонентов в Delphi для этого нет. Можно конечно найти сторонние разработки, как платные так и бесплатные – если это вас заинтересует, любой поисковик даст положительный результат.
Но сделать своими руками и полезней, и практичней, тема довольно обширная, что бы приводить тут код – вот неплохая статья на этот счет с простым и понятными примером и подробным описанием.
DBTreeView своими руками

А связь с зависимой таблицей, можно осуществить, просто используя либо жесткие связи через MasterSource – тогда, по событию OnChange компонента TTreeView и передать на метод таблицы (родительской) Locate индекс, сохраненный в параметре процедуры TreeView1.Items.AddObject – как указатель (Pointer) (см. пример). Или, это же можно сделать и для дочерней таблицы.
---------
Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 28.09.2007, 20:54
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо. Теперь понятно, в какую сторону
двигаться.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60.10 от 27.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное