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

  Все выпуски  

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


Программирование на DELPHI
Выпуск #83 (12 июня 2008 г.)

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

Delphi.int.ru

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

IRC-каналы сайта:

Сервер: irc.dalnet.ru
Порт: 6667
Канал: #delphiintru

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

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

Всех россиян поздравляем с Днём России! Всем остальным тоже не скучать :-)

Всем тем, кто только присоединился к нам, рекомендуется зарегистрироваться на сайте. Регистрация предоставит Вам полный доступ к возможностям сайта. К примеру, без регистрации Вы не сможете задавать на сайте вопросы, оставлять комментарии к файлам и участвовать в опросах.
Перейти к регистрации »
Задать вопрос »

В этом выпуске:

Статистика Delphi.int.ru Expert на 12.06.2008, 20:00 (предыдущий подсчёт - 05.06.2008, 18:00):

Количество экспертов: 54 (+3).
Участниками задано вопросов: 1678 (+18).
Экспертами дано ответов: 2294 (+23).
Количество сообщений на мини-форумах: 3272 (+82).
Максимальное число разосланных в день писем (за всю историю): 809 (17.07.2007, +0).

До встречи в следующем выпуске!

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

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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом.

Количество читателей рассылки (12.06.2008, 20:00):
5544+1934+487= 7965 (+17)

Связь по e-mail:

admin@delphi.int.ru
support@delphi.int.ru


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

Delphi.int.ru Expert
Сообщество программистов: общение, помощь, обмен опытом
(текущая версия системы: 2.37; последнее обновление: 09.06.2008)

Последние новости

09.06.2008. В раздел "Статистика" добавлена новая страница - "Статусы и возрасты участников" - количество экспертов с распределением по статусам и информация о возрастных категориях участников.

Последние достижения:

03.06.2008 - эксперт Бубырь Александр Николаевич достиг статуса 10-ый класс.
06.06.2008 - посетитель Шичко Игорь стал экспертом и получил статус 1-ый класс.
08.06.2008 - посетитель Мережников Андрей стал экспертом и получил статус 1-ый класс.

 

Архив: вопросы и ответы

В архив попадают вопросы, срок действия которых истёк. Каждый заданный вопрос действителен в течение одной недели, т.е. ответы на него принимаются именно в этот период. В сегодняшнем выпуске опубликованы вопросы # 406 - 420. Вопросы, на которые не было дано ни одного ответа, не публикуются.
Так как темп поступления вопросов от пользователей намного выше темпа их публикации, в рассылке публикуются вопросы, заданные довольно давно. Тем не менее, вопросы публикуются по порядку, без пропусков. Просмотреть любые вопросы и ответы Вы всегда можете на сайте.

Статистика по выпуску:

Кол-во вопросов: 15
Кол-ответов: 18
Баллы за ответы: 48
 

Вопрос # 406

Как к Delphi прицепить С-ный lib-файл? Поясню: есть библиотека (в исходниках) откомпилированная CBuilder (т. е. obj-файлы доступны). Нужно её прицепить к проекту на Delphi, но dll использовать нельзя. Спасибо

Вопрос задал: mvp (статус: 4-ый класс)
Вопрос отправлен: 14 марта 2007, 12:35
Всего ответов: 5; сообщений в мини-форуме вопроса: 7

 

1. Отвечает эксперт: Вадим К

Если она действительно в билдере скомпилирована, то некоторая надежда есть. Для этого надо знать точно сигнатуру функций.
Итак, хелп как всегда рулит. Вот виписка
Добавим строку
{$L BLOCK.OBJ}
для подлинковки в dcu нужной либы
добавлять нужно гдето в разделе implementation
Также не забыть дать обявления этих функций
procedure MoveWord(var Source, Dest; Count: Integer); external;
реализацию писать не надо, а слово external укажет компилятору, что они потом будут

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 14 марта 2007, 12:57
Оценка за ответ: 5
Комментарий: Путь верен, но возникли некоторые другие проблемы...

2. Отвечает эксперт: min@y™

В книге С. Тейксейра, К. Пачеко "Delphi 5. Руководство разработчика" есть такие разделы как: "Использование OBJ-файлов C/C++" и "Использование классов C++". Всё с примерами, естественно.

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

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 14 марта 2007, 15:24
Оценка за ответ: 5
Комментарий: Если не затруднит, то на mvp[sobaka]gala.net. Спасибо

3. Отвечает эксперт: Бубырь Александр Николаевич

Лет 5 назад у меня была та же задача.
Проще всего оказалось добавить свои делфийские формы в билдеровский проект (он спокойно открывает и добавляет PAS файлы) и компилировать в билдере.

Ответ отправил: Бубырь Александр Николаевич (статус: 10-ый класс)
Ответ отправлен: 14 марта 2007, 19:08
Оценка за ответ: 4
Комментарий: В общем случае Ваш совет подходит, но вопрос не о том. Если в проекте на delphi несколько десятков тысяч строк кода, то не переписывать же их все на Cbuilder ради библиотеки из 1000 строк? P. S. Говорят, что и сам Builder написан на Delphi, как и каждая последующая версия delhi пишется на предыдущей

4. Отвечает эксперт: Виталий Лещенко

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

Делаешь модуль в котором описываешь все нужные тебе функции с директивой external;

Для того, чтобы линковщих знал откуда их брать пишеш еще {$L test.obj}

И все!

Еще следует обратить внимание на способ передачи параметров и на то, кто очищает стек.
т.е. stdcall, register, cdecl

Ответ отправил: Виталий Лещенко (статус: 4-ый класс)
Ответ отправлен: 14 марта 2007, 21:18

5. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, mvp!
Добавлю, что OBJ файлов существует два формата: COFF - используемый Microsoft и OMF - используемый, в основном, Borland. Таким образом, при подключении, скажем OBJ файлов от MASM в Delphi возникают серьезные проблемы. Существуют конвертеры coff2omf и omf2coff, но реально с их помощью невозможно портировать что-то сложнее чем дважды два. Но MASM (и большинство других асемблеров) может выдавать obj файлы и в OMF формате.
Небольшой пример - проигрывание MIDI из памяти (интеграция MASM с DELPHI) см. прикреплённый файл.
С остальными (FASM, TASM, CBuilder, C++ и т.д.) все аналогично.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Ответ отправлен: 14 марта 2007, 23:47


Вопрос # 407

Здрасте!
Как в Application Console в Delphi использовать Паскалевский графический модуль?

Вопрос задал: Федянин Николай Петрович (статус: Посетитель)
Вопрос отправлен: 14 марта 2007, 18:36
Всего ответов: 1

 

1. Отвечает эксперт: Вадим К

никак. Виндовс консоль отличается от консоли в дос. При запуске старых консольных приложений (16бит) это дело симулируется. А во врорых делфи 32 битный бинарник даёт, а турбопаскаль - 16 бит - не слинкуется. Проще на канве рисовать.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 14 марта 2007, 18:49
Оценка за ответ: 4


Вопрос # 408

Подскажите как можно эксопритровать данные из нескольких (например 2-ух) StringGrid в один файл Excel и HTML? Заранее Спасибо!!! Дима.

Вопрос задал: Юрьев ДС (статус: Посетитель)
Вопрос отправлен: 15 марта 2007, 12:39
Всего ответов: 1

 

1. Отвечает эксперт: Вадим К

А как с одного знаем?
Если да, то в чём проблема? В позиционировании?
С Екселем кода куча, с html - в приложении

Приложение:

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 15 марта 2007, 15:48
Оценка за ответ: 5
Комментарий: Ответ на вопрос эксперта: Как с одного знаем. Да и как с 2-ух уже тоже знаю. А вот по поводу HTML - огромное спасибо. Работает так как надо было мне.


Вопрос # 410

есть ли готовые компоненты для работы с векторной графикой (бесплатные) или какие нибудь примеры

Вопрос задал: San (статус: Посетитель)
Вопрос отправлен: 15 марта 2007, 18:13
Всего ответов: 1

 

1. Отвечает эксперт: Роман

Здравствуйте, San!Небольшая библиотека для работы с векторной графикой есть тут: http://kladovka.net.ru/index.cgi?pid=list&rid=375 Исторически была создана для задания сигналов произвольной формы на ЦАПах с помощью кривых безье. Поддержка Undo.
В архиве демонстрационный пример.

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 15 марта 2007, 20:17


Вопрос # 411

Как получить login пользователя под которым он входит в операционную систему,в сеть?
GetUserName(lpBuffer,nSize); - практический пример, если можно

Вопрос задала: Наташа (статус: Посетитель)
Вопрос отправлен: 16 марта 2007, 09:46
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Роман

Здравствуйте, Наташа!Значит так,имя текущего пользователя оси можно узнать к примеру так(1),или так(2).Получить список зарегистрированных под NT пользователей можно так(3).

Приложение:

Ответ отправил: Роман (статус: 5-ый класс)
Ответ отправлен: 16 марта 2007, 10:27


Вопрос # 412

Здравствуйте! Как определить имя пользователя и имя компьютера с которого было запущено приложение?

Вопрос задала: Игракова Е.А. (статус: Посетитель)
Вопрос отправлен: 16 марта 2007, 21:11
Всего ответов: 1

 

1. Отвечает эксперт: Евгений Козаченко

Здравствуйте, Игракова Е.А.!
Сначала эти функции:
Имя компьютера:
function GetComputerNetName: string;
var
buffer: array[0..255] of char;
size: dword;
begin
size := 256;
if GetComputerName(buffer, size) then
Result := buffer
else
Result := ''
end;

Имя пользователя:
Function GetUserFromWindows: string;
Var
UserName : string;
UserNameLen : Dword;
Begin
UserNameLen := 255;
SetLength(userName, UserNameLen) ;
If GetUserName(PChar(UserName), UserNameLen) Then
Result := Copy(UserName,1,UserNameLen - 1)
Else
Result := 'Unknown';
End;

А потом их вызываем:
var
username,compname:string;
begin
username:=GetUserFromWindows;
compname:=GetComputerNetName;
end;

Ответ отправил: Евгений Козаченко (статус: 2-ой класс)
Ответ отправлен: 16 марта 2007, 21:25
Оценка за ответ: 4


Вопрос # 414

Здравствуйте. Я хотел бы задать вопрос на счёт формы.
Много встречается информации о создании формы,
то в виде звёздочки, то элепсовидная, то в виде кольца и так далее.
Как мне сделать форму такой, какой я хочу, то есть ну скажем по рисунку,
а остальная часть формы чтобы была не видима
(как, например иконка, видна та часть, что занимает рисунок,
а остальная часть не видна, только размер формы должен быть побольше).
И если можно ещё спросить, в форме есть свойство AlphaBlendValue,
можно это свойство применить к другим компонентам
(к Memo, Edit, Button), что бы они были полупрозрачными. И ещё как
в Memo1 программно выделить всё(то есть выделить весь текст).
Заранее благодарен.

