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

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

  Все выпуски  

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


Опрос
Полезные ссылки

Хватает ли Вам компонент, входящих в стандартную поставку Delphi?

Да, полностью хватает
В принципе, да, но не всегда
Нет, совершенно не хватает
Пользуюсь исключительно сторонними

Сайт "Программирование на Delphi":
http://www.delphi.int.ru/
Форум сайта:
http://www.delphi.int.ru/forum/
Программирование на DELPHI
Выпуск #47 (17 апреля 2006 г.) 

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

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

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

Итак, предварительная регистрация экспертов системы Delphi.int.ru Expert закончена. На данный момент зарегистрировано 26 экспертов. Что ж, вполне неплохо! При этом любой из Вас в любой момент также сможет стать экспертом - для этого будет специальная страница. Надеюсь, что количество экспертов со временем будет только возрастать, а пользователи будут получать всё более качественные и полные ответы на свои вопросы!

Однако есть один момент. В ближайшие 1-2 недели сайт www.delphi.int.ru будет переведён на новый сервер. В связи с этим несколько дней сайт может быть недоступен. Также возможны перебои в работе сайта. Регистрация пользователей будет временно остановлена. Не рекомендуется что-либо изменять в своих аккаунтах, т.к. изменения могут не сохраниться. Соответственно, запуск системы Delphi.int.ru Expert может быть немного отложен. Сайт гарантированно будет доступен всем через три дня после "переезда". Адрес сайта, естественно, останется прежним.

Также хочу представить Вам человека, который становится ведущим раздела "Юмор" в нашей рассылке - Bruder. Все анекдоты, юмористические рассказы и интересные истории, тем или иным образом связанные с компьютерами, присылайте, пожалуйста, ему. Уже сегодня Вас ждёт большая подборка анекдотов! Приятного чтения!

P.S. Не обращайте внимание, что рассылка несколько "поредела" - это лишь временное явление.

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

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

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

Delphi.int.ru Expert

Официальный запуск в конце апреля - начале мая.


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

Bruder прислал ответы на два вопроса, на которые не было дано ответов, поэтому, в качестве исключения, эти ответы публикуются, т.к. информация действительно полезная. Однако, хочу сообщить, что более ответы на вопросы не рассматриваются.

Вопрос #263:
У меня есть плагин, который состоит из дочерней формы. Как ее запустить в открыть в родительской форме программы? Или плагин состоит из Фрейма. Как поместить этот фрейм в дочернюю форму программы?

1. [Отвечает: bruder (статус: Эксперт: 2-ой класс), 13.04.2006 13:48]: Материал взят из DelphiWorld. Статья " О загрузке дочерней формы (MDIChild) из DLL".

Для работы форм необходимы оба глобальных (для программы) объекта: и TApplication и TScreen. Подгружаемая DLL, если использует разного рода формы и контролы их тоже создает. Но они другие! В смысле другие instances, которые и знать не знают о таких-же объектах в главном приложении. Но они есть и убивать их тоже не хочется (мало-ли чего случится, если убить объект TApplication, даже в DLL). Поэтому решение пришло следующее. Создаем в нашей DLL две служебные функции, функцию вызова нашей дочерней формы и две переменные (пишу StdCall потому что всегда DLL-ки так оформляю, это удобно):

var
DLLApp: TApplication;
DLLScr: TScreen;

procedure InitPlugin(App, Scr: integer); StdCall;
begin
DLLScr := Screen;
Screen := TScreen(Scr);
DLLApp := Application;
Application := TApplication(App);
end;

procedure DonePlugin; StdCall;
begin
Screen := DLLScr;
Application := DLLApp;
end;

function CreateMDI: integer; StdCall;
< b>begin
Result := integer(TfrmMyChildForm.Create(Application));
end;

exports
InitPlugin,
donePlugin,
CreateMDI;

Итак, в начале программы я открываю библиотеку (LoadLibrary), пролучаю функции (GetProcAddress) и инициализируюплагин (InitPlugin(integer(Application), integer(Screen))), передавая ему ссылки на объекты Application и Screen и они сохраняются в переменных внутри DLL. По окончании работы я его деинициализирую (DonePlugin), восстанавливая для dll-ки его объекты (для корректной деинициализации этих самых внутренних TApplication и TScreen), потом выгружаю библотеку (FreeLibrary). Функция создания дочернего окн а возвращает объект формы (а по сути указатель) и с ним можно работать, либо используя переменную - родителя (TForm например) или абстрактный класс с которого наследуется форма в DLL (MyForm := TForm(CreateMDI)).

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

Вопрос #267:
Здравствуйте, у меня такой вопрос: как можно с помощью Delphi организовать поисковую систему по FTP-ресурсам в локальной сети?

2. [Отвечает: bruder (статус: Эксперт: 2-ой класс), 13.04.2006 13:49]: Используй компонент "TNMFTP". Если вы уже подключены к серверу, вы можете получить список файлов и каталогов текущего каталога при помощи метода List и обработчика события OnListItem, которое вызывается для каждого элемента списка. Вы можете обрабатывать каждый элемент каталога в обработчике этого события или включить режим разбора строк элементов каталога, установив свойство ParseList в true. В последнем случае компонент разберёт полученные данные и поместит имена, размеры файлов атрибуты, время последнего изменения в составное свойство FTPDirectoryList. Каждый элемент этого свойства представляет собой объект типа TStringList.ДляуказанныхэлементовспискасодержимогокаталогаэтиобъектыимеютименаName[i], Size[i], ModifDate[i], Attribute[i]. Если метод List завершается успешно, то происходит событие OnSuccess, в противном случае генерируется событие OnFailure. Метод NListпредставляетсобойсокращённыйварианткомандыList и используется для получения только имён файлов и каталогов. Из вышесказанного следует исходник:

var i: integer;
{номер элемента}
    s: String;
{переменная, содержащая имя файла}
begin
  s:='...';
  NMFTP1.ParseList:=true;
  NMFTP1.NList;
  if NMFTP1.FTPDirectoryList.name.Find(s,i) then
    Form1.Caption:=NMFTP1.FTPDirectoryList.name[i];
end;

Подключение к серверу остаётся на тебе... Удачи.

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


Статьи  >>

Создание своего диалога выбора цвета

Автор: Fobos
evgeniv@yandex.ru
http://csportal.org.ru/

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

http://www.delphi.int.ru/download.php?id=159

В общем приступим! Сначала создаём форму и помещаем туда всё необходимое:

7 компонентов типа TImage и назовём их так:

•  MainViewer – экран вывода градиента;

•  ScalKontr – определяет присутствие изменяемого компонента RGB цвета в градиенте (если выбран R _ GB - то красного, если G _ RB – то зелёного, если B _ RG – то синего) от 0 до 255, путем нажатия курсора на нужную область.

•  Yarcost – шкала яркости выбранного оттенка.

•  Proba 1 – для выода цвета, находящегося под курсором при выборе насыщенности компонентом ScalKontr.

•  Proba 2 – для вывода оттенка, находящегося под курсором при выборе результата и яркости с помощью MainViewer или Yarcost.

•  ImageZahvat – для вывода выбранной в ScalKontr насыщенности.

•  Itog – для вывода выбранного оттенка.

12 Edit-ов , 3 RadioButton и 2 кнопки . Их оставим в покое (в смысле не переименовываем).

Теперь нам необходимо определиться с необходимыми процедурами.

Во-первых – это процедура генерирования шкалы контраста.
Во-вторых – это процедура генерирования градиента в MainViewer (в соответствии с выбранным типом градиента и выбранной насыщенностью).
В-третьих – процедура генерирования шкалы яркости, в соответствии с выбранным оттенком.

Начнём с первого. Сам нижеприведённый код я поместил в обработчик OnCreate формы.

Пояснения смотрите в комментариях к коду:

var
LineColor, ViewColor: TColor;
ColR, ColG, ColB, i, j:integer;
begin
{Если выбран баланс Красного с Синим и Зелёным (R_GB)}
if RadioButton1.Checked then
     begin
      ColR:=255;
      ColG:=0;
      ColB:=0;
      for j:=0 to 255 do
        begin
         LineColor:=RGB(255-j, 0, 0); //Изменяем значение красного цвета
           for i:=0 to 17 do
            begin
                  ScalKontr.Canvas.Pixels[i, j]:=LineColor; //рисуем точку
            end;
        end;
end;
{Если выбран баланс Зелёного с Красным и Синим (G_RB)}
if RadioButton2.Checked then
     begin
      ColR:=0;
      ColG:=255;
      ColB:=0;
       for j:=0 to 255 do
        begin
         LineColor:=RGB(0, 255-j, 0); //Изменяем значение зелёного  цвета
           for i:=0 to 17 do
            begin
                ScalKontr.Canvas.Pixels[i,j]:=LineColor; //рисуем точку
            end;
        end;
     end;

{Если выбран баланс Синего с Красным и Зелёным (B_RG)}
if RadioButton3.Checked then
     begin
      ColR:=0;
      ColG:=0;
      ColB:=255;
       for j:=0 to 255 do
        begin
          LineColor:=RGB(0, 0, 255-j); //Изменяем значение синего цвета
           for i:=0 to 17 do
            begin
                ScalKontr.Canvas.Pixels[i,j]:=LineColor; //рисуем точку
            end;
        end;
     end;

Думаю здесь всё понятно. Далее приступим к основной процедуре рисования градиента в MainViewer. Вот код:

{========================================================== Процедура генерации RGB-градиента}
procedure GenerateRGBInOutGrad(ClrOutR, ClrOutG, ClrOutB: Integer);
var
i, j: Integer; //счётчики
PixelColor: TColor; //цвет пиксела
Holst: TBitMap; //Объект для записи пикселей
begin
Holst:=TBitMap.Create; //создаём объект типа TBitMap
Holst.Width:=256; //указываем ширины
Holst.Height:=256; //указываем высоту

if ClrDialog.RadioButton1.Checked then //если выбрана RadioButton1
begin
   {Палитра красного с зелёным и синим}
for j:=0 to 255 do //цикл по оси Y
  begin
    for i:=0 to 255 do //цикл по оси X
     begin
      PixelColor:=RGB(ClrOutR, j, i); {привязываем значения зелёного и синего к
                                                        изменениям координат и переводим из RGB в
                                                        TColor}

      Holst.Canvas.Pixels[i, j]:=PixelColor; //Рисуем точку
     end;
  end;
end;

if ClrDialog.RadioButton2.Checked=true then //если выбрана RadioButton2
begin
   {Палитра зелёного с красным и синим}
for j:=0 to 255 do //цикл по оси Y
  begin
    for i:=0 to 255 do //цикл по оси X
     begin
      PixelColor:=RGB(j, ClrOutG, i); {привязываем значения красного и синего к
                                                         изменениям координат и переводим из RGB в
                                                        TColor}

      Holst.Canvas.Pixels[i, j]:=PixelColor; //Рисуем точку
     end;
  end;
end;

if ClrDialog.RadioButton3.Checked=true then //если выбрана RadioButton3
begin
   {Палитра синего с красным и зелёным}
for j:=0 to 255 do //цикл по оси Y
  begin
    for i:=0 to 255 do //цикл по оси X
     begin
      PixelColor:=RGB(j, i, ClrOutB); {привязываем значения красного и зелёного к
                                                        изменениям координат и переводим из RGB в
                                                       TColor}

      Holst.Canvas.Pixels[i, j]:=PixelColor; //Рисуем точку
     end;
  end;
end;
ClrDialog.MainViewer.Canvas.Draw(0,0,Holst); //рисуем всю картину на компонент TImage
Holst.Free; //освобождаем память, занимаемую объёктом Holst
end;

Вот!

Ну и, наконец, код вывода шкалы яркости:

{========================================================== Процедура генерации полосы яркости выбранного оттенка}
procedure GenerYarkost(ColR, ColG, ColB: Real);
var
   i, j: integer; //счётчики
   LineColor: TColor; //цвет TColor
   StepR, StepG, StepB: Real; {шаг изменения для каждого цвета,
                              необходимы для равномерного смешивания
                              цветов по всей длине линии яркости . }

