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

Программирование на Delphi

  Все выпуски  

Программирование на Delphi (выпуск 37)


Информационный Канал Subscribe.Ru

Программирование на DELPHI
Выпуск #37 (17 декабря 2005 г.) 

Разделы сайта:

Новости сайта
Система "Эксперт"
Вопросы и Ответы

Отправить вопрос
Файловый архив
Статьи
Компоненты
Plug-in's
Документация
Исходники
Изображения
Игры
Программы
Форум
Гостевая книга
F.A.Q.
Архив рассылки
Каталог сайтов
Обратная связь
Хостинг



Связь:

Администратор
Система "Эксперт"
Информация


Доброго времени суток, уважаемые читатели!

Опять-таки прошу прощение за длительный перерыв между выпусками. Сначала были проблемы, а потом ещё и заболел...

1) Подведём результаты опроса:

Кто, по Вашему мнению, должен оценивать ответы экспертов?

Ведущий рассылки - 4 голоса.
Автор вопроса
 - 11 голосов.
Мне без разницы - 3 голоса.

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

2) На сайте изменился принцип загрузки файлов. Теперь ссылки можно отправлять прямо в "качалки" и загрузка файлов будет идти. Напомню, что раньше существовала промежуточная страница со ссылкой на файл. Качайте наздоровье.

3) Раздел "Программы" на сайте изменился и стал таким же, как и раздел "Plug-in's". Файлы теперь удобнее просматривать и можно оставлять комментарии.

Внимание! Вопросы и ответы для следующего выпуска рассылки принимаются до 25.12.2005 18:00. Будьте внимательны.
Письма, присланные позже либо отсеиваются, либо откладываются для публикации в следующем выпуске.

Сайт рассылки: http://www.delphi.int.ru/.

До встречи!

Разделы рассылки:

Авторское слово
Новые вопросы
Ответы на вопросы
Статья по Delphi
Файловый архив
Друзья
Юмор


Количество читателей рассылки: 3802.


Подписка на рассылку:


Лидеры по количеству баллов:


Место
Имя
Баллы
Статус
1
Dron
289
Практикант
2
Feniks
281
Практикант
3
Ermakova Dasha
277
Практикант
4
Садовников Владимир
248
Практикант
5
Iron Monk
200
Практикант
6
mvp
125
Студент
7
Матвеев И.В.
125
Студент
8
Лучников А.И.
117
Студент
9
Ершов Денис
115
Студент
10
VeroLom
90
Эксперт: 10-ый класс

Статусы экспертов и их возможности:

Статус
Необходимое кол-во баллов
Прикрепление файлов
Форматирование текста
Посетитель
0
нет
нет
Эксперт 1-го класса
1
нет
нет
Эксперт 2-го класса
10
нет
нет
Эксперт 3-го класса
20
нет
нет
Эксперт 4-го класса
30
нет
нет
Эксперт 5-го класса
40
нет
нет
Эксперт 6-го класса
50
до 250 Кб
нет
Эксперт 7-го класса
60
до 250 Кб
нет
Эксперт 8-го класса
70
до 250 Кб
нет
Эксперт 9-го класса
80
до 250 Кб
нет
Эксперт 10-го класса
90
до 250 Кб
нет
Студент
100
до 250 Кб
нет
Практикант
150
до 250 Кб
нет
Специалист
300
до 250 Кб
да
Профессионал
500
до 1 Мб
да
Профессор
800
до 1 Мб
да
Академик
1000
до 1 Мб
да

Примечание: Под форматированием текста понимается возможность оформлять ответы с использованием html-тегов.

Если Вы хотите, чтобы Вашего имени (ника) не было в данной таблице, отправьте письмо по этой ссылке с зарегистрированного у нас адреса. В теле письма, пожалуйста, укажите причину удаления имени из таблицы. Нам важно ваше мнение.


Основные правила нашей рассылки:

1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, объёмом выше установленного ограничения (ограничения указаны в правилах).
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не обрабатываются! Используйте текстовый (не HTML) формат писем. HTML-теги применяйте только в том случае, если Вы уже достигли статуса, где это разрешено (см. правила).
5. Запрещено задавать вопросы, содержащие два (или несколько) вопросов разной тематики. Каждый из таких вопросов должен быть оформлен отдельным письмом.

Задать вопрос в рассылку   |   Задать вопрос с помощью web-формы   |   Система "Эксперт"


Новые вопросы.

Вопрос #200 (автор вопроса: KremenetskiyYY; вопрос отправлен: 29.11.2005 17:04):

Есть вот такой код...
procedure TForm1.Button2Click(Sender: TObject);
var
OD_acct:TOpenDialog;
fn_acct:String;
begin
OD_acct:=TopenDialog.Create(self);
OD_acct.Filter:='Файл (*.dbf)|acct_*.dbf';
OD_acct.InitialDir:='path';
if OD_acct.Execute then
fn_acct := OD_acct.FileName;
OD_acct.Free;
end;

Вопрос состоит вот в чем. Если "path" находится на сетевом диске (даже подключенном), то OpenDialog выбирает последнюю открытую папку... На локальном диске все работает отлично... Подскажите плиз, как добится подобного результата и на сетевом диске с путем типа \\server\folder\YYYY\MM\DD? Заранее благодарен. [Ответить на вопрос]


Вопрос #201 (автор вопроса: Антон Трапезников; вопрос отправлен: 30.11.2005 13:45):

Здравствуйте, уважаемые программисты. Никто не решал следующую проблемму - каким образом я могу задать цвет и стиль (например, flat) у всех компонентов на форме? [Ответить на вопрос]


Вопрос #202 (автор вопроса: Olaf; вопрос отправлен: 08.12.2005 01:58):

Подскажите, пожалуйста, как мне сделать, чтобы при добавлении одинаковых (повторяющихся) данных в таблицу (строку) выскакивало сообщение: "такие данные уже существуют"? [Ответить на вопрос]


Вопрос #203 (автор вопроса: Olaf; вопрос отправлен: 08.12.2005 03:26):

Не могу никак сообразить. Подскажите, как запретить повторный запуск формы? У меня есть главная форма, а в ней дочерние. И из главного меню главной формы загружаю дочерние. Но проблема в том, сколько нажимаешь кнопку открытия дочерней формы, столько форм (повторяющихся) и выскакивает. Спасибо. [Ответить на вопрос]


Вопрос #204 (автор вопроса: resident; вопрос отправлен: 09.12.2005 10:08):

Здравствуйте. Когда я на форму ставлю WebWrowser и указываю ему страницу, то обычный HTML работает отлично, а когда доходит до выполнения JavaScript, то не работает и выдаёт ошибку. Подскажите, что делать для JAVA. Спасибо. [Ответить на вопрос]


Вопрос #205 (автор вопроса: Vitek; вопрос отправлен: 10.12.2005 21:05):

