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

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


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

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

Выпуск № 501
от 13.06.2006, 07:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 351, Экспертов: 67
В номере:Вопросов: 10, Ответов: 22


Вопрос № 45482: Здравствуйте! У меня есть файл с расширением *.tps, те кто его мне передал сказали, что он создан в СУБД Clarion 6.1. Вопрос: нет ли такого компонента Deiphi который мог бы открывать этот файл или лучше переконвертировать его?...
Вопрос № 45489: Добрый день, уважаемые эксперты! У меня возник вопрос... Помогите решить его... Я написал утилитку, которая конвертит из OEM кодировки в ASCII и обратно. На форме расположены такие компоненты Table, DBGrid, DataSource. Если конвертировать...
Вопрос № 45492: как измерить частоту подаваемого на com-порт сигнала ?...
Вопрос № 45496: Здравствуйте! Писал процедуру, которая параметром принимает имя формы, а потом понял, что процедуру не имеет смысла вызывать из другой формы. Подскажите, пожалуйста, как обратиться к текущей форме, независимо от её имени? Заранее спасибо!...
Вопрос № 45507: Здравствуйте, уважаемые эксперты! Дополнение к вопросу №45368. Подскажите, пожалуйста, как при таком обращении к компонентам получить доступ к самому значению width, т.е назначить ему какое-нибудь значение? Заранее благодарен!...
Вопрос № 45517: Здравствуйте, уважаемые эксперты! Объясните, пожалуйста, смысл конструкции: TWinControl(Form1.FindComponent(Form.Components[i].Name)).Value Заранее благодарен!...
Вопрос № 45532: Здравствуйте! Мне нужно, чтобы пользователь не мог сделать форму меньше определенного значения. Я использую обработчик OnResize формы и в нем, если ширина формы меньше опред. значения, устанавливаю ей нужную ширину. При этом наблюдается довольно некр...
Вопрос № 45562: Как говорится чем дальше в лес тем ели гуще :) Так вот вопрос: как можно правильно организовывать очереди? Имеется следующее: Приходят пакеты. Надо искать между ними "ответы" - и ложить их в буфер, и искать среди них же (пакетов...
Вопрос № 45585: Здравствуйте! Скажите, пожалуйста, есть ли необходимость очищять динамический массив(список) при закрытии приложения или это происходит автоматически? Заранее благодарен!...
Вопрос № 45587: Здравствуйте. Имеется html-страница (фрагмент страницы - в приложении). Мой вопрос: как с помощью TIdHTTP (или чего-либо еще) взять только этот фрагмент, не закачивая (с помощью метода .Get) всю страницу целиком?...

Вопрос № 45.482
Здравствуйте!
У меня есть файл с расширением *.tps, те кто его мне передал сказали, что он создан в СУБД Clarion 6.1. Вопрос: нет ли такого компонента Deiphi который мог бы открывать этот файл или лучше переконвертировать его?
Отправлен: 07.06.2006, 09:03
Вопрос задал: KuchumHan (статус: Студент)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: sir henry
Здравствуйте, KuchumHan!
В Дельфи такого компонента нет и никогда не было. Единственные компоненты в Дельфи, которые напрямую работают с БД, это компоненты InterBase. К любым другим форматам БД Дельфи подключается через специального посредника - BDE, ADO, dbExpress, которым, в свою очередь, нужен драйвер для общения с тем форматом БД, который Вы выбрали.
И я Вам по-моему уже отвечал, как получить данные из файла Clarion, скачать драйвер ODBC. Вас что-то не устроило?
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 07.06.2006, 09:16
Оценка за ответ: 5
Комментарий оценки:
Всё понятно, НО он неоткрывается. Может я что то нетак делаю. Мне бы подробную инструкцию, если можно :-)


