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

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


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

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

Выпуск : № 54


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


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

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


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


Вопрос № 129 задаёт: phoenix  Ответить
Как поместить прогу туда, где часы и язык???
Вопрос № 130 задаёт: phoenix Ответить
Как отловить нажатие всех клавиш в системе и записывать их в какой-либо файл?(по другому называется - клавиатурный шпион)
Вопрос № 131 задаёт: phoenix Ответить
Как программно вырубить Windows?
Вопрос № 132 задаёт: phoenix Ответить
Как узнать, закрашена ячейка в DrawGrid или нет?
Вопрос № 133 задаёт: Шамсиев Марат Мулланурович Ответить
Здравствуйте!
Подскажите, пожалуйста, как выгрузить ole-объект из ToleContainer в файл в исходном формате.
Метод SaveAsDocument не всегда срабатывает, например для файлов *.xls, *.jpg. С чем это связано?
Вопрос № 134 задаёт: Ярошук  Ответить
Как напечатать TForm и все компоненты на ней в альбомном формате(А4)!

Ответы.

Вопрос № 126 задаёт: Середюк И. А. Ответить
Здравствуйте.
Есть поле редактирования RichEdit2. Через заданное время текст в поле перерисовывается. Как сделать так, чтобы во время перемещения курсора над строками в этом поле текст строки становился жирным и подчеркнутым (только во время нахождения над ним курсора), и при двойном нажатии левой (или правой) клавиши мыши этот текст присвоить какой-то переменной (допустим переменной StrVid) строкового типа?
Спасибо!
Отвечает:  Dynamic
Нужно обрабатывать события CMMouseEnter и CMMouseLeave. Для этого необходимо создать класс-наследник нужного тебе компонента (в данном случае, TEdit) и перекрыть указанные сообщения Дельфи:
type
TMyEdit = class(TEdit)
protected
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
public
ActiveMouse: boolean; // это поле введено для указания того, что данный экземпляр должен реагировать на движение мыши
end;

Реализация:
procedure TMyEdit.CMMouseEnter(var Message: TMessage);
begin
if ActiveMouse then
Font.Style := Font.Style + [fsBold, fsUnderline];
end;
procedure TMyEdit.CMMouseLeave(var Message: TMessage);
begin
if ActiveMouse then
Font.Style := Font.Style - [fsBold, fsUnderline];
end;

Пример использования:
procedure TForm1.FormCreate(Sender: TObject);
begin
with TMyEdit.Create(Self) do
begin
Parent := Self;
ActiveMouse := true;
Text := 'Text1';
end;
with TMyEdit.Create(Self) do
begin
Parent := Self;
ActiveMouse := false;
Top := 100;
Text := 'Text2';
end;
end;

Пример прилагаю.
Но в таком виде создавать компонент нужно только если вы уверены, что вам часто потребуется данная функциональность, иначе лучшим решением было бы просто создание соответствующих событий компонента и их последующая обработка:
type
TMyEdit = class(TEdit)
private
FOnMouseEnter,
FOnMouseLeave: TNotifyEvent;
protected
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
published
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
end;

Тогда реализация диспетчеров может быть такой:
procedure TMyEdit.CMMouseEnter(var Message: TMessage);
begin
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
end;
procedure TMyEdit.CMMouseLeave(var Message: TMessage);
begin
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
end;
Отвечает: Саня 
У компонента есть метод onMouseMove- юзай его, но учти, что надо отлавливать момент, когда мышь уйдёт с RichEdit. Например, можно использовать этот же метод для формы, но с проверкой, был ли до этого указатель над полем ввода, иначе слишком часто перерисовывать придётся:))
Там ещё есть метод OnMouseDown, он подойдёт для обработки двойного нажатия. Точно не помню, нет ли метода OnDblClick?
Вопрос № 128 задаёт: Роман  Ответить
Здраствуйте!
Подскажите, пожалуйста, как обратиться к переменной (массиву), если имя этой переменной хранится в виде строковой константы? А также как вызвать процедуру (функцию), если известно строковое представление ее имени?
Отвечает: Dynamic 
Для компонентов несложно: FindComponent('Edit1').Text := 'bla-bla-bla';
1.Для обычных переменных - никак, потому что имя переменная имеет только во время разработки программы, после компиляции - только адрес.
2. Обычно для решения подобных проблем используют строковые константы и массивы переменных жестко заданного процедурного типа. Пример:
type
 TMyProc = function (A: Double): Double;
const
 ProcArrName: array[0..1] of string = ('f1', 'f2');
var
 ProcArr: array[0..1] of TMyProc;
 .............
function f1(A: Double): Double;
function f2(A: Double): Double;
 
