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

Delphi - проблемы и решения

  Все выпуски  

Проблемы и решения в Delphi


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Проблемы и решения в 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

В избранное