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

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

  Все выпуски  

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


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

Программирование на Delphi. Выпуск №20: 12.02.05.


Приветствую Вас, уважаемые читатели!

Количество подписчиков: 1864.

Не забывайте посещать наш форум.

Top-10 Readers:

Место
Имя
Кол-во баллов
Место
Имя
Кол-во баллов
1.
157 баллов
6.
50 баллов
2.
137 баллов
7.
38 баллов
3.
117 баллов
8.

Den

36 баллов
4.
93 балла
9.
33 балла
5.
62 балла
10.
30 баллов

Правила нашей рассылки:
1. Не присылайте ответов на вопросы вроде "да я не знаю" или "да/нет". Такие ответы не публикуются.
2. Вопросы, не касающиеся Delphi, не принимаются (для этого существуют другие рассылки).
3. Запрещено присылать вложенные файлы, размером более 100 Кб, без предварительной связи с администратором.
4. Не изменяйте тем присылаемых писем. Письма с "неправильными" темами не публикуются! Используйте текстовый формат писем.


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

69. Народ, кто подскажет, как сделать шахматную доску и как реализовать перемещение фигур (как в других шахматных программах)? Если не трудно, приведите пример. [Ответить].

70. Всего три вопроса:
1. Пусть у нас есть изображение с глубиной цвета - 8 бит на пиксель т.е. всего 256 цветов. Цвет для такого изображения хранится в палитре по некоторому индексу (0-255), который как я понимаю можно получить используя функцию scanline. А вопрос состоит в том, чтобы получить яркость каждого конкретного пикселя. (кроме перевода в режим 24 бит).
2. Как работать (а точнее как получить доступ к цветам пикселя) для изображений с цветовым пространством CMYK и YCbCr. Если можно использовать scanline, то преведите пожалуйста пример.
3. Существуют ли CMYK и YCbCr изображения с глубиной цвета 1,4,8 бит на пиксель вообще?
Спасибо. [Ответить].

71. Кто знает, есть ли компонент или что-нибудь для работы с SMS? Где можно поискать информацию относительно этой темы? Интересует именно отправка SMS из Инета а не через мобилу с датакабелем. [Ответить].

72. Подскажите, существует ли возможность перенесения программы написанной на Delphi с ПК на КПК и что для этого нужно и по возможности где это можно достать? [Ответить].

73. Скажите, возможно ли программно добавлять на форму компоненты? Если можно, то как? [Ответить].


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

5. (Стиль Windows XP). [Отвечает: Igor]: Небольшое дополнение к ответу VeroLom'а:
Чтобы прицепить manifest в виде ресурса создайте файл manifest.xml с текстом манифеста и файл manifest.rc с одной строчкой:
1 24 LOADONCALL manifest.xml
Все, скомпилируйте manifest.rc с помощью brcc32.exe и получившейся manifest.res присоедините к приложению, как и любой другой ресурс: {$R manifest.res}

67. (Документация по работе с реестром). [Отвечает: Iron Monk]: Очень полезные ссылки по всем вопросам, в том числе и по реестру.
http://www.delphiworld.narod.ru
http://www.sources.ru/delphi/index.html.

[Отвечает: Ramon]: У Фленова Михаила есть отличная книженция "Библия Delphi". По-моему она еще лежит e-bookой на www.cydsoft.com. В любом случае на этом сайте море полезной инфы и не только по реестру.

66. (Преобразование 24-битной картинки в 16-битную). [Отвечает: Iron Monk]:

procedure TForm1.Button1Click(Sender: TObject);
begin
// TPixelFormat = (pf1bit, pf8bit, pf16bit,pf24bit, pf32bit, pfCustom)
Image1.Picture.Bitmap.PixelFormat:=pf16bit;
Image1.Picture.Bitmap.SaveToFile('C:\MyBitmap.bmp');
end;
end.

65. (События OnMouseWheel). [Отвечает: Ramon]: У некоторых серьезных вещей (типа Form) есть события OnMouseWheel, OnMouseWheelUp, OnMouseWheelDown. OnMouseWheel - возникает когда колесико движется в любом направлении. В параметрах обработчика есть такая вещь, как WheelDelta: Integer. Это число характеризует движение колеса. Если отрицательное - колесо повернуто вниз, если положительное - вверх (а вообще это типа угол поворота колеса). OnMouseWheelUp - возникает тогда и только тогда, когда колесо движется вверх. OnMouseWheelDown - возникает, когда колесо повернуто, соответственно вниз. У всех трех обработчиков есть (совершенно бесполезный, на мой взгляд) параметр MousePos: TPoint - координаты курсора, Handled: Boolean и Shift: TShiftState, как в OnKeyDown. Так что для идентификации вхелинья колеса есть несколько способов ;)