// где-то в OnCreate
ProcArr[0] := @f1; 
ProcArr[1] := @f2;
 
// использование
procedure ExecuteProc(const ProcName: string);
var i: integer;
     r: Double;
begin
    for i := 0 to High(ProcArr) do
     if ProcArrName[i] = ProcName then
     begin
       r := ProcArr[i];
       // используем значение переменой r 
       break;
     end;
end;
// или без использования массива имен:
procedure ExecuteProc(const ProcName: string);
var  r: Double;
begin
     if ProcName = 'f1' then
      r := ProcArr[0] else
     if ProcName = 'f2' then
      r := ProcArr[1] else
      r := 0;

       // используем значение переменой r 
end;
/////////////////////////
Удачи.


Статья:    "Создаем компонент: ExTreeView – иерархия в БД." Автор: Dynamic

   Многим программистам приходится сталкиваться с хранением и отображением какой-либо иерархической структуры, данные которой извлекаются из баз данных (БД). Для решения этой проблемы существует множество компонентов, которые условно можно именовать как DBTreeView, но иногда сложность работы с ними превышает требования к самой БД.

   В этой статье я хочу обсудить, как можно организовать простую иерархию в БД и отображать ее на экране с помощью стандартного компонента TreeView, правда немного дополненного и улучшенного.

   Для начала определимся со структурой базы данных, которую мог бы отображать наш компонент. Очень часто данные, нуждающиеся в древовидном представлении, имеют простую и, главное, одинаковую структуру, яркий этому пример – каталог файлов или список статей приход/расход. Минимальная таблица для них может выглядеть так:

Id         Уникальный в пределах таблицы идентификатор;
Parent     Идентификатор родительского узла;
Caption    Текст, отображаемый в ветвях дерева.

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

   Теперь настало время заняться созданием самого компонента. Для этого создадим новый компонент - наследник стандартного TreeView (кто забыл – меню Component/New Component, в поле Ancestor type выбираем TtreeView, в поле Class name – ExTreeView, остальные поля можете отредактировать по своему усмотрению, а можете оставить как есть. После нажатия на кнопку Ok, Дельфи создаст нам заготовку нашего компонента и процедуру его регистрации.

   Обычно при создании подобных компонентов в них встраивают свойства для подключения к конкретным полям базы данных (DataField) и свойство для связи с источником данных (DataSource), но мы сделаем по-другому: мы просто добавим в новый класс метод построения дерева из имеющегося набора данных. Для ее реализации нам потребуются следующие данные:

DataSet: TDataSet;      Собственно, набор данных. К этому моменту он должен быть открыт;
IdField: string         Имя поля Id;
ParentField: string     Имя поля Parent;
CaptionField: string    Имя поля Caption

   Алгоритм этого метода чрезвычайно прост: извлекаем из набора данных очередной ParentId, ищем его значение в свойстве Data дерева, возвращаем указатель на найденный узел (или nil, если ничего не найдено), добавляем в этот узел новую ветвь с нашим Id. Для поиска значения ParentId мы создадим отдельную функцию (лучше добавить ее в раздел public, чтобы можно было пользоваться в дальнейшем):

function TExTreeView.FindDataAsInteger(aData: integer): TTreeNode;
begin
     if Items.Count = 0 then           // Дерево пока пусто
     begin
       Result := nil;
       Exit;
     end;
     Result := Items[0];              // начинаем с первого узла
     while Result <> nil do           // пока есть узлы
      if Integer(Result.Data) = aData then Exit   // сравниваем
      else Result := Result.GetNext;  // переходим к следующему
end;

    Теперь посмотрим на реализацию нашего главного метода:

procedure TExTreeView.BuildFromDataSet(DataSet: TDataSet;
          const IdField, ParentField, CaptionField: string);
var p: integer;
begin
     with DataSet do
     begin
       Items.BeginUpdate;   // запрещаем перерисовку
       Items.Clear;         // очищаем дерево
       First;               // начинаем с первой записи
       while not EOF do     // пока не кончился набор данных...
       begin
         p := FieldByName(ParentField).AsInteger; // получаем ParentId
         Items.AddChildObject(FindDataAsInteger(p), // добавляем узел
            FieldByName(CaptionField).AsString,     // текст узла
            Pointer(FieldByName(IdField).AsInteger)); // Id в поле Data
         Next;              // к следующей записи
       end;
       Items.EndUpdate;     // перерисуем все
     end;
end;

   Я думаю все ясно из комментариев. Небольшое уточнение: добавляем не просто узел, а узел с объектом, адрес которого сохраняется в свойстве Data: Pointer дерева, но в качестве объекта мы используем обычный Integer, который для совместимости приводим к типу Pointer конструкцией вида:

Pointer(FieldByName(IdField).AsInteger)

   Обратное преобразование можно осуществить следующим образом:

Integer(TreeView.Data)

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

   Чтобы продемонстрировать последнее приведенное преимущество я добавил в этот компонент несколько полезных, на мой взгляд, элементов:

// функция поиска текста aFindText в подузле aNode
function FindText(aNode: TTreeNode; const aFindText: string): TTreeNode;

// при установке этого свойства в true узлы дерева, имеющие
// "детей" отрисовываются полужирным шрифтом и цветом,
// установленном в свойстве ExDrawColor
property ExDraw: boolean;
property ExDrawColor: TColor;

   Вот, собственно, и все, что я хотел сообщить по этой теме.

 Исходный текст компонента.

Комментарии вопросы к статье - пишите.


Книги:   

Архитектура Microsoft Windows для разработчиков

Описание: Первая часть книги Архитектура Microsoft Windows для разработчиков. 
Размер файла: 1972617 
Язык (для книг): rus

Обработка Exceptions в WinAPI

Описание: Содержит hlp форматный файл - в котором описано как обрабатывать правильно различные ситуации exceptions 
Автор: Dimyan 
Размер файла: 20630

Справочник по компонентам Delphi.


Компоненты:   

RLed v1.0

Это светодиодный индикатор. Он не способен отображать текст, а наиболее оптимальная область его применения, создание эквалайзера или датчика уровня громкости. Имеет два настраиваемых цвета: "высокий" и "низкий", пределы которых можно изменять. Имеется возможность изменять толщину диодов, или сделать шкалу сплошной. В архиве есть пример.

JDLed v2.0

Цифровое табло (как на электронных часах, способное отображать только цифры от 0 до 9). Есть возможность изменения толщины диодов и их цвета.

Lcd99

Цифровое табло, способное отображать цифры, английские буквы (правда, весьма специфически) и знак ":". Имеется возможность настройки вида: толщина диодов, их цвет, расстояние, как между диодами, так и между знаками. Знаки могут отображаться как линиями, так и точками.

AnalogMeter v.2.10

Это аналоговый индикатор (напоминает спидометр). Множество настроек. Есть возможность задать три зоны: зона минимальных значений, зона нормальных значений и зона максимальных значений. Можно изменять диапазон шкалы, количество делений на шкале и много чего еще. Смотрите пример, он все покажет.

AntiAliased Analog Gauge v.1.0

Этот аналоговый индикатор напоминает предыдущий (AnalogMeter). Имеет три стиля и множество настроек. В архиве есть пример.


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/     - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/  - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru     - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.
http://www.p-lib.pp.ru/    - На сайте находится множество статей по Visual C++, Visual Basic, ASP.NET/ASP, Delphi, Java, Базам Данных, 
PHP, Perl и т. д. Кроме того есть каталог сайтов, свежие компьютерные новости, софт, книги и многое другое.

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

:)

Депрессия - это когда включаешь интернет и не знаешь куда пойти.

:)

Если трахаться, то только с Виндой и в защищенном режиме.

:)

Пришло время расставить все точки перед RU

:)

Я б на Unix перешел, пусть меня научат!

:)

О, этот прожорливый System Idle!

:)

- Ты кем работаешь?
- Стекольщиком.
- Это как?.
- Ну, форточки там чиню....
- Так бы сразу и сказал - сисадмин...

:)

Дневник программиста. 
1-ый день. 
Поставил Windows 3.11 - я тащусь. 
2-ой день. 
Поставил Windows 95 - кайф. 
3-ий день. 
Поставил Windows NT - такого кайфа я не испытывал никогда в жизни. 
4-ый день. 
Был с женщиной - жалкое подобие 3.11.

:)

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

:)

Чем юзер отличается от программиста? Если попросить их перезагрузить
комп пользуясь только мышкой, юзер жмет на "завершение работы" в
Виндовсе.
А что сделает программист? Он поднимет мышку со стола и нажмет ею на
Reset.

:)

Как быстро и эффектно устроиться на работу: 
Приходишь в какую-то компьютерную контору, говоришь, так и так, хочу у вас работать, тебя спрашивают, умеешь ли ты ремонтировать лазерные принтеры, и вот тут надо поднести к уху мобильник, и, набрав какой-нибудь номер громко сказать: 
- Тэнк, загрузи в меня программу ремонта лазерных принтеров. 
Потом секунд 5 моргать глазами и произнести: 
- Да, я умею ремонтировать лазерные принтеры! 
Эффект будет потрясающий!


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

Рассылки 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
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное