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

RusFAQ.ru: Программирование на Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 451
от 22.04.2006, 14:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 312, Экспертов: 66
В номере:Вопросов: 3, Ответов: 8


Вопрос № 40470: Уважаемые эксперты! У меня такая возникает ошибка при загрузки формы из dll, при чем если загружать вторую форму из тойже dll то ок, а первую ни в какую и выдает ошибку: class EOleSysError with message "Не был произведен вызов CoInitialize"...
Вопрос № 40514: Здравствуйте! Необходимо отсортировать StringGrid по двум столбцам Col1 и Col2 (в них хранятся даные целого типа) таким образом, что если если значения в столбце Col1 совподают, тогда сравнивать по второму. Как, в этом случае, сортировать? Пожалу...
Вопрос № 40518: Здравствуйте уважаемые Эксперты! Вопрос теоретически-практический :) Допустим имеется функция (см. приложение) Нужно ли в начале тела функции ставить result:=true ? И есть ли разница в написании If 111 then... и If (111=T...

Вопрос № 40.470
Уважаемые эксперты! У меня такая возникает ошибка при загрузки формы из dll, при чем если загружать вторую форму из тойже dll то ок, а первую ни в какую и выдает ошибку: class EOleSysError with message "Не был произведен вызов CoInitialize"! В чем ошибка? Форма 1 у мени рабочая! Заранее спасибо!
И еще вопрос: Как можно передать из dll обработанные данные в учу файл или другю dll?
Отправлен: 16.04.2006, 20:04
Вопрос задал: Грицай Алексей Юрьевич (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: sir henry
Здравствуйте, Грицай Алексей Юрьевич!
Видимо Вы используете форму с OLE объектом. По крайней мере это исходит из ошибке. Перед тем, как этот объект использовать, нербходимо сначала инициализировать COM-библиотеку с помощью функции CoInitialize().
Опять же, предположительно, рабочая форма у Вас только в Дельфи, т.к. при этом в код заносятся автоматом все необходимые функции из VCL. В DLL'ке этих функций нет, поэтому Вам инициализацию COM нужно запустить вручную до вызова формы.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 17.04.2006, 06:56
Оценка за ответ: 4


Вопрос № 40.514
Здравствуйте! Необходимо отсортировать StringGrid по двум столбцам Col1 и Col2 (в них хранятся даные целого типа) таким образом, что если если значения в столбце Col1 совподают, тогда сравнивать по второму.
Как, в этом случае, сортировать? Пожалуйста, если можно, код программы.
Отправлен: 17.04.2006, 10:51
Вопрос задал: 007Makc (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Latent
Здравствуйте, 007Makc!
посмотрите здесь: там показана сортировка с целыми значениями.
http://www.delphiworld.narod.ru/base/stringgrid_int_sort.html

---------
- Нет ничего невозможного -
Ответ отправил: Latent (статус: 1-ый класс)
Ответ отправлен: 17.04.2006, 13:19

Отвечает: Igp
Здравствуйте, 007Makc!
Вот событие onCompare компонента TListView в одной из моих программ (3 столбика):

Приложение:

Ответ отправил: Igp (статус: 1-ый класс)
Ответ отправлен: 17.04.2006, 14:29


Вопрос № 40.518
Здравствуйте уважаемые Эксперты!
Вопрос теоретически-практический :)
Допустим имеется функция (см. приложение)
Нужно ли в начале тела функции ставить result:=true ?
И есть ли разница в написании
If 111 then...
и
If (111=True) Then...
Заранее благодарен за ответы.

Приложение:

Отправлен: 17.04.2006, 11:58
Вопрос задал: Дмитрий Александрович (статус: 1-ый класс)
Всего ответов: 5
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Ерёмин Андрей
Здравствуйте, Дмитрий Александрович!
Result:=True лучше писать, ибо значение по умолчанию может быть не определено - и тогда функция может потерять всякий смысл. Писать условие в скобках или без них - абсолютно никакой разницы, только +2 байта в pas-файл :-)
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 17.04.2006, 12:06
Оценка за ответ: 4
Комментарий оценки:
Спасибо но вопрос не о скобках

Отвечает: sir henry
Здравствуйте, Дмитрий Александрович!
1. У Вас в обязательном порядке должен присутствовать ответ функцции по умолчанию, посколько функция ДОЛЖНА возвращать какое-то значение. Лучше всего поставить Result:=True в самом начале, тогда у Вас будет гарантия, что если условие if по каким либо причинам не пройдет, то у Вас всегда будет тот ответ, который Вы ожидаете.
2. С технической стороны - никакой разницы, т.к. в условии должен быть логический результат, а он у Вас будет как в том, так и в другом случае. Однако Ваша задача при этом, проследить, чтобы логический результат соответствовал логике программы.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 17.04.2006, 12:08
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Kazakh
Здравствуйте, Дмитрий Александрович!
Добавлю:
>>Нужно ли в начале тела функции ставить result:=true ?
можно писать и так имя_функции:=true;
>>Приложение:
>> If Form1.dbedit1.text='2' then Result:=False

Проще и понятней и меньше кода, если писать так:
Result:=Form1.dbedit1.text='2';
Тогда в Result железно будет значение или True или False.

Да, ещё, имя функции должно начинаться с латинской буквы :-)

---------
Если собеседник затрудняется ответить, значит, вопрос поставлен правильно.
Ответ отправил: Kazakh (статус: 6-ой класс)
Ответ отправлен: 17.04.2006, 12:38
Оценка за ответ: 5
Комментарий оценки:
Спасибо! Действительно так понятнее.

Отвечает: Полховский Александр Владимирович
Здравствуйте, Дмитрий Александрович!
Я всё же добавлю.
Result:=true писать не обязательно, если в конце функции Вы обязательно присвоите ей какое-либо значение (будь то в конструкции if-then-else или в любой другой части кода). В вашем случае необходимо писать:
If Form1.dbedit1.text='2'
then Result:=False
else Result:=True;
// ну или как написал эксперт Kazakh
Иначе при несовпадении текста функция будет иметь непредсказуемый результат. А так она получит true.
Не совсем в тему, но полезно: Result также используют вместо имени функции (a111, напирмер), чтобы можно было использовать текущее временное значение функции для каких-то рассчётов. Например:

a111:=result*2;// тут мы удваиваем результат функции
Нельзя в подобных случаях (т.е. когда нам нужен текущий результат функции) использовать имя функции в правой части выражения, ибо это будет рекурсивный вызов (вызов функции из самой себя):
a111:=2*a11;//В этом случае функция запустится рекурсивно и пойдёт ещё один цикл расчётов

Про скобки: разницы нет, за исключением одного момента:
при использовании if a111 then... проверяется только значение функции, а при использовании if a111=true then... проверяется ещё и совпадение значения функции с выражением справа, то есть, выполняется не одно сравнение, а 2. Но это незначительно.
---------
Спасём нашу хрупкую планету !
Ответ отправил: Полховский Александр Владимирович (статус: Практикант)
Ответ отправлен: 17.04.2006, 19:52
Оценка за ответ: 5
Комментарий оценки:
Спасибо!

Отвечает: Denisss

Здравствуйте, Дмитрий Александрович!

1. В Вашем случае Result:= True поставить нужно, иначе функция может вернуть неопределенное значение (это может закончиться либо некорректной работой приложения, либо вызовом различных ошибок).
Но всегда есть способ лучше:
Выражение (Form1.dbEdit1.Text = '2') имеет тип Boolean
Переменная Result имеет тип Boolean,
тогда спрашивается: зачем писать 3-и строчки, когда можно все уместить в одну?:

  Result:= (Form1.dbEdit1.Text = '2');

2. Разница есть. Но Delphi интерпретирует обе записи одинаково.
После If должно идти условие - выражение типа Boolean. Функция 111 у Вас уже имеет тип Boolean, тогда сравнивая ее с True, Вы получаете тот же тип Boolean и тоже значение, что и 111. Т.е. правильнее будет писать if 111 then ...., а то можно и так написать:
if (((111 = True) = True) = True) then ...
и все равно программа будет одинаково работать.

Удачи!
Ответ отправил: Denisss (статус: Специалист)
Ответ отправлен: 19.04.2006, 01:03
Оценка за ответ: 5
Комментарий оценки:
Спасибо


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.30 (beta) от 09.04.2006
Яндекс Rambler's Top100

В избранное