← Июнь 2001 → | ||||||
1
|
2
|
3
|
||||
---|---|---|---|---|---|---|
4
|
5
|
6
|
7
|
8
|
9
|
10
|
11
|
12
|
13
|
15
|
16
|
17
|
|
18
|
19
|
20
|
22
|
23
|
24
|
|
25
|
26
|
27
|
29
|
30
|
За последние 60 дней 2 выпусков (1-2 раза в 2 месяца)
Сайт рассылки:
http://www.interface.ru, www.itshop.ru
Открыта:
16-01-2001
Адрес
автора: comp.soft.win.mydelphi-owner@subscribe.ru
Статистика
-3 за неделю
Проблемы и решения в Delphi
Проблемы и решения в Delphi - выпуск 20 от 28.06.2001.
Лучше один раз увидеть,
Чем не разу...
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
Доброго Вам времени суток уважаемый читатель.
Сегодня в выпуске :
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
2. Отвеченные вопросы.
3. Ищу подельника.
~~~~~~~~~~~~~~~~~~~
1. Очередные вопросы.
---------------------
Вопрос 320:
От: Ovtchinnikov Kirill
Вопрос:
Ка запихнуть программу в трей и заставить ее реагировать на
клик по ней?
Ответить.
Ответ 1:
Вопрос 321:
От: auru
Вопрос: почему при создании ServerSocket'а Delphi присваивает ему
неправильный
номер порта? Вот хочу я, к примеру, слушать 1024 порт, указываю
ServerSocket.Port:=1024. А после выполнения ServerSocket.Open netstat
говорит,
что занят 1029. И каждый раз занят разный порт. Что я неправильно
учитываю?
Ответить.
Ответ 1:
Вопрос 322:
От: tp@pi.net.ua
Здоровенькi були!
1. Нужно: Блокировать реакцию на Alt+F4!
2. Нужно: Если моя прога активна дать пользователю возможность быть
только с моей прогой и ни ногой за нее.
Ответить.
Ответ 1:
Вопрос 323:
От: d@nger0us (re@ture
Вопрос:
Здравствуйте!
Хотелось бы получить ответ но мой не очень сложный вопрос:
Когда я создаю в дельфи какой-н. проект, у которого на форме всего 2-3
кнопки, эдит и, например, листбокс; ехе-файл весит примерно 300k, хотя
полезных данных там на 50-70k.
Внимание вопрос: как мне уменьшить размер исполняемого файла?
(Пробовал экспериментировать с пакетами - ничего; кстати, версия
дельфи - 3.0 - может в 5.0 всё будет нормально?)
Ответить.
Ответ 1:
Вопрос 324:
От: Michael Mazia
Здравствуйте!
Вопрос касательно сохранения типизированных файлов: можно ли как-то
сохранить в записи (record) объект типа TStrings или TStringList?
Ответить.
Ответ 1:
Вопрос 325:
От: Сергей Кононов
Пишу программу для перехвата сетевого трафика
и реакции на него. Использую библиотеку WPCapLib,
но она безбожно тормозит (хотя возможно я с чем-то и не
разобрался), кроме этого требует установки *.Vxd на машину.
Может кто паодскажет, что ещё можно использовать и где это взять.
Ответить.
Ответ 1:
Вопрос 326:
От: Dmitry Gricay
Вопрос:
Приветствую.
Вопрос такого плана - необходима документация по программированию USB
шины. Описание, методы работы и т.д.
Ответить.
Ответ 1:
Вопрос 327:
От: Дмитрий
Hi DTarasov!
Вот есть у TWebBrowser свойство document типа IDispatch. И дальше в
хелпе написано, что мол используйте некий IDispatch интерфейс, чтобы
работать с документом используя модель объектов COM. В общем, мне надо
работать с документом HTML как с документом (а не исходным текстом в
HTML). Чтобы иметь доступ к объектам документа, как в JavaScript,
например. Где про это про всё можно почитать (в Инете или книжка какая
есть, я не нашёл)?
Заранее сенкс.
Shaman
dimon-da@mtu-net.ru
Ответить.
Ответ 1:
Вопрос 328:
От: Eugene
:case of?
Каким образом перечислить в "сase" _не цифровые_ значения:
case Parameter2 of
"один": begin {} end;
"два" : begin {} end;
"остальной": begin {} end;
end;//of
Ответить.
Ответ 1:
Вопрос 329:
От: Алексей
:Здравствуйте. При создании программы мне не хватило средств Оbject
Раscal, пришлось использовать API-функции. В моей книге написаны лишь их
названия. Подскажите, как использовать CopyFile и CreateFile. Cпасибо.
Ответить.
Ответ 1:
2. Отвеченные вопросы.
----------------------
Вопрос 126:
От: Dima
Вопрос:
Здравствуйте! Help please!
Проблема с Paradox: В Delphi 4 пишу:
Database1.StartTransaction;
Query1.SQL.Add('delete from Test.db');
Query1.ExecSQL;
Database1.Rollback;
После этого в таблице восстанавливаются только значения ключевых полей.
(BDE ver 5.01)
Заранее благодерен, Дмитрий.
Ответить.
Ответ 1:
Странно, что хоть что-то восстанавливается.
Локальные базы данных - -не поддерживают транзакции
Вопрос 127:
От: anton
Здраствуйте.
Я положил на форму файл *.bmp или Skin(компонент TSkinForm),в котором есть
кнопки.Как сделать,чтобы эти кнопки заработали.Я имею в виду не процедуры,а
сами кнопки.
Заранее благодарен.
Ответить.
Ответ 1:
Можно, конечно, использовать координаты мыши на тот момент, когда кликнули, но лучше, на
мой взгляд, использовать для отдельных элементов "скина" отдельные Image. Тогда можно
будет анимировать нажатия на кнопки, например, как в Winamp. А узнать, когда кликнули и где
кликнули можно так:
Пример 1:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (x>=10) and (x<=20) and (y>=10) and (y<=20) then
begin
{Если кликнули в прамоугольной области с координатами}
{ (10, 10) - левый верхний угол, (20, 20) - правый нижний угол }
end;
end;
Пример 2:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
case Button of
mbLeft: {Нажата левая кнопка мыши}
mbRight: {Нажата правая кнопка мыши}
mbMiddle: {Нажата средняя кнопка мыши}
end;
end;
P.S. В переменной Shift находятся флаги нажатий клавишь Ctrl, Alt и Shift.
См. Help по Delphi.
Вопрос 128:
От: Яковлев Юрий Николаевич
При cоздании клиентских приложений в ORACLE 8i есть небходимость
работать не только с хранимыми процедурами но и с объектами
Sequeces,Packages если стандартные компоненты доступа или другой способ
получения доступа к этим объектам, писать через трехзвенную архитектуру
(corba и т.д.) мне бы не очень хотелось ..
Ответить.
Ответ 1:
Вопрос 129:
От: Ернар Шамбаев
чПРТПУ:
Здравствуйте, братья по разуму!
1. Мне надо создать информационно-поисковую систему на Delphi
(information search system).
Естественно, одно из главных в ней - быстрый и качественный поиск в
документах.
Порекомендуйте, пожалуйста, дополнительные средства,
компоненты/библиотеки третьих фирм
по text search engine?
Мелкие вопросы:
2. PageControl.
Необходимо менять шрифт у страничек (у активной - один, у неактивных -
другой). Однако почему-то свойство Font объектов TabSheet "не имеет
силы" (все решает одноименное свойство PageControl даже при ParentFont=
False у станичек). Тогда зачем вообще это свойство у TabSheet?
3. StringGrid.
Сетка строк интересно себя ведет. Когда теряет фокус, одна из ее
строчек становится выделенной, когда получает - выделение снимается. По
логике, должно быть как раз наоборот.
4. StringGrid или DrawGrid.
Как в ячейке Grid'а отобразить checkbox или картинку?
5. TreeView
Скажите, пожалуйста, как грамотно организовать создание и удаление
пользовательских папок как узлов дерева?
Благодарю заранее.
Ответить.
Ответ 1:
Вопрос 130:
От: Onasys Passiontis
Доброго времени суток.
Для меня Win Api - полный туман из-за одной простой детали.
Я никак ни понимаю что такое handler.
Откуда он берётся, кто его назначает, является ли он постоянно закреплённым за каждым окном.
Если я хочу вызвать Word, то как мне узнать хандлер его окна. Но допустим я его однажды узнаю и буду пользоваться. А как тогда узнать handler, который будет у окна программы, подаренной мне знакомым програмистом Пупкиным?
Объясните, пожалуйста, как всем этим пользоваться.
Ответить.
Ответ 1:
Handle в переводе "ручка, рукоядка" - уникальный
номер объекта в системе (чтоб "держать" за эту ручку
объект), присваевается Windows'ом на свое усмотрение в
момент создания. Почти все API требуют передать им
handle для в место объекта над которым надо что-то
делать. В Дельфи большинство объектов имеют свой
handle. Например:
Form1.handle
application.handle
button1.handle
Handle должен быть обязательно больше 32
В качестве фиктивного handle можно передавать 0, но
надо быть осторожным, так как при передачи
несуществующего handle может быть ошибка.
A handler - это то что использует, ловит handle
(обычно относится к событиям)
Ответ 2:
Ответ на вопрос взят из замечательной книги М.Краснова "OpenGL. Графика в проектах DELPHI"
Как операционная система различает окна для осуществления диалога с ними? Все окна при своем создании
регистрируются в операционной системе и получают уникальный идентификатор, называемый "ссылка на
окно". Тип этой величины в Delphi - HWND (WiNDow Handle, ссылка на окно).
Ссылка на окно может использоваться не только операционной системой, но и приложениями для
идентификации окна, с которым необходимо производить манипуляции.
Попробуем проиллюстрировать смысл ссылки на окно на несложном примере.
Откомпилируйте минимальное приложение Delphi и начните новый проект. Форму назовите Form2, разместите
на форме кнопку, обработчик события OnClick кнопки приведите к следующему виду:
procedure
TForm2.Button1Click(Sender: TObject);
var
H : HWND;
begin
H := FindWindow ('TForm1', 'Form1');
If H <> 0 then ShowMessage ('Есть Form1!')
else ShowMessage ('Нет Form1!')
end;
Теперь при щелчке на кнопке выдается сообщение, есть ли запущенное приложение, класс окна которого
зарегистрирован в операционной системе как 'TForm1', в заголовке которого записано 'Form1'. То есть если
одновременно запустить обе наши программы, при нажатии на кнопку выдается одно сообщение, если окно с
заголовком 'Form1' закрыть, при щелчке на кнопку выдается другое сообщение.
Если заголовок окна безразличен - второй аргумент функции FindWindow нужно задать nil.
(Для работы с приложениями, класс окна которых неизвестен, достаточно использовать WinSight32 из поставки
Delphi. Для WinWord класс окна - OpusApp.)
Здесь мы используем функцию API FindWindow, возвращающую величину типа HWND - ссылку на найденное
окно либо ноль, если такое окно не найдено.
Итак, ссылка на окно однозначно определяет окно. Свойство Handle формы и есть эта ссылка, значение которой
форма получает при выполнении функции API CreateWindow - создании окна. Имея ссылку на окно,
операционная система общается с окном путем посылки сообщений-сигналов о том, что произошло какое-либо
событие, имеющее отношение именно к этому окну. Если окно имеет намерение отреагировать на это событие,
операционная система имеет это в виду и вместе с окном осуществляет эту реакцию. Окно может и не имея
фокус получать сообщения и реагировать на них.
Проиллюстрируем это на примере.
Обработчик события
OnMouseMove
формы приведите к виду:
procedure TForm2.FormMouseMove(Sender: TObject;
Shift: TShiftState; X,
Y: Integer);
begin
Caption := 'x=' + IntToStr (X) + ', y=' + IntToStr (Y)
end;
В заголовок формы выводятся координаты указателя мыши.
Запустите два экземпляра программы и обратите внимание, что окно, не имеющее фокус ("неактивное"), тоже
реагирует на перемещение указателя по его поверхности.
Имея ссылку на окно, приложение может производить с ним любые действия, путем посылки ему сообщений.
Andre
Вопрос 131:
От: Алексей Малиновский
Доброе время суток!
Я делаю программу для 3-х клиентов по учёту движения товаров на
складе...
Мне необходимо сделать так, чтобы при обращении клиента, к уже
редактируемой записи другим клиентом, выдавалось какое-ниьт сообщение
типа "Запись занята!". У меня возникла идея сделать это триггером
BeforeUpdate, но как узнать редактируется ли уже запись в данный момент
- не знаю.
Господа, помогите, наверняка уже кто-то сталкивался с такой проблемой.
Заранее большое спасибо. ;-)
С уважением, Алексей.
Ответить.
Ответ 1:
Самое дешевое решение - завести поле, в которое будет записываться ID usera перед началом операции.
Перед началом обновления данных выполняете следующее.
1. При старте программы каждому юзеру раздаете уникальный ID.
2. Перед началом обновления данных записываете ID в поле в и коммитете данные. После
этого поле будет залочено для этого юзера.
3. Вносите изменения.
4. В блокирующее поле записываете 0 и коммитете.
Перед началом обновления, проверяете чему равно значение блокирующего поля. Если оно не нулевое, то вы не только
сможете сообщить, что запись заблокирована, но и сказать кем именно.
Если не делать ничего подобного то запросто при многопользовательской работе можно получить
deadlock на сервере а есть не очень хорошо.
Ответ 2:
Так сделать нельзя. Можно по другому. Оцени критические ситуации и поставь проверку на триггер или еще лучше сделай
с помощью CHECK.
Например: колличество на складе не может быть меньше 0 CHECK TOVAR_COUNT>0
Если один из клиентов изменил количество , а второй попытался снять больше чем есть на складе - то сервер выдаст
ошибку, которую ты можешь обработать программой.
Очень хорошая книга по этой теме П.В. Шумаков - Дельфи 3 и разработка приложений баз данных.
После ее прочтения 80% твоих вопросов будут решены.
Ответ 3:
Думаю, что Вашу задачу можно решить следующим путем.
На сервере метод, который осуществляет обработку данных.
"закрыть" критической секцией.
В начале критическую секцию необходимо объявить в составе класса или
отдельно:
SectionLock: TCriticalSection;
Затем:
procedure TForm1.FormCreate(Sender: TObject);
begin
SectionLock:=TCriticalSection.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SectionLock.Free;
end;
Теперь при инициализации Вашего метода можно использовать SectionLock:
SectionLock.Acquire;
try
DoSomething;
finally
SectionLock.Release;
end;
или
SectionLock.Enter;
try
DoSomething;
finally
SectionLock.Leave;
end;
Когда поток достигает критической секции, то все что заключено
в этой секции перестает реагировать на любые внешние воздействия
до момента выхода из критической секции.
Теперь на попытку обращения к серверу другого клиента в качестве
результата можно возвращать значение, которое будет
идентифициороваться как "Занято".
Например:
if Lock
then "ответ - занято"
SectionLock.Enter;
try
Lock:=True;
DoSomething;
finally
SectionLock.Leave;
Lock:=False;
end;
P.S. Что бы сервер мог одновременно реагировать на несколько запросов,
его необходимо реализовать в СОМ технологии.
Вопрос 132:
От: Yellow D.
Приветствую!
Большое спасибо за ответ! Очень помог.
Вот тут появился еще вопросики:
1)Друг сказал, что в Inter Base надо при создании базы ввести параметр для
поддержки русского языка. Неподскажите что там ввести?
2)И где можно найти русское описание команд для I.B. 5.5 и MSQL.
3) Не знаете ли как в скролинговых аркадах делают проверку соприкосновения
обьекта с землей или другими обьектами? Цветовой проверкой?
Или где можно достать исходник на любом языке (лучше или Паскаль или VB -
легче понять структуру) такой игры?
Всего наилучшего!
Triada U.I.P.
Yellow D.
yellowd@comail.ru
Ответить.
Ответ 1:
На 1:
Ответ'Нужно выполнить SQL -
UPDATE RDB$FIELDS SET RDB$CHARACTER_SET_ID = 52 WHERE RDB$FIELD_NAME =
'RDB$SOURCE''
Вопрос 133:
От: Serge V. Frolov
Вопрос:
Скажите пожалуйста как средствами Win API можно
определить наличие компьютера в сети (протокол TCP/IP) ?
Ответить.
Ответ 1:
Вопрос 134:
От: tp@pi.net.ua
чПРТПУ: Как сделать так чтобы форма не выключалась сочетанием Alt+F4 и
Ctrl+Alt+Del?
Ответить.
Ответ 1:
Alt-F4 - очень просто - поставь или Action, или
скрытый пункт меню с shortcut Alt-F4 должно помочь.
А вот для Ctrl-Alt-Del - проблема, можно добится для
Win95/98 но не на NT/2000
Но мой совет никогда не делать этого, это ОЧЧЧЧЧЕНЬ
злит пользователей когда не работают привычные
клавиши, я никогда не поставлю себе ни одной програмы
которая не обрабатывает корректно следующие
комбинации:
Ctrl-Alt-Del
Alt-F4
Ctrl-F4
Ctrl-C
Ctrl-V
Ctrl-X
Alt
Alt-Space
Alt-Tab
Ctrl-Tab
Ctrl-Esc
Ответ 2:
Попробуй объяснить компутеру, что твоя программа не просто набор команд, а настоящий
ScreenSaver:
SystemParametersInfo( SPI_SCREENSAVERRUNNING, 1, 0, 0);
Ответ 3:
Эта кнопочка включает/выключает реакцию на Ctrl-Alt-Del :
procedure TForm1.Button5Click(Sender: TObject);
begin
if i=1 then
begin
i:=0;
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, @i, 0);
Button5.Caption:='Enable CtrlAltDel';
i:=0;
end else
begin
i:=1;
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, @i, 0);
Button5.Caption:='Disable CtrlAltDel';
i:=1;
end;
end;'
Вопрос 135:
От: Sam Savinov
Вопрос:
Слышал, что многие прекращают использовать BDE и переходят
на другой движок - CodeBase (вроде так называется). Может,
кто нить слышал, что это за технология. Буду рад любой информации
по этому вопросу.
Sam
Ответить.
Ответ 1:
Вопрос 136:
От: Alexey
Вопрос:
Приветствую всех!
Пытаемся с другом осуществить чат по модему через
Serversocket и ClientSocket. Ничего не получается. ServerSocket не
"видит", что я подключился и пишет ошибки. Я тоже не могу ему ничего
послать.
Ответить.
Ответ 1:
Вопрос 137:
От: Shadow
Здравствуйте.
Мне срочно нужно узнать, как спрятать программу в трей. И
как можно ею в нем управлять.
Вы говорили, что можно из библиотеки RX - RxTrayIcon.
А кто-то мне говорил, что PGTray95
НО НЕ ОДИН МЕТОД НЕ ПОЛУЧИЛСЯ!!!!
Может напишете пример, который при нажатии на кнопку, свернёт приложение к
часам. ПЛИЗ!!!!!
С уважением Дмитрий.
Ответить.
Ответ 1:
Привет, Бросаешь на форму PopupMenu и RxTrayIcon ... и все работает.
procedure Tmain.N1Click(Sender: TObject);
begin
main.Show;
main.WindowState := wsNormal;
end;
procedure Tmain.N2Click(Sender: TObject);
begin
main.Hide;
main.WindowState := wsMinimized;
end;
Пока.
Ответ 2:
А ты внимательно почитай доку...
дело в том. что RxTrayIcon только выводит трей твоей проги и
садит функции на PopupMenu.
А при запуске проги спрячь окошко
begin
Application.ShowMainForm:=False;
ShowWindow(Application.Handle, SW_HIDE);
ShowWindow(Application.ShowMainForm.Handle, SW_HIDE);
end;
а потом когда надо его просто показывать...
Ответ 3:
Вот пример с использованием библиотеки RX. _РАБОТАЕТ_.
На форме - кнопка Button1 и невизуальный компонент RxTrayIcon1.
Надо задать для RxTrayIcon1 свойство Active=FALSE и прицепить
к свойству Icon какую-нибудь иконку.
При необходимости можно создать popup-menu и прицепить его к
RxTrayIcon. Можно сделать иконку в трее анимированной. Да
много чего ещё можно сделать... И _очень_ легко (спасибо RX).
procedure TForm1.Button1Click(Sender: TObject);
begin
RxTrayIcon1.Active:=TRUE; // показываем иконку в SysTray
Hide; // скрываем форму (её не будет и в TaskBar)
end;
procedure TForm1.RxTrayIcon1Click(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
RxTrayIcon1.Active:=FALSE; // убираем иконку из SysTray
Show; // возвращаем форму на место
end;
Вопрос 138:
От: Александр Харлов
Здравствуйте!
Подскажите, как организовать прием данных с СОМ порта?
С выводом я разобрался, а с приемом постоянные проблемы.
Я хотел бы увидеть конкретный надежно работающий пример.
Желательно настройки порта брать из установок Windows.
Спасибо за помощь.
Ответить.
Ответ 1:
Для работы с COM-портами очень рекомендую компоненту AsyncPro. Обеспечивает и приём и передачу данных
и т.д. и т.п.
В конференциях утверждают, что одна из немногих компонент, корректно работающая с нестандартным
железом на COM-портах.
Лично накропал примочку для работы самодельного контроллера.
Ответ 2:
Использую CommPortDriver
procedure Tmain.FormCreate(Sender: TObject);
begin
if CommPortDriver1.Connected = false then
begin
CommPortDriver1.Connect;
end;
end;
procedure Tmain.CommPortDriver1ReceiveData(Sender: TObject;
DataPtr: Pointer; DataSize: Cardinal);
var
st : String;
p : PChar;
mas : array[0..1000] of char;
i : Cardinal;
begin
i:=0;
st:='';
CommPortDriver1.PausePolling;
p:=DataPtr;
Move(p^,mas,DataSize);
for i:=0 to DataSize-1 do
begin
st:=st+mas[i];
end;
CommPortDriver1.FlushBuffers(true,true);
CommPortDriver1.ContinuePolling;
For i:=1 to length(st) do Memo1.Text := Memo1.Text + st[i];
end;
procedure Tmain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if CommPortDriver1.Connected then
begin
CommPortDriver1.Disconnect;
end;
end;
Вопрос 139:
От: Denis Kovaleff
Всем привет!!!
Кто знает, как создать тень от окна приложения (окно не стандартное и его
можно двигать)? Тень должна ложиться не только на Desktop, но и на другие
окна, оказавшиеся "под нашим" приложением.
Есть предложение использовать маску - изображение с Alpha-каналом
(прозрачность) или, проще говоря, изображение в режиме GrayScale -
монохромное, но нет реализации этого предложения.
Спасибо!
Ответить.
Ответ 1:
Вопрос 140:
От: ION
Я вам писал "как нужно вставить курсор в программу", вы сказли
"Используя процедуру LoadCursorFromFile". Мне не очень понятно. Можете
прислать какой-нибудь пример. Буду очень благодарен.
PS 1 можно ли вместо курсора использовать BMP?
2 Где достать Dsglntf.dcu, а то много компонентов его просят?
Ответить.
Ответ 1:
По поводу 2:
У себя на винте. .) примерно здесь: "D:\Program Files\Borland\Delphi5\Source\Toolsapi\dsgnintf.pas"
Там же и *.dcu будет.
Ответ 2:
На форме объявить const crMyCursor = 5;
На FormCreate написать следующее
Screen.Cursors[crMyCursor] := LoadCursorFromFile('filename.ani');
В процедурах:
Screen.Cursor:= crMyCursor; - форма курсора меняется
Screen.Cursor:= crDefault; возвращение к стандартному курсору
Ответ 3:
Может я и не правильно понял вопрос.
1.В режиме редактирования добавить курсор в проект и его использовать.
Создать RES файл в редакторе рессурсов и записать в нем свой курсор под
определенным именем.
Подключить этот файл в Делфине : {$R CURS.RES}.
Загружаем(в процессе выполнения) курсор через
HCURSOR := LoadCursor( hInstance, lpCursorName );
Спокойно используем HCURSOR(ссылка на курсор)
Например:
Const
crMyCursor := 5;
.............
Screen.Cursors[crMyCursor] := LoadCursor(HInstance, 'NewCursor');
Cursor := crMyCursor;
2. Загрузить курсор в режиме выполнения.
HCURSOR := LoadCursorFromFile( lpFileName ),
lpFileName - (.CUR) или (.ANI)
Вопрос 141:
От: Alexander Polenov
чПРТПУ:
1. В чем особенности цикла try?
2. Как работать с массивами array[..]? Дайте примеры программ работающих с
такими массивами.
3. Написал программу (Дельфи4) работающую с TEdit. Из двух файлов выбирает
случайные строки и складывает в третий TEdit. (То есть 2 поля Memo, где
открываются текстовые файлы из двух полей TEdit и два генератора). При
запуске окно появляется в правом нижнем углу причем края находяться вне
экрана. Как это исправить? Это проблемы кода?
Ответить.
Ответ 1:
try никогда циклом не являлся.
try .... finally ... end - блок защиты ресурсов, при возникновении исключения в блоке try..finnaly операторы в блоке finally..end
выполнятся, также она выполнтся и в случае нормально выполнения блока try
Используется в тех случаях, когда необходимо гарантированно выполнить некоторые операторы, например
try
AboutBox:= TAboutBox.Create( Application);
AboutBox.ShowModal;
finally
AboutBox.Free;
end;
В этом примере освобождение переменной AboutBox произойдет в любом случае, произойдет или нет исключение при
создании и показе формы.
try ... except ... end - блок перехвата исключения. Операторы блока except ... end исполняются только в случае
возникновения исключения.
Более подробная информация - в хелпе.
Ответ 2:
1.
Try - это не цикл а структура, используется она для избежания ошибок,
например
Try
...
(операторы1)
...
Except
...
(операторы2)
...
End;
Если при выполнении "операторов1" произошла ошибка (Exception), то их
выполнение прекращается и выполняются "операторы2". Таким образом
можно избежать многих ошибок, например, ошибки уничтожения какого-либо
компонента.
Есть еще конструкция Try...Finaly...End, насколько я помню если блок
операторов между Try и Finaly выполнился успешно, то выполняется блок
операторов между Finaly и End.
2.
Пример работы программы с массивами:
Procedure MyProc;
Var MyArray1,MyArray2:Array[1..10] of Integer;
I:integer;
Begin
For i:=1 To 10 Do
Begin
MyArray1[i]:=i;
End;
For i:=1 To 10 Do
Begin
MyArray2[i]:=MyArray1[11-i];
End;
End;
После выполнения этой процедуры получим два массива: первый имеет
длинну 10 и заполнен числами по возрастанию от 1 до 10, второй также
имеет длинну 10 и заполнен числами по убыванию от 10 до 1 (второй
массив явлается перевернутым первым).
3.
Это происходит потому, что у формы установленно свойство "показываться
как при разработке". И соответственно она так и показвается. Есть и
другие свойства показа форм. Нужно в инсперкоре объектов у формы найти
свойство WindowState (если не ошибаюсь) и установить у него нужное
значение. Там есть: Максимизировать (Maximase), Минимизировать
(Minimise), и другие (всех просто не помню). Либо при написании
программы сдвинуть окно в нужное положение.
Вопрос 142:
От: yuron
Вопрос: Как в Delphi можно сделать обмен данными по модему с удаленным
компом, не имея подключения к инету?
Ответить.
Ответ 1:
(устало) берешь Async Pro. Там есть пример терминала.
Вопрос 143:
От: sanglier
Hello, Дмитрий Владимирович Тарасов!
Большое спасибо за проявленную Вами заботу в стремлении как-то
ответить на заданный вопрос, но почему-то не напрямую.
Ваше предложение посмотреть изделие Microsoft по созданию
компилированного Help'а очень ценно, но с ним (изделием) я знаком и
не согласен с Вашей оценкой (цитирую Вас):
> справка теперь дедается именно так
В действительности "ЭТО" далеко не так.
Второе Ваше предложение относительно Helpamp&Manual тоже очень хорошее.
Это изделие из тех, о которых говорят "два в одном". За это
предложение тоже БОЛЬШОЕ СПАСИБО, но я с ним знаком.
Но все таки, как говорят французы "вернемся к нашим баранам", где же
найти что-то вроде инструкции на РУССКОМ ЯЗЫКЕ по созданию Help'а, но
не компилированного (с расширением .chm), а обычного в виде книжек (с
расширением .hlp)?
Неужели ничего такого в РУНЕТЕ нет?
Большое спасибо за внимание, терпение и быстрые ответы.
С уважением,
--
Best regards,
Вячеслав Макарович mailto:sanglier@mail.ru
Ответить.
Ответ 1:
Есть отличная система для создания хелпов:
Help Development Studio
Ее можно скачать по адресу: www.chat.ru\~ijus-dev
Ответ 2:
Мне, напрмер, очень нравится HelpScribble. Если не знаете, то это - Delphi
для создания HELPо'в.
Ответ 3:
Перед тем как писать программу имитирующую форматирование диска, нужно
хотя-бы раз отформатировать свой и обратить внимание на то что винт во время
форматирования не звенит.
А для обеспечения имитации достаточно будет читать в цикле какой-то файл,
например своп Windows, ну а если звон очень сильно нужен, то читай его не
подряд а случайным образом.
Вопрос 144:
От: Александр Мордовский
Вопрос:
Как организовать DBGrid, который мог бы отображать и редактировать
поля типа boolean как чекбоксики(а не как стандартный true/false).
Заранее спасибо, Александр
Ответить.
Ответ 1:
DBCtrlGrid
Ответ 2:
в запросе выведи их как "Ц" и " " (true, false соответственно) и поставь шрифт в столбце DBGrid Symbol ... и все дела.
Ответ 3:
http://www.farpost.com/personal/dmitryb/RUS
<http://www.farpost.com/personal/dmitryb/RUS>
Прекрасный DBGRID
Возми там компонент EhLib
Очень рекомендую !!!
Вопрос 145:
От: "ИВЦ сельского хозяйства"
Добрый день!
Для копирования файлов я использую предложенную мне процедуру -
procedure TForm1.Button1Click(Sender: TObject);
var
OpStruc: TSHFileOpStruct;
frombuf, tobuf: Array [0..128] of Char;
Begin
FillChar( frombuf, Sizeof(frombuf), 0 );
FillChar( tobuf, Sizeof(tobuf), 0 );
StrPCopy( frombuf, 'h:\hook\*.*' );
StrPCopy( tobuf, 'd:\temp\brief' );
With OpStruc DO Begin
Wnd:= Handle;
wFunc:= FO_COPY;
pFrom:= @frombuf;
pTo:=@tobuf;
fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION;
fAnyOperationsAborted:= False;
hNameMappings:= Nil;
lpszProgressTitle:= Nil;
end;
ShFileOperation( OpStruc );
end;
Но после изменения файлов при повторном копировании копии файлов имеют
первоначальный вид (как при первом копировании). Может что-то где-то
надо очищать?
С уважением Romales
Ответить.
Ответ 1:
Ой! Зачем же так сложно. Может проще просто взять
copyfile процедуру из RxLib?
Вопрос 146:
От: "ИВЦ сельского хозяйства"
Доьрый день!
Подскажите пожайлуста, где можно скачать документацию по WinAPI?
С уважение Romales
Ответить.
Ответ 1:
Вопрос 147:
От: Сергей Рубаненко
Добрый день Дмитрий Владимирович!
У меня в процессе работы созрел следующий вопросик
Как запустить одновременно два независимых процесса на одной форме,
знаю, что это можно сделать при помощи API функций, но не знаю как точно.
Пример: Имеется база данных, в которую постоянно по мере прохода цикла записываются данные, которые отображаются на форме в DBGrid, выход из цыкла должен осуществляется только по нажатию клавиши на этой форме, но сделать это тяжеловато потому как она просто недоступна, пока крутится цикл.
С уважением Сергей из Харькова.
Ответить.
Ответ 1:
Привет, земляк. .)
Я думаю, что CreateThread тебе поможет. Почитай в хелпе про него.
Ответ 2:
В данном случае все очень просто, не нужны никакие 2
процесса, просто ваша форма не обрабатывает события
потому что в цикле вы просто не даете ей этого
сделать!
Поставьте application.processmessages в цикл и у вас
форма все будет обрабатывать!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
StartLoop: TButton;
Stop: TButton;
procedure StartLoopClick(Sender: TObject);
procedure StopClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Canceled:boolean;
implementation
{$R *.DFM}
procedure TForm1.StartLoopClick(Sender: TObject);
var i:integer;
begin
Canceled:=false;
i:=0;
repeat
//my loop
// делаем что-нибудь, например меняем заголовок
формы
inc(i);
Form1.caption:=inttostr(i);
application.ProcessMessages;//вот где собака
зарыта!
until Canceled;
end;
procedure TForm1.StopClick(Sender: TObject);
begin
Canceled:=true; //прервет цикл
end;
end.
Вопрос 148:
От: Алексей Малиновский
Добрый день, господа программисты!
Делаю программу с выводом графиков в реальном времени, с помощью TChart.
У меня там созданы 4 серии типа Bar (TBarSeries). Так, вот вопрос: как
мне добраться до цвета (мне необходимо его изменить) линии (Border)
какой-то определённой серии, зная номер серии?
Предложение такое (num - номер серии): Chart1.Series[num].... (но дальше
я ничего по этому поводу в help'e не нашёл :-( ).
Господа, может кто-то с этим уже сталкивался, или кто-то знает, или
предполагает как правильнее это сделать - ПОМОГИТЕ!
Заранее благодарен за ответы.
С уважением, Алексей.
Ответить.
Ответ 1:
Для того чтобы заранее знать цвета вновь создаваемых серий
нужно предопределить цвета в массиве ColorPalette компонента
TChart.
Например для 5 первых серий (можно в Create формы):
ColorPalette[1] := clRed;
ColorPalette[2] := clGreen;
ColorPalette[3] := clNavy;
ColorPalette[4] := clBlue;
ColorPalette[5] := clPurple;
Ответ 2:
У меня это делается так:
if ColorDialog.Execute
then
FormGraph.Chart.Series [i].SeriesColor := ColorDialog.Color;
Series: TLineSeries; (или TBarSeries - не важно)
Chart: TChart;
Короче, совсем просто.
Ответ 3:
Chart1.Series[num].SeriesColor := clYellow ; // or any other colour from TColo
Вопрос 149:
От: Olta Konstantin
чПРТПУ: Сетевая программка работает с DBF- файлами (лежат на сервере под
NETWARE). Иногда на локальной машине выполняют операции, которые требуют
эксклюзивного права на файлы. Как прочим пользователям, работающим с
данной программкой послать мессагу о том, что необходимо выйти из
программки (закончить работу с базой данных). Желательно получить код.
Ответить.
Ответ 1:
Проще всего просто отслеживать ошибки - так как другие
пользователи не могут работать с базой...
А вообще, надо переходить на что-нибудь серверное- и
работать стабильнее будет, и быстрее и проблемы эти
исчезнут - сервер будет следить за транзакциами.
Вопрос 150:
От: Матигуллин Рустем Рашитович
Вопрос по Qreport.
Не подскажет ли кто, как в компоненте QRDBText узнать перед печатью
сколько пикселов занимает выводимая на печать строка , для того чтобы
управлять количеством выводимых строк.
Заранее благодарен.
mrr@kamlit.ru
Ответить.
Ответ 1:
Вопрос 151:
От: Ернар Шамбаев
чПРТПУ:
Уважаемые господа программисты!
Кто-нибудь занимался написанием софта для видеокамеры?
Или, может, кто-нибудь порекомендует хорошие странички
по данному вопросу?
Ответить.
Ответ 1:
Вопрос 152:
От: Алексей Малиновский
Здраствуйте господа!
Делаю установочную программу с помощью InstallSheild, и когда я делаю
путь песвдонима на русском языке, то при загрузке программы происходит
ошибка, т.е. BDE не видит это директории.
Если посмотреть в bdeadmin, то у этого псевдонима вместо пути БД
какая-то белеберда...
Если же мы вручную в bdeadmin пропишем путь на русском языке, то всё
работает; если же делать это с помощью InstallShield, то не работает
(когда только путь на русском языке).
Подскажите господа, что делать?
С уважением, Алексей.
Ответить.
Ответ 1:
Вопрос 153:
От: Алексей Малиновский
Господа программисты, подскажите с помощью какой API ф-ии можно
установить флаг DTR и RTS в активное состояние для определённого
COM-порта.
Спасибо за ответы...
С уважением, Алексей.
Ответить.
Ответ 1:
После открытия com-порта через CreateFile() необходимо с помощью
GetCommState() и SetCommState() установить параметры порта (в частности
убрать автоуправление RTS и DTR). Затем для установки соответствующих
сигналов используется функция EscapeCommFunction().
Пример:
===========================================
Procedure ControlRTS;
Var S:String;
lDCB:TDCB;
fHandle:THandle;
Begin
S:='COM1';
// откроем порт
fHandle:=CreateFile( Pchar(S), GENERIC_READ Or GENERIC_WRITE, 0,
Nil, OPEN_EXISTING, 0, 0);
If fHandle=INVALID_HANDLE_VALUE Then
Begin
// Не смогли открыть....
Exit;
End;
// прочитаем его установки
If Not GetCommState( fHandle, lDCB) Then
Begin
// не прочитали
Exit;
End;
// Fill dcb
lDCB.BaudRate:=CBR_2400;
lDCB.ByteSize:=8;
lDCB.Parity:=NOPARITY;
lDCB.StopBits:=ONESTOPBIT;
// !!!! Здесь мы указываем что будем управлять RTS сами!!!
ldcb.Flags:=(ldcb.Flags And $FFFFC0FF) Or $00000100;
// Set comm state
SetCommState( fHandle, ldcb);
// А здесь можно управлять
// сбросим RTS
EscapeCommFunction( fHandle, CLRRTS);
// Установим RTS
EscapeCommFunction( fHandle, SETRTS);
// Close port
CloseHandle(fHandle);
fHandle:=0;
End;
=============================
Удачи. Slava V.
P.S. Надо заметить, что все выходы com-порта являются инверсными. А это
значит, что активным сосотоянием порта является 0, а неактивным 1.
Ответ 2:
Есть два варианта:
1. используй структуру DCB - поля fDtrControl=DTR_CONTROL_ENABLE и
fRtsControl=RTS_CONTROL_ENABLE, и функцию SetCommState(handle, DCB);
или
2. используй функцию EscapeCommFunction(handle, func),
где func - SETDTR, SETRTS
Вопрос 154:
От: Кабанов Артур Александрович
Вопрос:
Как узнать значение fsBold в DBGrid3.Columns[0].Title
Пробовал:
DBGrid3.Columns[0].Title.Font.Style:=[fsBold];
Значение изменяется на противоположное, а мне надо именно присвоить
fsBold:=False
Ответить.
Ответ 1:
Ну, это не вопрос...
Просто правильнее будет устанавливать или отменять fsBold следующим образом:
DBGrid3.Columns[0].Title.Font.Style:=DBGrid3.Columns[0].Title.Font.Style+[fs
Bold]; (установить)
DBGrid3.Columns[0].Title.Font.Style:=DBGrid3.Columns[0].Title.Font.Style-[fs
Bold]; (снять)
Ответ 2:
Свойство Font.Style является множеством, для того чтобы шрифт был не жирным надо исключить из Font.Style значение
fsBold.
Вас наверное ввел в заблуждение способ отображения множеств в ObjectInspector.
Ответ 3:
Узнать значение fsBold в DBGrid3.Columns[0].Title можно с помощью оператора in:
if fsBold in DBGrid3.Columns[0].Title.Font.Style then ... fsBold=TRUE
Присвоить значение fsBold:=FALSE можно следующим образом:
DBGrid3.Columns[0].Title.Font.Style:=DBGrid3.Columns[0].Title.Font.Style-[fsBold];
Вопрос 155:
От: Кабанов Артур Александрович
Вопрос:
При компиляции и последующем запуске программы из Delphi периодически
виснет программа и сама Delphi, но только где используются отчеты.
Пробовал поставить QuickReport 3.0.8 тоже самое.
У меня: DelphiEnterpriseVersion 5.0 (Build 6.18) UpdatePack1
QuickReport Version 3.0.8
Ответить.
Ответ 1:
3. Ищу подельника.
------------------
Astanin Dmitry:
Ищу желающих помочь мне в создании программы, обеспечивающей
одновременный доступ нескольких пользователей с
разных компьютеров в лок. сети (в этом я вообще чайник) и аудит
событий с сохранением результатов в защищенном
файле .. Дима kinch-ch@mail.ru
Лобастов Николай:
Здравстуйте, господа программисты.
У меня в голове куча идей, только не знаю куда с ними сунуться.
Два дня назад пришел к одному выводу и хочу с вами
поделиться. Может кто уже так делает. Может кто дельный совет даст.
Я работаю в банке в отделе разработки и столкнулся с тем, что мы часто
повторяемся в написании каких-то вещей.
Что такое хоз. деятельность любой организации? Это производство мат.
ценностей или услуг и ведение учета и отчетности. К чему сводится
отчетность? К документообороту. Что такое документ? Это объект с набором
свойств и методов. Никому не приходилось создавать компоненты TDocument,
TPlategka, TPKO, TRKO? Можно описать такие свойства как база данных, таблица,
номер, дата, название, методы такие как создать документ, провести документ,
распечатать документ и все это разместить на палитре компонент. И при
разработке чего-то еще нового в организации или в какой-то
фирме для организации просто кидаешь их на форму или в датамодуль
и описываешь реакцию на события.
Такая библиотека сильно облегчит автоматизацию предприятия, а разработчикам
поможет заработать кучу денег. Ведь это же златая кладезь.
Жду ответов и предложений. - Lobastov@kedr.kts.ru
Если Вы хотите как можно скорее получить ответ на свой вопрос, то
укажите в теме письма - delphiV,иначе письмо будет прочитано значительно
позже, если же у вас есть предложения то в теме письма укажите delphiP.
Для интересующихся - немного о себе. Работаю на
железнодорожном транспорте ведущим программистом.
Основные мои разработки это сбор и доставка клиентам
информации о вагонах и поездах: где находится(по России),
куда едет. В связи с этим программировал для e-mail,Socket,БД,ISAPI.
За сим прощаюсь - скорых Вам и качественных программ.
Автор рассылки - Дмитрий.
ICQ - 89533941.
ВСЕ ВОПРОСЫ СПРОСИТЬ ПРЕДЛОЖИТЬ АРХИВЫ СКОЛЬКО НАС
http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Рейтингуется SpyLog |
В избранное | ||