У меня такой вопрос: как можно написать DLL для нормального чтения mov и avi в кодировке DivX(Xvid), mpeg4, ну и др. какие-нибудь? Или есть какие компоненты? Использую MediaPlayer из Delphi7. Просто когда открываю такой файл, то нет звука, чёрный экран, или изображение идёт по ключевым фреймам. [Ответить на вопрос]


Вопрос #206 (автор вопроса: Artem; вопрос отправлен: 14.12.2005 00:20):

Как работать с USB в Delphi? Нужно программно на флэшку записать инфу, но не обязательно файл. Типа как на диск я могу записать на любой цилиндр на любую дорожку, а здесь как? [Ответить на вопрос]


Вопрос #207 (автор вопроса: Alex; вопрос отправлен: 15.12.2005 23:43):

Подскажите, пожалуйста! Есть программа, которая не использует никаких модулей, кроме windows. Как можно узнать имя файла запущеной программы, не используя Application.ExeName? [Ответить на вопрос]


Вопрос #208 (автор вопроса: Alex; вопрос отправлен: 15.12.2005 23:58):

Как можно в файл ресурсов запихнуть какие либо-файлы (не картинки)? Мне надо, чтобы вся программа занимала 1 файл, но при запуске она копировала из своего тела другие файлы на компьютер! Что делать? [Ответить на вопрос]



Вопросы, оставшиеся без ответа:

Вопрос #90 (автор вопроса: Nanny_Jagg; вопрос отправлен: 17.03.2005 07:56):

Как в DBGrid из библиотеки Ehlib 3.6 добавить Lookup-поле, чтобы оно действительно работало? Поле вроде сделано, но ключевое поле, оставленное рядом для контрола не меняется, по какому событию обработчик писать? [Ответить на вопрос]


Вопрос #176 (автор вопроса: Тимур; вопрос отправлен: 12.10.2005 13:58):

Нужно программно узнать температуру процессора. Мать Abit NF7-S (или любая другая) с микросхемой мониторинга Winbond W83627HF. [Ответить на вопрос]


Вопрос #181 (автор вопроса: pena; вопрос отправлен: 24.10.2005 14:52):

Как взять из Word картинку и вставить в мою базу данных? [Ответить на вопрос]


Вопрос #197 (автор вопроса: EvGeny; вопрос отправлен: 14.11.2005 01:39):

Я новичок в программировании. Как можно в Delphi на OpenGL загрузить .x файл? P.S. Просто этот файл удобен тем, что его можно открыть обычным текстовым блокнотом и просмотреть его структуру. А я очень хочу понять принцип - как загружать файлы 3D сцен в Delphi (как осуществлять перехот от одной координаты в другую, записанную в файле 3D модели, как отличать один объект от другого и т.д.) Буду очень благодарен за исходник с подробными объяснениями. Спасибо заранее! [Ответить на вопрос]

 


Ответы на вопросы.


Вопрос #190:
Открыт или закрыт лоток CD-ROM - как это проверить программно?

1. [Отвечает: Матвеев И.В., 28.11.2005 14:15]: По-видимому, определить положение каретки стандартными методами невозможно (я имею вввиду без прямого обращения к драйверам и к приводу непосредственно). Но Вы можете просто проверить готовность диска:

function IsDriveReady(DriveLetter: Сhar): Bool;
var
DrvNum: byte;
EMode: Word;
begin
result := false;
DrvNum := ord(DriveLetter);
if DrvNum >= ord('a') then
dec(DrvNum, $20);
EMode := SetErrorMode(SEM_FAILCRITICALERRORS);
try
if DiskSize(DrvNum - $40) <> -1 then
result := true
else
messagebeep(0);
finally
SetErrorMode(EMode);
end;
end;

Надеюсь этот вариант Вам подойдет.

Оценка за ответ: 5.

2. [Отвечает: midav.land.ru, 29.11.2005 11:22]: Вот есть кусочек кода:

uses mmsystem;
procedure TForm1.Button1Click(Sender: TObject);
var
s: array[0..64] of Char;
error: Cardinal;
Text: array[0..255] of Char;
begin
error := mciSendstring('open cdaudio alias geraet', nil, 0, Handle);
if error <> 0 then
begin
mciGetErrorstring(error, @Text, 255);
ShowMessage(Text);
mciSendstring('close geraet', nil, 0, Handle);
Exit;
end;
error := mciSendstring('status geraet mode', @s, SizeOf(s), Handle);
if error <> 0 then
begin
mciGetErrorstring(error, @Text, 255);
ShowMessage(Text);
mciSendstring('close geraet', nil, 0, Handle);
Exit;
end;
mciSendstring('close geraet', nil, 0, Handle);
ShowMessage('Message: ' + s);
end;

Правда на пустой и закрытый (одновремено) он говорит "OPEN", но мне кажеться нужно копать в эту сторону - искать описания mci команд.

Оценка за ответ: 5.


Вопрос #191:
Можете подсказать какой-нибудь код для восстановления расфокусированных изображений (например решение двумерного интегрального уравнения Фредгольма 1 рода) ?

1. [Отвечает: Антон Трапезников, 29.11.2005 08:27]: Здравствуйте, Саша.

Попробую Вам помочь...

Систему линейных уравнений, решаем методом Гаусса с частичным выбором ведущего элемента. При решении полученной системы уравнений возможны два случая - система вырождена и нам придется поделить на ноль в ходе решения, или система невырождена. Если система невырождена, то существует одно и только одно решение. Если же система вырождена, то данный алгоритм неприменим. В случае вырожденой матрицы функция возвращает False. Если матрица невырождена, то функция возвращает True, а переменная Y содержит решение системы.

Для сравнения с нолем в алгоритм передается малое число epsilon, и любое число, по модулю меньшее epsilon, считается нолем.

Для начала скачайте и подключите библиотеку AP: http://alglib.sources.ru/translator/aplib.zip.

А дальше так:

(************************************************
Этот модуль сгенерирован транслятором AlgoPascal.
************************************************)
uses Math, Ap;

(*
Эти подпрограммы должен определить программист:
function F(X : Double):Double;
function K(X : Double; S : Double):Double;
*)

function SolveFredholm2(A : Double;
     B : Double;
     N : Integer;
     var Y : TReal1DArray;
     Epsilon : Double):Boolean;forward;


(*************************************************************************
Процедура  решает  интегральное  уравнение Фредгольма второго рода,
заданное   ядром   интегрирования   K(X,S) и правой частью F(X), на
отрезке [A, B].

Результат помещается в массив Y с номерами элементов от 1 до N, где
1 соответствует A, N соответсвует B.

Epsilon - малое число, передаваемое для сравнения с нолем   в  ходе
решения получаемой системы уравнений.
*************************************************************************)
function SolveFredholm2(A : Double;
     B : Double;
     N : Integer;
     var Y : TReal1DArray;
     Epsilon : Double):Boolean;
