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

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

  Все выпуски  

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


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

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

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

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

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



Связь:

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

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

Для начала, хочу поздравить всех Вас с наступающим Новым Годом!

А теперь о новостях сайта и рассылки...

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

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

Кроме того, на сайте дефицит статей. Как-то собирался написать несколько штук, чтобы в рассылке было что публиковать, да вот времени всё нет... Думаю, среди Вас есть талантливые писатели? Если имеются собственные статьи, присылайте, опубликуем.

Также есть одно революционное изменение. Теперь любой исходник в рассылке и на сайте выделяется в специальной рамке. Смотрится красиво и легко воспринимается. Одна из особенностей - теперь все отступы в коде при публикации будут сохраняться (были жалобы на это). А в скором времени каждый исходник ещё будет раскрашиваться! В данный момент "робот-раскрасчик" уже готов, осталось только отладить.

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

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

До встречи!

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

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


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


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

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

Место
Имя
Баллы
Статус
1
Dron
303
Специалист
2
Feniks
296
Практикант
3
Ermakova Dasha
290
Практикант
4
Садовников Владимир
267
Практикант
5
Iron Monk
200
Практикант
6
Матвеев И.В.
149
Студент
7
mvp
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-формы   |   Система "Эксперт"


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

Вопрос #209 (автор вопроса: Матвеев И.В.; вопрос отправлен: 18.12.2005 02:34):

Можно ли узнать когда был "расшарен" каталог в сети. Т.е. узнать дату, когда на каталог был установлен общий доступ, если этот каталог находится не на моей машине и я имею к нему только "сетевой" доступ? [Ответить на вопрос]


Вопрос #210 (автор вопроса: Денис; вопрос отправлен: 18.12.2005 05:35):

Здравствуйте уважаемые эксперты! Подскажите пожалуйста: как превратить ячейку StringGrid'a в многострочный редактор типа TMemo, другими словами - добавить свойство Lines? Заранее всем спасибо. [Ответить на вопрос]


Вопрос #211 (автор вопроса: Павел; вопрос отправлен: 18.12.2005 15:41):

Как написать программу, которая будет определять какие пользователи есть на компьютере? Допустим, нажать кнопку и в memo создастся список всех пользователей. [Ответить на вопрос]


Вопрос #212 (автор вопроса: Владимир; вопрос отправлен: 18.12.2005 20:30):

Подскажите пожалуйста, кто работал с XStringGrid, как прикрутить форму к FormCellEditor? Что-то разобраться не могу, и документации никакой на офсайте нет, или ссылку на документацию. [Ответить на вопрос]


Вопрос #213 (автор вопроса: Сергей; вопрос отправлен: 19.12.2005 09:56):

Каким образом узнать количество страниц в документе Word и загрузить в OleContainer страницу с нужным номером? [Ответить на вопрос]


Вопрос #214 (автор вопроса: Slava; вопрос отправлен: 22.12.2005 21:11):

Нужно сделать небольшую программу для обмена сообщениями в локальной сети. Программа должна сидеть в трее и реагировать на входящие собщения. Вопрос: какие компоненты будет лучше всего использовать? [Ответить на вопрос]


Вопрос #215 (автор вопроса: Аркадий; вопрос отправлен: 27.12.2005 05:06):

Как сделать поиск в mdb или mde, в обьектах (таблицы, запросы, макросы, модули) и изменять функции? [Ответить на вопрос]


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

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

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

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

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

Если на данный вопрос не поступит ответов, он будет удалён из данного раздела 08.01.06.

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

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

Если на данный вопрос не поступит ответов, он будет удалён из данного раздела 15.01.06.

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

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

Если на данный вопрос не поступит ответов, он будет удалён из данного раздела 20.01.06.


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

Вопрос #181:
Как взять из Word картинку и вставить в мою базу данных?

1. [Отвечает: Матвеев И.В., 18.12.2005 06:51]: Итак, как выдрать рисунки из Word программно я так и не узнал, хотя занимался этим серьезно, но думаю, что копать нужно в направлении TWordApplication.Selection.InlineShapes, по-видимому, эта коллекция содержит все OLE объекты, включенные в документ.

Есть также программа Word2Picture (www.wordcnv.com), которая выдирает рисунки из Word документов в автоматическом режиме даже без использования сервера OLE. Но разработчики не хотят говорить как они это делают.

Желаю удачи.

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

Вопрос #200:
Есть вот такой код...

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? Заранее благодарен.

1. [Отвечает: Ares, 18.12.2005 20:52]: Хм... Проверил твой код, но описанной тобой ситуации так и не смог добиться - всё нормально работает. Может, дело в правах доступа? P.S. Проверял на WinXP, мож, с Win9х дело обстоит иначе...

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

2. [Отвечает: dasha ermakova, 19.12.2005 17:19]: Думаю, дело не в том, что диск сетевой. Проверяла ваш код, все нормально работало, и с сетевыми адресами тоже. Возможно, во время работы программы, адрес открытой папки где-то присваивается.

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

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

1. [Отвечает: Садовников Владимир, 17.12.2005 20:18]: Для всех компонентов это не получится. Уж для TButton - точно. Хотя можно создать n-ое количество компонентов, в которых заменить виртуальный метод Paint, в котором и рисовать контрол, как тебе надо. Либо использовать уже созданные другими людьми компоненты.

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

2. [Отвечает: Dron, 17.12.2005 23:35]: Если вы имеете ввиду скины, то можно использовать специализированные компоненты: AlphaControls, SkinForm, ThemeEngine, SkinCrafter и др. У стандартных компонент изменить оформление нельзя, разве что можно изменить их свойства. Чтобы не обращаться к каждому компоненту отдельно, компоненты можно искать. Примерно вот так:

For I:=0 To Form1.ComponentCount-1 Do TWinControl(FindComponent(Form1.Components[I].Name)).Visible:=False;

Это скроет все контролы на форме. Думаю, что направление и способ действия понятен.

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

3. [Отвечает: Pavel A. Repin, 19.12.2005 08:48]: Например, вот так:

var i: integer; begin for i := 0 to ComponentCount - 1 do if Components[i] is TMyComponentType then (Components[i] as TComponentType).Color := clRed; end;

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

4. [Отвечает: PVS, 19.12.2005 10:53]: Цвет можно - всего лишь нужно выставить ParentColor=True. С остальным труднее. Частично может помочь ParentCtl3D=True, но скорее всего часть "стилизации" придется писать руками :(

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

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

1. [Отвечает: Деревянко Евгений, 17.12.2005 22:24]: Сначала предлагаю определить, какие данные считать одинаковыми, то есть по каким полям проверять уникальность. Например: запись о двух сотрудниках с разными табельными номерами, но одинаковыми фамилиями и именами можно считать разными - просто совпадение (однофамильцы да к тому же ещё и тезки). Но разных людей с одинаковыми табельными номерами быть не может. То есть табельный номер должен быть уникальным. Для того, чтобы обеспечить уникальность по ключу (одному или несколким полям) можно прибегнуть к одному из следующих вариантов:

1) Задать ограничение (constraint) для данного поля в таблице, а в Delphi при помощи try ... except проверять на ошибку при попытке вставить/обновить запись. Что-то типа этого:

with Table1 do begin insert; FieldValues['EmpNo'] := 105; // это поле определено как уникальное // и такое значение уже есть FieldValues['LastName'] := 'SomeName'; FieldValues['FirstName'] := 'SomeName'; FieldValues['PhoneExt'] := 10; FieldValues['HireDate'] := '01.01.01'; FieldValues['Salary'] := 1000; try post except on e: EDBEngineError do if e.Message = 'Key violation.' then Application.MessageBox('Ошибка в ключе!', '', MB_ICONERROR); end; end;

2) Перед тем как вставить в таблицу данные нужно поискать ключевое значение в таблице, но если таблица довольно большая, а вставлять нужно часто, то работать будет медленно:

if Table1.Locate('EmpNo', 105, []) then Application.MessageBox('Ошибка в ключе!', '', MB_ICONERROR);

3) Если есть возможность, то следует ключевое поле опрелить как автоинкрементное (identity).

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

2. [Отвечает: Матвеев И.В., 18.12.2005 06:49]: Вариант первый: При добавлении новой записи производить поиск в таблице по добавляемому значению методом Lookup. Вот пример:

if Table1.Lookup('NAME', VarArrayOf([Edit1.Text]), 'NAME') = Null then ShowMessage('Такой записи нет') else ShowMessage('Такая запись уже есть');

Метод Lookup производит поиск в таблице, но не переводит курсор на найденную запись. Поиск может производиться как по индексированным, так и по неиндексируемым полям. Недостаток в том, что не все технологии этот метод поддерживает. Параметры: Имя поля, в котором искать; искомое значение; имя поля, значение которого будет передано в Result, если запись найдется.

Вариант второй: Создать индекс по тому полю, по которому требуется уникальность, с параметром Unicue и в событии OnPostError таблицы отлавтивать эту ситуацию.

Желаю удачи.

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

3. [Отвечает: PVS, 19.12.2005 10:46]: Если надо контролировать уникальность, к примеру, полей field_1, field_2, field_3 из таблицы mytable, то проще всего прямо в базе данных один раз выполнить вот такой SQL: create unique index mytab123 on mytable(field_1, field_2, field_3); и тогда на повторяющиеся данные будет "ругаться" сама база. Если же здача в том, чтоб пользователь видел не сообщение от базы данных на английском языке, да еще и с непонятным значением, а читабельную фразу "Такие данные уже существуют", тогда надо на событиеBeforePost написать что-то вроде:

CheckQuery.SQL.Text:= 'select count(*) as cnt from mytable where (field_1='+ Dataset.FieldByName('field_1').Value+') and (field_2='+ Dataset.FieldByName('field_2').Value+') and (field_3='+ Dataset.FieldByName('field_3').Value+')'; //Здесь все поля - числа. Для строк нужно больше кавычек CheckQuery.Active:=True; if CheckQuery.FieldByName('cnt').value<>0 then begin ShowMessage('Такие данные уже существуют'); DataSet.Cancel; end;

Хотя и здесь лучше иметь индекс по нужным полям - быстрее ищет.

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

4. [Отвечает: dasha ermakova, 19.12.2005 14:00]: Перед добавлением новой записи нужно просмотреть все записи таблицы и сравнить каждую с новой. Если это таблица базы данных, то например так:

procedure TForm1.Button2Click(Sender: TObject); var i: integer; fnd: bool; begin fnd:=false; with Table1 do begin DisableControls; First; for i:=1 to RecordCount-1 do begin if Table1.Fields[0].AsString = 'hello' then fnd:=true; Next; end; EnableControls; if fnd = true then MessageDlg('Такие данные уже существуют',mtWarning,[mbOK],-1); end; end;

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

5. [Отвечает: midav.land.ru, 21.12.2005 11:20]: Наиболее простой способ - когда проэктируете таблицу, указать что данное поле не должно содержать повторяющиеся значения. Тогда при добавлении одинаковых значений будет возникать исключение, которое нужно обработать. Вариант 2. (Я так делаю) Перед добавлением производиться запрос, а есть ли такое поле. На основании результата поиска и делается вывод. К сожалению Вы не указали как вы добавляете записи (Стандарные компоненты или как я через SQL запросы).

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

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

1. [Отвечает: Садовников Владимир, 17.12.2005 20:22]: Если ты создаёшь формы динамически - то сохраняй где-нибудь указатель на форму и сравнивай его перед следующим созданием формы с nil, а при закрытии формы - обнуляй. Либо можешь воспользоваться функцией FindWindow с соответствующим названием класса твоей формы и заголовка окна формы. Кроме этого, формы можно сделать модальными (хотя это не всегда помогает; например, когда необходимо работать сразу в нескольких формах) - это при помощи метода ShowModal класса TForm.

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

2. [Отвечает: Деревянко Евгений, 17.12.2005 22:30]: Все просто. Надо перед созданием формы проверить её существование:

if form2 = nil then begin Application.CreateForm(TForm2, Form2); form2.Show; end;

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

3. [Отвечает: Матвеев И.В., 18.12.2005 06:49]: Весь вопрос заключается в том, как Вы открываете дочернюю форму из главной. Если Вы обращаетесь к существующему экземпляру формы, например, методом Show - у Вас будет появляться одна форма, а при повторном вызове Show, она просто будет выведена на передний план.

Как я понял, Вы динамически создаете дочернюю форму, Вам нужно просто при первом вызове создать форму, а затем показать, а при последующих (форма <> nil) обращаться к существующей.

Вот пример:

if Form2 = nil then Form2 := TForm2.Create(Form1); Form2.Show;

Еще одно, если дочерняя форма богата компонентами и создается долго, Вы можете убрать ее из автосоздаваетмых - убрать строку Application.CreateForm(TForm2, Form2); из файла проекта - это сэкономит некоторое время при запуске приложения.

Желаю удачи.

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

4. [Отвечает: Ares, 18.12.2005 21:02]: Попробуй дочернюю форму вызывать вот так:

if not Assigned(Form2) then Form2 := TForm2.Create(Form1);

где Form2 - дочерняя форма.

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

5. [Отвечает: PVS, 19.12.2005 11:08]: По вопросу рискну предположить, что на Click по кнопке написан код a-la:

ChildFrm:=TChildForm.Create(Self); ChildFrm.Show;

А хочется чтоб было так:
1) не переменная ChildFrm, а свойство класса TParentForm.
2) в onClose для TChildForm CloseAction:=caHide;
3) ChildFrm:=TChildForm.Create(Self) - где-то в инициализации ParentFrm, например в OnCreate.
4) а по клику на кнопку просто ChildFrm.Show;
( или if not(ChildFrm.Visible) then ChildFrm.Show; )

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

6. [Отвечает: dasha ermakova, 19.12.2005 14:34]: Перед строчкой создания дочерней формы CreateMDIChild нужно поставить if MDIChildCount<1 then или не 1, а сколько форм можно максимум создать. И все.

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

7. [Отвечает: Feniks, 20.12.2005 12:50]: Я, например, пользуюсь следующим методом:
- создаю флаг буленовский и когда кликаешь по кнопке, устанавливаю флаг в FALSE, а в дочерней форме в событии OnClose этот флаг ставлю в TRUE;
- на главной форме клик по кнопке пишу в событии ActionList, в событии OnUpdate свойство Акшина кнопки Enabled приравниваю к флагу.

Пример: главная форма

var bIsNotChildWindow : Boolean = False;

На кнопку Button создаем Action в компоненте TActionList и вешаем два обработчика:

procedure TMainForm.ButtonActionExecute(Sender: TObject); begin // тут пишем открытие дочернего окна bIsNotChildWindow := False; end;

procedure TMainForm.ButtonActionUpdate(Sender: TObject); begin (Sender as TAction).Enabled := bIsNotChildWindow; end;

В дочерней форме:

procedure TChildForm.FormClose(Sender: TObject; var Action: TCloseAction); begin bIsNotChildWindow := True; end;

Таким образом твоя кнопка будет отключаться, когда ты открываешь доч. окно и опять включаться, когда ты его закрываешь. Очень удобный и быстрый метод.

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

8. [Отвечает: midav.land.ru, 21.12.2005 11:29]: Когда-то решал подобный вопрос. У компонента Application есть свойсво Forms, которое хранит список всех созданых (не объязательно видимых) форм. Тоесть перед созданием необходимо проверить, есть ли форма, если нет - создать.

function IsFormOpen(const FormName: string): Boolean; var i: Integer; begin Result := False; for i := Screen.FormCount-1 downto 0 do if (Screen.Forms[i].Name=FormName) then begin Result := True; Break; end; end;

Способ два, подсмотреный в Борланда и немного противоречаший справке, но реально работающий. Для кнопки вызова пишем:

if Form2<>nil then Form2:=TForm2.create(Form1); Form2.show; (Если форма создана, то она будет появляться) в Form2 в событии Close procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin Action:=caFree; //Говорим что при закрытии формы нужно удалить все ресурсы Form2:=nil; //А здесь принудительно зануляем. Это противоречивое место, но строка нужна. Иначе при повторном нажатии кнопки показать форму будет ошибка end;

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

9. [Отвечает: Shutn1k, 21.12.2005 18:53]: Вы наверное используете функцию: Show Form1; А надо: ShowModal Form1; Тогда, пока не закроете дочернюю форму, не сможете получить доступ к главной.

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

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

1. [Отвечает: Dron, 17.12.2005 23:29]: Возможно, в настройка обозревателя в Windows отключены Java-скрипты, поэтому и ошибку выдаёт. Чтобы выполнялись Java-скрипты никаких дополнительных пакетов устанавливать не нужно. Попробуйте открыть в IE и посмотреть - ошибка должна быть и в нём, т.к. в Windows всё взаимосвязано.

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

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

1. [Отвечает: Садовников Владимир, 17.12.2005 20:33]: Помимо драйвера USB тебе ещё придётся писать драйвер Flash-памяти. Поэтому хорошенько подумай, а оно тебе действительно надо? Может быть, этот документ тебе поможет: http://thegercog.narod.ru/Files/Docs/windows/wdm_power_management.rar. Но помимо этого нужно ковырять ещё драйвер Flash, а это сложнее на порядок. При этом ты будешь зависеть от конкретного производителя или конкретной реализации модели Flash-памяти. Ещё один плюс к работе - это то, что нужно ковырять файловую систему. Если на Flash находится FAT, то там не так сложно спрятать кластеры, но если попадётся NTFS/Ext/Reiser - то это будет на порядок сложнее. Можешь скачать с моего сайта документацию на FAT: http://xskernel.narod.ru/documentation/software/fat.pdf

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

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

1. [Отвечает: Садовников Владимир, 17.12.2005 20:36]: Есть хорошая функция - ParamStr(Index:Integer). Index может принимать значения от 0 до ParamCount(). Функция ParamStr возвращает аргумент командной строки по его номеру. Т.е. если мы хотим получить первый параметр, переданный программе, мы должны запросить ParamStr(1). Кроме этого, нулевым параметром всегда является полный путь к запущенному приложению. Поэтому ParamStr(0) аналогично Application.ExeName, но делает программу значительно компактной, т.к. отпадает необходимость использования VCL.

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

2. [Отвечает: Деревянко Евгений, 17.12.2005 22:33]: Фунция ParamStr возвращает параметры командной строки. Нулевой параметр и есть название файла запущеной программы. Например:

s := ParamStr(0);

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

3. [Отвечает: Dron, 17.12.2005 23:37]: Полный путь к exe-файлу программы, кроме Application.ExeName можно узнать, прочитав значение ParamStr(0). Согласно правилам Windows нулевой параметр - это путь к exe-файлу, а следующие параметры (1, 2 и т.д.) - это уже командные параметры.

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

4. [Отвечает: Матвеев И.В., 18.12.2005 06:07]: Используйте метод Windows.GetCommandLine; Он возвращает всю командную строку с которой было запущено Ваше приложение. Или другой, более надежный метод - GetModuleFileName. Вот пример:

