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

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


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

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

Выпуск № 816
от 21.05.2007, 13:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 472, Экспертов: 88
В номере:Вопросов: 9, Ответов: 16


Вопрос № 86972: Я написал на Delphi программу типа Client-Server, которая обменивается сообщениями. Когда программа запускается первый раз, то все работает отлично, а если запускаю по второму разу Client или Sevre? то выдает ошибку: Asyncronous socket error 10061. Ч...
Вопрос № 86996: Здравствуйте Уважаемые эксперты. Пишу, что-то типа курсовой... в общем жалкое подобие курсовой. Училке вот видишь ли захотелось. В общем. Я к программе подключили компоненты скинов. Все работает (уже делал не одну программу с ними)....
Вопрос № 86998: Здравствуйте уважаемые программисты! Будьте добры подскажите, пожалуйста, почему у меня в приложении при выполнении определенной команды вылетает сообщение об ошибке такого вида: Мол приложение вызвало ошибку в EOleSysError с сообщением «Не б...
Вопрос № 87005: Здравствуйте товарищи! Подскажите пожалуйста, как узнать координаты в пикселах курсора в TEdit или TMemo? Заранее спасибо....
Вопрос № 87038: Здраствуйте!!! У меня не большая проблема и поэтому прошу вас помочь, необходимо написать программу, которая будет переводить число десятичной системы в восьмеричную, как целую, так и дробную ее часть, а также программа проверяла, чтобы вводили именн...
Вопрос № 87090: Здравствуйте, эксперты. При симуляции нажатия клавиш мыши я использую Mouse_Event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); или SetCursorPos(X,Y); SendMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, 0). Вопрос: как выпольнить симуляцию нажатия клави...
Вопрос № 87096: Уважаемые эксперты! Может у кого-нибудь есть опыт в использовании архивации в программе? Желательно код с использованием ZIP, RAR, 7z. Код может быть и с использованием внешних длл. Заранее благодарен!...
Вопрос № 87114: Доброе утро Уважаемые эксперты. У меня на форме есть StringGrid, состоящая из 2 столбцов. Как можно построить график функции, заданной точками, координаты которых указаны в StringGrid. Есть ли компоненты для вывода графической информации на экран...
Вопрос № 87135: Здравствуйте, уважаемые Эксперты! Скажите как из программы скопировать саму программу, но с другим именем? Т.е. есть у меня программа proj1.exe, мне надо чтобы она скопировала себя же в proj2.exe. P.S. Кажется это просто......

Вопрос № 86.972
Я написал на Delphi программу типа Client-Server, которая обменивается сообщениями. Когда программа запускается первый раз, то все работает отлично, а если запускаю по второму разу Client или Sevre? то выдает ошибку: Asyncronous socket error 10061. Что это за ошибка.
Отправлен: 15.05.2007, 13:08
Вопрос задал: Soadbest (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gladiator
Здравствуйте, Soadbest!
Либо сервер у вас при выходе клиента накрывается либо некорректно отсоединяетесь.

Приложение:

Ответ отправил: Gladiator (статус: 9-ый класс)
Ответ отправлен: 15.05.2007, 14:18

Отвечает: PGM
Здравствуйте, Soadbest!

Эта ошибка появляется если Сервер закрыл сокет и больше не слушает его. Скорее всего вы закрываете на Сервере сокет, а не соединение, при отсоединении клиента, что и приводит к таким результатам.

Вот ниже выдержка из MSDN по ошибке:

Приложение:

Ответ отправил: PGM (статус: 7-ой класс)
Ответ отправлен: 15.05.2007, 17:48


Вопрос № 86.996
Здравствуйте Уважаемые эксперты.

Пишу, что-то типа курсовой... в общем жалкое подобие курсовой. Училке вот видишь ли захотелось.

В общем. Я к программе подключили компоненты скинов. Все работает (уже делал не одну программу с ними). Сейчас же мне захотелось, чтоб программа сама выводила возможные скины на выбор.

Т.е. Есть Меню (TMainMenu) в нем пункт Скин (ID 1 т.к. идет Файл, Скин, Помощь). Написал процедуру, чтоб узнать количество файлов в каталоге с указанным расширением. Работает :)