64. (Верхние и нижние индексы в исходнике). [Отвечает: Садовников Владимир]: Этого нельзя сделать, ибо это противоречит синтаксису языка. Редактор языков - это не Word-подобный редактор.


Вы также можете ответить на предыдущие вопросы. Поскольку на них уже ответили как минимум раз, они больше не публикуются в рассылке. Но если вы можете что-то добавить к ответам других, пожалуйста, отвечайте - ответы будут опубликованы. Найти предыдущие вопросы вы можете на нашем сайте: http://www.delphi-faq.fatal.ru/ или в спец-выпусках рассылки.


Статьи по Delphi.

Delphi 4: Автоматизация приложений MS® Office® для эффективного анализа результатов

    Содержание:

  • Глава 1: Работа с MS Excel.
    • Часть 1: Создание, отображение и удаление экземпляра Excel.
    • Часть 2: Лучшее решение - шаблоны.
    • Часть 3: Создание или открытие книги.
    • Часть 4: Работа с листами и ячейками.
    • Часть 5: Передача данных разного типа.
    • Часть 6: Передача данных используя буфер обмена и DDE.
    • Часть 7: Пример обмена данными с Excel используя VCL и OLE.
  • Глава 2: Работа с MS Word.
    • Часть 1: Управление Word-ом через OLE.
    • Часть 2: Подсчет статистики обычного текста, сносок и колонтитулов в документах.
    • Часть 3: Открытие документа используя VCL.
    • Часть 4: Работа с таблицами.
    • Часть 5: Работа с текстом, рисунками и списками.

Глава 1. Работа с MS Excel.

Часть 3. Создание или открытие книги.

Евгений Старостин.

В качестве примера я беру проект из предыдущей моей статьи и стану его понемногу расширять, отвечая на вопросы, появившиеся у специалистов разного профиля и кругозора. Эти вопросы получены мною из двух "источников": как реакция на мою статью и, извините, из переписки по XL Report Support. Эти две вещи уж очень сильно пересекаются, поэтому я и обращаюсь к обоим источникам моего вдохновения. Я не буду последователен в своих рассуждениях, местами буду писать подробно, местами - кратко. Попросту, я опишу некоторые часто встречающиеся проблемы и решения этих проблем.

И еще! Я решил совсем опустить в своем пространном (как обычно) повествовании тонкости работы с Excel в Delphi 5.0, так как считаю, что работа с импортированной библиотекой типов принципиально одинакова и в версии 4, и в версии 5. Различен, разве что, только уровень импорта этой самой библиотеки. К тому же, я уже полностью "переехал" на Excel 2000, поэтому тестирую весь код, который приведен здесь, именно в нем. Итак, поехали.


Создание или открытие книги.

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

property IWorkbook: Excel8TLB._Workbook read FIWorkbook;

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

 if Assigned(IXLSApp) and (not Assigned(IWorkbook) ) then
    FIWorkbook := IXLSApp.Workbooks.Add(EmptyParam, 0);
         

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

Коллекция Workbooks содержит все открытые книги и предоставляет возможность кое-как управлять всем этим.

Боже, как убоги коллекции от Microsoft, и особенно поиск в них! Я отклонюсь, но это надо видеть. Вот пример поиска книги с заданным именем, приведенный как совет в MSDN Office Developer.

 Public Function SheetExists(strSearchFor As String) As Boolean
 SheetExists = False
 For Each sht In ThisWorkbook.Worksheets
     If sht.Name = strSearchFor Then
         SheetExists = True
     End If
 Next sht
 End Function
         

Это вам не IndexOf писать. Сами ищите! А я так иделаю. Но, далее...

Метод Add этой коллекции (читай, метод интерфейса) позволяет добавить книгу к этой коллекции, пустую либо по шаблону. Первый параметр этого метода, Template (из справки по Excel VBA), может принимать имя файла с путем.

Поэтому, выполнив код

 if Assigned(IXLSApp) and (not Assigned(IWorkbook) ) then
    FIWorkbook := IXLSApp.Workbooks.Add(ExtractFilePath(ParamStr(0)) + 'Test.xls', 0);
         