Вопрос задал: Толков Геннадий Викторович (статус: Посетитель)
Вопрос отправлен: 17 марта 2007, 23:21
Всего ответов: 2; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Вадим К

По первому вопросу вам поможет статья
http://www.delphiworld.narod.ru/base/form_by_image.html
По поводу прозрачности компонент. Если форма прозрачна, то компоненты тоже прозрачны.
ПО поводу последнего вопроса
memo1.SelectAll не пробывали?

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 18 марта 2007, 00:04
Оценка за ответ: 4

2. Отвечает эксперт: Бубырь Александр Николаевич

http://expert.delphi.int.ru/question_370
Фактически тот же вопрос, ответы даны в нем

Ответ отправил: Бубырь Александр Николаевич (статус: 10-ый класс)
Ответ отправлен: 18 марта 2007, 10:50
Оценка за ответ: 4


Вопрос # 415

Здравствуйте, уважаемые эксперты! Меня интересует следующий вопрос. Задумал я сделать что-то наподобие своей странички в локальной сети. Почитал книг, там очень подробно описывается о том, работать с Web-модулями. Но я толком не понял, как сделать свой Web-сервер с правами на запуск исполняемых EXE модулей, который будет принимать результат работы от Web-модуля и отправлять браузеру (про это там не описывалось). Была идея использовать стандартный Web-сервер от MicroSoft, который поставляется вместе с Windows: закинуть несколько страничек и модулей в папку C:\inetpub\wwwroot. Действительно, страницы открываются, но модули не запускаются, а СКАЧИВАЮТСЯ. Как установить права на запуск, я не нашел. Подскажите мне, как можно решить данный вопрос.

Вопрос задал: Bingo (статус: Посетитель)
Вопрос отправлен: 18 марта 2007, 14:18
Всего ответов: 1

 

1. Отвечает эксперт: min@y™

Я никогда подобным не занимался, но дкмаю, что тебе поможет Apache web-server для Windows.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 19 марта 2007, 08:22


Вопрос # 417

Здравствуйте господа эксперты.
У меня такая проблема: при первом запуске программы пользователь должен установить горячие клавиши (н-р, Ctrl+Alt+F9) для последующих вызовов окна программы (она работает в фоновом режиме). Как это реализовать, если можно на примере.

Вопрос задал: Яковлев Николай Сергеевич (статус: Посетитель)
Вопрос отправлен: 19 марта 2007, 06:38
Всего ответов: 2

 

1. Отвечает эксперт: min@y™

Смотри хэлп по API-функциям RegisterHotkey() и UnregisterHotkey().

З.Ы. Если будет непонятно, могу написать пример.pas.

Ответ отправил: min@y™ (статус: Студент)
Ответ отправлен: 19 марта 2007, 08:27

2. Отвечает эксперт: Вадим К

А отобразить сами горячие клавиши можно с помощью компонента THotKey с стандартной поставки делфи. У него также есть свойство HotKey, которое при близком рассмотрении оказывается типа Word. Поэтому сохранять где нибудь в ини файл или свой текстовый файл не будет проблем.
Выставлять сам хоткей пользователю будет привычно.

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 19 марта 2007, 11:15


Вопрос # 418