var Buffer: array[0..260] of Char; Str : string; begin SetString(Str, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer))); ShowMessage(Str);

Желаю удачи.

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

5. [Отвечает: Pavel A. Repin, 19.12.2005 09:00]: Для этого подходит функция ParamStr(), предназначенная для определения параметров, с которыми была запущена программма. Paramstr(0) - содержит полный путь к программе.
Paramstr(1) и последующие - сами параметры.
Например: при запуске c:\myprog.exe /s /q:
Paramstr(0) будет содержать c:\myprog.exe
Paramstr(1) будет содержать /s
Paramstr(2) будет содержать /q
Надеюсь, объяснил понятно.

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

6. [Отвечает: PVS, 19.12.2005 11:13]: ParamStr(0) - он в System.

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

7. [Отвечает: Сергей Азачем, 19.12.2005 13:07]: Использовать функцию GetModuleFileName.

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

8. [Отвечает: Антон Трапезников, 20.12.2005 07:27]: Здравствуйте, Alex. Для этого используется функция ExtractFilePath. Вот примеры её использования:

MessageDlg('program path = ' + ExtractFilePath(Application.ExeName, mtInformation, [mbOk], 0);

или

function ApplicationPath: string; begin Result := ExtractFilePath(ParamStr(0)); end;

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

9. [Отвечает: Feniks, 20.12.2005 13:00]: Старой и доброй функцией Paramstr(0), которая вернет тебе путь и имя файла. Есть еще АПИшные функции, вот только я их не помню.

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

10. [Отвечает: midav.land.ru, 21.12.2005 11:35]: Программе передаются параметры командной строки. нулевой параметр как раз и хранит имя програмы с путём к нему. Так как Делфовский компилятор проводит разбор параметров, то просто пользуешься следующей конструкцией: ParamStr(0).

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

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

1. [Отвечает: Матвеев И.В., 18.12.2005 06:53]: Это очень просто и об это не раз писалось. Итак, Вам нужно поместить файл(ы) в ресурс, подключить этот ресурс к exe файлу программы, а затем сохранить эти файлы на диск. 1. Создание файла ресурсов. В Delphi за это отвечает утилита brcc32.exe, ей нужно передать файл скрипта ресурса .rc, этот файл имеет приблизительно такой вид:

nameinres1 rcdata "Имя файла 1"
nameinres2 rcdata "Имя файла 2"

здесь nameinres1 - имя в ресурсе, rcdata - секция, можно создавать свои, Имя файла 1 - имя файла, для добавления.

Чтобы не писать это вручную, можно воспользовться утилиткой ResEd http://www.wasm.ru/baixado.php?mode=tool&id=237. Далее нужно передать этот сценарий в brcc32.exe и получаешь готовый файл ресурсов .res.

Можно воспользоваться программой Resource Hacker (http://rpi.net.au/~ajohnson/resourcehacker) или ей подобной - она создает уже не сценарий, а готовый файл ресурсов.

2. Подключение файла к проекту. Осуществляется директивой R+ компилятора, например так: {$R resfile.res}, где это писать значение не имеет, хоть в проекте, хоть в .pas файле.

3. Сохранение файла из ресурсов на диск. Осуществяется с помощью класса TResourceStream:

var rs: TResourceStream; a: Pointer; begin rs := TResourceStream.Create(hInstance, 'RCDATA_1', RT_RCDATA); try GetMem(a, rs.size); rs.Read(a^, rs.size); {Теперь a - динамический указатель на код} { Здесь делается все, что необходимо с кодом, используя указатель a } FreeMem(a); finally rs.Free; end; end;

Желаю удачи.

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

2. [Отвечает: PVS, 19.12.2005 11:22]: Можно писать какие-угодно данные ПОСЛЕ кода программы. То есть в переменную надо запомнить размер программы без данных и со следующего байта читать "свою" информацию, открывая .exe-файл как внешний. Как ее туда дописать - дело техники (надежнее, конечно, другой программой).

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

3. [Отвечает: Feniks, 20.12.2005 13:14]: "Затолкнуть" в ЕХЕ-шник любой файл - это не проблема. "Запихивать" файлы в ЕХЕ-шник или в DLL-ку нужно следующим образом: создаешь текстовый файл с расширением .RC и пишешь в нем

<имя ресурса> <тип хранимого ресурса> <имя файла>

например:

BackGround0 BITMAP "BackGround0.bmp"
BackGround1 BITMAP "BackGround1.bmp"
BackGround2 BITMAP "BackGround2.bmp"
BackGround3 BITMAP "BackGround3.bmp"
SoundAbout WAVE "About.wav"
CurSQLWait RCDATA "SQLWait.ani"
AnimateWait AVI "AnimateWait.avi"

Тут перечислены стандартные типы ресурсов. Также можно использовать свои, например MYGIF. Но лучше использовать стандартные, так тогда проще их вытягивать будет. Если необходимо "затолкать" не стандартного типа ресурсов, тогда необходимо использовать RCDATA. Потом все это сохраняешь под именем myres.rc. ОЧЕНЬ ВАЖНО, чтобы все перечисленные в нем файлы и сам файл RC лежали в одной папке. Далее, компилируешь его с помощью утилиты brcc32 в файл .RES: brcc32 myres.rc. В результате получаешь myres.res Вот его потом присоединяешь в свое проект или в отдельный модуль: {$R myres.res} Тот файл RES, который сама Делфя используем по умолчания для каждого проекта, лучше не использовать, получишь много головной боли и хлопот. Я это сам на своей шкуре испытал. После присоединения его к проекту надо этот проект перебилдить (Build), а не перекомпилировать, т.к. при компиляции он не компилит файл RES в ЕХЕ. И в последующих изменениях в RC файле надо каждый раз билдить весь проект. Чтобы вытянуть эти ресурсы из ЕХЕ-файла и сохранить их в файлы:

var ResStream : TResourceStream; begin ResStream := TResourceStream.Create(hInstance, <имя ресурса>, RT_RCDATA); ResStream.SaveToFile('NameFile.ext'); ResStream.Free; end;

Также смотри в Хелпе: TResourceStream, LoadImage, LoadFromResourceName, LoadFromResourceID, LoadIcon, PlaySound, FindResource, FindResourceEx и т.д. и т.п.

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

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


Статья по Delphi.

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

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


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

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

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

Название / описание файла
Категория
Объём
Ссылки
Sassoft Builder - Новый мощный продукт для программиста на Delphi! Множество готовых функций и процедур; подойдет для новичков в программировании.
Программы
524 Кб

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


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

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

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-программиста
Visual Basic для новичков и профессионалов
   
 

Юмор.

Диалог между программистом и его женой вечером, после работы.
Муж пришел домой: Good evening dear, I`m now logged in.
Жена: Ты купил хлеба?
Муж: Bad command or filename.
Жена: Но я тебя попросила еще утром.
Муж: Erroneous syntax. Abort?
Жена: Как насчет нового телевизора?
Муж: Variable not found...
Жена: По крайней мере, дай мне свою кредитку, я хочу сходить в магазин.
Муж: Sharing Violation. Access denied...
Жена: Ты меня любишь или любишь только компьютеры или ты просто издеваешься надо мной?
Муж: Too many parameters...
Жена: Зря я вышла за тебя замуж.
Муж: Data type mismatch.
Жена: Ты вообще бестолковый...
Муж: It`s by Default.
Жена: Как насчет твоей зарплаты?
Муж: File in use... Try after some time.
Жена: Какое у меня положение в нашей семье?
Муж: Unknown Virus.

:))

Анекдот прислал: Feniks.

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

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

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

 

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

В избранное