Вопрос № 45.489
Добрый день, уважаемые эксперты!
У меня возник вопрос... Помогите решить его...
Я написал утилитку, которая конвертит из OEM кодировки в ASCII и обратно. На форме расположены такие компоненты Table, DBGrid, DataSource.
Если конвертировать большое количество записей (около 8000) то утилита довольно продолжительное время работает... :-( Я думаю что это связано с тем, что все отображается в таблице... Как можно увеличить скорость конвертации?
Привожу пример...

Приложение:

Отправлен: 07.06.2006, 11:17
Вопрос задал: PheanixN (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 7)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, PheanixN!
Ес-сно, если у вас в визуальном компоненте часто что-дь меняется и системе надо его перерисовывать, то это тормозит работу проги. Сделайте его невидимым на время конвертации. Саму скорость конвертации это не повысит, а вот скорость работы программы - точно повысит :-)
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 9-ый класс)
Ответ отправлен: 07.06.2006, 11:26
Оценка за ответ: 3

Отвечает: Маренич Владимир
Здравствуйте, PheanixN!

Невидимость не поможет! Необходимо использовать специальные методы TDataSet:
Table1.DisableControls;
try
//конвертация
finally
Table1.EnableControls;
end;

Если это не принципиально, то можно отключить на время конвертации грид от датасета (при этом грид будет отображаться как пустой):

DataSource1.DataSet:=nil;
try
//конвертация
finally
DataSource1.DataSet:=Table1;
end;

Если и это не уменьшит время работы Вашей процедуры, то нужно подумать над оптимизацией самой конвертации.
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 07.06.2006, 13:23
Оценка за ответ: 5

Отвечает: Злоумышленник
Здравствуйте, PheanixN!
1. Зачем в цикле используются строчки:
DataSource.DataSet.UpdateRecord;
DataSource.DataSet.Refresh; ?
Лучше DataSource1.DataSet.Post и если надо обновить, то просто закройте и откройте свою Table после цикла
2. DataSource.Enabled := false перед циклом и DataSource.Enabled := true после цикла уменьшит время обработки до 5 раз примерно.
Ответ отправил: Злоумышленник (статус: 9-ый класс)
Ответ отправлен: 07.06.2006, 20:38
Оценка за ответ: 3


Вопрос № 45.492
как измерить частоту подаваемого на com-порт сигнала ?

Приложение:

Отправлен: 07.06.2006, 11:42
Вопрос задал: Сергей Леонидович Воробьёв (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: sir henry
Здравствуйте, Сергей Леонидович Воробьёв!
Com-порт - это цифровое, а не аналоговое устройство. На нем нет никакой частоты. Точнее нет в том понимании, в каком определят частоту сигнала при подаче его на вход частотометра.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 07.06.2006, 12:25

Отвечает: Злоумышленник
Здравствуйте, Сергей Леонидович Воробьёв!
В своё время я считал период сигнала на COM-порт.
В моей проге RecivBytes отвечает за обработку байтов с COM-порта, сам обработчик в основном потоке и принимает сообщения с потока чтения. Вот кусок кода:
*******
private
{ Private declarations }
tmTime: TTime;
...
procedure TfmMainForm.RecivBytes(var Msg: TMessage);
var
tmMeasuredTime: TTime;
Mlsec: Int64;
begin
tmMeasuredTime := Time;//засекли момент получения
Mlsec := MilliSecondsBetween(tmMeasuredTime,tmTime);//вычисляем разность
tmTime := Time;//обновляем начало отсчёта
end;
********
В Mlsec будет находиться разница в миллисекундах, из неё частоту сигнала вычислите. Если конечно знаете как подавать сигналы на COM-порт, и как принимать. Есть книжка П. Агуров "Последовательные интерфейсы ПК", в магазинах есть пока (спешите! :) ), там много информации.
Ответ отправил: Злоумышленник (статус: 9-ый класс)
Ответ отправлен: 07.06.2006, 20:38


Вопрос № 45.496
Здравствуйте! Писал процедуру, которая параметром принимает имя формы, а потом понял, что процедуру не имеет смысла вызывать из другой формы. Подскажите, пожалуйста, как обратиться к текущей форме, независимо от её имени? Заранее спасибо!
Отправлен: 07.06.2006, 12:19
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Лукьяненко Алексей Валериевич
Здравствуйте, Андрющенко Вячеслав Васильевич!

Укажите параметр Self.
Self - это ссылка на экземпляр класса, для которого вызван метод
Ответ отправил: Лукьяненко Алексей Валериевич (статус: 3-ий класс)
Ответ отправлен: 07.06.2006, 12:25

Отвечает: Gh0stik
Здравствуйте, Андрющенко Вячеслав Васильевич!
Вот поробуйте такой обработчик:

procedure TForm1.FormClick(Sender: TObject);
begin
ShowMessage((Sender as TForm).Name);
end;

Удачи!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаються события на земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 07.06.2006, 12:31


Вопрос № 45.507
Здравствуйте, уважаемые эксперты! Дополнение к вопросу №45368. Подскажите, пожалуйста, как при таком обращении к компонентам получить доступ к самому значению width, т.е назначить ему какое-нибудь значение? Заранее благодарен!
Отправлен: 07.06.2006, 13:00
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Андрющенко Вячеслав Васильевич!
Обычно делается так:
TWinControl(FindComponent('имя_компонента')).Width:=150;
Имя, естественно, подставить своё. Можно как у вас - в цикле.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 07.06.2006, 13:13
Оценка за ответ: 4

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Андрющенко Вячеслав Васильевич!

Например - для всех кнопок установить длину 150:

for i:=0 to Form1.ComponentCount-1 do
begin
if Form1.Components[i].ClassName='TButton' then
(Form1.Components[i] as TButton).width:=150;
end;
---------
Ответы на все вопросы - на сайте www.ya.ru :)
Ответ отправил: Устинов Сергей Евгеньевич (статус: Студент)
Ответ отправлен: 07.06.2006, 13:16
Оценка за ответ: 4


Вопрос № 45.517
Здравствуйте, уважаемые эксперты! Объясните, пожалуйста, смысл конструкции:
TWinControl(Form1.FindComponent(Form.Components[i].Name)).Value
Заранее благодарен!
Отправлен: 07.06.2006, 14:15
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Андрющенко Вячеслав Васильевич!
Для элемента на форме Form, стоящего по счёту на позиции i (в списке) возвращается значение его свойства Value. Однако лишь некоторые компоненты имеют это свойство, поэтому код ненадёжен.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 07.06.2006, 14:43
Оценка за ответ: 4

Отвечает: Маренич Владимир
Здравствуйте, Андрющенко Вячеслав Васильевич!
1. Выбирается компонент с индексом i из формы Form (присвоим условное значение Comp1)
2. В форме Form1 ведется поиск компонента с наименованием Comp1.Name (условно Comp2). Если компонента с таким именем нет, то получим Comp2=nil
3. Преобразование указателя на объект Comp2 к типу TWinControl
4. Получаем значение свойста Value или вызов метода Value, который должен быть в TWinControl... НО ЕГО ТАМ НЕТ. Сдесь компилятор обязан выругаться типа не знаю что такое VALUE

Еще пару замечаний:
в п.1 получим компонент только в том случае, если i п.2 может вернуть компонент, а может и не найти (результат функции FindComponent будет nil).
п.3.1 Попытка преобразования в TWinControl пройдет нормально, если FindComponent вернет nil или объект класса TWinControl
п.3.2 Если FindComponent вернет nil, то попытка вызова любого метода или обращения к свойству вызовет Access violation
п.3.3 Если найденный компонент не является TWinControl или его наследником, то будет то же исключение

Резюме: безграмотная конструкция. Так не пишут.
Необходимо с контролами использовать Form1.FindChildControl(Form.Controls[i]) (условно Ctrl1)
Потом проверять Ctrl1 на предмет того существует ли такой контрол и является ли он TWinControl или его наследником: if (Ctrl1<>nil) and (Ctrl1 is TWinControl) then ...
Потом уже обращаемся к преобразованию и использованию свойств и методов:
with Ctrl1 as TWinControl do
Top:=0;
Left:=0;
//...
end;
P.S. Если нужно свойство VALUE каког-то конкретного контрола (например, TSpinEdit), то нужно вместо TWinControl подставить TSpinEdit

Приложение:

Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 07.06.2006, 15:33
Оценка за ответ: 5

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Андрющенко Вячеслав Васильевич!

К предыдущим ответам могу добавить только, что если Вы все-таки хотите использовать такую конструкцию, то можно использовать ее и в таком виде:
(Вам ранее нужно было изменять свойство name у всех компонентов формы)

for i:=0 to form1.ControlCount-1 do
TWinControl(Form1.Components[i]).name:='imya'+inttostr(i)+timetostr(now)[8];

Таким образом у всех компонентов будет новое имя.
---------
Ответы на все вопросы - на сайте www.ya.ru :)
Ответ отправил: Устинов Сергей Евгеньевич (статус: Студент)
Ответ отправлен: 07.06.2006, 15:46
Оценка за ответ: 5

Отвечает: Решетник Д
Здравствуйте, Андрющенко Вячеслав Васильевич!
если у Вас в вопросе опечатка (Form1.Components[i].Name),
тогда ИМХО это абсолютно бессмысленная конструкция, т.к.
Form.Components[i] ~ Form1.FindComponent(Form.Components[i].Name)

но в люьом случае конструкция очень ненадежная и скорее всего будет выдавать все время ошибки во время выполнения, т.к. немногие компоненты имеют свойство Value.
Для доступа лучше испольозвать конструкцию is/as
if (Form.Components[i] is TYourValueComp) then (Form.Components[i] as TYourValueComp).Value .....
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 8-ой класс)
Ответ отправлен: 07.06.2006, 15:58
Оценка за ответ: 5


Вопрос № 45.532
Здравствуйте! Мне нужно, чтобы пользователь не мог сделать форму меньше определенного значения. Я использую обработчик OnResize формы и в нем, если ширина формы меньше опред. значения, устанавливаю ей нужную ширину. При этом наблюдается довольно некрасивый эффект мерцания. Подскажите, пожалуйста, как определить, что пользователь закончил изменение размеров формы(отпустил кнопку мыши после "таскания" формы за край). Заранее спасибО!
Отправлен: 07.06.2006, 17:01
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Савенко Вадим Иванович
Здравствуйте, Андрющенко Вячеслав Васильевич!
Это очень просто. У формы есть свойство Constraints, а у него есть подсвойсва
MaxHeight, MaxWidth, MinHeight, MinWidth, в которых Вы задаете максимальные и
минимальные размеры окна
Ответ отправил: Савенко Вадим Иванович (статус: 1-ый класс)
Ответ отправлен: 07.06.2006, 17:15
Оценка за ответ: 5
Комментарий оценки:
Благодарю

Отвечает: Проходящий Мимо
Здравствуйте, Андрющенко Вячеслав Васильевич!
Можно отлавливать сообщения Windows WM_GETMINMAXINFO. При его использовании Вам не нужно будет определять, закончил ли пользователь изменение размеров или нет. Приведенная ниже процедура просто не даст сделать размеры окна меньше, чем задано значениями ширины X и высоты Y формы. Максимальное значение размеров формы при этом не ограничивается. Нужно не забыть в раздел protected добавить объявление процедуры:

protected
procedure WMGetMinMaxInfo(var Message: TMessage); message WM_GETMINMAXINFO;
end;

procedure TForm1.WMGetMinMaxInfo(var Message: TMessage);
type
PTMinMaxInfo = ^TMinMaxInfo;
begin
with PTMinMaxInfo(Message.LParam)^.ptMinTrackSize do
begin
x := 450;
y := 350;
end;
inherited;
end;

Удачи!
---------
Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 5-ый класс)
Ответ отправлен: 08.06.2006, 08:50
Оценка за ответ: 5

Отвечает: Serg_6667
Здравствуйте, Андрющенко Вячеслав Васильевич!
Это можно сделать намного проще: просто определить в свойствах формы минимальные размеры окна.
Form1.constraints.minwidth := 300;
Form1.constraints.minheight := 300;
Ответ отправил: Serg_6667 (статус: 2-ой класс)
Ответ отправлен: 08.06.2006, 10:07
Оценка за ответ: 5


Вопрос № 45.562
Как говорится чем дальше в лес тем ели гуще :)
Так вот вопрос: как можно правильно организовывать очереди?
Имеется следующее:
Приходят пакеты. Надо искать между ними "ответы" - и ложить их в буфер, и искать среди них же (пакетов) "запросы" - и давать в качестве ответа на них "ответы". Так вот хочется спросить уважаемых экспертов как организовать все это "по уму"? ...Может подскажете какие алгоритмы затрачивающие мало времени на обработку такой очереди.
Отправлен: 07.06.2006, 21:49
Вопрос задал: Andrew (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Маренич Владимир
Здравствуйте, Andrew!
Не понятно что приходит и что должно уходить (формат данных). Непонятно откуда приходит и куда уходит... Одним словом без протокола (правил обмена данными) трудно что-либо подсказать. Абстрактно могу сказать, что можно в качестве буфера использовать однонаправленный динамический список.
Со списком работать просто, но при добавлении/удалении из разных потоков (thread) необходимо использовать соответствующие элементы синхронизации. Т.е. если у Вас один поток читает из канала данные и складывает их в буфер, а другой поток этот самый буфер "разбирает" (определяет, что является запросом, а что ответом и соответсвенно реагирует и отправляет на запросы ответы), то смотрите полный пример. Если Вы делаете все это в основном потоке (т.е. последовательно), то отмеченные комментарием со звёздочками строки можете опустить.

Приложение:

Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 08.06.2006, 08:29


Вопрос № 45.585
Здравствуйте! Скажите, пожалуйста, есть ли необходимость очищять динамический массив(список) при закрытии приложения или это происходит автоматически? Заранее благодарен!

Приложение:

Отправлен: 08.06.2006, 05:47
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, Андрющенко Вячеслав Васильевич!
Это происходит автоматически, но дело здесь в другом. Удалять динамические компоненты лучше сразу, как только Вы прекратили их использование, т.к. они занимают немалый объем памяти (это касается в основном VCL-компонентов), а если памяти компьютеру не хватает, то он начинает тратить свое время на обмен данных со свопом, а это уже серьезное замедление производительности.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 08.06.2006, 06:32
Оценка за ответ: 5

Отвечает: Решетник Д
Здравствуйте, Андрющенко Вячеслав Васильевич!
Добоавлю ИМХО это хороший тон программирования - убирать за собой, а также перестраховка от недоработок разработчиков ОС...
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 8-ой класс)
Ответ отправлен: 08.06.2006, 09:28
Оценка за ответ: 4


Вопрос № 45.587
Здравствуйте. Имеется html-страница (фрагмент страницы - в приложении). Мой вопрос: как с помощью TIdHTTP (или чего-либо еще) взять только этот фрагмент, не закачивая (с помощью метода .Get) всю страницу целиком?

Приложение:

Отправлен: 08.06.2006, 06:05
Вопрос задал: Michael222 (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Решетник Д
Здравствуйте, Michael222!
Пройдитесь по ключевым словам:
InternetOpen, InternetConnect, HttpOpenRequest, HttpAddRequestHeaders, HttpSendRequest, InternetReadFile, InternetCloseHandle библиотеки WinInet.
Конкретно такой функции я не увидел, но если пройти по спецификации, думаю что-то найдете.
---------
Жизнь коротка, чтобы писать на ассемблере
Ответ отправил: Решетник Д (статус: 8-ой класс)
Ответ отправлен: 08.06.2006, 09:26
Оценка за ответ: 4
Комментарий оценки:
Тогда вопрос вдогонку: как формировать Request (желательно с примерами)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Michael222!
По-моему, с помощью TIdHTTP у вас это не получится - надо писать самому с помощью сокетов.
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 9-ый класс)
Ответ отправлен: 08.06.2006, 09:36
Оценка за ответ: 3


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

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

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

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

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала 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.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное