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

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


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

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

Выпуск № 500
от 12.06.2006, 06:35

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


Вопрос № 45333: Вот такая задача: надо создать двупотоковое приложение, в коем один поток занимается чтением из СОМ порта данных. Так вот как написать так чтоб читающему потоку можно было назначать бОльший приоритет без ущерба для основного приложения? ЗЫ: Если ...
Вопрос № 45344: Добрый день, уважаемые! Подскажите как преобразовть путь из 'c:aaabbcccfilename' в 'c:aaa...filename', если по длине эта строка не влазит в Edit, а также как отображать этот путь в хинте?...
Вопрос № 45363: Как переименовать папку программно? и еще нужен компонент: 1) ему можно было бы задать корневую папку, выше которой подняться нельзя; 2) файлы и папки оформлены как дерево; 3) показывать нужно название файла или папки и его время...
Вопрос № 45368: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, как "пройтись" по всем элементам формы и проверить, обладает ли элемент определенным свойством, например width? Заранее благодарен!...
Вопрос № 45369: Здравствуйте, уважаемые эксперты! Можно ли преобразовать символы из Caption, Richedit, combobox в верхний и нижний индексы? И если такое возможно, то как это сделать во время выполнения программы? Спасибо....
Вопрос № 45378: Здравствуйте, уважаемые эксперты. вопрос такой:можно в делфи сделать так, чтобы по нажатию какой-нибудь комбинации клавиш у меня вставлялись например строки procedure begin end чтобы не приходилось каждый раз это набирать или что...
Вопрос № 45407: Спасибо за ответ на предыдущий вопрос. есть еще один. Как можно клавишами переключаться между юнитами проекта, которые в закладках? Спасибо за ответы...
Вопрос № 45464: Здраствуйте, екперты. Хочу попробовать создать firewall на Delphi но не знаю с чего начать?...
Вопрос № 45465: Уважаемые эксперты, подскажите, пожалуйста, как расположить текст по параболе? Заранее благодарен!...
Вопрос № 45470: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, литературу по DLL в интеренете. Мне нужно не просто "что такое и зачем", а как можно подробнее, до мелочей. Заранее очень благодарен!...
Вопрос № 45474: Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, как на форме расположить тект по параболе?...

Вопрос № 45.333
Вот такая задача: надо создать двупотоковое приложение, в коем один поток занимается чтением из СОМ порта данных. Так вот как написать так чтоб читающему потоку можно было назначать бОльший приоритет без ущерба для основного приложения?
ЗЫ: Если не правильно сформулировал - подскажите как надо.
Отправлен: 06.06.2006, 06:37
Вопрос задал: SUPcOZA (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, SUPcOZA!
Первый же результат в Яндексе по запросу "приоритет нити" (без кавычек) выдает страницу с информацией. Все используемые функции есть в help-е Delphi. Только в Delphi нет типа HANDLE - вместо него используется HWND. Впрочем, в принципе, можно использовать хоть LongWord, т.к. системный идентификатор HANDLE - это по сути 32-битное целое без знака.

Например, при инициализации процесса:

var
threadHandle: HWND;
...
threadHandle := GetCurrentThread();
if not SetThreadPriority(threadHandle, THREAD_PRIORITY_ABOVE_NORMAL) then
ShowMessage('Не удалось установить повышенный приоритет');

Приложение:

Ответ отправил: Сухомлин Кирилл Владимирович (статус: 8-ой класс)
Ответ отправлен: 06.06.2006, 15:40

Отвечает: Злоумышленник
Здравствуйте, SUPcOZA!
...
SetThreadPriority(CommThread,8);//выставляете приоритет, какой надо
CommThread - хэндл потока

Приложение:

Ответ отправил: Злоумышленник (статус: 9-ый класс)
Ответ отправлен: 07.06.2006, 00:43

Отвечает: Маренич Владимир
Здравствуйте, SUPcOZA!
Есть такой класс TThread, в котором есть соотв. свойство. А для того чтобы основной поток не тормозил, то нужно правильно настроить работу потока с высоким приоритетом. Я обычно в теле потока в не критических местах ставлю Sleep(1). Это заставляет операционку "затормозить" этот поток и дать управление другим потокам. Примерно выглядит так:
begin
while not Terminated do
begin
//...
//читаем данные с порта
Sleep(1);
//обработка полученных данных
Sleep(1);
//обработка полученных данных
Sleep(1);
//отправляем ответ в порт
Sleep(1);
//...
end;

Тогда критические участки (прием/получение данных) будут выполняться с наивысшим приоритетом, а в ходе обработки данных даем другим потокам "пробиться" к процессорному времени. Не забывайте правильно настроить порт (SetCommTimeouts) для таймаутов прийма/отправки данных. Пока будет операционка ожидать ввода/вывода другие потоки будут нормально работать.
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 07.06.2006, 14:48


Вопрос № 45.344
Добрый день, уважаемые! Подскажите как преобразовть путь из
'c:aaabbcccfilename' в 'c:aaa...filename', если по длине эта строка не влазит в Edit, а также как отображать этот путь в хинте?
Отправлен: 06.06.2006, 09:30
Вопрос задал: Савенко Вадим Иванович (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Проходящий Мимо
Здравствуйте, Савенко Вадим Иванович!
В приложении функция Mince(PathToMince: string; InSpace: Integer): string; преобразует полный путь для отображения по принцыпу:
"C:Program FilesDelphiDDropTargetDemomain.pas" в
"C:Program Files..main.pas", где
PathToMince - полный путь;
InSpace - количество символов преобразованого пути.

Для отображения Hint нужно обязательно выставить в родительськой форме свойство Form1.ShowHint := true;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
//отображаем обрезаный путь
Edit1.Text := Mince(OpenDialog1.FileName, 40);
//в хинте отобоажаем полный путь
Edit1.Hint := OpenDialog1.FileName;
end;
end;

Удачи!

Приложение:

---------
Carpe diem!

Ответ отправил: Проходящий Мимо (статус: 5-ый класс)
Ответ отправлен: 06.06.2006, 10:26

Отвечает: Баззи Баззукин
Здравствуйте, Савенко Вадим Иванович!
начиная с Delphi 7 можно использовать функцию MinimizeName. Unit Filectrl.

Приложение:

Ответ отправил: Баззи Баззукин (статус: 2-ой класс)
Ответ отправлен: 06.06.2006, 11:04


Вопрос № 45.363
Как переименовать папку программно?

и еще нужен компонент:
1) ему можно было бы задать корневую папку, выше которой подняться нельзя;
2) файлы и папки оформлены как дерево;
3) показывать нужно название файла или папки и его время модификации.
4) прикрепить контекстное меню для работы с выбранным файлом или папкой.
Отправлен: 06.06.2006, 11:55
Вопрос задал: Vitalya (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Баззи Баззукин
Здравствуйте, Vitalya!
Папки и файлы успешно переименовывает функция RenameFile. Если успешно, возвращает True
Ответ отправил: Баззи Баззукин (статус: 2-ой класс)
Ответ отправлен: 06.06.2006, 12:11

Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Vitalya!
1) у TShellTreeView есть свойство Root. Можно редактировать как на этапе разработки, так и после компиляции. Однако, чтобы еще и нельзя было подняться выше - это надо подумать. Но какую-то идейку я вам подкинул =)
2) TShellTreeView на закладке Samples. Полный путь к выбранному файлу или папке получается по свойству Path. Также там есть SelectedFolder и еще куча полезных свойств.
3) Прикрутите к этому небольшую панельку с Label-ами а данные читайте с помощью, например, FindFirst через TSearchRec.
4) Свойство PopupMenu есть у данного компонента - если вы это имеете ввиду. Я с ним никогда не работал, так что не знаю :-,
Ответ отправил: Сухомлин Кирилл Владимирович (статус: 8-ой класс)
Ответ отправлен: 06.06.2006, 15:21
Оценка за ответ: 4


Вопрос № 45.368
Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, как "пройтись" по всем элементам формы и проверить, обладает ли элемент определенным свойством, например width? Заранее благодарен!
Отправлен: 06.06.2006, 12:51
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Проходящий Мимо
Здравствуйте, Андрющенко Вячеслав Васильевич!
В этом вам поможет приведенный ниже код, только в раздел uses нужно добавить модуль TypInfo:

procedure TForm1.Button1Click(Sender: TObject);
var
PropInfo: PPropInfo;
i:byte;
begin
//проходим в цикле все компоненты
for i:=0 to Form1.ComponentCount-1 do
begin
PropInfo := GetPropInfo(Form1.Components[i].ClassInfo, 'Width');
//вот здесь и проверяется, есть ли свойство
if PropInfo <> nil then
Application.MessageBox(PChar('Свойство ''Width'' есть в компоненте '+
Form1.Components[i].Name), '', 0)
end;
end;

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


Вопрос № 45.369
Здравствуйте, уважаемые эксперты!
Можно ли преобразовать символы из Caption, Richedit, combobox в верхний и нижний индексы? И если такое возможно, то как это сделать во время выполнения программы?
Спасибо.
Отправлен: 06.06.2006, 12:57
Вопрос задал: Граур Василий Олегович (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Баззи Баззукин
Здравствуйте, Граур Василий Олегович!
В Richedit можно.
смотри пример.

SCF_ALL применить ко всему тексту
SCF_SELECTION применить к веделенному тексту
SCF_WORD | SCF_SELECTION применить к выделенным словам

Проверено на Delphi7.

Приложение:

Ответ отправил: Баззи Баззукин (статус: 2-ой класс)
Ответ отправлен: 06.06.2006, 13:35

Отвечает: Маренич Владимир
Здравствуйте, Граур Василий Олегович!
Можно использовать функции преобразования в верхний и нижний регистр:
AnsiUpperCase(S: string): string
AnsiLowerCase(S: string): string
к соотв. свойствам.
Например для TLabel это будет выглядеть примерно так:
Label1.Caption:=AnsiUpperCase(Label1.Caption);
для TComboBox:
ComboBox1.Lines.Text:=AnsiUpperCase(ComboBox1.Lines.Text);
Ответ отправил: Маренич Владимир (статус: Студент)
Ответ отправлен: 07.06.2006, 14:37
Оценка за ответ: 5


Вопрос № 45.378
Здравствуйте, уважаемые эксперты.
вопрос такой:можно в делфи сделать так, чтобы по нажатию какой-нибудь комбинации клавиш у меня вставлялись например строки procedure
begin
end
чтобы не приходилось каждый раз это набирать
или чтобы сразу begin с end.
Спасибо за ответы и помощь
Отправлен: 06.06.2006, 13:36
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Проходящий Мимо
Здравствуйте, Lichkaty Alexander!
Конечно можно!
В Delphi7 нужно выбрать пункт меню ToolsEditorOptions, закладку Source Options, нажать кнопку Edit Code Templates. В форме нужно нажать кнопку Add. В поле Shortcut Name ввести уникальную последовательность букв, которые будут вызывать Ваш шаблон, например для procedure begin end это может быть 'pbe' или что-то по Вашему вкусу. В поле Code вводите сам шаблон:

procedure
begin
|
end

Знак '|' обозначает куда IDE поставит курсор после выполнения шаблона.
В редакторе для вызова шаблона нужно набрать его Shortcut и нажать комбинацию Ctrl+j
P.S. Для Вашего случая уже имеется стандартный шаблон procedure

---------
Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 5-ый класс)
Ответ отправлен: 06.06.2006, 14:04
Оценка за ответ: 5
Комментарий оценки:
то, что мне нужно было. Спасибо

Отвечает: Устинов Сергей Евгеньевич
Здравствуйте, Lichkaty Alexander!

Tools -> Editor Options -> Source Options - > Edit Code Templates

Создаете название шаблона, описание.
Пишете нужный код для вставки.
Когда в редакторе напишете название шаблона - нажмите Ctrl+J - вставится нужный код, или просто Ctrl+J и выбирайте из списка нужный Вам код.

Удачи!
---------
Ответы на все вопросы - на сайте www.ya.ru :)
Ответ отправил: Устинов Сергей Евгеньевич (статус: Студент)
Ответ отправлен: 06.06.2006, 14:16
Оценка за ответ: 5

Отвечает: Lexus
Здравствуйте, Lichkaty Alexander!

Можете попробовать следующим образом:

Объявляете в начале программы процедуру или функцию, например:
private
procedure proc1(s:string);

И нажимаете Ctrl+Shift+C и делфи сама вставит следующий код в программе:

procedure Tform1.proc1(s:string);
begin

end;

Можно сразу писать код, очень удобно и даже лучше чем вы просили!
---------
"Все что вы скажете будет использовано против вас в суде..." (УК РФ)
Ответ отправил: Lexus (статус: 3-ий класс)
Ответ отправлен: 06.06.2006, 16:16


Вопрос № 45.407
Спасибо за ответ на предыдущий вопрос. есть еще один.
Как можно клавишами переключаться между юнитами проекта, которые в закладках?
Спасибо за ответы
Отправлен: 06.06.2006, 16:55
Вопрос задал: Lichkaty Alexander (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Ерёмин Андрей
Здравствуйте, Lichkaty Alexander!
С помощью Ctrl+Tab и Ctrl+Shift+Tab.
---------
Нет правила без исключений. Правило без исключений - исключение из правил.
Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на DELPHI: Всё для программиста.
ICQ: 286837644
----
Ответ отправлен: 06.06.2006, 17:00
Оценка за ответ: 5

Отвечает: Serg_6667
Здравствуйте, Lichkaty Alexander!

Знаю, что при нажатии Сtrl+F12 появляется окно со всеми юнитами, а при нажатии Shift+F12 - окно со всеми формами проекта
Ответ отправил: Serg_6667 (статус: 2-ой класс)
Ответ отправлен: 06.06.2006, 17:59


Вопрос № 45.464
Здраствуйте, екперты. Хочу попробовать создать firewall на Delphi
но не знаю с чего начать?
Отправлен: 07.06.2006, 02:54
Вопрос задал: Pm_pilot (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: sir henry
Здравствуйте, Pm_pilot!
Перво-наперво необходимо начать с изучения стека протоколов TCP/IP. Потом с изучения службы шлюза alg.exe, который является посредником между приложением и брандмауэром в Windows.
Ну и выучить наизусть всю MSDN. :)
Зайдите на http://www.sourceforge.net, введите там в строке поиска firewall и внимательно изучите все проекты с исходным кодом по этой тематике. Конечно на Delphi файрволов там нет, но не вызовет абсолютно никакого затруднения перевод кода с Си на Дельфи, если Вы сможете ухватить идею. Тем более все WinAPI функции есть в Дельфи, только необходимо будет преобразовать типы данных параметров этих функций.
Ответ отправил: sir henry (статус: Академик)
Россия, Красноярск
----
Ответ отправлен: 07.06.2006, 05:37
Оценка за ответ: 4
Комментарий оценки:
Спасибо. Ну с MSDN єто ясно, а про
www.sourceforge.net я не подумал, а переделывать код с Си в Паскаль уже приходилось.


Вопрос № 45.465
Уважаемые эксперты, подскажите, пожалуйста, как расположить текст по параболе? Заранее благодарен!
Отправлен: 07.06.2006, 03:10
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Евгения
Здравствуйте, Андрющенко Вячеслав Васильевич!
стандартными функциями можно создать шрифт под каким-либо углом, поэтому, чтобы вывести текст по кривой, нужно посимвольно выводить его, расчитывая координаты и угол текста (найти угол между горизонтом и касательной к параболе в данной точке)...
ниже приведена программа, которая выводит текст посимвольно под разным углом... формулы расчета координат и угла наклона не считала... можете сами попридумывать, или у математиков спросите...
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
procedure FormClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

procedure printing(s: string; x1,y1,a1: integer);
var LF: TLogFont;
Fnt: HFont;
begin
FillChar(LF, SizeOf(LF), 0);
with LF do
begin
lfHeight := 20;
lfEscapement := a1;
StrPCopy(lfFaceName, 'Courier New Cyr');
end;
with Form2.Canvas do
begin
Fnt := CreateFontIndirect(LF);
Font.Handle := Fnt;
TextOut(x1, y1, s);
DeleteObject(Fnt);
end;
end;

procedure TForm2.FormClick(Sender: TObject);
var
i,x1,y1,a1: Integer;
Text: string;
begin
text:='мама мыла раму... рама мыла маму...';
for i:=1 to length(text) do begin
y1:=i*i; //задаете координаты по у тут
x1:=i*10; //задаете координаты по х тут
a1:=-i*30; //задаете угол наклона тут
Printing(text[i],x1,y1,a1);
end;
end;

end.

по функции CreateFontIndirect почитайте тут:
http://it.kgsu.ru/Delphi_6/dlph0042.html

и вообще я это отсюда взяла и немного переделала...

Счастливо!
---------
Я не волшебник, я только учусь... А разве кто-то обещал, что будет легко?
Ответ отправила: Евгения (статус: 6-ой класс)
Ответ отправлен: 07.06.2006, 08:53


Вопрос № 45.470
Здравствуйте, уважаемые эксперты! Подскажите, пожалуйста, литературу по DLL в интеренете. Мне нужно не просто "что такое и зачем", а как можно подробнее, до мелочей. Заранее очень благодарен!
Отправлен: 07.06.2006, 05:34
Вопрос задал: Андрющенко Вячеслав Васильевич (статус: 1-ый класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

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

Посмотрите эту ссылку:
http://delphiworld.narod.ru/base/uses_dll.html
Воообще советую заходить по чаще на http://delphiworld.narod.ru - много полезного найдете!!!
Удачи!!!
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаються события на земле. Генератор случайных чисел - и только.
Ответ отправил: Gh0stik (статус: Студент)
Ответ отправлен: 07.06.2006, 10:47


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

Отвечает: Баззи Баззукин
Здравствуйте, Андрющенко Вячеслав Васильевич!
Вам для этого надо создать шрифт. Потребуется структура Logfont и API функция CreateFontIndirect. В структуре LogFont можно указать размер шрифта, угол. Получившийся шрифт примените на канвас формы. Это не работает в Win 9x.
Ответ отправил: Баззи Баззукин (статус: 2-ой класс)
Ответ отправлен: 07.06.2006, 09:46


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

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

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

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

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

В избранное