var
    h : Double;
    t : Double;
    m1 : Double;
    x : Double;
    SMat : TReal2DArray;
    i : Integer;
    j : Integer;
    u : Integer;
    k1 : Integer;
    m : Integer;
begin
    SetLength(SMat, N+1, N+1+1);
    SetLength(Y, N+1);
    h := (b-a)/(n-1);
    i := 1;
    repeat
        x := a+(i-1)*h;
        SMat[i,n+1] := F(x);
        j := 1;
        repeat
            SMat[i,j] := -h*K(x, a+(j-1)*h);
            if (j=1) or (j=n) then
            begin
                SMat[i,j] := SMat[i,j]/2;
            end;
            if j=i then
            begin
                SMat[i,j] := 1+SMat[i,j];
            end;
            j := j+1;
        until  not (j<=n);
        i := i+1;
    until  not (i<=n);
    SetLength(Y, N+1);
    Result := True;
    i:=1;
    while i<=n do
    begin
        k1 := i;
        m1 := AbsReal(SMat[i,i]);
        j:=i+1;
        while j<=n do
        begin
            if m1             begin
                m1 := AbsReal(SMat[j,i]);
                k1 := j;
            end;
            Inc(j);
        end;
        if AbsReal(m1)>=Epsilon then
        begin
            j:=i;
            while j<=n+1 do
            begin
                t := SMat[i,j];
                SMat[i,j] := SMat[k1,j];
                SMat[k1,j] := t;
                Inc(j);
            end;
            k1:=i+1;
            while k1<=n do
            begin
                t := SMat[k1,i]/SMat[i,i];
                SMat[k1,i] := 0;
                j:=i+1;
                while j<=n+1 do
                begin
                    SMat[k1,j] := SMat[k1,j]-t*SMat[i,j];
                    Inc(j);
                end;
                Inc(k1);
            end;
        end
        else
        begin
            Result := False;
            Break;
        end;
        Inc(i);
    end;
    if Result then
    begin
        i := n;
        repeat
            y[i] := SMat[i,n+1];
            j := i+1;
            while j<=n do
            begin
                y[i] := y[i]-SMat[i,j]*y[j];
                j := j+1;
            end;
            y[i] := y[i]/SMat[i,i];
            i := i-1;
        until  not (i>=1);
    end;
end;

Оценка за ответ: 5.


Вопрос #192:
Когда я пишу программы в Дельфи, то у меня получается 10-20 файлов этой программы и иконка для запуска. Как мне сделать так, чтобы программа состояла только из одного файла или (exe) файла?

1. [Отвечает: Антон Трапезников, 28.11.2005 08:21]: Все дело в том, что "10-20 файлов этой программы" не нужно распространять вместе с готовым откомпилированным файлом, т.к. это исходные тексты вашего проекта.

Оценка за ответ: 5.

2. [Отвечает: PVS, 28.11.2005 10:39]: Вообще-то в большинстве случаев достаточно одного .exe файла, если, конечно, речь не идет о файлах с какими-то данными или о вспомогательных библиотеках (*.dcu, *.pas, *.dpr, *.dfm и другая гадость нужны только для разработки - пользователям ставить их не надо, а иногда и вредно :-)

Оценка за ответ: 5.

3. [Отвечает: Вадим Фурив, 28.11.2005 11:14]: Вообще, все файлы, которые создает Дельфи при программировании - это рабочие файлы. Расширение .pas это сам текст программы, .dfm - описание свойств формы, .ddp - диаграмма (которую я например не использую), .dcu - откомпилированный модуль по-моему. Эти все файлы нужны для разработки программы. По умолчанию, если Вы не создаете .dll, то при компиляции программы создается файл .exe. Он-то Вам и нужен для работы. Смело переписывайте пользователю и запускайте. Правда при запуске программы, которая скажем использует ADO на компьютере с Win95, она может не работать, и тогда придется или создавать инсталяционный пакет или инсталировать компоненты DCOM вручную.

Оценка за ответ: 5.

4. [Отвечает: Матвеев И.В., 28.11.2005 13:06]: Дело в том, что эти 10-20 файлов - это файлы проекта, т.е. исходные тексты программ (*.pas, *.dpr, *.dfm), файлы ресурсов (*.res), настройки компилятору (*.cfg) и так далее. Вы можете просто скопировать *.exe файл и использовать его как готовую программу. Или это можно сделать в опциях проекта на странице "Каталоги".

Смотрите также полное описание типов файлов Delphi.

*.DPR-файлы

.dpr-файл является центральным файлом delphi-проекта. Для программы он является первой точкой входа. dpr содержит ссылки на другие файлы проекта и связывает формы с соответствующими модулями. Данный файл нужно редактировать с предельной осторожностью, так как неумелые действия могут привести к тому, что вы не сможете загрузить ваш проект. Этот файл является критическим при загрузке и перемещении (копировании) проекта.

*.PAS-файлы

Это стандартный текстовый файл, который можно редактировать в текстовом редакторе. Данный файл нужно редактировать с некоторой долей осторожности, поскольку это может закончиться потерей некоторых преимуществ двух других инструментов. К примеру, добавление кода для кнопки с декларацией типа никак не отразится на соответствующем .dfm-файле формы. Все pas-файлы являются критическими при пересборке проекта.

*.DFM-файлы

Данный файл содержит описание объектов, расположенных на форме. Содержимое файла можно увидеть в виде текста, вызвав правой кнопкой мыши контекстное меню и выбрав пункт "view as text", или же с помощью конвертора convert.exe (расположенного в каталоге bin), также позволяющего перевести файл в текстовый вид и обратно. Данный файл нужно редактировать очень осторожно, поскольку это может закончиться тем, что IDE не сможет загрузить форму. Этот файл является критическим при перемещении и пересборке проекта.

*.DCU-файлы

Это бинарные файлы, которые содержат в себе компилированный код, когда Delphi создает exe файл (или dll или другой) сперва весь код компилируется в DCU файлы, а затем из этих файлов выделяется используемый код и помещается в итоговый пакет. С помощью DCU файлов можно распростанять свои компоненты без исходных текстов (по DCU файлав восстановить PAS файл невозможно), только нужно иметь ввиду, что в разных версиях Delphi используются несовместимые форматы DCU файлов.

*.DOF-файлы

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

*.DPK-файлы

Данный файл содержит исходный код пакета (аналогично .DPR-файлу стандартного проекта Delphi). Подобно файлу .DPR, .DPK-файл также является простым текстовым файлом, который можно редактировать в стандартном редакторе. Одной из причин, по которой вы можете это сделать - использование компилятора командной строки.

*.RES-файлы

Это стандартный двоичный windows-формата файл ресурсов, включающий в себя информацию о приложении. По умолчанию, Delphi создает новый .RES-файл при каждой компиляции проекта в исполняемое приложение.

Оценка за ответ: 5.