Далее циклом For через процедуру (в приложении) создаю новые пункты AddSubiIem(GetNextFileName('skins'),1);.

Функция GetNextFileName возвращает следующее имя файла в каталоге. Там тоже все работает.

AddSubItem - тоже работает. Создает меню. Куча новых пунктов, прям как и надо.

Но тут проблемы в количестве 2-х штук:
1) Меню все выводиться сплошняком... т.е. нет прокрутки. У меня сейчас только 30 скинов а могу и больше сделать... будет ужасно смотреться. Во весь экран. Как это можно реализовать... или это я уже что-то забыл изначально в настройках TMainMenu?
2) Разумеется при нажатии на какой-то пунк меню должен загружаться новый скин... как загрузить я знаю. Но я же не знаю сколько у меня будет новых пунктов. И для не созданных пунктов нельзя писать процедуру обработки. Скажите плиз как обработать для них элементарный OnClick?
3) Это так на десерт. Как сделать все новые пункты с флажками? Т.е. на один нажимаешь флажок загорелся, а на дургом убрался.

Приложение:

Отправлен: 15.05.2007, 15:06
Вопрос задал: Сарумян (статус: 5-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 6)

Отвечает: Ерёмин Андрей
Здравствуйте, Сарумян!
2) Чтобы обрабатывать события компонент, созданных динамически, нужно объявить процедуру с аналогичными параметрами и затем присвоить её имя событию созданного компонента. Для того, чтобы узнать, какой пункт нажат, можно, например, использовать свойство Tag - записывать в каждый созданный пункт меню его порядковый номер, который затем легко прочитать. См. пример в приложении. Процедура MenuItemClick - это обработчик события, а по нажатию Button1 создаются 10 пунктов меню. При выборе любого из пунктов в заголовке окна появляется надпись "Выбран пункт №..."
3) Можно применить ту же самую технологию, что и в п.2 - обрабатывать OnClick.
Желаю удачи!

Приложение:

---------
Нет правила без исключений. Правило без исключений - исключение из правил.

Ответ отправил: Ерёмин Андрей (статус: Профессор)
Россия, Тула
WWW: Программирование на Delphi. Помощь, советы, обмен опытом.
ICQ: 286837644
----
Ответ отправлен: 15.05.2007, 15:20
Оценка за ответ: 5
Комментарий оценки:
Ох ну и намучался же я, пока понял что к чему... все какие то лишние ошибку выдавал Дельфин.
А кстати на счет Tag, он мне не понадобиться :) У меня имя пункта берется как название файла минус '.skn', т.е. чтоб загрузить скин надо всего лишь дописать к заголовку расширение. А за пищу к размышлению большое спасибо.

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

1. свежесозданному пункиу меню (каждому 10 например) установите свойство NewItem.Break := mbBreak или
NewItem.Break := mbBarBreak
- следующие пункты мею будут выводится в новом столбце (во втором слусае - между ними будет разделитель)
2. Создаете в любом разделе описания класса процедуру вида
procedure OnSkinClick(Sender: TObject),
в разделе implementation модуля - его реализацию
и каждому свежесозданному пенкту меню устанавливаете обработчик:
NewItem.OnClick := OnSkinClick;
3. NewItem.RadioItem := True;

Ответ отправил: Лукьяненко Алексей Валериевич (статус: 8-ой класс)
Ответ отправлен: 15.05.2007, 15:37
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за ответ. Хотя с флажками придеться еще думать... Да и с выводом разграниченным тоже. Но 5 ставлю, не за то что, дали ответ, а за то что дали пищу для размышления. Куда как лучше самому понять как все работает нежели копи-паст совершать бездумно.


Вопрос № 86.998
Здравствуйте уважаемые программисты!
Будьте добры подскажите, пожалуйста, почему у меня в приложении при выполнении определенной команды вылетает сообщение об ошибке такого вида:
Мол приложение вызвало ошибку в EOleSysError с сообщением «Не был произведен ваызов CoInitialize.»
Ошибка в строке:
ExcelApp:=CreateOleObject('Excel.Application');
Переменная ExcelApp объявлена как Variant, в uses модуля подключены модули ComObj и ActiveX, все как положено при создании Com-объекта. А все это написано в процедуре нажатия кнопки. Если создаю Com-объект в отдельном проекте все ОК. Как быть?
Премного благодарен за ответы.
Отправлен: 15.05.2007, 15:24
Вопрос задал: Bvg82 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 5)

Отвечает: PGM
Здравствуйте, Bvg82!

Потому что стоит явно вызывать метод CoInitialize, когда работаете с COM/Ole объектами "до" любого обращения к COM объекту. А в конце работы вызывать CoUninitialize. Возможно в вашем случае где-то этот вызов неявно присутствует - поэтому при определенных условиях все работает. Имейте также ввиду, что работа с COM объектом из потока, также требует вызова данной пары методов и в потоке, независимо от того вызывали ли вы их в основном приложении.
Ответ отправил: PGM (статус: 7-ой класс)
Ответ отправлен: 15.05.2007, 17:56
Оценка за ответ: 5
Комментарий оценки:
Спасибо, что натолкнули на правильную мысль, проблема решилась за 5 секунд, в файле проекта отсутствовала строчка application.initialize
При ее добавлении все работает :)


Вопрос № 87.005
Здравствуйте товарищи!

Подскажите пожалуйста, как узнать координаты в пикселах курсора в
TEdit или TMemo?

Заранее спасибо.
Отправлен: 15.05.2007, 15:56
Вопрос задал: _porodox_ (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 4)

Отвечает: ~Steep~
Здравствуйте, _porodox_!

Можно рассчитать: берем позицию курсора на главной форме и вычитаем позицию крайнего левого угла TEdit или TMemo (Top, Left)
---------
Все всегда делаеться к Лучшему!
Ответ отправил: ~Steep~ (статус: 7-ой класс)
Ответ отправлен: 15.05.2007, 16:13
Оценка за ответ: 3

Отвечает: PGM
Здравствуйте, _porodox_!

Если имеется ввиду не мышиный курсор (для него GetCursorPos), а то что называется "каретка" в тексте, то используйте GetCaretPos, он вернет клиентские координаты относительно текущего элемента (т.е. того который в фокусе и в котором мигает "каретка").
Ответ отправил: PGM (статус: 7-ой класс)
Ответ отправлен: 15.05.2007, 18:02
Оценка за ответ: 5


Вопрос № 87.038
Здраствуйте!!! У меня не большая проблема и поэтому прошу вас помочь, необходимо написать программу, которая будет переводить число десятичной системы в восьмеричную, как целую, так и дробную ее часть, а также программа проверяла, чтобы вводили именно число.
Отправлен: 15.05.2007, 18:55
Вопрос задал: FallenAngel (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Coupler
Здравствуйте, FallenAngel!
Текст программы полностью в приложении. Проверка на ввод только чисел осуществляется следующим образом: просто запрещаем вводить в Edit все символы, кроме цифр и одной запятой. Число цифр в дробной части такое же, как и у числа в десятичной системе, но это можно убрать, если нужно (строку lendr := length(edit1.Text) - pos(',', edit1.Text); заменить, например, на lendr := 5; - будет 5 цифр после запятой). Связано это с тем, что число цифр в дробной части может быть бесконечным.

Приложение:

Ответ отправил: Coupler (статус: Студент)
Ответ отправлен: 16.05.2007, 14:46
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо за ответ, программа написана и работает просто отлично, были небольшие проблемы с StdCtrls, но думаю из-за разных версий среды Delphi, я удалили этот модуль и все заработало, Delphi его автоматически сам подключил, не знаю в чем проблема, думаю сама среда косячит!!! еще раз спасибо ;)


Вопрос № 87.090
Здравствуйте, эксперты.
При симуляции нажатия клавиш мыши я использую Mouse_Event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); или
SetCursorPos(X,Y); SendMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, 0).
Вопрос: как выпольнить симуляцию нажатия клавиш мыши одновременно с нажатием, например, Ctrl+Alt?
Т.е. как будто мы удерживаем Ctrl(ssCRTL: TShiftState) и Alt(ssAlt: TShiftState), потом щелкаем LBUTTON, и отпускаем Ctrl и Alt.
Спасибо.
Отправлен: 15.05.2007, 23:49
Вопрос задал: Ренат Байрамгулов (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss

Здравствуйте, Ренат Байрамгулов!

Для этого нужно применять эмуляцию нажатия кнопок (keybd_event - по применению очень похожа на mouse_event):

// Нажатие кнопки ALT (левой)
keybd_event(VK_LMENU, 45, KEYEVENTF_EXTENDEDKEY, 0);
// Нажатие кнопки CTRL (левой)
keybd_event(VK_LCONTROL, 45, KEYEVENTF_EXTENDEDKEY, 0);
// Нажатие кнопки мыши (левой)
mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
// Отжатие кнопки мыши
mouse_event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
// Отжатие кнопки CTRL
keybd_event(VK_LCONTROL, 45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
// Отжатие кнопки ALT
keybd_event(VK_LMENU, 45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);

- приблизительно так.

Удачи!
Ответ отправил: Denisss (статус: Профессионал)
Россия, Москва
WWW: Хлама много, по сути ничего...
ICQ: 281599577
----
Ответ отправлен: 16.05.2007, 00:36
Оценка за ответ: 5
Комментарий оценки:
Огромное спасибо!

Отвечает: VinipuX
Здравствуйте, Ренат Байрамгулов!

Попробуй, сам честное слово не пробовал, но по содержимому вроди умеет нажимать нужное.

Функция SendKeys этого юнита, эмулиреут нажатие клавиши для лююого активного приложения
Для активизации приложения ивпользуйте функцию AppActivate

Зависимости: SysUtils, Windows, messages
Ссылка ниже.
http://delphirus.com/modules.php?name=Pages&pa=showpage&pid=997
Ответ отправил: VinipuX (статус: 2-ой класс)
Ответ отправлен: 17.05.2007, 03:26


Вопрос № 87.096
Уважаемые эксперты!

Может у кого-нибудь есть опыт в использовании архивации в программе? Желательно код с использованием ZIP, RAR, 7z. Код может быть и с использованием внешних длл.

Заранее благодарен!
Отправлен: 16.05.2007, 00:47
Вопрос задал: LEXASOFT (статус: 4-ый класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 8)

Отвечает: Louken
Здравствуйте, LEXASOFT!

Попробуйте поискать в инете компонент ZipTV. С ним должны поставляться и демки, т.е. архиваторы, менеджеры архивов и др. У меня например дистрибутив этого компонента называется "ZipTV_d7_u7.0.6.exe".
Ответ отправил: Louken (статус: 2-ой класс)
Ответ отправлен: 16.05.2007, 01:42
Оценка за ответ: 5
Комментарий оценки:
Спасибо нашел на http://www.ziptv.com/

Отвечает: LanK
Здравствуйте, LEXASOFT!

Я использовал в своей программе TZipMaster Freeware Delphi Zip v1.73

Минус... в том, что "с собой" надо таскать zip.dll / unzip.dll :( но Free!

Пример распаковки в приложении. Запаковка аналогично.
В версии 1,73 было 9 демо примеров :).

Приложение:

---------
Пусть все будет хорошо! Давайте жить дружно! :) И будет жить еще лучше!

Ответ отправил: LanK (статус: Студент)
Ответ отправлен: 16.05.2007, 13:17
Оценка за ответ: 5
Комментарий оценки:
Большое спасибо!

Отвечает: Sattar
Здравствуйте, LEXASOFT!
Для архивацыи можна использовать WinRAR. Управление архивацыей можно управлять через передаваемые параметры.
Примеры:
Первый пример создаст архив всех файлов c папки c:data и сохранит под именем c:ackup.rar
Второй пример создаст папку c: ewdata и туда поместит файлы с архива c:ackup.rar
Для более детальной работы прочытайте справку по консольным командам в WinRar.

Приложение:

Ответ отправил: Sattar (статус: 3-ий класс)
Ответ отправлен: 17.05.2007, 20:02
Оценка за ответ: 5


Вопрос № 87.114
Доброе утро Уважаемые эксперты.
У меня на форме есть StringGrid, состоящая из 2 столбцов. Как можно построить график функции, заданной точками, координаты которых указаны в StringGrid. Есть ли компоненты для вывода графической информации на экран или ActiveX.
Отправлен: 16.05.2007, 08:13
Вопрос задала: Pns (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Gh0stik
Здравствуйте, Pns!

Конечно есть - допустим компонент Chart (вкладка Additional).

Расположите компонент Chart на форме, далее вызовите контекстное меню компонента и выбирете пункт Edit Chart, далее в появившемся окошке нажимаете кнопочку Add и выбираете тип Fast Line. На этом настройку компонента закончим.

Далее Вам будет достаточно добавить такой обработчик который построит график по известным парам точек, которые записаны в StringGrid1:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i:integer;
begin
with StringGrid1 do
for i:=0 to RowCount-1 do
Series1.AddXY(StrToInt(Cells[0,i]),StrToInt(Cells[1,i]),'',clTeeColor);
end;


Обращаю Ваше внимание на то что метод AddXY() - работает только с целыми числами, потому Вам дополнительно потребуется сделать дополнительные преобразования если значения дробные (привести их к целому типу).

Также прикрепляю к ответу код с программой, которая строит график функции f(x)=x2, координаты точек принадлежащие графику предварительно заношу в StringGrid1.

Good Luck!!!

Приложение:

Прикреплённый файл: Загрузить >>
Срок хранения файла на сервере RusFAQ.ru составляет 30 суток с момента отправки ответа.
---------
Господь Бог - это всего лишь сверхмощный генератор случайных чисел, в соответствии с которыми сочетаются события на Земле. Генератор случайных чисел - и только.

Ответ отправил: Gh0stik (статус: Профессионал)
Украина, Славянск
Организация: Славянский государственный педагогический университет (Кафедра алгебры)
ICQ: 289363162
----
Ответ отправлен: 16.05.2007, 12:24
Оценка за ответ: 5
Комментарий оценки:
Спасибо.все работает.


Вопрос № 87.135
Здравствуйте, уважаемые Эксперты!

Скажите как из программы скопировать саму программу, но с другим именем? Т.е. есть у меня программа proj1.exe, мне надо чтобы она скопировала себя же в proj2.exe.

P.S. Кажется это просто...
Отправлен: 16.05.2007, 10:54
Вопрос задал: LanK (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: W@NDeReR
Здравствуйте, LanK!

CopyFile('Proj1.exe','C:Proj2.exe',false);

//Proj1.exe - исходный файл
//C:Proj2.exe - путь и конечное название файла куда скопировать
//False - будет или нет перезаписан файл, если таковой уже существует (true - не будет, false - будет перезаписан).
---------
Опыт — дитя мысли, а мысль — дитя действия. Нельзя учиться по книгам.
Ответ отправил: W@NDeReR (статус: 4-ый класс)
Ответ отправлен: 16.05.2007, 11:21
Оценка за ответ: 5
Комментарий оценки:
верно, спасибо! Чего то я совсем запамятовал :). FileExist помню, а Copy забыл :).

Отвечает: Elpher2006
Здравствуйте, LanK! Воспользуйтесь функцией CopyFile. Пример в приложении.

Приложение:

---------
Не делай другим того, чего сам не хочешь испытать!

Ответ отправил: Elpher2006 (статус: 1-ый класс)
Ответ отправлен: 17.05.2007, 04:58


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

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

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

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

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


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


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100

В избранное