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

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

  Все выпуски  

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


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

Программирование на DELPHI
Выпуск #29 (31 августа 2005 г.) 

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

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

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



Связь:

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


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

Итак, у нашего проекта закончился отпуск и теперь можно начать активно работать. Наверное, многие ещё находятся в отпусках, но это не проблема. Естественно, начать работу с пустого места нельзя, поэтому Вас ждёт небольшой сюрприз. Наш сайт полностью переработан. Изменено его оформление, которое теперь напоминает стиль Windows XP. Также изменены некоторые ссылки, поэтому старые уже не работают. Итак, что же нового появилось на сайте?

1. Новые файлы: компоненты, исходники, программы, игры, статьи.

2. Поиск, с помощью которого можно найти любой из вопросов, когда-либо задававшихся в рассылке. Имеются различные варианты поиска. Перейти >>

3. Зарегистрировавшись на сайте, Вы получаете логин и пароль. Когда зайдёте на сайт, введите их вверху страницы и при просмотре страниц сайта Вы всегда будете видеть количество баллов на своём счету, а также свой статус. Изменить данные о себе можно на странице управления аккаунтом.

4. Добавлена возможность оценки статей. Когда будете читать какую-либо статью, обратите внимание на небольшую форму внизу. Там можно отдать голос за статью (оценка - от 1 до 5). Средняя оценка каждой из статей, а также количество голосов показаны на странице раздела.

5. Добавлены новые страницы: "Правила портала" и "О сайте". Настоятельно рекомендую всем ознакомиться с правилами. Просьба их соблюдать.

6. Продолжает свою работу форум. Не забывайте, что там Вам могут быстро дать ответ на интересующий вопрос.

Вышеописанные изменения и новинки - только часть от всех изменений, какие произошли на сайте. Описать всего невозможно, т.к. каждая страница была переработана. Также исправлены ошибки, которые были на сайте. Ну что, как говорится, Добро Пожаловать!

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

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


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


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

 


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


Место
Имя
Баллы
Статус
1
Feniks
281
Практикант
2
Dron
216
Практикант
3
Iron Monk
200
Практикант
4
Садовников Владимир
282
Практикант
5
Dasha
172
Практикант
6
Андрей Лучников
83
Эксперт: 9-ый класс
7
Игорь Данилевич
76
Эксперт: 8-ой класс
8
VeroLom
71
Эксперт: 8-ой класс
9
Ершов Денис
53
Эксперт: 6-ой класс
10
Павел Звягинцев
50
Эксперт: 6-ой класс

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


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

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


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


Вопрос #141 (автор вопроса: Вениамин; вопрос отправлен: 09.06.2005 19:39):