Доброго врямя суток уважаемые програмисты.
У меня есть строка (на пример "_X@x^2$-25$-_x-8@x^2$-10x+25$$:_x-20@x-5$^2")
Надо чтобы у програме UMS вводились соотвецтвенные выражения ("http://seledka2.ho.com.ua/1.png")
Вопрос у следущем: как сделать так чтобы когда цифры - писать их (посылать ей нажатие), а когда символы(^#&...) мышка нажимала на соотвецтвующие коорденаты, или на стрелки вправо($) и вниз(@)???
Помогить плз. В пятницу вступительный экзамен по алгебре. Прога будет читьать файл (по строкам, каждая строка - новый пример) и по ФТП и туда же ложить ответ. С ФТП я разобрался, а вот с вводом проблемы. Прошу помощи.

Приложение:

Вопрос задал: Наземнов Вячеслав (статус: Посетитель)
Вопрос отправлен: 19 марта 2007, 19:25
Всего ответов: 1

 

1. Отвечает эксперт: Вадим К

Да, дожились. Мы в своё время ручками решали всё. Так надёжнее.

Теперь по вопросу. То, что вы хотите, называется лексический парсер. Только в вашем случае он предельно прост.Код я привожу ниже, но его лучше вынести в отдельный поток - будет чётче работать. Именно для этого по коду разбросаны Sleep(10).
Почему не привожу полный код? Если вы в математике не хотите разбираться, тогда программист не получиться.

Так как у меня нет этой проги, а решать я и без неё умею, то некоторые вещи в коде вам прийдётся догадываться самому.

Приложение:

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 20 марта 2007, 11:24
Оценка за ответ: 5
Комментарий: Спасибо большое. То что надо.
Вадим К - респект !!!


Вопрос # 419

Здравствуйте! Как можно в AppConsole оформить меню, чтобы оно находилось в центре экрана, и как сделать очистку экрана

Вопрос задал: Федянин Николай Петрович (статус: Посетитель)
Вопрос отправлен: 21 марта 2007, 11:51
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Вадим К

Вот здесь http://delphiworld.narod.ru/base/console_colored_text_out.html есть модуль, который вам поможет. Он очень подобен паскалевскому Crt.
Очистка экрана будет делаться в одну строку ClrScr;
Также там есть функции позиционирования курсора и устаноки цвета шрифта.

Этого предостаточно для вывода чего угодно. Я конечно слабо представляю, как вы хотите видеть меню, но могу предположить, что следующий код вам будет интересен.
procedure DrawMenu;
const m[1..5] of string = ('1 punkt','2 punkt punkt','3 punkt','4 punkt','5 punkt');
var i:integer;
begin
ClrScr;
for i:=1 to 5 do
begin
if i=currentpunkt then
SetAttr($1E)
else
SetAttr($10);
GotoXY(32,12+i);
Write(m[i]);
end;
end;
А в коде, который обрабатывает нажатие кнопок переводить currentpunkt на пункт вверх(ну к примеру стрелка вверх) или вниз (стрелка вниз).

В целом интересная задача

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 21 марта 2007, 14:09
Оценка за ответ: 5


Вопрос # 420

Здравствуйте уважаемые эксперты!
проблема такая при открытии базы данных в одном из полей DBGrida светится (Bytes). Поскажите пожалуйста как можно расшифровать эти закодированные данные. очень нужно.

Вопрос задал: Мясников Сергей Владимирович (статус: Посетитель)
Вопрос отправлен: 21 марта 2007, 20:53
Всего ответов: 1; сообщений в мини-форуме вопроса: 1

 

1. Отвечает эксперт: Вадим К

Вы хотябы название поля привели, можно было бы предложить что то внятное. А так предположу, что это поле типа BLOB. Как эго расшифровать? А это зависит, что там. Там может быть обычный текст или картинка, тогда киньте на форму TDBMemo (TDBRichEdit) или TDBImage. Подключите их к этому полю. А там увидите. Но может быть, что там действительно зашифрованые данные. Тогда нужно смотреть - не телепат я, не знаю что там, а единстенно верного ответа нет здесь

Ответ отправил: Вадим К (статус: Кандидат наук)
Ответ отправлен: 22 марта 2007, 11:11
Оценка за ответ: 3


Обучение Delphi

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

20. Подпрограммы (часть 1)
21. Подпрограммы (часть 2)
22. Подпрограммы (часть 3)

Простые типы данных

Автор:
© Ерёмин А.А., 2008
Если бы не память, жизнь была бы невозможна; если бы не забывание, жизнь была бы невыносима.
Номер урока:
22

Введение

В предыдущих уроках мы между делом знакомились с типами данных. Всё это время речь шла о простых типах. Сегодня мы обобщим пройденное ранее, а также познакомимся с новым материалом, который необходимо знать в рамках темы "Простые типы данных". Осмысленно подходить к выбору типов данных для используемых в программах переменных необходимо по разным причинам. Во-первых, имея под рукой многообразие доступных типов и умело ими распоряжаясь, можно сократить объём памяти, требуемый программе для работы. Экономию в 1-2 байта никто не заметит, но если речь идёт о больших объёмах данных, эти байты могут вылиться во вполне реальные мегабайты. Во-вторых, разумный выбор типов данных позволяет избежать некоторых ошибок, причём как со стороны программиста (на этапе создания программы), так со стороны пользователя (во время использования программы).

Простые типы данных - общее представление

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

  • целочисленные;
  • вещественные;
  • логические;
  • строковые (символьные).

Следует отметить, что все эти типы за исключением вещественного, упорядочены. Что это значит? А это значит, что в рамках данного типа значения расположены не в произвольном порядке, а в порядке возрастания. Зная об этом, в некоторых случаях можно исключить в своей программе лишний код. Поясню на примере, как именно упорядочены значения в этих типах данных:

Целочисленный тип - содержит числовые значения, целые числа. Числа упорядочены по возрастанию: ..., -2, -1, 0, 1, 2, 3, ...
Логический тип - содержит всего 2 значения - True, False, которые тоже упорядочены: False, True (следует из соответствия False - 0, True - 1).
Символьный тип - символы кодовой таблицы. Поскольку каждому символу соответствует свой код, то символы расположены в порядке увеличения кода. К примеру, буквы латинского алфавита A, B, C, D, ... идут в кодовой таблице именно так, т.к. чем дальше от начала алфавита, тем больший код имеет буква. То же самое касается и арабских чисел в кодовой таблице - они идут по порядку: 0, 1, 2, ..., 8, 9. Это позволяет делать такие сравнения, как, например 'A' < 'Z' (это истинно).

Из того, что перечисленных типы данных упорядочены, следует, что все значения образуют конечную последовательность. Это соответствует нашим представлениям о типах данных - все они имеют свои ограничения. К примеру, нет числового типа данных, который позволил бы хранить сколь угодно большое число. "Большие" типы есть, но "число" "бесконечность" они хранить не могут.

Функции и процедуры для порядковых типов данных

Существует несколько полезных функций и процедур, без использования которых, порой, сложно оперировать порядковыми типами данных:

Pred() - функция возвращает предыдущее значение для выражения, указанного в качестве единственного аргумента.

Примеры: Pred(5) = 4, Pred('E') = 'D', Pred(True) = False.

Succ() - функция, обратная для Pred() - возвращает следующее значение.

Примеры: Succ(5) = 6, Succ('E') = 'F', Succ(False) = True.

Ord() - возвращает порядковый номер значения в списке значений типа данных. С этой функцией мы уже встречались при работе со строками - с её помощью мы узнавали код символа.

Примеры: Ord('A') = 65, Ord(True) = 1.

Low() - возвращает минимальное значение указанного типа данных.

Примеры: Low(Byte) = 0, Low(Boolean) = False, Low(Char) = #0 (символ с кодом 0).

High() - возвращает максимальное значение указанного типа данных.

Примеры: High(Byte) = 255, High(Boolean) = True, High(Char) = #255 (в русской локали это символ "я").

Ну и ещё две процедуры, с которыми мы уже знакомы:

Dec() - уменьшает значение на единицу.

Inc() - увеличивает значение на единицу.

Не забывайте о втором необязательном параметре этих процедур.

Пользовательские типы данных

На основе порядковых типов данных программист может создать свои собственные типы - перечислимые и интервальные. Они будут рассмотрены ниже.

Целочисленные типы

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

Сначала рассмотрим беззнаковые типы, т.е. те, которые позволяют хранить только положительные числа и ноль:

Byte - значения 0..255 - занимает в памяти 1 байт.

Word - значения 0..65535 - 2 байта.

LongWord - значения 0..4294967295 - 4 байта.

Теперь типы со знаком (отрицательные числа записываются со знаком минус "-" впереди, неотрицательные могут записываться как со знаком "+", так и без него):

ShortInt - значения -128..127 - 1 байт.

SmallInt - значения -32768..32767 - 2 байта.

LongInt - значения -2147483648..2147483647 - 4 байта.

Int64 - значения -2^53..2^53-1 - 8 байт.

Существуют также 2 общих типа, которые находят своё отражение в вышеперечисленных. Рекомендуется использовать именно эти типы, т.к. компилятор "заточен" под них и создаёт более быстрый и эффективный код:

Integer - значения -2147483648..2147483647 - 4 байта.

Cardinal - значения 0..4294967295 - 4 байта.

Следует отметить, что целые числа могут быть представлены не только в десятичной, но и в шестнадцатеричной системе счисления, т.е. в виде $xxxxxxxx, где x - один из символов 0, 1, ..., 8, 9, A, B, ..., E, F. К примеру, все цвета (точнее, их коды) представляются именно в виде шестнадцатеричных чисел.

Логические типы

С логическими выражениями и с логическим типом данных мы уже знакомы - это тип Boolean, принимающий значения True и False. Помимо Boolean существуют следующие логические типы: ByteBool, WordBool и LongBool. Однако последние введены лишь для обспечения совместимости с другими языками и системами программирования. Использовать рекомендуется только тип Boolean. Логическое значение в памяти занимает 1 байт. На самом деле, конечно, достаточно и одного бита, но оперировать ячейками меньше байта, мы, к сожалению, не можем.

Символьные типы

Символьные типы обеспечивают хранение отдельных символов. Основной тип данных - Char, который содержит символы с кодами 0..255. Существуют ещё типы AnsiChar и WideChar. Тип AnsiChar эквивалентен типу Char, т.е. по сути это один и тот же тип. Занимает в памяти 1 байт. Для кодирования символов используется код ANSI (American National Standards Institute). Тип WideChar кодируется международным кодом Unicode и занимает в памяти 2 байта. Таблица Unicode включает символы практически всех языков мира.

Вещественные типы

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

Real (он же Double) - значения от 5.0x10^-324 до 1.7x10^308, точность - 15-16 цифр, занимает в памяти 8 байт.

Real48 - значения от 2.9x10^-39 до 1.7x10^38, точность - 11-12 цифр, 6 байт памяти.

Single - значения от 1.7x10^-45 до 3.4x10^38, точность - 7-8 цифр, 4 байта.

Extended - от 3.6x10^-4951 до 1.1x10^4932, точность - 19-20 цифр, 10 байт памяти.

Comp - от -2x10^63+1 до 2x10^63-1, точность - 19-20 цифр, 8 байт.

Currency - от -922337203685477.5808 до 922337203685477.5807, точность - 19-20 цифр, в памяти занимает 8 байт.

Как и в случае с целыми числами, перед вещественными числами может стоять знак "+" или "-".

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

Запись с фиксированной точкой представляет собой обычную запись, в которой целая и дробная части отделены друг от друга точкой/запятой.

Запись с плавающей точкой подразумевает запись порядка числа, который отделяется от самого числа буквой "E" (запись "e" тоже допустима). Например, запись 1.5e2 означает число 1.5 с порядком +2, т.е. это 1.5x10^2 = 150.

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

Перечислимые типы данных

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

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

Значения типа данных перечисляются через запятую, а весь этот набор заключается в круглые скобки. Описание типа должно производиться в специальном разделе раздела описаний - разделе описания типов. Этот раздел предваряется ключевым словом type. Т.е. запись идёт приблизительно так же, как и описание переменных или констант, только вместо var и const пишется type. Сам тип описывается следующим образом: название типа, далее знак равенства и далее само значение. В случае с перечислимым типом это будет набор возможных значений.

Примечание: практически все типы данных в Object Pascal принято называть с буквы "T" (сокращённо от "Type"). Это не закон языка - просто одно из правил хорошего тона. Зная, что "T***" - это тип, вы никогда не ошибётесь, в противном же случае название можно спутать, например, с названием переменной.

Допустим, мы хотии задать тип данных, определяющий один из месяцев года. Мы можем описать его так:

type
  TMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec);
 
