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

Интернет для Delphi-программиста


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

Интернет для Delphi программиста.

Выпуск : № 47


Здравствуйте уважаемые подписчики рассылки "Интернет для Delphi программиста". Данная рассылка предназначена для всех кого интересует Delphi, здесь будут выкладываться ссылки на различные ресурсы интернета так или иначе связанные с Delphi: книги, исходники, программы... Изучайте Delphi один из лучших языков программирования!!!


ЗАДАТЬ ВОПРОС :

Правила рассылки: 
1. Не присылайте ответов на вопросы типа "да, нет".  
2. Если отвечаешь на вопрос - то отвечай подробно с примерами (желательно с исходником примера).
3. Тема вопросов - программирование на Delphi.
Внимание авторам: - Я не указываю ваши адреса из-за спама, но кто хочет, чтобы его email был - пишите, иначе только имя(ник).
Отправить вопрос


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


Вопрос № 115 задаёт: Константин Завальный Ответить 
Здраствуйте! Подскажите, пожалуйста, можно ли в Delphi реализовать обработку параметров с которыми должно запускаться приложение. Ну в смысле "project.exe -a:665 -b", типа того. Как получить значения этих параметров, и можно ли вообще это сделать?
Вопрос № 116 задаёт: source  Ответить
Здравствуйте уважаемые эксперты и подписчики рассылки.
У меня возникла проблема со считыванием данных с COM порта от самодельного устройства. Надо использовать альтернативные сигнальные - DCD. Вопрос в том как организовать это чтение на Delphi.
Поделитесь плиз куском кода...
Вопрос № 117 задаёт: Юшков.М.В  Ответить
Borland Delphi 5 :
Создал библиотеку - OLE Automation Сервер
Опция Automation Object :
Instancing : 'Multiple instance'
метод destroy Сервера :
//--------------------------------------------------------
destructor TZebex.destroy;
begin
     ShowMessage('удаление БИБЛИОТЕКИ из памяти ');
     inherited destroy;
end;
//--------------------------------------------------------
Код процедуры клиента :
//--------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
    var  z:OleVariant;
begin
    z := CreateOLEObject('z2030.zebex');
end;
//--------------------------------------------------------
При нажатии кнопки 'Button2'
я получаю сообщение : 'удаление БИБЛИОТЕКИ из памяти ' ,т е код
деструктора выполнился

Пока я не закрою приложение клиент я не могу пересобрать библиотеку
т.е., при попытке заново скомпилировать библиотеку я получаю сообщение :
'[Fatal Error] Could not create output file 'C:\PROJECT\delphi5\zCom1\tz2030.dll'

Почему после вызова в программе-клиенте и удалении локальной
переменной z библиотека остается занятой программой- клиентом

Ответы.

Вопрос № 111 задаёт: Antony  Ответить
Подскажите алгоритм изменения параметров jpg-файлов. То есть имеется программа в которой указывается исходная папка с jpg файлами и указываются размеры и качество jpg файлов после обработки программой.
Один из таких алгоритмов я нашёл:
procedure TForm1.Button1Click(Sender: TObject);
var
  bmp: TBItmap;
  jpg: TJpegImage;
  SearchRec:TSearchRec; 
begin
  jpg := TJpegImage.Create;
  If FindFirst(TempPath + '\*.jpg', faAnyFile, SearchRec)=0 then
 repeat  
  jpg.Loadfromfile(SearchRec.Name);
  bmp:= Tbitmap.Create;
//Задаются размеры
  bmp.Width := SpinEdit1.Value ; 
  bmp.Height:= SpinEdit2.Value; 
  bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
  {Рисует превьюшку на форме}
//Возврат в формат JPG и сохранение изменённого файла.
  jpg.Assign( bmp );
  jpg.SaveToFile(ChangeFileext( SearchRec.Name, '_thumb.JPG' ));

 until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
 end;
Но этот алгоритм неудобен тем, что если в папке содержится много картинок (например 400-700), то программа во время выполнения преобразований не реагирует ни на что. А мне нужен алгоритм при исполнении которого программа реагировала бы на действия пользователя.
Отвечает: Евгений http://decoding.narod.ru 
Внутрь цикла repeat вставь Application.ProcessMessages;
Напримкр так:
repeat  
  jpg.Loadfromfile(SearchRec.Name);
  bmp:= Tbitmap.Create;
//Задаются размеры
  bmp.Width := SpinEdit1.Value ; 
  bmp.Height:= SpinEdit2.Value; 
  bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
  {Рисует превьюшку на форме}
//Возврат в формат JPG и сохранение изменённого файла.
  jpg.Assign( bmp );
  jpg.SaveToFile(ChangeFileext( SearchRec.Name, '_thumb.JPG' ));
  Application.ProcessMessages;
until FindNext(SearchRec) <> 0;
Отвечает: Dynamic
Перед
Until FindNext(SearchRec) <> 0;
добавь строчку Application.ProcessMessages. Чтобы добавить кнопку "Стоп" нужно еще сделать следующее:
- объявить где-нить переменную AbortUser: boolean;
- перед началом процесса AbortUser := false;
- ПОСЛЕ Application.ProcessMessages добавить проверку: if AbortUser then break;
- в OnClick кнопки "Стоп" написать: if MessageBox(ля-ля-ля) = ID_YES then AbortUser := true;
Отвечает: #One
//Попробуй в цикле поставить
application.ProcessMessages;
{этим ты дашь ОС обработать накопившиеся сообщения, если этого не сделать, во время большого цикла возможен эффект зависания}
Отвечает: Ян Яблоновский http://zhurnal.lib.ru/j/jablonowskij_jan_aleksandrowich/
В любом случае, если Вам нужно, чтобы во время обработки программного цикла Ваша прога реагировала на пользователя (или хотя б нормально обрабатывала события компонентов Дэльфи) - способ один: ставьте в цикл вызов волшебного слова:

Application.ProcessMessages ;
(Лучше ставить это дело в самом начале или в самом конце цикла - так вернее, что "волшебное слово" не будет обойдено из-за какого-нибудь условного оператора.)
Ниже - привожу пример, как (точнее, куда) это можно воткнуть в Вашем коде:
procedure TForm1.Button1Click(Sender: TObject);
var
  bmp: TBItmap;
  jpg: TJpegImage;
  SearchRec:TSearchRec; 
begin
  jpg := TJpegImage.Create;
  If FindFirst(TempPath + '\*.jpg', faAnyFile, SearchRec)=0 then
 repeat  
  Application.ProcessMessages ;
  jpg.Loadfromfile(SearchRec.Name);
  bmp:= Tbitmap.Create;
//Задаются размеры
  bmp.Width := SpinEdit1.Value ; 
  bmp.Height:= SpinEdit2.Value; 
  bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );
  {Рисует превьюшку на форме}
//Возврат в формат JPG и сохранение изменённого файла.
  jpg.Assign( bmp );
  jpg.SaveToFile(ChangeFileext( SearchRec.Name, '_thumb.JPG' ));
 
 until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
 end;
Отвечает: Константин Завальный
IMHO, Вы можете не менять алгоритм, а только вставить команду обработки системных сообщений Application.HandleMessage; или Application.ProcessMessages; . Отличаются они тем, что первая обрабатывает одно сообщение из очереди, а вторая - все. Вставив одну из команд в цикле (где нибудь, между repeat и untill), Ваша программа будет реагировать на события.
Отвечает: Vadim
Могу только подсказать идею..
Сам алгоритм можно вынести в нить класса TThread.
Перед until FindNext(SearchRec) <> 0; выполнять проверку некоторого флага (bStop: Boolean ,например, или создать собственное событие, которое устанавливается функцией SetEvent и сбрасывается - ResetEvent).
Если из основной программы, например по нажатию кнопки, был установлен флаг (или событие), то выполняем инструкцию Break; да, и перед работой с файлами можно их сначала подсчитать, а процесс дальнейшей работы с ними отображать в ProgressBar или
Gauge.
Отвечает: Burich-Caeser
После repeat добавь
Application.ProcessMessages;
Это заставит приложение проверить какие сообщения пришли от системы и отреагировать на них.
Отвечает: cpo
Попробуй в теле процедуры вставить Application.ProcessMesages.
Вопрос № 112 задаёт: Антон Трапезников  Ответить
Не подскажите где можно найти пример реализации ассиметричного шифрования (что-нибудь типа RSA, GOST /etc). Мне нужны именно примеры реализации, либо модули на Delphi/Асм, а не ссылка на компоненты (многие из них закрыты).
Отвечает: Андрей Германович
НА сайте http://www.pgpru.com лежат исходники программы PGP до версии 6.5
Там же по моему лежал SDK для PGP
Вопрос № 113 задаёт: Vitek  Ответить
Скажите, пожалуйста, как узнать длину видео файла.
Пробую:

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;

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

2.На форме есть ShellListView-ы, надо "таскать" файлы(папки) из одного
в другой, и в(из) среду (папки).

Отвечает: Евгений http://decoding.narod.ru
Попробуй через TMediaPlayer
procedure TForm1.Button1Click(Sender: TObject);
begin
   MediaPlayer1.FileName := 'FileName.avi';
   MediaPlayer1.Open;
   MediaPlayer1.TimeFormat := tfMilliseconds;
   ShowMessage( 'Время в милисекундах = ' + IntToStr( MediaPlayer1.Length ) );
end;
Надеюсь, из милисекунд в нормальное время ты сможешь перевести.
Отвечает: Dynamic
Тебе размер файла что-ли? Так FileSize()!
Вопрос № 114 задаёт: СОЛИДОЛ  Ответить
Господа програмисты, всем доброго времени суток. Ситуация такая: есть мемо, в которое загружается досовский текст. Вопрос: реально ли и если да то как сделать так шоб русские символы отображались почеловечески, а после редактирования сохранять во все той же досовской кодировке.
И еще.
while not fileexists(cfn)<>true do sleep(100);
winexec(cfn,sw_show);

Где я провтыкал? По идее все это должно ждать пока данный экзешник не окажится "на своем месте", а потом запустится. Не запускается...
Всем неравнодушным заранее спасиба
Отвечает: Евгений http://decoding.narod.ru
while not fileexists(cfn)<>true do sleep(100);
winexec(cfn,sw_show);

Пиши так

while fileexists(cfn)<>true do sleep(100);
winexec(cfn,sw_show);

Отвечает: Кама
function WinToDOS(S: string): string;
var pS: PChar;
begin
     pS := PChar(S);
     CharToOem(pS, pS);
     Result := pS;
end;
 
function DOSToWin(S: string): string;
var pS: PChar;
begin
     pS := PChar(S);
     OemToChar(pS, pS);
     Result := pS;
end;
При открытии: Memo1.Text := DosToWin(Memo1.Text)
Перед сохранением: Memo1.Text := WinToDos(Memo1.Text)

По второму вопросу почитай справку про WaitForSingleObject
Отвечает: #One
1. Кодировка. Пример взят из книги М. Флёнова "Программирование в Д глазами хакера"
procedure TForm1.CodeButtonClick(Sender: TObject);
//из Винды в ДОС
var
 s:array [0..255] of char;
begin
 CharToOem(PChar(WindowsEdit.Text), s);
 DOSEdit.Text:=s;
end;

procedure TForm1.CodeButton1Click(Sender: TObject);
//из ДОС в Винду
var
 s:array [0..255] of char;
begin
 OemToChar(PChar(DOSEdit.Text), s);
 WindowsEdit.Text:=s;
end;
2. Запуск ексешника.
while not fileexists(cfn) do sleep(100);
winexec(cfn,sw_show);//сам не пробовал, но вроде так надо
А лучше переписать код, исходя из того, что если winexec выполнилась успешно, то возвращает значение, большее 31
Отвечает: Skyscraper Recluse
CharToOem(), OemToChar() как раз для работы в Winapi-приложениях с
текстами в досовской кодировке. Описано в модуле Windows.
Отвечает: Igoshin Konstantin
На счет первого вопроса можно предложить руками перекодировать текст из DOS-кодировки в Win при загрузке, и обратно - при выгрузке текста (для этого посмотри таблицу соответствия - их достаточно много)
По поводу второго вопроса могу предложить использовать таймер и через определенные промежутки времени (100 мс) проверять на существование файла. Таким образом программа не будет останавливаться при ожидании. PS: функция fileexists(cfn) возвращает либо True, либо False => можно писать просто not fileexists(cfn).
Отвечает: Burich-Caeser
Реально, но только вручную. Грузи в невидимый Мемо, или используй
LockWindowUpdate(Memo1.Handle); до загрузки и
LockWindowUpdate(0); после.

Во втором убери not. Проверь сам, получается наоборот:
если файла нет, загрузить его =).



Статья:    "Добавить свой пункт в системное меню приложения."

Добавить пункт в системное меню, написать обработчик его выбора и перехватить сообщение о выборе пункта из системного меню. Примечание: Константа WM_USER используется в приложении для определения собственных сообщений. Значения от 0 до (WM_USER-1) зарезервированы для системных сообщений.

TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure OnMyMenu;
private
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
end;

var
Form1: TForm1;

implementation
{$R *.DFM}
const
SC_MyMenuItem = WM_USER + 1;
//----------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
// добавление своего пункта в системное меню приложения
AppendMenu(GetSystemMenu(Handle, FALSE), MF_SEPARATOR, 0, '');
AppendMenu(GetSystemMenu(Handle, FALSE), MF_STRING,
SC_MyMenuItem, 'Новый пункт в меню');
end;
//----------------------------------------------------
procedure TForm1.OnMyMenu;
Begin
// Обработка нажатия на новый пункт меню
End;
//----------------------------------------------------
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
// перехват события выбора нового пункта меню
if Msg.CmdType = SC_MyMenuItem then
OnMyMenu else
inherited;
end;

Источник: Дельфи. Вокруг да около. http://www.vlata.com/delphi/


Компоненты:   

Знаменитый RX Library 2.75 для Delphi 7 c исходниками. (размер 3,8 Mb).

SQL Server Data Access Components 3.00.0.2 с исходниками. (размер 1,12 Mb).

TxQuery 1.86 без исходников. (размер 1,8 Mb).

Raize Components 3.00.13 с исходниками D7 - отличный набор компонентов. (размер 7,90 Mb).

TMS Component pack v3.5 c исходниками - неплохой набор компонентов. Вслючает в себя изестный TMS Grid Pack. (размер 1,71 Mb).

InfoPower 4000.0.5 c исходниками - отличный набор компонентов для работы с базами данных. Включает в себя Grid, различные диалоги (Locate, Filter) и т.д. (размер 7,1 Mb).

Apollo VCL 6.1 c исходниками - еще один компоненнт для доступа к БД в формате DBF без BDE. (размер 1,15 Мb).

Turbo Power Async Professional версия 4.06 c исходниками - отличный компонент для доступа к портам и работы с модемом. (размер 3,20 Мb).

LMD Tools версия 7.0.59 с исходниками - отличный набор компонентов на все случаи жизни. (размер 1,7 Мb).

PDJCtrl версии 7.0 для Delphi 5-7 без исходников. Неплохой набор компонентов. (размер 1,04 Мb).

Отличная библиотека Qstring функций и процедур работы со строками. Рекомендую. Включает в себя: функции и процедуры для сравнения строк; функции и процедуры для изменения регистра символов; функции и процедуры перекодировки строк из DOS в Windows и наоборот; поиск, замена и удаление подстрок и отдельных символов; форматирование строк, вырезка фрагментов строки; функции и процедуры для работы со множествами типа TCharSet;функции и процедуры для работы с символьной записью чисел и многое другое. (размер 83,2 Kb).

EldoS Components Pack 4.01 с исходниками - отличный набор компонентов. Включает в себя компоненты для работы с базами данных, а также отличный набор TreeView. С исходниками. (размер 5,32 Mb).

PReport 1.9.9 без исходников- неплохой генератор отчетов. Не FastReport, конечно, но все же. Позволяет генерировать отчеты в текстовой форме для матричных принтеров. (размер 880 Kb).

EMS Quick Export Component Suite 3.22 с исходниками D3-D2005 - наверное, лучший компонент, позволяющий экспортировать данные из любого DataSet в различные форматы: MS Excel, MS Word, RTF, HTML, DBF,PDF и т.д. (размер 600 Kb).

EMS Quick Import Component Suite 2.22 с исходниками D3-D2005 - наверное, лучший компонент, позволяющий импортировать данные в любой DataSet из различных форматов: MS Excel, DBF, XML, текстовго файла и файла в формате CSV. (размер 424 Kb).

EHLib 3.5 c исходниками - отличный DbGrid и еще несколько компонетов от Дмитрия Большакова. (размер 600 Kb).


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/ - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.

Немного юмора:  :))

Идет последний запуск Windows...


Петр I прорубил окно в Европу, а Билл Гейтс в ж...


Петр I прорубил окно в Европу, а Билл Гейтс в ж...


И кто же им поверит, что эта райская программа была написана на языке Ада?


- У тебя какой?
- 14 400. А у тебя?
- 28 800.
- Ого!


- Я уже лет восемь вслепую печатаю, и в отличие от тебя всеми пальцами.
- Ну ты крут, а я только 10-ю.


- Клава?!, - сказал Штирлиц.
Но клава не отвечала.
- Висит. - Подумал Штирлиц.
Психанув, он начал судорожно давить на неё пальцами.
- Ну и дурак вы! - сказала Клавдия.
Штирлицу стало стыдо.


Американская школа для одаренных детей, 1970 год, урок информатики...
- А теперь, детки, какие программки вы бы хотели написать, когда подрастете? Вот ты, Питер?
- Я бы написал такую крутую утилитку, которая бы быстро лечила винчестер от ошибок!
- Молодец, Питер! А ты, Юджин?
- А я бы сделал такую программку, которая бы быстро и без глюков сжимала файлы!
- Умница, Юджин! А ты, Билли, чего молчишь?
- Ну, ничего-ничего! Будет вам всем быстро, будет вам без глюков..


Шеф диктует секретарше электронное письмо:
- Сообщаю вам запятая что кредит запятая полученный нами у вас запятая в этом году мы не сможем отдать точка. Леночка, я сказал точка, а не двоеточие с тремя скобками!



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

Рассылки Subscribe.Ru
Программирование на Delphi
Рассылка сайта Delphi coding


Все кто хочет изучить Delphi и реально научиться писать свои программы, ЦПИ "Эверест" поможет Вам.
Всё, что Вам нужно это компьютер и доступ к интернету - для получения уроков.

10 причин в пользу платного обучения в ЦПИ "Эверест"…

1. Когда Вы платите деньги- появляется дополнительный стимул против лени: надо учиться, ведь деньги уже уплачены….
2. Учась платно, получаете удобный для Вас график работы.
3. Весь необходимый справочный материал Вы получите в свое время и на русском языке.
4. Используя интернет в качестве бесплатной библиотеки, Вы получаете все ее минусы:

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

5. Стоимость обучения одного месяца в ЦПИ "Эверест" сравнима с ценой хорошей книги. Но часто ли Вам попадались книги, рассчитанные именно на Вас. Мы же работаем индивидуально.
6. Автор книги или магазин не несет никакой ответственности за то, поняли ли Вы материал или нет, мы же закрепляем за каждым курсантом преподавателя, курирующего Вас.
7. Освоив программирование в Delphi - Вы освоите:

  • основы настоящего программирования- структурного и процедурного программирования ;
  • систему работы с базами данных и SQL- запросами, а это одно из самых перспективных направлений в программировании;
  • язык программирования ObjectPascal, что позволит Вам легко перейти, при желании, на С или Паскаль;
  • работу с компьютерной графикой;
  • при желании - основы низкоуровневого программирования ( Ассемблер).

8. А это значит, что …Мы предлагаем получить "высшее образование" - профессию программиста всего за 1 год и 144 доллара, любой ВУЗ попросит в 3 раза больше за один только семестр.
9. Вы получаете самый практический курс в сети, поскольку теория дается только тогда, когда она действительно необходима…
10. Учиться у нас легко и просто. Весь материал доступен и простым людям, не имеющим никогда дел с программированием….


По всем вопросам обращайтесь ко мне.

Если вы встретили в интернете интересный сайт или статью, да и вообще, что угодно связанное с Delphi, поделитесь ссылкой.
Если можете написать статью связанную с Delphi - присылайте с радостью выложу.
Давайте поможем друг другу!  Архив рассылки.

Предложения, критику и пожелания пишите на e-mail.


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

В избранное