В главной директории некоторого сайта, например www.name.ru, расположен текстовый документ, например 1.txt (т.е. путь к нему http://www.name.ru/1.txt). Как сделать, чтобы данный файл скачивался в папку с программой? Мне это нужно для следующей цели: есть программа с базой данных (*.txt). Я хочу обновлять эту базу через интернет, т.е. при нажатии кнопки "ОБНОВИТЬ" будет скачиваться файл по указанному мной (программистом) адресу. Спасибо. [Ответить на вопрос]


Вопрос #142 (автор вопроса: Михаил; вопрос отправлен: 18.06.2005 11:33):

При подключении к базам Access через ADO все работает нормально, если не используется пароль БД. При использовании пароля Delphi сообщает об ошибке в строке подключения. Как решить эту проблему? [Ответить на вопрос]


Вопрос #143 (автор вопроса: Ирина; вопрос отправлен: 20.06.2005 10:25):

Здравствуйте! Как из одной ТБД в ComboBox высветить 2 поля и как их по выбору перенести в DBGrid (т.е. делаем выборку из справочника, высветив 2 его поля (наименование, цена) и заносим выбранные данные в формируемую БД)? [Ответить на вопрос]


Вопрос #144 (автор вопроса: Angen; вопрос отправлен: 03.07.2005 22:41):

Пишу программу "Редактор настроек Windows" наподобие "WinSEr". Подскажите, пожалуйста, как в свойствах "Пароли" под Win98 в закладке "Удаленное управление" программно добавить определенного пользователя или удалить его? [Ответить на вопрос]



Вопросы, на которые нет ответов:

Вопрос #63 (автор вопроса: Den; вопрос отправлен: 31.01.2005 12:34):

День добрый ! Прошу помощи, кто знает как к Делфе (7) пристроить самописный плагин, или кто знает где взять плагин к D-7, чтоб как в D-8 в редакторе кода можно было сворачивать текст процедур и отдельных блоков кода?. Первый вариант желательнее... [Ответить на вопрос]


Вопрос #78 (автор вопроса: Hires; вопрос отправлен: 20.02.2005 16:33):

Как получить скорость работы GPU и памяти видео карты? [Ответить на вопрос]


Вопрос #82 (автор вопроса: Николай; вопрос отправлен: 23.02.2005 01:44):

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


Вопрос #88 (автор вопроса: Sergey; вопрос отправлен: 15.03.2005 19:57):

Вопрос по TChart. Как осуществить привязку указателя мыши к линии LineSeries? И еще. По оси X - время (DateTime). Как "вытащить" значение Y в любой точке LineSeries? [Ответить на вопрос]


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

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


Вопрос #105 (автор вопроса: Crazy_Jack; вопрос отправлен: 03.04.2005 14:44):

Как прочитать под WinXP MBR? [Ответить на вопрос]


Вопрос #131 (автор вопроса: YaricZ; вопрос отправлен: 21.05.2005 15:01):

У меня такой вопрос: я использую библиотеку KOL и MCK, но компонентов в этих библиотеках немного - только стандартные. Внимание - вопрос знатокам: возможно ли использование компонентов Delphi совместно с KOL? Если добавить обычный компонент из вкладки, к примеру, "стандартные" - программа не компилируется. И второй вопрос: если совместное использование KOL со стандартными компонентами Delphi невозможно, то где можно скачать аналог компонентов DataSource, ClientDataSet, DBGrid. DBEdit, DBMemo? На официальном сайте ничего нет. Заранее выражаю благодарность всем, кто сможет мне помочь. [Ответить на вопрос]


Вопрос #138 (автор вопроса: YaricZ; вопрос отправлен: 04.06.2005 21:47):

Как сделать анализатор звука (спадающие пики как в Winamp) ? [Ответить на вопрос]


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


Вопрос #122:
Как заставить NMSMTP (Delphi 6) работать через прокси-сервер? Или подскажите другой компонент, с помощью которого можно отправлять почту, но только с возможностью работы через прокси.

1. [Отвечает: mvictor, 08.06.2005 15:35]: Не очень понял причем здесь прокси. Попробуй Indy, по-моему там есть все.


Вопрос #55:
Здравствуйте. Прошу знающих помочь. Кто хоть немного соприкоснулся с Delphi 8. В чем разница между WinForm и VCL.NET, В VCL.NET не смог найти как работать с ADO, а в WinForm всё настолько запутанно ...(к примеру, по нажатию кнопки необхрдимо создать и высветить новое окно). В D-5 и D-7 это решалось просто:Form2 := TForm2.Create(nil); Form2.ShowModal; Form2.Free; Окно создано (когда необходимо), показано пользователю и по закрытию уничтожается. Как в D-8?

1. [Отвечает: One, 08.06.2005 16:24]: Если любишь всё новое без разбора, то ставь Delphi 2005 (хотя у меня эта система глючила и в итоге вернулся к 7) и работай с Win32 БЕЗ .NET. Microsoft им не пользуется (.NET) – вот и ты не спеши.

2. [Отвечает: spoon, 09.06.2005 10:41]: Различие между WinForm и VCLForm заключается в том, что второй автономный, т.е все библиотеки включаются в exe, а у первого только ссылки на них...


Вопрос #80:
Привет всем! у меня возникла такая вот проблемка. Есть база данных, созданная в MS Access, которая содержит 2 поля, в одном картинки, во втором текст. При подключении этой базы в Делфи7 (используются ADO компоненты), появляется ошибка Bitmap image is not valid. Подскажите, что делать? Связь с БД есть, т.к. текст она показывает. Пробовала менять форматы картинок и в JPG, и в разные BMP. Ничего не помогло.

1. [Отвечает: One, 08.06.2005 16:32]: А не пробовала хранить картинки не в таблице, а в папке на жёстком диске и называть их в соответствии со значением ключевого поля, например? И при переходе по записям вызывать отображение изображения из файла. Так всегда делаю, а в таблицах картинки хранить неудобно.

2. [Отвечает: SHKoder, 08.06.2005 17:33]: Используй тип поля BLOB.

3. [Отвечает: mfred, 08.06.2005 23:30]: Точно не гарантирую, но возможно в Delphi, когда ты связываешь БД с какой-то таблицей на форме, она не может воспроизвести картинку. Попробуй как-нибудь подстроить, или текст в одном поле, а рисунок в другом.


Вопрос #64:
Прошу ответить на вопрос. Можно ли в Delphi в исходнике использовать верхние и нижние индексы? Если можно, как?

1. [Отвечает: Лялин Александр Николаевич, 08.06.2005 17:44]: Можешь попробовать отдельный редактор с подобной функцией. Например: Notepad ++. http://notepad-plus.sourceforge.net/uk/site.htm.


Вопрос #118:
Компонент F1Book. Пишешь в ячейку по-русски. Покидаем ячейку - шрифт в покинутой ячейке, насколько я понимаю становится албанским. Как у этого компонента менять кодовую страницу?

1. [Отвечает: Dron, 08.06.2005 11:03]: Я сделал всё, как было описано: положил F1Book на форму, запустил программу, написал по-русски и пошёл по другим ячейкам. Текст остался русским! Наверное, у вас в системе какие-то настройки шрифтов сбиты. Попробуйте сделать на каком-другом компьютере. Мне кажется, что будет всё нормально.


Вопрос #116:
Здравствуйте! Что нужно сделать, чтобы в отчетах Rave версии 5.0 правильно отображался русский текст? Спасибо.

1. [Отвечает: One, 08.06.2005 18:17]: Не все шрифты правильно отображают кириллицу. Советую поэкспериментировать с выбором шрифта, чтобы исключить искажение данных.

1. [Отвечает: Иван, 03.06.2005 12:46]: Был такой случай: написал программуу. На моем компьютере отчеты создавались "грамотно", т.е. русский был русский, а не ломаные символы. На другом компьютере (под какой и писалась программаа) в отчете получились иероглифы, я просто переустановил BDE и все встало на свои места.


Вопрос #137:
Хочу реализовать загрузку и сохранение баз. Проблема в следующем: при создании базы берётся имя, которое задаёт пользователь, и к нему приписывается расширение .XML (OpenDialog.FileName + '.xml'). Здесь всё нормально, но при загрузке базы для редактирования и сохранения изменений уже к имени файла Base.xml снова приписывается ".Xml" ...

1. [Отвечает: One, 08.06.2005 19:00]: Возможно, тебе помогут функции ExtractFileDir, ExtractFileExt, ExtractFileName.

2. [Отвечает: Dron, 08.06.2005 19:08]: Не совсем понимаю проблемы... Ну а почему нельзя его ручками убрать, раз оно лишнее? Т.е. так: FileName:=Copy(FileName1,Length(FileName)-4).

3. [Отвечает: SHKoder, 09.06.2005 09:49]: Забава вся в том что ты используешь глобальную переменную, к которой потом конкатенируешь расширение файла... Не делай этого... Отдай эти функции TOpenDialog и TSaveDialog. Покопайся в их функциях и там найдешь, кажется, DefaultExt - расширение файла. Принимает по маске '*.xml' и FileName - если хочешь завязать только на одном имени или маске, с помощью которых ты сможешь сохранять только с этим расширением файл и только с ним естественно его открыть, причем при сохранении в TOpenDialog не обязятельно вбивать расширение файла, а только его имя.

4. [Отвечает: Feniks, 13.06.2005 11:27]: Перед сохранением данных в файл проверяйте FileName на присутствие в нём расширения .XML. Если там такого нет, то добавляйте сами. Для этого в хелпе смотрите функции :
function ExtractFileDir(const FileName: string): string;
function ExtractFileDrive(const FileName: string): string;
function ExtractFileExt(const FileName: string): string;
function ExtractFilePath(const FileName: string): string;
function ExtractFileName(const FileName: string): string;
function ExtractRelativePath(const BaseName, DestName: string): string;
function ExtractShortPathName(const FileName: string): string;

5. [Отвечает: Evgeshka Vasilkov, 13.06.2005 23:50]: Великий и могучий хелп дает нам знак:
uses sysutils;
if ExtractFileExt(FileName)<>'.xml' then FileName:=filename+'.xml';

Если расширение файла присутствует, и оно не равно '.xml', добавим нужное расширение. Есть идеи проще?


Вопрос #134:
Как можно увидеть метку диска?

1. [Отвечает: Dron, 08.06.2005 19:06]: Предлагаю несколько оригинальный метод. Кладём на форму компонент TDriveComboBox (вкладка Win 3.1). У него устанавливаем: Name=Drives; Visible=False. Далее помещаем на форму Edit1, Label1 и Button1. Пусть в Edit1 вводится буква диска, у которого нужно узнать метку... Тогда в Button1.OnClick() пишем:

procedure TForm1.Button1Click(Sender: TObject);
Var I: Integer;
begin
Label1.Caption:='';
For I:=0 To Drives.Items.Count-1 Do
If Copy(Drives.Items[I],1,1)=StrLower(PChar(Edit1.Text)) Then
Label1.Caption:=Copy(Drives.Items[I],3,Length(Drives.Items[I]));
end;

Т.е. происходит перебор всех строк, каждая из которых включает имя диска и его метку. Если Label1.Caption после нажатия на кнопку станет пустым, значит данный диск недоступен; если он станет двумя квадратными скобками: ( [] ), значит диск не имеет метки.

2. [Отвечает: SHKoder, 09.06.2005 09:41]:
procedure TForm1.Button2Click(Sender: TObject);
var
VolumeName,
FileSystemName : array [0..MAX_PATH-1] of Char;
VolumeSerialNo : DWord;
MaxComponentLength,FileSystemFlags: Cardinal;
begin
GetVolumeInformation('C:\',VolumeName,MAX_PATH,@VolumeSerialNo,
MaxComponentLength,FileSystemFlags, FileSystemName,MAX_PATH);
Memo1.Lines.Add('VolumeName = '+VolumeName); //метка диска
Memo1.Lines.Add('SerialNo = $'+IntToHex(VolumeSerialNo,8)); //его
ссерийный номер
Memo1.Lines.Add('CompLen = '+IntToStr(MaxComponentLength));
Memo1.Lines.Add('Flags = $'+IntToHex(FileSystemFlags,4));
Memo1.Lines.Add('FSName = '+FileSystemName);
end;

Думаю, полностью рабочий исходник тебе поможет.

3. [Отвечает: Feniks, 13.06.2005 10:52]:
var
i: integer;
Drives: DWORD;
Result: BOOL;
RootPathName: PChar;
VolumeSerialNumber: DWORD;
MaximumComponentLength, FileSystemFlags: DWORD;
VolumeName : packed array [0 .. MAX_PATH - 1] of Char;

begin
FillChar(VolumeName, SizeOf(VolumeName), 0);
// Get all the logical drives on the system
Drives := GetLogicalDrives;
for i := 2 to 25 do // Only deal with drives C: through Z: (2 is C, 3 is D, etc.)
begin
if (Drives and Trunc(Power(2.0,i))) > 0 then // Does Drive "i" exist?
begin
// Drive exists, convert i to a root path name (e.g., convert 2 to 'C:\')
RootPathName := PChar(Chr(i + 65) + ':\');

// Get the volume information
Result := GetVolumeInformation(
RootPathName, // address of root directory of the file system
@VolumeName, // address of name of the volume
SizeOf(VolumeName), // length of lpVolumeNameBuffer
@VolumeSerialNumber, // address of volume serial number
MaximumComponentLength, // address of system's maximum filename length
FileSystemFlags, // address of file system flags
nil, // address of name of file system
0 // length of lpFileSystemNameBuffer
);

// if the call was successful, add the serial number to the listbox.
if Result then
ShowMessage('Drive : ' + Chr(i + 65) + ':\ ' + #13 +
'Volume Name : ' + StrPas(VolumeName) + #13 +
'SerialNumber : ' + IntToStr(VolumeSerialNumber));
end;
end;
end;

4. [Отвечает: Андрей Лучников, 14.06.2005 11:22]: Если я правильно понял, то нужна привязка к диску (или какая-то проверка). Есть хорошая API-функция GetVolumeInformation. Простой пример чтения a la серийника винта или любого драйва (тот, который задается при форматировании):

uses ShellAPI;

...

function GetSNHDD(DriveChar: Char):Word;
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;

"abs" потребовался для исключения отрицательных значений (почему-то иногда бывают). Для более детальной информации лучше почитать хелп.


Вопрос #133:
Доброго времени суток! Подскажите, пожалуйста, как в Delphi7 создать сервис с встроенным в него интерфейсом (или наоборот)? То есть, во время выполнения сервиса (состояние - работает) нужно выводить иконку в трей и по двойному клику на неё вызывалась форма, а при остановке сервиса форма была недоступна, как и иконка в трее. Что-то вроде WinRoota, MDaemon-a. У меня есть подходящий объект, но он во время работы загружает процессор на все 100%. Подскажите, как лучше поступить.

1. [Отвечает: Маренич Владимир, 08.06.2005 23:06]: Попробуй создать безоконный сервис, а управление сервисом (остановка, перезапуск, настройка опций в форме, отображение состояния) сделать другим приложением, в котором можно использовать CoolTrayIcon (см. на torry.net). Преимущества: сервис будет запускаться до логина пользователя, а приложение-спутник после входа пользователя. В случае глюков спутника работа сервиса не прекратится, а спутник можно перезапустить. Спутником можно контролировать "запущенность" сервиса и в случае каких либо сбоев перезапускать и т.д. и т.п. Сам так сделал. :) Удачи.
P.S. А если все-таки надо сделать одним процессом, то нужно установить свойство сервиса (TService) Interactive=true.

2. [Отвечает: VeroLom, 09.06.2005 02:23]: Проще всего написать программу, управляющую сервисом. По таймеру, например, можно проверять состояние сервиса и, если он работает, показать иконку, иначе спрятать.

3. [Отвечает: spoon, 09.06.2005 11:00]: Используй RxTrayIcon.


Вопрос #140:
Салют всем! У меня такая проблема. Я сделал небольшую базу данных, где есть связанные таблицы. В общем когда удаляешь запись номер 3 главной таблицы, а потом вставляешь запись номер три и получается, что в подчинённой таблице записи связанные с бывшей записью номер три не удалились. В Database Desktop я сделал каскадное удаление записей, т. е. удаляешь главную и из всех подчинённых удаляются сооттветствующие записи, но при работе программы выдаётся ошибка: Master has detail records. Cannot delete or modify. Тогда я попробовал удалять записи программно, но и тут меня постигла неудача, выдаётся ошибка: Table cannot be opened for exclusive use. Типа не могу получить эксклюзивный доступ, хотя во время работы программы в связанных таблицах можно вручную удалять, добавлять и т п. Прошу разъяснить, что я не так делаю.

1. [Отвечает: Feniks, 13.06.2005 13:05]: Если Вы используете таблицы Paradox, то я вынужден Вас огорчить - эти таблицы не поддерживают такие связи, хотя в Databse Desktop-е есть возможность создавать эти связи и в его хелпе все описано про каскадное удаление и т.д. Но реально в жизни это не так. Поэтому, единственный выход - это не создавать такие связи, а делать все вручную, т.е. все каскадное удаление, обновление записей и т.д. Я тоже когда-то наступил на эти грабли...

2. [Отвечает: SHKoder, 09.06.2005 10:01]: Очевидным у тебя в каскаде стоит не то событие, ставь его на Delete
Action, тогда достаточно удалять запись только из главной таблицы, а из подчиненной будет удаляться сама. А вообще по правилу програмления не нужно удалять. Заведи логическое поле, которое будет отвечать по свойствам за удаление записи, например имею таблицу с полями:

fk_id - идентификатор
fc_name - наименование
fn_value - числовое значение
fl_del - флаг удаления

и делаешь:

select * from table
where fl_del = 0
значит все не удаленые записи

при имении записей в таблице:
fk_id | fc_name | fn_value | fl_del
1 |имя 1 | 1 | 0
2 |имя 4 | 123 | 1
3 |имя 2 | 234 | 0
4 |имя 6 | 46 | 0

после выборки ты получишь то что тебе необходимо:

fk_id | fc_name | fn_value | fl_del
1 |имя 1 | 1 | 0
3 |имя 2 | 234 | 0
4 |имя 6 | 46 | 0

а потом связывай ее с другой таблицей...
ведь запись с fk_id = 2 уже не существует в выборке, а значит и нет ссылки на подчиненную...

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

3. [Отвечает: Маренич Владимир, 08.06.2005 23:45]: Скорее всего проблема в том, что в компоненте TTable установлено свойство Exclusive=true. А по поводу удаления мог бы написать, какую СУБД используешь. Хотя по тому, что есть в тексте вопроса могу предположить (уверен на 99%), что это Paradox. В таком случае это так. Перед удалением записи нужно удалить все связанные с ней записи из других таблиц. Почему Paradox это не делает при установленном CASCADE не понимаю. Но простой пример поможет этот "глюк" обойти. См. приложение (Delphi 7).

4. [Отвечает: msg-Galicino, 11.07.2005 10:35]: Дмитрий, можно использовать каскадное удаление, но сначала удалять дочерние записи и только потом основную. Т.е. в порядке подчиненности снизу вверх.


Вопрос #136:
Использую базу данных в формате XML (через компонент DataSource, ClientDataSet), где хранятся вопросы и ответы к тесту - соответствующему приложению. При запуске теста база каждый раз заново загружается в программу. Возможно изменение базы через редактор вопросов. Вопрос: можно ли зашифровать базу вопросов, чтобы она была доступна для обновления, чтения, изменения? Цель - скрыть от тестируемого правильные ответы (база легко просматривается в Total Commander при нажатии F3).

1. [Отвечает: SHKoder, 09.06.2005 09:44]: Метод основан на сложении текста и пароля: "мой текст" + "пароль" = ('м'+'п')('о'+'а')... То есть каждый символ получают путем сложения соответствующих символов текста и пароля. Под "сложением символов" я подразумеваю сложение номеров этих символов. Обычно пароль длиннее текста, поэтому его размножают: "парольпар". Чтобы расшифровать текст, нужно проделать обратную операцию, то есть из текста вычесть пароль. При нажатии на Button1 эта программа шифрует текст из Memo1 при помощи пароля из Edit1. Результат сохраняется в строку s. Для наглядности зашифрованный текст также помещается в Memo1. При нажатии на Button2 текст из s расшифровывается. Если Вы нажмете Button1 два раза подряд, получится зашифрованный зашифрованный текст. Вернуть начальный текст можно будет двумя нажатиями на Button2.

var
s: string;

procedure Code(var text: string; password: string;
decode: boolean);
var
i, PasswordLength: integer;
sign: shortint;
begin
PasswordLength := length(password);
if PasswordLength = 0 then Exit;
if decode
then sign := -1
else sign := 1;
for i := 1 to Length(text) do
text[i] := chr(ord(text[i]) + sign *
ord(password[i mod PasswordLength + 1]));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
s := Memo1.Text;
code(s, Edit1.Text, false);
Memo1.Text := s;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
code(s, Edit1.Text, true);
Memo1.Text := s;
end;

2. [Отвечает: Evgeshka Vasilkov, 13.06.2005 23:59]: База элементарно шифруется xor-ом:

var s1:string;
begin
s1:=GetStringFormDataset();//любым доступным способом получить
исходную строку
s2:='';//см. примечание
for i:=1 to length(s1) do begin
s1[i]:=chr(ord(s1[i]) xor 33);//прикроем текст одним символом...
//s1[i]:=chr(ord(s1) xor hash[i];//..серией символов из массива
s2:=format(s2+'%.2x',[ord(s1[i])]); //см. прим
end;
label1.caption:=s1;
end;

После применения такого способа шифрования в "тотальном командире" базу прочитает только Нео. Но от кражи и дешифровки базы спасет только AES, rijndael или любой другой сравнительно современный алгоритм кодирования. Примечание: При любом способе кодирования нужно уделять внимания алгоритмам чтения шифровок. При обычных методах типа .lines.add() символы с кодами 00 могут здорово подмочить репутацию. На мой взгляд лучше хранить в xml не строку, как она есть, а строку её hex кодов ("HEX" ="484558"), и при чтении преобразовывать её в читабельный текст вместе с декодированием. Хотя чем писать своё, для дела (не в качестве самообразования), можно использовать уже готовые программы для тестирования (написанные на неслабом уровне ещё в прошлом веке)...


Вопрос #139:
Можно ли ориентировать меню (компонент MainManu) вертикально?

1. [Отвечает: SHKoder, 09.06.2005 09:52]: Можно использовать компоненты, которые образуют аналогичные меню, но перетягиваемые, например в MS Word или Excel, такие компоненты называются dxBarManager из набора DevExpress. Там много всего приятного и удобного.

2. [Отвечает: Feniks, 13.06.2005 12:54]: Можно, если его делать в стиле Офиса. Т.е. меню надо делать на основе TControlBar и TToolBar, или им подобным. Пример построения меню.


Вопрос #113:
Как экспортировать отчеты в Word?

1. [Отвечает: spoon, 09.06.2005 10:58]: Заюзать FastReport :)