var
  M: TMonth;
 
{...}
 
M:=Jun;

Обратите внимание, что после описания перечислимого типа в программе не может быть переменных, название которых совпадает с названием значений объявленного типа. В нашем примере не может быть переменных "Jan", "Feb" и т.д. При попытке присвоения переменной перечислимого типа значение, не указанное в списке, компилятор выдаст ошибку, поэтому ошибиться не представляется возможным.

Раздел type существует как в модуле всей формы (в этом разделе изначально описана сама форма: TForm1 = class(TForm) ... ), так и в любой подпрограмме. Область действия типа, соответственно, определяется местом в программе, в котором он описан.

Интервальные типы данных

Интервальные типы данных (также их называют ограниченными) получаются из имеющихся типов путём ограничения диапазона значений. Интервал задаётся двумя константами - начальной и конечной границей. При каждом присвоении значения переменной выполняется проверка соответствия нового значения указанному диапазону. Если значение не попадает в диапазон, выдаётся сообщение об ошибке. Во время выполнения программы задание недопустимого значения к ошибке не приводит, зато значение переменной может стать неверным.
Ограниченный тип данных можно создать только на основе простого упорядоченного типа. Значение второй константы (т.е. правой границы) должно быть больше значения первой (левой границы).
Ограниченные типы данных также описывают в разделе type. Формат записи похожий, только между константами-границами ставятся две точки.

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

type
  TDay = 1..31;
  TMonth = 1..12;
  TYear = 1900..2100;

Помните, что использование ограниченного типа данных не уменьшит объём занимаемой памяти. Это следует из того, что задание интервала - это всего лишь условное задание возможных значений из общего набора значений данного типа.

Заключение

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


Оцените данный урок (1 - плохо, ..., 5 - отлично): -1- -2- -3- -4- -5-. Комментарии в тексте письма приветствуются.
 

Статьи

Самые популярные статьи на сайте:

Как можно из Delphi отслеживать все события Windows?
Создание непрямоугольных форм в Delphi
Работа с приложениями Microsoft Office. Excel
Работа с реестром и INI-файлами в Delphi
Как прочитать ID3-Tag'и из MP3-файла?
Конвертирование графических форматов
Работа с приложениями Microsoft Office. Word
Написание инсталлятора на Delphi
Работа со строковыми типами данных
Работа с HTML-справкой в программах

Выравнивание компонентов

Автор: Вадим К

Если вы не можете сделать, чтобы ваша программа работала правильно, сделайте, чтобы она хотя бы выглядела нормально. Билл Гейтс ©

Вступление

Очень часто, когда поднимается вопрос о дизайне программы, программисты начинают изобретать решения, чтобы их программы нормально выглядели при разных размерах форм. Пишут тонны кода, которые не дают уменьшаться форме меньше положенного или вообще не дают изменять размер. Пишут код для того, чтобы при изменении размеров формы компоненты аккуратно заполняли её.

Но оказывается, что многие задачи в Delphi уже решены, надо только уметь использовать их. Рассмотрим свойства компонентов, которые так или иначе связаны с позиционированием компонентов относительно друг друга, а потом и несколько примеров для реализации типичных интерфейсов программ. Свойства будут рассмотрены в алфавитном порядке, так что при чтении, возможно, придется "прыгать".

Свойства

Align (выравнивание)

Свойство заставляет компонент менять некоторые из своих размеров и положение при изменении размеров компонента-родителя. Возможные значения:

alNone – значение по умолчанию, положение компонента зависит только от Left, Top, Width, Height.

alBottom – компонент "прижимается" к нижней части компонента-родителя. Занимает всю доступную ширину родителя. Работает только свойство Height. Если есть два компонента, один из которых имеет alBottom (или alTop), а второй alLeft (alRight), то первый компонент займёт максимальную высоту, а второй разместится в оставшейся части.

Два компонента: один - с Align=alRight, другой - Align=alBottom

alTop – компонент "прижимается" к верхней части компонента-родителя. Остальное – аналогично alBottom.

alLeft - компонент "прижимается" к левой части компонента-родителя. Занимает всю доступную высоту родителя. Работает только свойство Width.

alRight - компонент "прижимается" к правой части компонента-родителя. Аналогичен alLeft.

alClient – компонент занимает всё доступное пространство компонента-родителя. Если есть компоненты с другими выравниваниями, то вначале выравниваются они. Нельзя разместить на одном родителе два компонента с этим типом выравнивания.

AlignWithMargins (выравнивать с учетом отступов)

Указывает на то, что при использовании свойства Align, нужно учитывать свойство Margins. О нём - ниже.

Anchors

С английского названия этого свойства переводиться как "якорь". Позволяет закрепить края компонента к краям родителя таким образом, чтобы при изменении размеров родителей расстояние между заданными краями оставалось постоянным. Свойство представляет собой множество (set). В инспекторе объектов редактируется как 4 вложенных свойства типа Boolean. По умолчанию выставлены только akTop и akLeft.

Чтобы понять, как это свойство работает, сделайте такие два эксперимента. Поставьте на форму панель (можно кнопку), сделайте размеры такими, чтобы компонент занимал по площади где-то половину формы и был размещён в центре. Выставьте все четыре подсвойства в True. Запустите программу и изменяйте мышкой размеры формы, понаблюдайте эффект. Также попробуйте выставлять только некоторые подсвойства равными True.

Это свойство появилось с 4, то ли c 5 версии Delphi.

AutoSize (авторазмер)

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

Constraints (ограничивающее условие)

