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

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

  Все выпуски  

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


Программирование на DELPHI
Выпуск #67 (14 апреля 2007 г.)

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

Delphi.int.ru

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

Delphi.int.ru Expert

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

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

09.04.2007 - добавлено оповещение в канал о новых зарегистрированных на сайте участниках.

11.04.2007 - добавлено автоматическое оповещение в канал о новых вопросах, ответах и сообщениях на форумах системы Delphi.int.ru Expert.

Информация для подключения:

Сервер - irc.dalnet.ru (либо irc.tic-tac.ru)
Порт - 6667
Канал - #delphiintru

Ждём Вас на нашем канале!

Статистика системы Delphi.int.ru Expert на 14.04.2007, 18:00:

Зарегистрированных экспертов: 83 (+2), из них в активном режиме 59 (+1).
Участниками задано вопросов: 479 (+20).
Всего отправлено ответов: 829 (+27).
Всего сообщений на форумах вопросов: 728 (+13).
Максимальное число разосланных в день писем: 553 (25.02.2007).

Приятного чтения и до скорой встречи!

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

» Авторское слово
» Обучение Delphi
» Delphi.int.ru Expert
» Статья по Delphi
» Файловый архив
» Юмор

Количество читателей рассылки (14.04.2007, 18:00):
5454+1090+321= 6865.

Связь по e-mail:

admin@delphi.int.ru
expert@delphi.int.ru
info@delphi.int.ru

Если Вы хотите где-нибудь разместить материалы, представленные на www.delphi.int.ru или в данной рассылке, свяжитесь, пожалуйста, с автором или администратором.
Обучение Delphi

» Найти все предыдущие уроки можно на www.delphi.int.ru в разделе "Статьи".
Последние 3 урока:

3. Работа с компонентами в дизайнере форм
4. Свойства в Delphi
5. Управление проектом

Обзор свойств компонент

Автор:
Ерёмин Андрей
У самого интересного экспоната не бывает таблички с названием
Номер статьи:
6
(Закон зоопарков и музеев Джоунса)

Пришло время подробнее ознакомиться со свойствами компонент. И начнём мы с базового элемента любого оконного приложения - формы. Свойств у формы достаточно много, и в разных версиях Delphi их набор может немного отличаться. Здесь будет рассмотрение свойств на основе Delphi 7.

Свойства формы (TForm) в Object Inspector - часть I

Создание полупрозрачной формы с использованием свойств AlphaBlend и AlphaBlendValue
AlphaBlend = True

Форма Borderstyle=
Borderstyle="bsDialog"

Форма Borderstyle=
Borderstyle="bsToolWindow"

Action - определяет объект TAction. Это объект служит для быстрой привязки действий к компонентам, в особенности - к пунктам меню и панелям инструментов. Но может быть привязан и к форме. Для управления TAction служат редакторы TActionList со страницы Standard и TActionManager со страницы Additional.

ActiveControl - определяет элемент, который имеет в данный момент фокус ввода. Если выбрать какой-либо объект во время разработки (design-time), то при запуске приложения этот объект и будет иметь фокус ввода. Также свойство может быть полезно и во время выполнения (run-time) - можно узнать, какой объект "держит" фокус в данный момент, а также можно переместить фокус на любой из объектов. Пример: разместим на форме 2 кнопки - Button1 и Button2, а также TTimer (страница System). Выбрав элемент Timer1, дважды щёлкнем в Инспекторе объектов напротив надписи OnTimer на вкладке Events, т.е. создадим обработчик события и напишем следующее: ActiveControl:=Button2; Теперь, запустив программу, каждую секунду фокус будет перемещаться на Button2.

Align - определяет выравнивание формы на экране. Свойство принимает одно из следующих значений:

  • alBottom - по нижнему краю;
  • alClient - вся пользовательская (клиентская) область;
  • alCustom - выравнивание определяется вызовом методом объекта-родителя;
  • alLeft - по левому краю;
  • alNone - без выравнивания;
  • alRight - по правому краю;
  • alTop - по верхнему краю.

AlphaBlend - включает/выключает прозрачность формы.

AlphaBlendValue - задаёт степень непрозрачности формы: 0 - форма полностью невидима, 255 - полностью видима. Прозрачность активируется только при установке свойства AlphaBlend в True.

Anchors - определяет направления, по которым компоненты "привязываются" к форме. Пример: если установить у формы значения akLeft и akRight этого свойства в True, и точно также сделать у кнопки, то при изменении ширины формы размер кнопки (ширина) также будет изменяться.

AutoScroll - включает автоматическое появление полос прокрутки (Scroll bars) на форме, когда размеров формы недостаточно для отображения всех элементов.

AutoSize - включает автоматическое изменение размеров формы согласно позициям размещённых на ней элементов.

BiDiMode - определяет двунаправленное отображение элемента. В некоторых языках письмо осуществляется не слево-направо, а наоборот. Это свойство создано как раз для этой цели.

BorderIcons - определяет множество кнопок, которые отображаются в заголовке окна:

  • biSystemMenu - единственный элемент, который не является кнопкой - отвечает за системное меню окна, которое вызывается комбинацией клавиш [Alt]+[Пробел].
  • biMinimize - кнопка сворачивания (минимизации) окна;
  • biMaximize - кнопка разворачивания окна;
  • biHelp - кнопка справки.

Если хотя бы одна из кнопок сворачивания и разворачивания включена, то независимо от состояния другой, отображаются обе (но вторая естественно неактивна). Если выключены обе, они не отображаются вообще. Это не зависит от Delphi - так устроена ОС Windows.

BorderStyle - определяет поведение границ окна и общий тип окна:

  • bsDialog - диалоговое окно (из кнопок - только "Закрыть", иконки в заголовке окна нет);
  • bsNone - "чистый лист" (отсутствие у окна границ и заголовка) - применяется обычно для создания заставок во время запуска программы;
  • bsSingle - обычное окно, но с запретом изменения размеров;
  • bsSizeable - обычное окно (по умолчанию) - размеры формы можно изменять;
  • bsSizeToolWin - упрощённое окно с уменьшенным заголовком;
  • bsToolWindow - упрощённое окно с уменьшенным заголовком без возможности изменения размеров.

BorderWidth - ширина границы окна в пикселах. Граница является невидимой и расположена в пользовательской части формы.

Caption - текст заголовка формы.

ClientHeight, ClientWidth - размер клиентской (пользовательской) части формы, т.е. той, на которой располагаются компоненты.

Color - цвет формы.

Constraints - определяет минимальные и максимальные размеры высоты и ширины формы в пикселах. 0 - любое значение, т.е. без ограничений.

Ctl3D - свойство определяет 3D-вид формы. При выключенном - "плоское" изображение.

Cursor - курсор мыши в тот момент, когда он находится над формой.

DefaultMonitor - определяет, на каком мониторе появится форма. Имеет смысл применять это свойство только при наличии более, чем одного монитора (например, если несколько экранов).

DockSite, DragKing и DragMode - определяют поведение формы при осуществлении операций Drag&Drop.

Enabled - отвечает за общую активность формы. Если установлено в False, форма недоступна.

Font - шрифт, используемый на форме.

FormStyle - стиль формы или её поведение в MDI-приложении (многооконное приложение, где дополнительные формы располагаются "внутри" основной формы). Значения:

  • fsNormal - обычная форма (значение по умолчанию);
  • fsMDIChild - дочерняя (подчинённая) форма MDI-приложения;
  • fsMDIForm - главная форма MDI-приложения;
  • fsStayOnTop - форма находится поверх всех окон на экране.

Height - высота формы в пикселах. В отличие от ClientWidth является высотой с учётом заголовка и границ формы.

HelpContext, HelpFile, HelpKeyword, HelpType - свойства для связи формы с файлом справки в формате *.hlp.

Свойства формы (TForm) в Object Inspector - часть II

Прозрачная форма, созданная с использованием свойств TransparentColor и TransparentColorValue
TransparentColor = True

Hint - текст всплывающей подсказки.

HorzScrollBar - свойство определяет внешний вид и поведение горизонтальной полосы прокрутки окна.

Icon - значок (иконка) формы. Отображается в заголовке слева от заголовка. Задаётся файлом в формате *.ico.

KeyPreview - если свойство установлено в True, то при нажатии клавиш сначала будут вызываться обработчики формы, а только затем обработчики того компонента, который в данный момент имеет фокус ввода. События, связанные с нажатием клавиш - OnKeyDown(), OnKeyPress(), OnKeyUp().

Left - позиция формы на экране (левого верхнего угла) в пикселах.

Menu - позволяет выбрать один из компонентов-меню, который станет главным меню окна, т.е. будет отображаться вверху.

Name - имя формы как объекта. Может содержать только латинские буквы, цифры и знак подчёркивания, и не может начинаться с цифры. Фактически, это то имя, по которому в программе можно обратиться к форме.

ObjectMenuItem - используется при работе с OLE-объектами и позволяет связать пункт меню и OLE-объект: когда объект выделен, пункт меню активен и наоборот.

OldCreateOrder - определяет, когда происходят события OnCreate() и OnDestroy() формы. Если установлено в False, то OnCreate() произойдёт после вызова всех конструкторов, а OnDestroy() - после вызова всех деструкторов. Начальное значение - False, изменять не рекомендуется.

ParentBiDiMode - изменение свойства BiDiMode согласно значению объекта-предка формы.

ParentFont - изменение шрифта (Font) согласно значению объекта-предка.

PixelsPerInch - пропорции шрифта в системе (точек на дюйм).

PopupMenu - позволяет указать контекстное меню (объект TPopupMenu) для формы. Это меню вызывается нажатием правой кнопки мыши.

Position - определяет начальную позицию формы на экране, т.е. в момент её появления. Основные значения:

  • poDesigned - появление в том месте, в каком форма расположена в design-time;
  • poDesktopCenter - по центру рабочего стола (рекомендуемое значение);
  • poScreenCenter - по центру экрана;
  • poMainFormCenter - по центру главной формы приложения (для главной формы не имеет смысла).

PrintScale - определяет размеры формы при выводе её изображения на печать.

Scaled - включает масштабирование формы в соответствии с заданным значением свойства PixelsPerInch.

ScreenSnap - если установлено в True, то форма будет автоматически "прилипать" к краям экрана в момент перемещения.

SnapBuffer - определяет расстояние (в пикселах), на котором форма будет "прилипать" к краю экрана.

ShowHint - включает/выключает показ всплывающей подсказки (Hint).

Tag - специальное свойство, которое есть у всех объектов. Специального применения для этого свойства нет, поэтому оно используется для разных целей в конкретной ситуации. Свойство удобно в том случае, если нужно хранить некоторое целое число - не придётся заводить дополнительную переменную.

Top - позиция формы (левого верхнего угла) на экране в пикселах.

TransparentColor - включает/выключает прозрачность определённого цвета формы.

TransparentColorValue - задаёт цвет, который будет прозрачным.

UseDockManager - используется при реализации Drag&Drop технологии, предоставляя дополнительные возможности этого метода взаимодействия.

VertScrollBar - определяет внешний вид и поведение вертикальной полосы прокрутки окна.

Visible - определяет видимость формы на экране.

Width - ширина окна в пикселах, включая границы.

WindowMenu - свойство-аналог свойства Menu, но используемое при создании MDI-форм.

WindowState - одно из состояний окна:

  • wsNormal - обычное состояние (занимает часть экрана);
  • wsMinimized - окно свёрнуто;
  • wsMaximized - окно развёрнуто на весь экран.

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

Примечания

Стоит сделать несколько примечаний насчёт свойств.

  • Свойства прозрачности формы (AlphaBlend, AlphaBlendValue, TransparentColor и TransparentColorValue) корректно работают только на ОС Windows XP и следующих версиях. В предыдущих версиях ОС изменение значения этих свойств не производит визуального изменения формы.
  • Свойства, названия которых начинаются со слова Parent (англ. - родитель), в большинстве случаев связывают значения некоторых свойств со значениями соответствующих свойств объекта-родителя. Так, кнопка (TButton) имеет свойство ParentFont и свойство Font, отвечающее за шрифта текста на этой кнопке. Но и сама форма имеет свойство Font. В результате, если у кнопки установить ParentFont в True, а затем изменить шрифт у формы, то шрифт у кнопки изменится соответствующим образом. Это позволяет быстро изменять одни и те же свойства у большого числа компонент. Другие подобные свойства - ParentShowHint, ParentColor, ParentBiDiMode.
  • Свойство Cursor, отвечающее за курсор, есть у большинства компонент. Но при перемещении курсора его вид изменяется на тот, который задан у самого "дальнего" объекта. Т.е. если и формы и у кнопки заданы разные формы курсора, то при перемещении над кнопкой будет использоваться курсор, заданный у самой кнопки. Число "вложений" одних компонент в другие может быть довольно большим.

Заключение

В этой статье рассмотрены свойства формы и основные свойства компонент. Изменяя свойства, можно настроить объекты так, как это требуется для реализуемой программы. Объектно-ориентированное программирование в основном и сводится к управлению свойствами объектов.

Оцените данный урок по пятибалльной шкале:
1 2 3 4 5
Комментарии и замечания приветствуются.

 

Delphi.int.ru Expert
(текущая версия системы: 1.67
последнее обновление: 15.03.2007)

Если Вы не являетесь зарегистрированным пользователем сайта, зарегистрируйтесь прямо сейчас! Регистрация »

Delphi.int.ru Expert - это автоматизированная система экспертной помощи, призванная помочь в решении проблем, возникающих как у начинающих, так и опытных программистов, а также способствующая обмену информации между участниками лично и публикации этой информации в массовых рассылках в дальнейшем. Система полностью автоматизирована и постоянно развивается и обновляется. Если у Вас есть какие-то либо вопросы или Вы столкнулись с какой-либо проблемой при программировании на Delphi/WinAPI - задайте свой вопрос и эксперты Вам помогут. Кроме того, Вы сами можете войти в состав экспертов и помогать другим.

Задать вопрос экспертам » | Справочное руководство » | Перейти в состав экспертов » | Эксперты системы »

Здесь публикуются вопросы вместе с ответами, срок действия которых закончился (каждый вопрос действителен в течение одной недели).

* Администраторы сайта не корректируют сообщения и за наличие грамматических ошибок ответственности не несут.

Delphi.int.ru Expert  – вопросы и ответы (#191 - #200)
Вопрос № 191

Текст вопроса:

как копировать файлы функцией CopyFileEx со стату баром? что только не перепробовал какие где параметры кое как разобраться не могу. есть ли простенький пример применения фунции?

Автор вопроса: терехин алексей сергеевич (статус: Посетитель)
Дата и время отправки вопроса: 10.12.2006, 20:28
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: min@y™ (статус: 7-ой класс), 11.12.2006, 09:11]:

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

Набрал в гугле "Копируем файл с индикатором процесса" и первая же ссылка и есть этот пример.

http://articles.org.ru/cfaq/index.php?qid=715&frommostrecent=yes

Оценка за ответ: 3.
Комментарий: зачёт

2. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 11.12.2006, 10:54]:

Здравствуйте, терехин алексей сергеевич!
Все есть в MSDN и даже в Delphi Help (Win32 Programmer's Reference). Все довольно просто, есть только одна тонкость: в CopyFileEx передается параметр pbCancel, который должен быть указателем на переменную Boolean, так вот, эта переменная не должна быть локальной.

Готовый пример смотрите здесь: http://expert.delphi.int.ru/download_32.

Ключевой код приведен в приложении.

Приложение:

Оценка за ответ: 5.
Комментарий: наконец то понятное объяснение )



Вопрос № 192

Текст вопроса:

Создаю на главной форме фон с помощью Form.Canvas.Draw... Во время работы приложения, при перемещении окна за пределы экрана, либо накрывания окном другой программы, рисунок пропадает и получаются белые пятна. Что делать? Не прорисовывать же фон каждый такт.

Автор вопроса: Павлов Евгений Владимирович (статус: Посетитель)
Дата и время отправки вопроса: 10.12.2006, 23:33
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Dron (статус: 10-ый класс), 11.12.2006, 08:03]:

Здравствуйте, Павлов Евгений Владимирович!
Самое простое, что можно сделать - это рисовать на канве TImage или TPaintBox вместо канвы формы. В этом случае изображение точно будет оставаться.
Кстати, если вы заливаете фон окна однотипной картинкой (т.е. т.н. режим "плитка"), то можете использовать свойство Brush:
Form1.Brush.Bitmap.LoadFromFile('background.bmp');

Оценка за ответ: 5.
Комментарий: Отличный ответ! Просто и по существу.

2. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 11.12.2006, 09:49]:

Здравствуйте, Павлов Евгений Владимирович!

Просто делайте замещение рисунка в событии OnPaint
формы, и при необходимости можно всегда заново отрисовать форму событием Paint;

3. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 11.12.2006, 11:12]:

Здравствуйте, Павлов Евгений Владимирович!
Добавлю и я пару слов на Ваш вопрос.

Итак, TCanvas - канва или, в простонародье, холст является надстройкой над HDС - Handle of Display Device Context - дисплейным контекстом устройства. Устройство, которому может принадлежать холст может быть разным - например экран (как в Вашем случае с холстом формы), а может быть холстом картинки TBitmap и еще много чего (принтер и т.д.).
Если Вы рисуете на канве экрана, т.е. на канфе формы или любого другого элемента управления, то если другие программы закрасят эту область, естественно она изменится.

С учетом всего этого у Вас есть два выхода:
1. Перерисовывать заново, когда область рисования была перекрашена (OnPaint/WM_PAINT).
2. Если рисование занимает продолжительное время и содержит циклы перерисовывания, когда одна область зарисовывается сначала одним цветом, потом другим. Чтобы избежать мерцания нужно имвользовать канву TBitmap того же размера. Рисовать на ней и в конце цикла рисования выводить на экран. В OnPaint тогда не нужно будет рисовать изображение снова - нужно будет только вывести на экран уже готовое, что намного быстрее.

Кстати TPaintBox не имеет буфера и рисует на экран аналогично всем остальным контролам, т.е. не сохраняет содержимое.

Оценка за ответ: 4.
Комментарий: Спасибо. Жаль конечно, что нет какой-нибудь особой команды для закрепления рисунка, но куда деваться...



Вопрос № 193

Текст вопроса:

Здравствуйте меня зовут Коля
Мне нужна решить одну задачу на Delphi(связь delphi с Excel)
Я скачал с Интернета исходный код:

что мне нужно знать как зделать:
мне нужно открыть фаил например kolj(Excel),
считать данные из файла например [1,2] (первый столбец вторая строка),
и сохранить этот фаил (по моему сохранить Excel.save) чтоб не выдавалось диалоговое окно Excelя сохранить фаил.
Т.е. мне нужно добавлять какието данные в таблицу и сохранять ее.

Приложение:

Автор вопроса: Пилипенко Николай Федорович (статус: Посетитель)
Дата и время отправки вопроса: 11.12.2006, 16:16
Получено ответов на вопрос: 0
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

К сожалению, ответов на данный вопрос не поступило...



Вопрос № 194

Текст вопроса:

Как настроить NMSMTP для отправки sms?

Приложение:

Автор вопроса: Белый Владимир (статус: Посетитель)
Дата и время отправки вопроса: 12.12.2006, 13:51
Получено ответов на вопрос: 1
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: mvp (статус: 4-ый класс), 12.12.2006, 15:27]:

В приложении пример отсылки простого письма. Чтобы отсылать письма, нужно иметь аккаунт на какой-то почтовой службе.
Host - smtp-сервер вашего провайдера или почтовой службы (обычно smtp.myprovider.net), userId - ваш почтовый ящик (не обязателен, но всё зависит от провайдера, так что пишите). Далее, думаю разберётесь. И ещё: отслеживайте события OnAuthenticationFailed и OnFailure.

По поводу sms скажу отдельно: для jeans и UMC можно оставить один адресс: @sms.umc.ua, но сервер umc часть провайдеров банит (не знаю за что), так что не факт, что у Вас получится.

sms на Kyivstar: @2sms.kyivstar.net - для припейда и @sms.kyivstar.net - для контракта, так что так, как Вы написали - Вы ничего не отправите, так что исправьте. И ещё, чтобы человек с Киевстаром мог принять Ваше письмо, ему необходимо разрешить приём сообщений с мыла (по-моему, надо отправить sms на номер 7021, хотя уточните. Стоимость - как обычная sms).

Приложение:

Оценка за ответ: 5.
Комментарий: Спасибо!!!!



Вопрос № 195

Текст вопроса:

Назовите, пожалуйста, метод определения текущей размерности массива?

Автор вопроса: Полушин Сергей Анатольевич (статус: Посетитель)
Дата и время отправки вопроса: 12.12.2006, 17:51
Получено ответов на вопрос: 3
Сообщений в форуме вопроса: 4
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Вадим К (статус: Средний уровень), 12.12.2006, 18:39]:

lehgth(имя массива) - "размерность"
low() high() - нижний и верхний индекс

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

2. [Отвечает: Новаковский Юрий Аврамович (статус: 3-ий класс), 12.12.2006, 19:59]:

Здравствуйте, Полушин Сергей Анатольевич!

Повидимому массмв у Вас динамический (иначе зачем узнавать длину, а не размерность, размерность-это количество индексов).
От себя добавлю как изменить длину динамического массива см приложение.
УдачиВам!

Приложение:

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

3. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 13.12.2006, 01:14]:

Здравствуйте, Полушин Сергей Анатольевич!
Динамические массивы не несут в себе информации о своей размерности (в runtime), статические массива тоже, похоже, проверяются на размерность только компилятором на этапе компиляции.
Поэтому определить именно "размерность", просто так не получится. Я вижу только один не очень "красивый" вариант - проанализировать как Delphi размещает в памяти данные динамических массивов (функция DynArraySetLength) и, имея первый элемент массива, узнав его длинну (Lehgth) проверить память за этими данными. Если данные в памяти есть - возможно это следующий уровень размерности массива.

Только у меня нет времени разбираться с этим. Ести Вам надо - идите в этом направлении.

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



Вопрос № 196

Текст вопроса:

Здраствуйте.
Задача заключается в следующем. Необходимо организовать авторизованный доступ к дискете.Т.е.,если в привод вставлена незапароленная дискета то предлагается ввести логин и пароль, после чего находится хеш-функция этого пароля и он записывается в 8 байт boot-сектора. Если дискета запароленная, то доступ к ней можно получить только после ввода верного пароля.
Так вот меня интересует, как при помощи WinAPI сделать запись на дискету и производить считывание с нее. По возможности прошу дать ссылки. Взаранее спасибо.

Автор вопроса: Князев А.А. (статус: Посетитель)
Дата и время отправки вопроса: 14.12.2006, 16:23
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 14.12.2006, 16:51]:

1) Получаем прямой доступ к устройству с помощью CreateFile() (В качестве имени подставляем, например, '\\.\A:')
2) С помощью DeviceIOControl() запрашиваем информацию о геометрии устройства (IOCTL_DISK_GET_DRIVE_GEOMETRY) и убеждаемся, что это действительно дискета. Заодно получаем информацию о размере сектора.
3) Читаем/пишем с помощью ReadFile()/WriteFile()

Самая полезная ссылка на эту тему http://msdn.microsoft.com/

2. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 14.12.2006, 23:51]:

Здравствуйте, Князев А.А.!
Alexander A. Gribanov совершенно прав.
Вот еще пример получения информации о геометрии. На С++, но портировать на Delphi совсем просто - главное принцип.

Приложение:

Оценка за ответ: 5.
Комментарий: Спасибо большое.



Вопрос № 197

Текст вопроса:

Как сохранить сформированную таблицу Excel с заданным именем?
Я открываю исходную таблицу ID1.XLS(он открывает файл, как ID11.XLS), заполняю нужные таблицы, а теперь нужно сохранить файл с именем, который задал пользователь SaveDialog'ом! Как это сделать? (Использую Delphi6)

Приложение:

Автор вопроса: RedMask (статус: Посетитель)
Дата и время отправки вопроса: 15.12.2006, 09:28
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 15.12.2006, 09:43]:

Здравствуйте, RedMask!

n.saveas(opendialog1.filename);

Оценка за ответ: 4.
Комментарий: Хороший и правельный ответ, поставил 5 бы если сработало :-)

2. [Отвечает: Помфюк Владимир Степанович (статус: 7-ой класс), 15.12.2006, 10:14]:

Здравствуйте, RedMask!
n.ActiveWorkbook.SaveAs(opendialog1.filename);
или так
n3:=n.Workbooks.Add(n2);
n3.SaveAs(opendialog1.filename);

Оценка за ответ: 5.
Комментарий: Спасибо большое) Помог первый вариант) Как гора с плеч!



Вопрос № 198

Текст вопроса:

Как отследить перемещение формы? Такого события нет вроде! Ну вообще то я видел уже что-то по этому поводу в Интернете, но мне бы хотелось, чтобы объяснили!
Это надо для того, чтобы остальные формы моего программного средства двигались вместе с панелью инструментов, как прикреплённые!
Заранее спасибо!

Автор вопроса: RedMask (статус: Посетитель)
Дата и время отправки вопроса: 15.12.2006, 13:52
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 3
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: PaVeL-Ekt (статус: 1-ый класс), 15.12.2006, 14:13]:

Здравствуйте, RedMask!

Да Вы правы события такого нету,
но есть событие OnMouseMove

Создадим глобальную переменную типа
Type TForm_coord=record
X: integer;
Y: integer;
end;

Var
Form1: TForm1;
Form_Coord: TForm_coord;

теперь обработчик движения мыши:
Procedure TForm1.OnMouseMove(Sender: TObject; ...);
begin
if (ssLeft in state)and((x>0)and(x<form1.width)and(y>0)and(y<)) then
if (x<>Form_Coord.x)or(y<>Form_Coord.y) then
begin
//ваша Функция или процедура при передвижении формы;
Form_Coord.x:=x;
Form_Coord.y:=y;

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

2. [Отвечает: Вадим К (статус: Средний уровень), 15.12.2006, 16:49]:

Зачем так сложно? И мне кажеться это не совсем то, что просят у нас. Итак, вот мой вариант
в public части формы обявим новый метод.
public
procedure WMMove(var mess:TWMMove);message WM_Move;
Дальше жмём Ctrl+Shift+C и Делфи сгенерирует обработчик. Там можно писать код обработки. Текущие координаты формы можно узнать непосредственно (Top и Left) или с этого параметра, так как он - структура.
Эта процедурка будет дёргаться каждый раз, когда форма будет соваться по экрану

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



Вопрос № 199

Текст вопроса:

Доброе время суток, программисты. У меня есть
чистый TreeView, как мне в нем создать программно item, программно выделить его и создать в нем подкатолог. Заранее благодарен

Автор вопроса: Geron (статус: 1-ый класс)
Дата и время отправки вопроса: 17.12.2006, 01:26
Получено ответов на вопрос: 2
Сообщений в форуме вопроса: 0
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Виталий Лещенко (статус: 3-ий класс), 17.12.2006, 01:39]:

Здравствуйте, Geron!
Вся работа ведется через TreeView1.Items
Метод Add создаст новый аитем и добавит его к нужной ноде.

Приложение:

2. [Отвечает: Евгений Козаченко (статус: 2-ой класс), 17.12.2006, 11:46]:

Здравствуйте, Geron!
...
var
node,N:TTreeNode;
begin
n := TreeView1.Items.Add(nil,'text');//Это добавляеться айтем в корень
node:= TreeView1.Items.AddChild(n,'2text');//Это добавляется "подкаталог"
...

А для того, чтобы виделить его нужно просчитывать его индекс.

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



Вопрос № 200

Текст вопроса:

доброе время суток, господа Программисты.
Помогите, пожалуйста. Как очистить memo. Заранее Благодарен

Автор вопроса: Geron (статус: 1-ый класс)
Дата и время отправки вопроса: 19.12.2006, 01:39
Получено ответов на вопрос: 4
Сообщений в форуме вопроса: 1
Страница данного вопроса >>


» Ответы на данный вопрос:

1. [Отвечает: Alex Van Glukhman (статус: 7-ой класс), 19.12.2006, 02:10]:

Здравствуйте, Geron!

1 вариант: Memo1.Lines.Text:='';
2 вариант: Memo1.Clear;

УДАЧИ!

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

2. [Отвечает: Матвеев Игорь Владимирович (статус: Средний уровень), 19.12.2006, 04:44]:

Здравствуйте, Geron!

Memo1.Lines.Text:='';
Memo1.Lines.Clear;
Memo1.Clear;

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

3. [Отвечает: Alexander A. Gribanov (статус: 2-ой класс), 19.12.2006, 09:41]:

TMemo.Free ? ;)
А если серьёзно, то чем не устраивает TMemo.Clear ?

P.S.: На такие вопросы прекрасно умеет отвечать встроенная контекстная помощь в Delphi....

4. [Отвечает: Дима Гусаков (статус: 1-ый класс), 19.12.2006, 16:49]:

1. memo1.clear;

2.
procedure ClearMemos;
var
i: integer;
begin
for i:=0 to ComponentCount-1 do
if (Components is TMemo) then
(Components as TMemo).Text:=' ';
end;
Объявляем переменную i типа integer. Далее, перебирая все компоненты на форме, ищем среди них Memo и очищаем их содержимое.




Статьи  >>

Диалог в стиле wizard'а

Автор: Dynamic
Источник: http://dynamic.nm.ru/

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

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

Итак, кладем на форму компонент TPageControl и добавляем требуемое количество закладок. Я для примера создал пять закладок:

  • Первая страница. Особенность: кнопка "Назад" неактивна (куда ж идти то?). Обычно здесь располагается общая информация о задаче (программе);
  • Вторая страница. Особенность: переход на следующую страницу возможен только при выполнении определенного условия. В программах установки таким условием является согласие пользователя с лицензионным соглашением;
  • Третья страница. С нее в зависимости от выбора пользователя будет осуществляться переход либо на следующую страницу, либо сразу на пятую (последнюю в нашем примере);
  • Четвертая страница. Ничего особенного, нужна как "заглушка" для предыдущего шага;
  • Пятая страница. Конечный этап: кнопка "Далее" отключается, появляется кнопка "Готово".

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

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
     // Прячем закладки. В принципе эту операцию можно выполнить
     // и в Инспекторе объектов, но так будет более универсально
     for i := 0 to PageControl1.PageCount-1 do
      PageControl1.Pages[i].TabVisible := false;
     // Делаем активной (видимой) первую страницу
     PageControl1.ActivePageIndex := 0;
     // Обновляем элементы управления
     CheckChange(0);
end;

Процедура CheckChange(NewIdx: integer) является ключевой в программе: она изменяет состояние элементов управления текущей страницы мастера и вызывается всякий раз, когда пользователь переходит от предыдущей страницы к странице с индексом NewIdx. Вот как она реализована:

procedure TForm1.CheckChange(NewIdx: integer);
begin
     // Контролируем "крайние" закладки:
     btBack.Enabled := NewIdx > 0;
     btFrwrd.Enabled := NewIdx < PageControl1.PageCount-1;
     // Кнопка "Готово" видна только на последней странице
     btend.Visible := not btFrwrd.Enabled;
     // Метка с сообщением, что предыдущая страница была пропущена
     Label6.Visible := RadioGroup2.ItemIndex > 0;

     // дополнительные проверки в зависимости от номера текущей страницы (закладки)
     case NewIdx of
      1: btFrwrd.Enabled := btFrwrd.Enabled and (RadioGroup1.ItemIndex > 0);
      2: btFrwrd.Enabled := RadioGroup2.ItemIndex > -1;
      3: if RadioGroup2.ItemIndex > 0 then
          if GoBack then
           PageControl1.SelectNextPage(false, false) else
           PageControl1.SelectNextPage(true, false);
     end;
end;

Логическая переменная GoBack позволяет определить направление переключения закладок: вперед или назад. Ее значение формируется в обработчиках соответствующих кнопок "Вперед" и "Назад":

procedure TForm1.btFrwrdClick(Sender: TObject);
begin
     GoBack := false;
     PageControl1.SelectNextPage(true, false);
end;

procedure TForm1.btBackClick(Sender: TObject);
begin
     GoBack := true;
     PageControl1.SelectNextPage(false, false);
end;

Теперь посмотрим - когда же необходимо вызвать процедуру CheckChange() для обновления состояния элементов управления.

Во-первых, после смены любым способом активной страницы (TPageControl генерирует при этом событие OnChange):

procedure TForm1.PageControl1Change(Sender: TObject);
begin
     CheckChange(PageControl1.ActivePageIndex);
end;

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

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
     CheckChange(PageControl1.ActivePageIndex);
end;

procedure TForm1.RadioGroup2Click(Sender: TObject);
begin
     CheckChange(PageControl1.ActivePageIndex);
end;

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

Вы можете отправить свои статьи по адресу info@delphi.int.ru и они будут опубликованы в ближайших выпусках рассылки и на сайте.


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

Разделы: Статьи | Компоненты | Plug-in's | Документация | Исходники | Программы | Игры | Изображения

Уважаемые читатели! Отправляйте полезные компоненты/модули, интересные исходники, собственные программы/игры и мы разместим их на сайте. Отправить можно здесь »

Название
Описание
Раздел
Объём
Ссылки
Pente

Игра Pente очень похожа на крестики-нолики. Основные осебенности игры заключаются в том, что можно изменять размер игрового поля, размер строк и колонок, а также стратегию компьютера (наступательную или оборонительную).
Исходники в комплекте.

39 Кб
Lines

Старая добрая игра Lines :-)
Исходники в комплекте.

161 Кб
 
Всего новых файлов: 2  
200 Кб
 

Если у Вас есть книги по Delphi (в электронном виде, разумеется) или другая полезная документация - сообщите и её можно будет разместить на сайте.

Отправить файл »   

Юмор

Ведущий раздела: Bruder

Билл Гейтс vs General Motors

Говорят, на последней компьютерной выставке COMDEX Билл Гейтс заявил, что если бы General Motors развивался так, как Microsoft, мы бы уже все давно ездили на машинах стоимостью $25 и расходом топлива 0.005 л/100 км.

Через день представитель GM заявил в ответ, что если бы GM повторял тенденции Microsoft, то:
1. Абсолютно без причины, среднестатистическая машина попадала бы в аварию 2 раза в день.
2. Каждый раз, когда изменялась бы разметка на дороге, приходилось бы покупать новый автомобиль.
3. Иногда машина бы просто останавливалась посреди шоссе. Чтобы поехать дальше, надо было бы оттолкать машину к обочине, закрыть все ОКНА, заглушить двигатель, открыть все ОКНА и только потом ехать.
4. Выполняя сложный маневр, машина может заглохнуть и больше не завестись. Тогда придется переинсталлировать двигатель.
5. Макинтош сделал бы автомобиль, который бы использовал энергию солнца, был бы в пять раз быстрее авто от Microsoft, вдвое легче в управлении - но мог бы ездить только по 5% дорог.
6. Датчики температуры двигателя, зарядки батареи, давления масла заменили бы на один - единственный: "Эта Машина осуществила нелегальную операцию и сейчас заглохнет".
7. Перед тем как сработают подушки безопасности, появится надпись: Are you sure?
8. Иногда автомобиль закроет дверь на замок и вы не сможете попасть внутрь. Тогда нужно одновременно нажать ручку двери, вставить ключ и нажать на радиоантенну - система разблокируется.
9. Каждый раз при покупке нового авто придется учиться ездить заново - управление каждой новой машины будет в корне отличаться от старого.
10. Чтобы заглушить мотор, нужно нажать кнопку START.

Говорят, Гейтс обиделся...

:))

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

В избранное