Вопрос #135:
Как создать поиск с любой частью поля, а также чтобы была возможность продолжить поиск? В VBA это называется "Найти далее". То есть по находит первое совпадение (подчеркну: с любой часть поля - не целиком, не сначала), а по кнопочке идет далее по таблице и находит совпадения.

1. [Отвечает: Feniks, 13.06.2005 11:06]: Возможно Вам поможет функция Locate, которая есть у TTable и TQuery.
Она описана в Хелпе.

2. [Отвечает: Андрей Лучников, 14.06.2005 14:44]: Если это базы, то самое реальное - создать запрос (TQuery) и выбрать все записи удовлетворяющие критерию через оператор Like, получится набор записей, по которому можно перемещаться, параллельно сихронизируясь с основной таблицей (через любой метод поиска, например, Locate или FindKey), естественно, что у записи должен быть уникальный ключ.


В рассылке публиковались вопросы, на которые не ответил никто. Найти эти вопросы Вы можете на нашем сайте в разделе "Эксперт": http://www.delphi.int.ru/modules/expert/. Если Вы ответите на них, авторы этих вопросов будут Вам очень признательны. Все вопросы, опубликованные в данном выпуске рассылки, действительны в течение 7 дней после отправки самой рассылки. Ответы, присланные по истечении данного срока, приняты не будут. Пожалуйста, обратите на это внимание и рассчитайте свободное время. И не забывайте: чем больше ответов на вопросы Вы присылаете и чем качественнее эти ответы, тем больше у Вас шансы выиграть призы.