Иногда бывает, что нежелательно, чтобы компонент увеличивал (или уменьшал) свои размеры больше какой-то величины. Поэтому его размеры можно и нужно ограничить. Это свойство имеет четыре подсвойста: MaxHeight, MaxWidth, MinHeight и MinWidth, названия которых сами говорят за себя. Если например, в свойство MaxHeight формы вписать число 400, то увеличить высоту формы больше 400 не получится. Число 0 означает игнорирование данного ограничения. Понятное дело, что MaxHeight >= MinHeight, и аналогично с шириной. Если попытаться нарушить условие, то Delphi поправит за вами, уравняв их. Кстати, при этом наблюдается интересный эффект. Если MaxHeight = MinHeight, то у компонента (формы) нельзя изменить высоту. А ширину – можно. Развернуть в полный экран тоже не получится. Рекомендую поэкспериментировать с этим свойством. Хотя его применение и достаточно ограничено.

Height (высота)

Указывает высоту компонента в пикселях. Игнорируется при некоторых установках свойств Align и Anchors.

Left (слева)

Указывает на расстояние в пикселях от левого края компонента до левого края компонента-родителя (обычно это форма). Игнорируется при некоторых установках свойств Align и Anchors.

Margins (кромка, край; приграничная область)

Это свойство начинает проявлять себя только если AlignWithMargins = True. В таком случае можно указать, на сколько меньше должен занимать компонент при выравнивании. Вокруг компонента как бы создаётся отступ. Посмотрите на рисунок, где для нижней панели все 4 подсвойства выставлены по 10 и сравните с предыдущим рисунком.

Визуальные изменения при активировании свойства Margins

Padding (заполнение)

Это свойство чем-то подобно свойству Margins. Только действует для вложенных в данный родительский компонент дочерних компонент. То есть, выставив равным все 4 подсвойства по 10, а для вложенного компонента сделав Align = alClient, получим, что компонент не займёт всё пространство, а останется каемка в 10 пикселей. Смотрим на рисунок.

Применение свойства Padding

Естественно, выставлять все 4 подсвойства одинаковыми не обязательно. И как всегда, чтобы увидеть всю прелесть этого свойства, меняем размеры формы мышкой и наблюдаем.

Top (верх)

Указывает на расстояние в пикселях от верхнего края компонента до верхнего края компонента родителя (обычно это форма). Игнорируется при некоторых установках свойств Align и Anchors.

Width (ширина)

Указывает на ширину компонента в пикселях. Игнорируется при некоторых установках свойств Align и Anchors.

Примеры реальных приложений

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

Блокнот

Да, да, тот Блокнот, который есть в Windows.

Порядок действий:

  • Ставим на форму меню (TMainMenu). Заполняем.
  • Ставим на форму TStatusBar. Замечаем, что у него автоматически срабатывает Align=alBottom.
  • Ставим на форму TMemo. Выставляем Align=alClient.

Осталось только реализовать меню и приложение готово. Запустите и посмотрите, как при изменении размеров наше приложение ведёт себя аналогично Блокноту.

The Bat!

Теперь усложним задачку. Сымитируем интерфейс популярного почтовика. Кстати, он написан на Delphi.

  • Ставим на форму меню (TMainMenu), заполняем пунктами по вкусу (нужно создать хотя бы два-три пункта, иначе теряется весь эффект).
  • Ставим CoolBar.
  • Ставим на CoolBar два тулбар (TToolBar). Замечаем, как они выравниваются по верхней кромке.
  • Выбираем верхний тулбар и заполняем свойства Menu = MainMenu1, AutoSize = True, и, если у вас Delphi 2007, то и Drawingstyle="dsGradient."

Теперь у нас два меню, что ж, уберём лишнее – выделим форму и свойство Menu сделаем пустым.

  • Ставим на форму ImageList, кликаем дважды по нему и наполняем его иконками.
  • Выставим свойство Images у ToolBar2 равным ImageList. Замечаем, как у добавленных кнопок появились картинки. Они все одинаковы, поэтому кликаем по каждой и с помощью свойства ImageIndex выбираем понравившиеся. В конце выставляем свойство AutoSize = True для этого тулбара.
  • Для CoolBar также выставляем AutoSize = True. Замечаем, как всё "уляглось".
  • Ставим на форму TStatusBar.
  • Ставим на форму TreeView, выставляем Align = alLeft. Ширину делаем где-то на треть формы.
  • Ставим на форму компонент TSplitter (вкладка Additional). Внимательно - кликайте именно по форме, иначе он может выровняться по самому левому краю формы – в таком случае возьмите и перетащите его на место. Он автоматом выставляет Align = alLeft.
  • На оставшееся пространство ставим панель, и выставляем Align = alClient.
  • Теперь на панель ставим ListView, выставляем свойства style="vsReport," Align = alTop. С помощью свойства Columns добавляем колонки.
  • Ставим на панель TSplitter. Выставляем Align = alTop. Компонент автоматом примет горизонтальное положение.
  • В оставшуюся часть панели ставим компонент TWebBrowser или TRichEdit (Чем вы решите отображать содержимое письма). Выставляем Align = alClient.

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

Программа с интерфейсом как у The Bat!

Особенности – компоненты автоматически подгоняют размер при изменении размеров формы, границы между TreeView, ListView и просмотрщиком писем можно менять при запущенной программе. И самая главная особенность - достаточно профессиональный интерфейс мы получаем стандартными компонентами и без единой строчки кода!

Интересные заметки

1. Если один или несколько компонентов полностью заполняют своего родителя, то выделить мышкой самого родителя невозможно. И для многих это трагедия – они не знают, что делать. Можно, конечно, в инспекторе объектов в выпадающем списке поискать подходящий, но обычно и имени нужного компонента мы не помним... А всё просто. Выделяем любой компонент, который лежит на заданном компоненте, и жмём Esc. И, вуаля, выделен компонент-родитель! Ещё одно нажатие - и выделение уходит к родителю родителя. Это будет продолжаться до тех пор, пока выделение не перейдёт к форме. В примере почтовика, можно, нажав три раза Esc, гарантировано дойти до формы.

2. Если случайно компонент поставили не на того родителя, то перетянуть мышкой его уже нельзя. Удалять и ставить по-новому? НЕТ! На помощь приходит клавиатура. Выделяем нужный компонент (или несколько, просто зажав Shift). Потом жмём Ctrl+X (вырезать). Кликаем по нужному компоненту-родителю и жмём Ctrl+V (вставить). Более того, таким образом можно переносить компоненты между формами и даже проектами! А можно "вставить" не на форму, а в Блокнот. Присмотревшись, можно понять, как в виде текста представлен компонент, и даже подредактировать его. А потом и вставить на другую форму.

3. Если несколько компонентов находятся на форме, то их можно выделить, просто "охватив мышкой". То есть, провести по диагонали так, что бы в полученный прямоугольник попали нужные компоненты. А вот если компоненты находятся на панели, то так уже не получится – мы просто перемещаем панель. Решение простое. Просто нажмите Ctrl на клавиатуре и выделяйте как обычно.

4. Поставив много компонент на форму, обнаруживаем, что некоторые компоненты не хотят быть над другими или под ними. Решается просто – выделяем компонент, кликаем правой кнопкой мыши. В меню Control есть два пункта Send to Back (отправить вглубь) и Bring to front (ко мне).

5. В случае наличия на форме большого количества Edit'ов, многие пользователи любят переключаться между ними с помощью Tab. Но как только в своей программе попробуешь сделать это – курсор прыгает между ними, как ему вздумается. Кликаем правой кнопкой, в меню TabOrder выставляем стрелочками нужный порядок. Пусть пользователи радуются.

Заключение

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

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

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

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

Название
Описание
Раздел
Объём
Ссылки
EkszBox-VCL
Набор красивых элементов управления с возможностью изменения стиля и поддержкой различных эффектов. В состав входят: ImgProgressBar, ImgTrackBar, ImgCheckBox, ImgButton, ImgForm, ImgLED, GradientBar, FadeImage, DirBrowse.
1.67 Мб
TSMMAPIMail
Компонент позволяет создавать e-mail сообщения и отправлять их с использованием MAPI. Нет ограничений на количество получателей сообщения и количество прикреплённых файлов.
4 Кб
HTML Viewer Components
Набор из HTML компонентов, содержащий ThtmlViewer, TFrameViewer и TFrameBrowser. Все 3 компонента позволят отображать HTML документы.
ThtmlViewer - основной компонент. Отображает единственный документ без фреймов. Этот компонент является базовым для двух остальных.
TFrameViewer - отображает как отдельные документы, так и фреймы. Рассчитан в основном на отображение локальных файлов.
TFrameBrowser - тоже отображает и отдельные документы, и фреймы, но, тем не менее, рассчитан для отображения интернет-страниц, загружаемых по сетевым протоколам по заданным URL.
Версия 9.x этих компонент поддерживает большую часть элементов HTML 3.2 и многих элементов HTML 4. Поддерживаются многие свойства таблиц стилей CSS.
1.21 Мб
Кривая Гильберта

Построение кривой Гильберта на Canvas с использованием процедуры LineTo.

5 Кб

Парные картинки
Пример создания игры "Memories" на Delphi, где игроку требуется найти парные картинки на поле 4x4.

124 Кб

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

6 Кб

Тесты
Программа для организации тестов с вариантами ответа и возможностью подгрузки картинок в текст вопроса.

149 Кб

 
Всего новых файлов: 7  
3.17 Мб
 
 

Юмор

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

Программа "Ёлочка"

program Елочка;
Begin
Лес.елочка.create();
While not Лес.елочка.dead do
Begin
лес.елочка.age := лес.елочка.age+1;
if зима or лето then
begin
лес.елочка.plain := true;
лес.елочка.color := cl_green;
end;
метель.filename:='D:\Music\NSYNC - Bye Bye Bye.mp3';
метель.open;
sleep(1000);
метель.play;
мороз.укутать(лес.елочка);
GetMessage(H, лес.елочка.handle, 0, 0);
if h.uint = wm_замерзла then
dead := true;
end;
лес.заяц.create;
лес.заяц.трусливый := true;
лес.заяц.color := cl_gray;
x := лес.елочка.left;
y := лес.елочка.top;
While x
Begin
лес.заяц.left := x;
inc(x);
лес.заяц.top := y + round( abs(sin(x*pi/180)*10) );
end;
Winexec('wolf3d.exe /evil',0);
лес.елочка.cuttoclipbord;
Праздник.pastefromclipboard;
Праздник.елочка.skin.loadfromfile('нарядная.jpg');
For i:=1 to SizeOf(Праздник.елочка.радость) do
Прадзник.Дети..Настроение + Праздник.елочка.радость;
End.

Источник: bayanov.net

:))

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




Ведущий рассылки: Ерёмин Андрей


В избранное