вы получите книгу, идентичную файлу "Test.xls" с именем Test1.xls. Именно этим способом я создаю все свои отчеты, так как создаю их по заранее разработанным шаблонам. Естественно, что это шаблоны XL Report.

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

 if Assigned(IXLSApp) and (not Assigned(IWorkbook) ) then
    FIWorkbook := IXLSApp.Workbooks.Open(ExtractFilePath(ParamStr(0)) + "Test.xls', EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, false, 0);
         

Понимаю, что в душе нормального программиста такой код вызовет отвращение. Как-то я даже получил гневное письмо о собственной ненормальности из-за того, что использую ранее связывание и кучу EmptyParam. Впрочем, я не сильно агрессивный человек (правда, только в переписке), и отвечать не стал. В конечном итоге, раннее связывание дает мне немного преимуществ, но я за него. Я не могу помнить все методы и их параметры из Excel Type Library, поэтому получаю их (только при раннем связывании, естественно) из подсказок редактора Delphi - продуманная вещь этот редактор. А чтобы не мучаться с написанием такого количества EmptyParam, можно написать и так:

 if Assigned(IXLSApp) and (not Assigned(IWorkbook)) then
   IDispatch(FIWorkbook) := OLEVariant(IXLSApp.Workbooks).Open(
     FileName := ExtractFilePath(ParamStr(0)) + 'Test.xls');
         

Но, мы отклонились. Что же стоит за таким количеством параметров по умолчанию в методе Open? Да, много чего. Из этого "громадья" я использую лишь несколько вещей. Их я и опишу, а заинтересовавшихся остальными отсылаю к справке по Excel VBA. Вот объявление этого метода в импортированной библиотеке типов:

 function Open(const Filename: WideString; UpdateLinks: OleVariant; ReadOnly: OleVariant;
               Format: OleVariant; Password: OleVariant; WriteResPassword: OleVariant; 
               IgnoreReadOnlyRecommended: OleVariant; Origin: OleVariant; 
               Delimiter: OleVariant; Editable: OleVariant; Notify: OleVariant; 
               Converter: OleVariant; AddToMru: OleVariant; lcid: Integer): Workbook; safecall;
         

В FileName необходимо передать имя открываемого файла, желательно указав путь его нахождения. Иначе, этот файл Excel будет искать в каталоге по умолчанию. Чтобы файл был запомнен в списке последних открытых файлов, в AddToMru можно передать true. Иногда я знаю, что файл рекомендован только для чтения (не путать с "парольной" защитой книги). Тогда при открытии выдается соответствующее сообщение. Чтобы игнорировать его, можно передать в IgnoreReadOnlyRecommended true. Вот, пожалуй, и все мои скудные знания об этом методе. Впрочем, с помощью его мне приходилось открывать и файлы текстовых форматов с разделителями. Но тогда я обращался к чудесному "пишущему" плейеру VBA и записывал с его помощью макросы, затем правил их по необходимости и все отлично получалось. Этим же способом разрешать "всяческие" тонкие вопросы рекомендую и вам.

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

 procedure TForm1.btnCreateBookClick(Sender: TObject); 
 var FullFileName: string;
 begin
   FullFileName := ExtractFilePath(ParamStr(0)) + 'Test.xls';
   if Assigned(IXLSApp) and (not Assigned(IWorkbook)) then
     try
       case rgWhatCreate.ItemIndex of
       // По шаблону
       0: FIWorkbook := IXLSApp.Workbooks.Add(FullFileName, 0);
       // Просто откроем
       1: FIWorkbook := IXLSApp.Workbooks.Open(FullFileName,
            EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
            EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, false, 0);
       // Пустая книга
       2: FIWorkbook := IXLSApp.Workbooks.Add(EmptyParam, 0);
       end;
     except
       raise Exception.Create('Не могу создать книгу!');
     end;
 end;
         

Далее во всех примерах я подразумеваю, что вы всякий раз будете создавать новую книгу по шаблону с помощь кнопки "Create workbook". Книга-шаблон названа как прежде Test.xls и включена в проект. Все остальные примеры опираются именно на эту книгу и ее листы. В этой книге я подготовил кое-какие данные и поименованные области для последующих примеров работы с Excel. Для каждого примера кода я буду добавлять кнопку и, возможно, RadioGroup к ней с возможностью выбора варианта работы. Не судите меня строго за то, что главная и единственная форма проекта-примера получится громоздкой и некрасивой. Не это здесь главное. Итак, всегда создавайте по кнопке книгу. Далее нажимайте кнопку, на которую указывает конкретный пример кода, и наблюдайте. Буду рад, если кто-то из читателей создаст более приемлемый демонстрационный проект для этой статьи.

1. Скриншот из 2-ой статьи: Открыть.

2. 1-ая часть цикла статей по Excel: Открыть.

3. 2-ая часть цикла статей по Excel: Открыть.

4. 3-ая часть цикла статей по Excel: Открыть.

4. Демо-программа-1 к статьям: Скачать.


Присылайте свои статьи по адресу delphi-faq@list.ru с темой 'Clause' (без кавычек), и они будут опубликованы в ближайших выпусках рассылки. Большая просьба: статью оформляйте в -txt или -doc формате и используйте -zip или -rar сжатие (без самораспаковки).


Документация.

В данном разделе публикуются различные ссылки, причём не только по Delphi но и по OpenGL, WinAPI, DirectX и т.д. (они могут быть на других языках, например, на Си). Присылайте свои ссылки на документацию по программированию.

http://www.openwatcom.org
ftp://www.openwatcom.org
Проект OpenSource-компилятора языка Си++, достойный внимания. Всё содержимое доступно по ftp-протоколу. Можно найти много документации по современным аппаратным платформам.
[Ссылки прислал: Садовников Владимир].



Кладовая.

Свои "добавки" присылайте сюда. Только большая просьба: не присылайте файлы сразу, сначала описания и объёмы.

MxCalendar v1.21 - Очень симпатичный календарик для ваших приложений. (ZIP, 338 Кб).

 


Дружественные сайты.

Здесь представлены ссылки на дружественные сайты нашего портала. Если вы тоже хотите стать нашим другом, разместите баннер на главной странице своего сайта. Подробнее о том, как стать другом, можно прочитать здесь: http://www.delphi-faq.fatal.ru/banner.htm, а узнать о всех наших друзьях - на странице http://www.delphi-faq.fatal.ru/friends.htm

http://infomania2004.webhost.ru/ - Этот сайт создан для того, чтобы вы могли получить интересующую вас информацию с минимальными затратами сил и времени. Если вы не нашли здесь нужной информации, вы можете оставить заявку на ее поиск. Как только информация будет найдена, она появится на сайте, а вам сообщат об этом.
http://www.basic.webhost.ru/ - Программирование на языках Basic и Visial Basic. На сайте Вы найдете версии Бейсик, игры, вопросы и ответы, статьи, а также многое другое...
http://www.sashook.nm.ru/ - Игры, флешки, обои, компьютерные приколы.


Юмор.

Василий Иванович диктует Петьке, сидящему за телеграфом:
- Москва запятая Кремль точка. Отбили реку у белых вскл знк завтра проводим соревнования по плаванию тчк. Петька , я сказал тчк, а не двоеточие со скобкой!

***

Когда на одной персоналке запустили TI (переворачивалка экрана), а девушки об этом не знали и спросили преподавателя, он (доцент! кафедры вычислительной техники) высказал предположение:
"Может вы дискету не той стороной вставили?!"

***

Пророчество Конца Света:
"И Солнце в тот день не взойдет, и звезды с неба упадут... и будет на чистом синем небе белыми буквами написано:
"Обнаружена ошибка
Возможные действия:
Hажмите любую клавишу для продолжения, или Hажмите CTRL+ALT+DEL для пересотворения мира, в этом случае все живое на земле будет уничтожено"

***

Неохотно и несмело
Запускается мастдай.
Глюк в машине Пентагона -
И пополнился наш рай.

***

Люблю я глюк в ядре мастдая,
Когда он в regedit войдёт,
Как бы резвяся и играя,
Зависнет, а потом умрёт.


Присылайте свои "компьютерные" анекдоты по этой ссылке: Delphi-FAQ@list.ru и они обязательно будут опубликованы! Нецензурные анекдоты не публикуются!

Товарищи программисты! Проявляйте свою активность. Давайте помогать друг другу!
Если вы не нашли ответа на свой вопрос, не отчаивайтесь! Ведь количество подписчиков постоянно растёт и, наверняка, найдётся тот человек, который поможет вам!
На сегодня всё. До встречи через неделю!
Сайт рассылки: http://www.delphi-faq.fatal.ru/ E-mail: Delphi-FAQ@list.ru
Страница рассылки: http://subscribe.ru/catalog/comp.soft.prog.delphifaq

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphifaq
Отписаться

В избранное