Статья по программированию.

Пишем компонент - окно выбора папки.

Автор: Трофим Роцкий
Источник: http://delphid.dax.ru

Среди стандартных диалогов Delphi 6 (вкладка Dialogs) диалог выбора папки, как это не прискорбно, отсутствует. Но ничего :) Сейчас мы исправим данное упущение, написав соответствующий компонент.

Чтобы создать новый компонент, в Delphi IDE выберите пункт File > New > Other и затем в появившемся окне нажмите New Component. Появится диалоговое окно, в котором:

  • Ancensor type (класс-предок нового компонента) - введите TComponent;
  • Class Name (имя нового класса) - TBrowseFolderDlg;
  • Palette Page (имя вкладки: поместим наш диалог вместе со стандартными дельфийскими) - Dialogs.

Остальное оставьте без изменений и нажмите OK. Наш мегадиалог будет вызываться функцией, продекларированной в Public Declarations компонента:

function BrowseFolder(title: PChar; h: hwnd): String;

где title - заголовок диалога (поставьте любой на ваш вкус :) ), h - хэндл окна-владельца (то есть вашей программы). А команды, использованные в коде, содержатся в ShlObj.pas, так что не забудьте указать этот модуль в разделе Uses.

unit BrowseFolderDlg;

interface

uses
Windows, Messages, SysUtils, Classes, Controls, ShlObj;

type
TBrowseFolderDlg = class(TComponent)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
function BrowseFolder(title: PChar; h: hwnd): String;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Dialogs', [TBrowseFolderDlg]);
end;

function TBrowseFolderDlg.BrowseFolder(title: PChar; h: hwnd): String;
var
lpItemID: PItemIDList;
path: array[0..Max_path] of char; //выбранная папка
BrowseInfo: TBrowseInfo; //настройки диалога
begin
FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
SHGetSpecialFolderLocation(h,csidl_desktop,BrowseInfo.pidlRoot);
//устанавливаем свойства диалогового окна
with BrowseInfo do begin
hwndOwner := h; //окно-владелец
lpszTitle := title; //заголовок диалога
//не показываем некоторые системные папки: "Корзина", "Панель управления" и т.д
ulFlags := BIF_RETURNONLYFSDIRS+BIF_EDITBOX+BIF_STATUSTEXT;
end;
//выводим диалог
lpItemID := SHBrowseForFolder(BrowseInfo);
//папка, указанная юзером, существует?
if lpItemId <> nil then begin
SHGetPathFromIDList(lpItemID, Path);
result:=path;
GlobalFreePtr(lpItemID); //освобождаем ресурсы
end;
end;

end.

Готово? Сохранитесь и, выбрав Component > Install Component, проинсталлируйте наш диалог, указав в разделе Unit File Name путь к файлу BrowseFolderDlg.pas.

Осуществить вызов диалога из программы можно так (разумеется, предварительно бросив TBrowseFolderDlg на форму):

procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Caption:= 'Выбрана следующая папка: '+
BrowseFolderDlg1.BrowseFolder('Укажите каталог:',Application.Handle);
end;

Конечно, это только "скелет" полноценного компонента, и просторы для модернизации безграничны...


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


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

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

Название / описание файла
Категория
Объём
Ссылки
Камень-Ножницы-Бумага - Компьютерная версия старой игры. Есть выбор уровня сложности, а также правила игры.
Игры
259 Кб

Monster Speech - Компонент, с помощью которого можно "научить" приложение разговаривать. Поддержка SpeechAPI 4.

Компоненты
66.2 Кб

MxTipDialog - Готовый диалог "Tip of the day". Установите его и ваши приложения начнут при запуске отображать полезные советы!

Компоненты
261 Кб

Free Button - Фигурная цветная кнопка с тенью, у которой можно изменить цвет. Также на кнопку можно поместить изображение.

Компоненты
184 Кб

SynEdit 2.01b - текстовый редактор. Его основное назначение состоит в выделении синтаксиса различных языков программирования. Большинство языков, существующих на данный момент, уже заложены в редактор: Assembler, Pascal, PHP, Perl, C++, JavaScript, Fortran, Visual Basic, Python, SQL и многие другие. Естественно, можно создавать и свои комбинации подсветки текста.