5. [Отвечает: Акишин Андрей Владимирович, 28.11.2005 13:52]: Надо просто скомпилировать программу, нажми <Ctrl+F9>, или "Project => Compile".

Оценка за ответ: 4.

6. [Отвечает: Ершов Денис, 29.11.2005 07:03]: Используй ресурсы. Подробнейшая статья по их использованию: http://decoding.narod.ru/practic/resource/resource.html

Оценка за ответ: 4.

7. [Отвечает: Alex, 29.11.2005 21:08]: Сама прога и состоит из 1 ЕХЕ файла. Т.е смело копируй на дискету ЕГО и она пойдёт!!! 10-20 файлов – это код программы, который и компилируется.

Оценка за ответ: 4.

8. [Отвечает: Dron, 30.11.2005 07:02]: Всё обстоит иначе. Файлы, которые вы видите - это файлы разработки программы (исходники). Среди них: *.dpr - файлы проектов, *.dfm - файлы описания форм, *.pas - модули, *.res - ресурсные файлы и др. Если вы запустите программу из Delphi (F9), то она скомпилируется в единый exe-файл, который вам и нужен. Тащить за собой исходники не нужно. Но и удалять их не стоит, а то не сможете изменить программу или продолжить её разработку.

Оценка за ответ: 5.

9. [Отвечает: Антон, 02.12.2005 10:21]: При компиляции Дельфи-проекта действительно получается несколько файлов. Однако для работы Вашей программы достаточно одного .exe файла. Остальные относятся к исходникам и их необязательно передавать конечному пользователю.

Оценка за ответ: 5.

10. [Отвечает: Ares, 02.12.2005 13:13]: Я так понимаю, что у тебя получаются файлы dfm, dcu, pas, cfg, dof, dpr, res, ddp - это всё файлы проекта и для запуска программы они не нужны, - вполне достаточно exe ну и может dll если есть. Ну и небольшой ликбез по основным файлам проекта:
- *.dpr: здесь хранится информация о модулях и формах подключённых к проекту. Также здесь осуществляется инициализация и запуск приложения. Файл текстовый, поетому можно в него чего-нибудь дописать при необходимости.
- *.pas: файл предназначен для хранения кода (именно его ты в делфях и редактируешь). Обычно связан с формой, но можно создавать и отдельно без формы (для более удобного хранения например своих процедур и ф-ций).
- *.dfm: в таких файлах хранится информация о внешнем виде формы (какие объекты находятся на форме, значения свойств этих объектов отличающиеся от дефолтовых). Файл может быть как текстовым так и бинарным.
- *.dоf: здесь храняться настройки проекта (какие библиотеки включать при компиляции, где их искать и куда ложить выходные файлы) - *.res: ресурсный файл проекта (иконки, курсоры и прочая хрень)
- *.dcu: это скомпилиный файл *.pas. потом из них компонуется исполняемый файл, динамическая библиотека и т.д.

Это основные файлы, их набор может быть разным в зависисмости от того, что ты хочешь получить на выходе (обычный исполняемый файл, динамически-подгружаемая библиотека, package и т.д.)

Оценка за ответ: 5.

11. [Отвечает: Zeon, 06.12.2005 01:03]: После компиляции программы у тебя и так получается один пусковой exe файл. Остальное - исходный код программы, который для работы приложения не нужен. Если ты конечно не используешь информацию с каких-либо внешних файлов(музыку, видео, картинки, базы данных...), однако и многое из них при желании можно впихнуть в exe-шник.

Оценка за ответ: 5.


Вопрос #193:
Как сделать программу, чтобы она инсталлировалась, а не запускалась просто с иконки, и надо ли это вообще, чтобы программа инсталлировалась?

1. [Отвечает: Антон Трапезников, 28.11.2005 08:29]: Создание инсталляционного скрипта целесообразно только если выша программа нуждается в чем-то, что не входит в систему штатно, например, BDE. Если же вы не используете таких технологий, то инсталятор вам не нужен :) Необходимо только учесть, что заранее неизвестно из какой папки пользователь будет запускать ваше приложение, т.е. функции вида:

.LoadFromFile('sample.txt');

лучше заменить на:

.LoadFromFile(GetCurrentDir+'\sample.txt');

Оценка за ответ: 5.

2. [Отвечает: PVS, 28.11.2005 10:43]: Инсталяция предназначена для инициализации каких-то данных (например в реестре), а также чтобы при деинсталяции убрать за собой веь мусор. Если программа не нуждается в таких действиях (или их проще сделать один раз руками) - она может жить без инсталляции (просто запускатся).

Оценка за ответ: 5.

3. [Отвечает: Вадим Фурив, 28.11.2005 11:17]: Если Вы создаете простую программу, не использующую какие-то особые компоненты Windows, то намного разумней будет просто переписывать EXE-файлы пользователю и запускать их там (если программа пишется под конкретного пользователя). Если используются скажем компонетны ADO и Вы не уверены на какой версии Windows будет использоваться программа, то лучше создать инсталяционный пакет. Использовать можно программу InstallShield. Не знаю какая из версию последняя, но это не очень важно.

Оценка за ответ: 5.

4. [Отвечает: midav.land.ru, 28.11.2005 12:31]: Для того, чтобы программа инсталировалась, необходимо сделать инсталятор. Есть автоматические, например мне нравиться и я пользуюсь NSIS (качать http://nsis.sf.net, редактор http://nsis.sourceforge.net/Main_Page) Всё делается на скриптах, есть автоматическая генерация шаблона (в редакторе), которая потом напильничком поттирается до идеала. Можно также сделать ручной инсталятор, то-есть написать всё ручками. Это лучше делать для спецефических прог.

Использовать ли инсталятор? Если твоя прога маленькая, ничего особого настраивать не нужно, то зачем пользователю качать лишние метры? А вот если нужно копировать кучку файлов по папкам и прописать кучу настроек - тогда инсталятор. Есть ещё один неплохой инсталятор - WinRar. Если поставить галочку SFX, то появляется возможность указать куда распаковывать и как.

Оценка за ответ: 5.

5. [Отвечает: Акишин Андрей Владимирович, 28.11.2005 14:01]: Можно воспользоваться инсталлятором. Если у Вас в программе используются *.dll или другие файлы, которые необходимо регистрировать в системе пользователя (например, если Вы написали программу по управления БД использующую BDE или собственный алгоритм), то их необходимо инсталлировать.

Оценка за ответ: 5.

6. [Отвечает: Матвеев И.В., 29.11.2005 03:31]: Создания инсталляционного пакета - это отдельная задача для программиста и задача довольно сложная. Прежде всего, для этого используется специальное программное обеспечение - вместе с Delphi распространяется InstallShield, но это не единственный вариант, есть еще WiseInstaller и др.

Устанавливать или нет? - если программа простая, состоит из одного-двух файлов, не содержит драйверов, расширений оболочки и подобного - лучше не нужно, это только займет лишнее всемя у Вас и у пользователя.

Некоторые хорошие создатели инсталяшек:
- Wise Installation Wisard
- Install Shield
- QuickInstallMaker - www.mjksw.com
- Nullsoft Install System
- Sfx-Factory - www.emerge.de
- Installer 2000 - www.getsoftware.com
- Ghost Installer - www.ginstall.com
- Inno Setup - http://iceman.da.ru

Оценка за ответ: 5.

7. [Отвечает: Лучников А.И., 29.11.2005 09:58]: Смотря что нужно. Можно сделать инсталяцию с помощью InstallShield. Можно написать свою. А вот если надо защитить программу, то стоит попробовать API-шные функции. Как самый простой вариант - GetVolumeInformation. Пример использования последней (возвращает серийный номер тома):

function GVD(DriveChar: Char): DWord;
var
NotUsed, VolFlags: DWORD;
Buf: array [0..MAX_PATH] of Char;
pdw:DWORD;
begin
try
Buf[0] := #$00;
if GetVolumeInformation(PChar(DriveChar + ':\'), Buf,
DWORD(sizeof(Buf)),
@pdw, NotUsed, VolFlags, nil, 0)
then
Result:=abs(pdw)
else Result := 0;
finally
end;
end;

Оценка за ответ: 5.

8. [Отвечает: Alex, 29.11.2005 21:44]: Инсталлировать прогу нужно для того, чтобы прописать какие-либо файлы в реестр, изменить настройки винды, настроить приложение. А если прога простая типа калькулятора, то её можно разве что прописать в меню ПУСК - Программы, НО Надо ли.

Оценка за ответ: 3.

9. [Отвечает: Dron, 30.11.2005 07:05]: Это зависит от разных потребностей. Если ваша программа состоит из одного exe-файла, то вряд ли ей нужен инсталлятор и вы можете прописать все действия, которые должны выполняться при первом запуске в OnCreate() главной формы. Если же ваша программа использует какие-то DLL и её необходимо регистрировать в системе (сервисы, автозагрузка, реестр), то здесь инсталлятор лучше создать. К тому же, автоматически создастся и программа для деинсталляции (удаления), что тоже очень важно. Существует большое количество программ для разработки инсталлятором. Я лишь от себя скажу, что использую InnoSetup (http://www.jrsoftware.org) и вполне им доволен.

Оценка за ответ: 5.

10. [Отвечает: Антон, 02.12.2005 10:34]: Для того чтобы Ваша программа инсталлировалась с иконки - нужно написать инсталлятор и присвоить ему соответствующую иконку. Инсталятор - это тоже программа, по сути, ничем не отличающаяся от той, которую Вы хотите проинсталлировать. Просто целью исталлятора является установка на компьютер другой программы, т.е. автоматическое прописывание в реестре нужных параметров, копирование файлов и пр. Теоретически это может сделать и пользователь - вручную. Если Ваша программа состоит из 1-5 файлов и не требует прописки в реестре, файлах win.ini, sytem.ini, то делать для нее инсталятор бессмысленно. Надеюсь, что я вообще правильно понял Ваш вопрос....

Оценка за ответ: 5.

11. [Отвечает: Ares, 02.12.2005 13:25]: Во-первых, зделать инсталляционный пакет можно с помощью таких программ как InstallShield или Wise (яндекс тебе в помощь :)) Во-вторых, надо ли? Однозначно надо когда для нормального функционирования программы необходимо наличие каких-либо специфических ключей в реестре, когда нужно предварительно установить ещё что-либо (BDE, какую-либо СУБД и т.п.)когда какие-либо настройки нужно сделать до первого запуска программы, или например просто нужно туеву хучу файлов проекта распихать по разным папкам (Program Files\CommonFiles, Windows\System32, в профиль пользователя и т.д.)... А если программа состоит из одной экзехи и пары-тройки dll`ок, то смысла по-моему нет... ну разве что ярлычки раскидать по менюшкам или открыть сайт проекта....

Оценка за ответ: 5.

12. [Отвечает: dasha ermakova, 05.12.2005 14:16]: Программу нужно инсталлировать, если в ней очень много файлов, и все их нужно разместить по определенным папкам, чтобы пользователь не мучался, а только выбрал, куда установить. Подробнее о создании инсталляции с помощью программы InstallShield Express см. в прилагаемом файле. Картинок нет по той причине, что не помещались в 250 Кб, но объяснения на мой взгляд достаточно подробные. Загрузить прикреплённый файл >>

Оценка за ответ: 5.

13. [Отвечает: Zeon, 06.12.2005 01:13]: Для создания инсталляторов существует множество разных программ. Например неплохая программа - NetScat Installer Pro(http://www.netscat-online.tk/). Лично мне нравится. А само создание таких инсталляторов - это дело вкуса. Я, например, не люблю такого. Инсталляторы, как правило, используют тогда, когда в месте с программой нужно записать в систему какие-то дополнительный файлы или внести изменения в реестр.

Оценка за ответ: 5.


Вопрос #194:
Помогите пожалуйста! У меня есть база данных db. Из базы выводится некоторая информация в RichEdit. Мне нужно выделить встречающие нужные слова жирным или цветом в RichEdit. И еще: как вставить в RichEdit гиперссылку, например "см. ссылку" и чтобы при нажатие открывалось новое окно RichEditа? Как это сделать? Подскажите пожалуйста.

1. [Отвечает: Матвеев И.В., 28.11.2005 13:44]: Это опять вопрос про редакторы. Дело в том, что в Delphi, мне по крайней мере, не встречалось нормальных компонентов - редакторов вроде RichEdit, чтобы можно было удобно расширять возможноси и переделывать под себя.

Теперь конкретно по вопросу. Если Вам нужно только показать текст, но не редактировать его - Вы можете использовать TRichView (www.trichview.com), но прийдется вручную все обрабатывать.

Вот еще подобные компоненты:
- TFatMemo;
- TRichEdit98;
- THighlightedMemo;

Вы можете найти их на www.torry.net.

Оценка за ответ: 4.

2. [Отвечает: dasha ermakova, 05.12.2005 16:43]: Чтобы изменить параметры шрифта в RichEdit, нужно выделить текст (параметры SelStart,SelLength) и в SelAttributes установить нужные параметры. В приведенном примере находится и выделяется красным цветом слово "программа" во всем тексте.

procedure TForm1.Button1Click(Sender: TObject);
var
num: integer;
begin
num:=0;
while true do
begin
num:=PosEx('программа',RichEdit1.Text,num+1);
if num<>0 then
begin
RichEdit1.SelStart:=num-1;
RichEdit1.SelLength:=Length('программа');
RichEdit1.SelAttributes.Color:=clRed;
end
else
break;
end;
end;

Ссоздание гиперссылок RichEdit не поддерживает, надо делать вручную. То есть искать нужный текст, находить его координаты на форме, проверять, соответствуют ли им координаты курсора, если да, можно поменять его форму и обрабатывать щелчок мышки. А можно скачать специальный компонент, в котором это все реализовано. Например, такой http://www.filebox.ru/download/1241. Там можно вставлять гиперссылки, картинки, менять текст, вставлять таблицы, в общем на любой вкус :)

Оценка за ответ: 5.


Вопрос #195:
Помогите пожалуйста! В ListBoxе есть список - несколько тысяч киргизских слов, отсортированных по алфавиту. В Киргизском языке есть три дополнительные буквы "код символа 189","код символа 188","код символа 179". Подскажите пожалуйста, как мне сделать, чтобы эти буквы стояли например: "код символа 189" - после буквы н, "код символа 188" - после буквы о, "код символа 179" - после буквы у? Заранее спасибо.

1. [Отвечает: midav.land.ru, 28.11.2005 12:55]: Написать свою процедуру сортировки. И отсортировать по новому. Посмотри сюда, здесь подобная проблема решается для украинского: http://www.delphiworld.narod.ru/base/sort_ukr.html

Оценка за ответ: 5.

2. [Отвечает: Матвеев И.В., 29.11.2005 03:34]: Вам нужно реализовать заново метод сортировки. Самый простой вариант - метод "Пузырька", работает медленно (сложность вычислений максимум O(n^2), т.е. квадратичная зависимость от числа элементов), но этот метод прост и пригоден в большинстве случаев. И стандартный метод Sort тоже на нем основан.

Самое главное, нужно реализовать свою функцию сравнения строк - аналог CompareString, только для соответствующих условий. Я не совсем разобрался с Кригизскими кодировками, поэтому возможно что-то перепутал в порядке сортировки, но Вы можете сами изменить порядок.

Весь проект в приложении к письму. Загрузить прикреплённый файл >>

Судя по тому, что у Вас в списке несколько тысяч слов - процесс сортировки займет значительное время, поэтому я добавил CallBack функцию в функцию сортировки - она будет вызываться каждые 3 процента (процент Вы можете изменить).

Вот главные методы:

type
TOrder = array[Char] of Byte;

TPercentProc = procedure (Percent: Integer);

var
SortOrder : TOrder; // Алфавит для сравнения

const // Здесь описываете нужный Вам порядок символов
cstr = #0#1#2#3#4#5#6#7#8#9#$A#$B#$C#$D#$E#$F#$10#$11#$12#$13#$14#$15#$16#$17#$18#$19#
$1A#$1B#$1C#$1D#$1E#$1F' !"#$%&''()*+,- ./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`
abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘'“”∙–—˜™љ›њќћџ ЎўЈ¤Ґ¦§ЁЄ«¬­®Ї±Іґµ¶ё№є»ѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭ
ЮЯабвгдежзийклмнЅојпрстуіфхцчш'; // последние опущены

///////////////

// Инициализация алфавита для сравнения
procedure Initialize;
var
i : Integer;
begin
// Заполнение стандартного алфавита для сортировки
for i := Low(Byte) to High(Byte) do
SortOrder[Char(i)] := Byte(cstr[i]);
end;

// -1 = "<", 0 = "=", 1 = ">"
function CompareString(Str1, Str2: string): Integer;
var
Len1, Len2,
MinLen : Integer; // Длина кродчайшей строки
cIndex : Integer;
begin
Len1 := Length(Str1); if Len1 = 0 then Result := 1;
Len2 := Length(Str2); if Len2 = 0 then Result := -1;
MinLen := Len1; if Len2 < MinLen then MinLen := Len2;
if MinLen = 0 then Exit; // Пустая строка в конец
cIndex := 1; // Начинаем сравнение с первого сисимвола
while (cIndex <= MinLen) and (Str1[cIndex] = Str2[cIndex]) do
Inc(cIndex);
// Теперь cIndex - первые разные символы
Result := SortOrder[Str1[cIndex]] - SortOrder[Str2[cIndex]];
if Result <> 0 then Result := Result div Abs(Result);
// Та строка что короче, та и меньше
if cIndex > MinLen then
begin
Result := -1;
if Len1 > Len2 then Result := 1;
end;
end;

// Сортировка методом пузырька
function AdvancedSort(Strings: TStrings; CallBackProc : TPercentProc = nil): Boolean;
var
i, j : Integer;
p, Percent : Integer;
Count : Integer;
begin
if Strings = nil then Exit;
Count := Strings.Count;
Percent := 0;
for i := 0 to Count-1 do
for j := 0 to Count-2 do
begin
if CompareString(Strings[j], Strings[j+1]) = 1 then
Strings.Move(j+1, j); // >
// Если сделали 3% - сообщим в CallBackProc
p := Round(i/Count*100);
if p - Percent > 3 then
if @CallBackProc <> nil then
begin
CallBackProc(p);
Percent := p;
end;
end;
end;

Желаю удачи.

Оценка за ответ: 5.

3. [Отвечает: dasha ermakova, 05.12.2005 18:30]: Сортировать придется вручную. Предлагаю такой вариант.

var
Form1: TForm1;
ar: array [0..2,0..1] of integer = ((189,2371),(188,2381),(179,2431));

implementation

{$R *.dfm}

function FindAr(num: char): integer;
var
i: integer;
begin
Result:=-1;
for i:=0 to High(ar) do
if ar[i,0] = Ord(num) then
Result:=i;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i, j, num: integer;
s, si, sj: string;
begin
for i:=0 to ListBox1.Items.Count-2 do
begin
num:=FindAr(ListBox1.Items[i][1]);
if num<>-1 then
si:=IntToStr(ar[num,1])
else
si:=IntToStr(Ord(ListBox1.Items[i][1]));

for j:=i+1 to ListBox1.Items.Count-1 do
begin
num:=FindAr(ListBox1.Items[j][1]);
if num<>-1 then
sj:=IntToStr(ar[num,1])
else
sj:=IntToStr(Ord(ListBox1.Items[j][1]));

if si<>sj then
if CompareStr(si,sj)>0 then
begin
s:=ListBox1.Items[i];
ListBox1.Items[i]:=ListBox1.Items[j];
ListBox1.Items[j]:=s;
si:=sj;
end
else
else
if CompareStr(ListBox1.Items[i],ListBox1.Items[j])>0 then
begin
s:=ListBox1.Items[i];
ListBox1.Items[i]:=ListBox1.Items[j];
ListBox1.Items[j]:=s;
si:=sj;
end;
end;
end;
end;

Оценка за ответ: 5.


Вопрос #196:
Добрый день! Подскажите, есть ли в Дельфи аналог функции sscanf из C? И если нет, то где ее можно взять?

1. [Отвечает: midav.land.ru, 28.11.2005 12:55]: Есть, написали - читайте здесь http://www.delphiworld.narod.ru/base/sscanf_in_delphi.html

Оценка за ответ: 5.

2. [Отвечает: Матвеев И.В., 29.11.2005 04:10]: Вот. Источник - DelphiWorld 6 (www.delphiworld.narod.ru).

Оценка за ответ: 5.

3. [Отвечает: Лучников А.И., 29.11.2005 10:03]: Могу посоветовать засунуть ее в DLL (на C) - далее использовать в Delphi как любую другую функцию, вызываемую из DLL (насчет наличия в Delphi - не отвечу).

Оценка за ответ: 4.


Вопрос #198:
Как выполнить комбинированный поиск по нескольким параметрам в таблице Access (не используя переменные в свойстве Parametrs, ADOQuery)? Не идут почему-то "даты".

1. [Отвечает: midav.land.ru, 28.11.2005 12:59]: Да, с датами и я намучился. Их нужно оформлять в таком виде: #11/5/2005#. Вот готовая функия:

function SQL_Date(Date: TDateTime): string;
var
OldFormat: string;
ResultStr: string;
begin
if Date>0 then
begin
OldFormat:=ShortDateFormat;
ShortDateFormat:='dd/mm/yyyy';
ResultStr:=DateToStr(Date);
ShortDateFormat:=OldFormat;
ResultStr[3]:='/';
ResultStr[6]:='/';
Result:='#'+ResultStr+'#';
end
else
Result:='';
end;

Оценка за ответ: 5.


Вопрос #199:
Здрвствуйте, уважаемые эксперты!
Скажите, пожалуйста, как узнать длину видео файла? Пробую:

procedure Timer1.Timer(...);
begin
Label2.Caption := FormatDateTime ('hh:nn:ss', Player.Length / (1000 * 24 * 60 * 60))+ ' / ' + FormatDateTime ('hh:nn:ss', Player.Position / (1000 * 24 * 60 * 60));
end;

Но это работает только с аудио файлами.

1. [Отвечает: Матвеев И.В., 29.11.2005 04:24]: У Вас не установленны какие-то видео кодеки для использеумого Вами видео формата. Ваш метод у меня прекрастно работает и с DIV3 и с ASF и с WMV форматами, а также с wav и mp3.

Оценка за ответ: 4.

2. [Отвечает: Zeon, 06.12.2005 01:17]:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

Type
TForm1 = class(TForm)
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
Public
procedure ReadAviInfo(FileName: String);
End;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ReadAviInfo(FileName: String);
var
iFileHandle: Integer; // хэндл файла

// Для позмционирования в AVI файле
Aviheadersize: Integer;
Vheadersize: Integer;
Aviheaderstart: Integer;
Vheaderstart: Integer;
Aheaderstart: Integer;
Astrhsize: Integer;

// Временные переменные
TempTest: String[5];
TempSize: Integer;
TempVcodec: String[5];
TempAcodec: Integer;
TempMicrosec: Integer;
TempLengthInFrames: Integer;
TempAchannels: Integer;
TempAsamplerate: Integer;
TempAbitrate: Integer;

//Выходные данные
Size: Double;
Length: String;
Vcodec: String;
Vbitrate: Double;
VWidth: Integer;
VHeight: Integer;
Fps: Double;

LengthInSec: Double;
Acodec: String;
Abitrate: String;
begin
// Открываем
iFileHandle := FileOpen(FileName, fmOpenRead);

// Грубая проверка на подлинность файла
FileSeek(iFileHandle, 7, 0);
FileRead(iFileHandle, TempTest, 5);
If copy(TempTest, 0, 4) <> 'AVI ' then
begin
MessageDlg('Could not open ' + FileName + ' because it is not a valid video file', mtError, [mbOk], 0);
Exit;
End;

// Размер файла
FileSeek(iFileHandle,4,0);
FileRead(iFileHandle, TempSize, 4);

// Размер хедера (needed To locate the audio part)
FileSeek(iFileHandle,28,0);
FileRead(iFileHandle, Aviheadersize, 4);

// старт хедера (needed To locate the video part)
Aviheaderstart := 32;

// Милисекунды (1000000 / TempMicrosec = fps)
FileSeek(iFileHandle,Aviheaderstart,0);
FileRead(iFileHandle, TempMicrosec, 4);

// Размер во фреймах
FileSeek(iFileHandle,Aviheaderstart + 16,0);
FileRead(iFileHandle, TempLengthInFrames, 4);

// Ширина
FileSeek(iFileHandle,Aviheaderstart + 32,0);
FileRead(iFileHandle, VWidth, 4);

// Высота
FileSeek(iFileHandle,Aviheaderstart + 36,0);
FileRead(iFileHandle, VHeight, 4);

FileSeek(iFileHandle,Aviheaderstart + Aviheadersize + 4,0);
FileRead(iFileHandle, Vheadersize, 4);

Vheaderstart := Aviheaderstart + Aviheadersize + 20;

// кодек
FileSeek(iFileHandle,Vheaderstart + 3,0);
FileRead(iFileHandle, TempVCodec, 5);

Aheaderstart := Vheaderstart + Vheadersize + 8;

FileSeek(iFileHandle,Aheaderstart - 4,0);
FileRead(iFileHandle, Astrhsize, 5);

// Audio codec
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 8,0);
FileRead(iFileHandle, TempACodec, 2);

// Audio каналы (1 = mono, 2 = stereo)
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 10,0);
FileRead(iFileHandle, TempAchannels, 2);

// Audio samplerate
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 12,0);
FileRead(iFileHandle, TempAsamplerate, 4);

// Audio bitrate
FileSeek(iFileHandle,Aheaderstart + Astrhsize + 16,0);
FileRead(iFileHandle, TempAbitrate, 4);

// закрываем файл
FileClose(iFileHandle);

// анализируем видео кодек (можно добавить больше)
Vcodec := copy(TempVcodec, 0, 4);
If Vcodec = 'div2' then Vcodec := 'MS MPEG4 v2'
Else If Vcodec = 'DIV2' then Vcodec := 'MS MPEG4 v2'
Else If Vcodec = 'div3' then Vcodec := 'DivX;-) MPEG4 v3'
Else If Vcodec = 'DIV3' then Vcodec := 'DivX;-) MPEG4 v3'
Else If Vcodec = 'div4' then Vcodec := 'DivX;-) MPEG4 v4'
Else If Vcodec = 'DIV4' then Vcodec := 'DivX;-) MPEG4 v4'
Else If Vcodec = 'div5' then Vcodec := 'DivX;-) MPEG4 v5'
Else If Vcodec = 'DIV5' then Vcodec := 'DivX;-) MPEG4 v5'
Else If Vcodec = 'divx' then Vcodec := 'DivX 4'
Else If Vcodec = 'mp43' then Vcodec := 'Microcrap MPEG4 v3';

// тоже с аудио
Case TempAcodec of
0: Acodec := 'PCM';
1: Acodec := 'PCM';
85: Acodec := 'MPEG Layer 3';
353: Acodec := 'DivX;-) Audio';
8192: Acodec := 'AC3-Digital';
Else
Acodec := 'Unknown (' + IntToStr(TempAcodec) + ')';
End;

Case (Trunc(TempAbitrate / 1024 * 8)) of
246..260: Abitrate := '128 Kbit/s';
216..228: Abitrate := '128 Kbit/s';
187..196: Abitrate := '128 Kbit/s';
156..164: Abitrate := '128 Kbit/s';
124..132: Abitrate := '128 Kbit/s';
108..116: Abitrate := '128 Kbit/s';
92..100: Abitrate := '128 Kbit/s';
60..68: Abitrate := '128 Kbit/s';
Else
Abitrate := FormatFloat('# Kbit/s', TempAbitrate / 1024 * 8);
End;

// тут некоторые вычисления
Size := TempSize / 1024 / 1024;
Fps := 1000000 / TempMicrosec; // FPS
LengthInSec := TempLengthInFrames / fps; // Length In seconds
Length := FormatFloat('# min', Int(LengthInSec / 60)) + FormatFloat(' # sec',
Round(LengthInSec - (Int(LengthInSec / 60) * 60)));
Vbitrate := (TempSize / LengthInSec - TempABitrate) / 1024 * 8;

// Выводим инфу в мемо
Memo1.Lines.Add('AVI INFORMATION');
Memo1.lines.Add('Size: ' + FormatFloat('#.## MB',Size));
Memo1.Lines.Add('Length: ' + Length);
Memo1.Lines.Add('');
Memo1.Lines.Add('VIDEO INFORMATION');
Memo1.Lines.Add('Codec: ' + Vcodec);
Memo1.Lines.Add('Bitrate: ' + FormatFloat('# Kbit/s', Vbitrate));
Memo1.lines.Add('Width: ' + IntToStr(VWidth) + ' px');
Memo1.lines.Add('Height: ' + IntToStr(VHeight) + ' px');
Memo1.Lines.Add('FPS: ' + FormatFloat('#.##', fps));
Memo1.Lines.Add('');
Memo1.Lines.Add('AUDIO INFORMATION');
Memo1.Lines.Add('Codec: ' + Acodec);
Memo1.Lines.Add('Bitrate: ' + Abitrate);
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
If OpenDialog1.Execute Then ReadAviInfo(OpenDialog1.FileName);
End;

end.

Автор: Rouse_ .
Взято из http://forum.sources.ru.

Оценка за ответ: 5.


Все вопросы и ответы на них Вы всегда можете найти на нашем сайте в разделе "Эксперт": http://www.delphi.int.ru/modules.php?name=expert.


Статья по Delphi.

Новых статей нет. Раздел "Статьи" на сайте скоро будет переработан.


Присылайте свои статьи по адресу info@delphi.int.ru с темой 'Articles' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки и на сайте. Также вы можете заполнить вот эту форму. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).


Файловый архив.

Из данного раздела Вы можете скачать различные файлы: компоненты, plug-in'ы для Delphi, документацию по программированию, программы, игры, написанные на Delphi и всё остальное... Вы можете добавить свои файлы в данный раздел. Чтобы сделать это, пожалуйста, заполните форму на сайте.

Новые файлы на сайте:

Название / описание файла
Категория
Объём
Ссылки
ArchiveCD - Электронный архив – каталог лазерных дисков.
Программы
251 Кб

Чтобы перейти к разделу "Файловый архив" на сайте, нажмите на эту ссылку.


Дружественные сайты.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите наш баннер на своём сайте. Подробнее о том, как это сделать, можно прочитать на странице данного раздела на нашем сайте. Узнать о всех наших друзьях более подробно вы сможете на той же странице...


http://www.excode.ru/ - Статьи, исходники, компоненты, книги, кодерский магазин.


http://xskernel.narod.ru/ - XSystem Kernel Project. Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.


http://tpascal.h15.ru/ - Сайт Злобина Евгения Сергеевича "ВСЁ О ПАСКАЛЕ". Здесь найдётся всё: исходники, программы, документация, алгоритмы, олимпиада, конкурсы, форум, уроки и многое, многое другое!!! Вступайте в сообщество ПаскALL. Сайт постоянно обновляется и развивается!!!


http://www.hkdsoft.narod.ru/ - H.K.D. Soft - Программирование на Delphi, C/C++, Assembler, Pascal, Basic/VB/VBA/VBS. Компоненты, статьи, исходники, множество е-книг, форум. Бесплатный софт. Скачать программу GamesBase - базу данных по играм содержащую описания, скриншоты, коды, прохождения игр.


http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.


http://www.visualbasic.noka.ru/ - Программирование на Visual Basic & Basic. На сайте Вы найдете множество примеров, статьи, исходники, ActiveX, а также многое другое!


http://www.sashook.hut1.ru/ - Игры, коллекция флешек, обои и заставки, компьютерные приколы, картинки, тосты и алкогольные присказки, смешные истории и анекдоты.


http://www.ssgroup.fatal.ru/ - Delphi 39. Ресурс для программистов. Статьи, исходники, компоненты, учебники, справочники, FAQ, программы и многое другое.


Дружественные рассылки:

Рассылки Subscribe.Ru :: Программирование
Интернет для Delphi-программиста
X-Program ПО, новости сайта и программирование в Delphi7
Visual Basic для новичков и профессионалов
Поиск текстов, переводов и аккордов песен
Напряги мозг!
   

 


Юмор.

Первый урок английского.
Учительница:
- Кто из вас, дети, знает все английские буквы?
Вовочка (программист маленький):
- Я.
(У) - Hу, называй, по порядку.
(В) - Q, W, E, R, T, Y.

:))

Если вас отовсюду гонят в три шеи, значит, вы - Змей Горыныч!

:))

В зеркале сегодня такие ужасы показывали!..

:))

Основное отличие игры от жизни - это существование клавиши Esc.

:))

И точка лазерного прицела на твоем лбу - тоже чья-то точка зрения.

:))

Начальник отдела кадров и хакер:
-"Не работал", "не учился", "не служил", "не имеет", "нет", "нет", "нет". Как же ты с такими данными работать собираешься?
- Не волнуйтесь, пожалуйста, уверяю вас, как только я буду работать, все данные будут в полном порядке.

:))


Пожалуйста, присылайте свои анекдоты по этой ссылке: info@delphi.int.ru и они обязательно будут опубликованы! Желательно на компьютерную тему.

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу!
Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Количество подписчиков постоянно растёт и, наверняка, найдётся тот человек,
который поможет вам! На сегодня всё. До встречи через неделю!
Ведущий рассылки, Ерёмин Андрей.

Вы можете оказать помощь нашему проекту через систему WebMoney: R379291065219, Z165075684614. Будем очень признательны!

 

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphifaq
Архив рассылки
Отписаться
Вспомнить пароль

В избранное