begin
       ClrDialog.Edit4.Text:=IntToStr(round(ColR));   {Эти строки}
       ClrDialog.Edit5.Text:=IntToStr(round(ColG));   {нужны лишь в моём}
       ClrDialog.Edit6.Text:=IntToStr(round(ColB));   {примере. В Вашем
                                                                                может и не понадобятся.}


{+++++++++++++++++++++++++++++++++++++++}

  {Генерация шкалы яркости для выбранного оттенка}
      StepR:=(256-ColR)/256; //определение шага для красного
      StepG:=(256-ColG)/256; //определение шага для зелёного
      StepB:=(256-ColB)/256; //определение шага для синего

      j:=256; //здесь счётчику по Y-ку присваивается начальное значение
        repeat j:=j-1; {Цикл по Y-ку организован с помощью repeat until чтобы
                       организовать обратный отсчёт от 256 до 1. Это сделано
                       для того, чтобы заполнять шкалу не с верху вниз, а снизу
                       вверх (т.к. начальная точка экранных координат
                       расположена в верхнем правом углу.)}


         ColR:=ColR+StepR; {В каждом переходе цикла по Y}
         ColG:=ColG+StepG; {увеличиваем значение соответствующего цвета}
         ColB:=ColB+StepB; {на соответствующий ему шаг.}
           for i:=0 to 17 do
            begin
               {На всякий случай проверим значения цветов на вхождение
                в пределы 255}

                   if ColR>255 then ColR:=255;
                   if ColG>255 then ColG:=255;
                   if ColB>255 then ColB:=255;

                LineColor:=RGB(round(ColR), round(ColG), round(ColB)); //Записываем оттенок
                ClrDialog.Yarcost.Canvas.Pixels[i, j]:=LineColor; //Рисуем точку в компонент TImage
            end;
          until j=1;
end;

Вот в принципе все необходимые процедуры для написания такого диалога. Всё остальное – дело техники и это вы найдёте в примере к статье. Правда есть ещё один момент, который необходимо описать – это перевод из TColor в RGB формат. Чисто для примера сделаем 3 переменные типа integer (пусть это будут ColR , ColG и ColB ) и одну переменную типа TColor (Например, ColTColor). Далее присвоим значение переменной ColTColor. Пусть это будет зелёный (clGreen). Ну и, наконец, выделим из этой переменной значения RGB компонентов в соответствующие переменные типа integer. Весь код :

procedure TestTColorToRGB;
var
   ColR, ColG, ColB: integer;
   ColTColor: TColor;
  begin
   ColTColor:=clGreen; //присваиваем зелёный цвет

    ColR:= ColTColor mod $100; //выделяем красный
    ColG:=( ColTColor div $100) mod $100; //выделяем зелёный
    ColB:= ColTColor div $10000; //выделяем синий
end;

У переменных должны получиться следующие значения:

ColR = 0;
ColG = 255;
ColB = 0.

Вот и всё. Конечно, для крутого графического редактора этого мало, но ведь можно и дополнить чем-нибудь ещё!
Адрес примера к статье: http://www.delphi.int.ru/download.php?id=159

Любой из читателей может присылть свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте. Статьи, полностью взятые с других сайтов, без указания ссылок на авторство, не публикуются.


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

Из-за переноса сайта новые файлы не добавлены на сайт.

Ссылки  >>

Здесь представлены ссылки на дружественные сайты. Обмен ссылками и баннерами приветствуется для сайтов схожей тематики. Здесь представлены самые последние ссылки:

All for Delphi - Научись правильно писать программы! Программы, компоненты, книги, ссылки.
http://xskernel.excode.ru/
Сайт, посвящённый написанию операционной системы. Новости, информация об XSystem Kernel Team, документация, глоссарий, исходники системы. Open Source - наше направление.
 
Рассылки Subscribe.Ru
Интернет для Delphi-программиста
Visual Basic для новичков и профессионалов
Программирование на Delphi
   
 

Юмор.

Адвокат говорит на суде речь:
- Прошу принять во внимание, Ваша честь, что у моего подзащитного было тяжелое детство - родители не купили ему персонального компьютера.

:))

Блаженны юзеры ибо не ведают что творят!

:))

Азъ есмь поинтъ съ адресомъ:...

:))

Когда были выпущены первые тамагочи, фирма Microsoft подала в суд на компанию разработчика тамагоч за украденную идею, мотивируя это тем, что еще в 95 году была создана программа, требующая постоянного ухода, которая умирала, как только что-то делалось не так, как надо. Называлась она Windows95...

:))

Обновление Windows изменило интуитивно ясный интерфейс Вашего компьютера. Загрузите обновление интуиции с сайта Microsoft.

:))

Сидят два программиста на лавочке, возле двухэтажного дома, и пьют пиво. Вдруг окно второго этажа открывается и оттуда мужик падает, но тут же вскакивает, отряхивается и забегает в дом. Буквально через минуту мужик опять с окна падает, опять отряхивается и бежит снова в дом. И так несколько раз. Первый программист, задумчиво:
- Глюк...
Второй неспеша попивая из банки, добавляет:
- Да... Где-то в цикле.

:))

Root - только для тех кто в правду крут!

:))

Беседуют два программера:
- Блин, вчера моя жена мне позвонила, а модем трубку снял.....
- И че??????
- Да болтали полтора часа....

:))

Новое сообщение в Windows: "Пользователь грозится выполнить недопустимую операцию!"

:))

Первым хакером признан Старик, закачавший через сеть особняк, дворянский титул и новое корыто.

:))

По ссылке "забыли пароль?"
пользователю должна загружаться страница с сообщением:
"Ну и дурак!"

:))

Когда вас на работе отчитывает шеф, это выглядит так, как будто он пытается пересказать вашу биографию "в переводе гоблина".

:))

Это, сын, не обезьянки. Это дяди киберпанки.

:))

У кнопки "Reset" есть один недостаток: маленькая очень, кулаком попасть сложно.

:))

На С я могу просто делать ошибки, на С++ я могу их наследовать!

:))

Билл Гейтс предложил погасить половину государственного долга России при условии, что страна будет переименована в MS Russia...

:))

- Вы уверены,что хотите удалить папку D:\TEMP ?
- Да.
- В этой папке находятся файлы. Вы уверены, что хотите их удалить?
- Да!
- Удаление этих файлов может повлиять на зарегистрированные программы. Вы все еще уверены?
- Да! Да! Да!!!
- Эти файлы могут использоваться системой. Вы уверены?
- Пошла ты нафик! - заорал админ и нажал Cancel.
- Ага! Испугался! - подумала NT.

:))

Папа, а что значит FORMAT DISK C: COMPLETE ?

:))

Вакансия: водитель.
Требования: профессиональные навыки управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимися на вооружении стран СНГ и НАТО. Навыки раллийского и экстремального вождения - обязательны, опыт управления болидами F1 - приветствуется. Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, бортовых компьютеров, антиблокировочных систем, навигационных систем (GPS) и автомобильных аудиосистем ведущих производителей - обязательны. Опыт проведения кузовных и окрасочных работ приветствуется. Претенденты должны иметь сертификаты Mercedes, BMW, General Motors, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
Зарплата 1500-2500 руб., определяется по результатам собеседования.

:))

Программист возвращается с работы. Жена его встречает с задумчивым видом.
- Что так долго?
- Да как обычно...
- А у нас уже через неделю девять месяцев!
- Да ну? И кто, мальчик или девочка?
- Знаешь, пока неизвестно. Доктор сказал, что исследование вредно. ... Что молчишь? Ты меня не любишь?! Я всегда это знала!!!!!
- Да нет, просто думаю, какими методами обращаться к объекту, класс которого не определен во время разработки...

:))

Опубликованы анекдоты, присланные: Bruder и C0uPLe®.

Присылайте компьютерные анекдоты, рассказы и истории по этой ссылке и они обязательно будут опубликованы.

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

В избранное