Компоненты
998 Кб

Start2w - Компонент сделан на базе стандартного компонента TPanel. Start2w может отображать иконку windows-приложения, а также запускать это приложение.

Компоненты
7.80 Кб

GruCredits - Компонент эмитирует титры, как в фильмах.

Компоненты
5.26 Кб

MonDir - Программа, отслеживающая изменения в указанном каталоге (появление нового файла, удаление, переименование). Является примером работы с потоками.

Исходники
5.56 Кб

GruString - Модуль для работы со строками. Большое количество функций для обработки строковых переменных.

Исходники
9.31 Кб
Статья: Пишем компонент - окно выбора папки.
Статьи
4.69 Кб

Passwords Keeper - универсальный хранитель паролей. Основные преимущества: удобный интерфейс; шифрование всех хранимых данных; быстрый ввод паролей в любое Windows-приложение; бесплатность (freeware).

Программы
719 Кб

Внимание! На информационном портале Subscribe.Ru появилась возможность прикреплять небольшие картинки к письмам рассылки. Предложение следующее: для файлов данного раздела можно помещать небольшой скриншот, взглянув на который сразу можно увидеть компонент "в работе". Хотелось бы узнать Ваше мнение: стоит ли прикреплять данные скриншоты или можно обойтись без них? Это увеличит размер писем на 30-40 Кб. Итак:

Нужно ли помещать в письма рассылки скриншоты компонент, программ, исходников и других файлов раздела "Файловый архив"?

1. Да, было бы неплохо.

2. Нет, не нужно, а то письма рассылки будут слишком большими.

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


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

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


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


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


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


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


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


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

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

 


Юмор.

- Что такое пошаговая стратегия?
- Это Need for Speed III на 486-ом компьютере.

:))

Здравствуйте, уважаемая редакция "Компьютерры". Прошу выслать мне полный домашний адрес Билла Гейтса и написание его имени и фамилии на английском языке. Заранее благодарен. Зеваков Денис Викторович.
ОТ РЕДАКЦИИ: Уважаемый Денис! Если вы хотите отправить нашему приятелю Билли новогодний подарок, достаточно написать "Bill Gates, ЫФЭб и будьте уверены - дойдёт, его в Америке каждая собака знает. А для тех, кто захочет отправить что-нибудь посущественнее, сообщаем точные координаты: N47, 38' 22,9'' W122. 07' 39,3'' - при радиусе поражения в 5 км попадание гарантируем.

:))

- Как три программиста могут организовать бизнес?
- Один пишет вирусы, другой - антивирусы.
- А третий?
- Операционные системы, под которыми это всё работает.

:))

"Дорогая! - заявляет один программер своей жене. - За всё, что ты для меня сделала, я решил увековечить твоё имя! Я назвал твоим именем только что созданный мною вирус".

:))

"Ты уверен, что хочешь выключить компьютер?" - спросил компьютер.
Со словами "не хочу, но надо!" Штирлиц в пятидесятый раз за последние двадцать минут нажимал на кнопку "Нет".

:))

Встречаются два программиста:
- Говорят, ты женился!
- Да, есть такое дело.
- А как зовут?
- (задумчиво) Окса... нет, Татья... короче, номер её ICQ - 90761437!


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

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

Вы можете оказать помощь нашему проекту через систему WebMoney:
R760630419845
Z947123691104
Будем очень благодарны!

 

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

В избранное