Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» FAQ по Borland C++ Builder

Автор: IgorXI
Дата сообщения: 11.10.2006 05:16
dyr farot
Parent::Method(...);

Это не совсем то, что я хотел, Parent, насколько я понял - это свойство TControl, оно отвечает за принадлежность контрола контейнеру, а мне нужно вызвать из перекрывающей виртуальной функции перекрываемую.
Автор: Abs62
Дата сообщения: 11.10.2006 07:48
IgorXI
Вместо Parent надо писать имя класса, метод которого вызывается. "inherited" в BCB нет, надо указывать явно.
Автор: IgorXI
Дата сообщения: 11.10.2006 08:44
dyr farot
Abs62
Спасибо, действительно так и есть, не сразу понял.
Автор: bandyn
Дата сообщения: 11.10.2006 08:49
Есть программа, она обрабатывает некий код на клике Button1
Вопрос: Как мне вызвать функцию void __fastcall TFMain::Button1Click(TObject *Sender)
при старте программы, а именно из void __fastcall TFMain::FormShow(TObject *Sender)
С этим никогда не сталкивался.... плиз
Автор: ryambler
Дата сообщения: 11.10.2006 18:31
bandyn

Цитата:
Вопрос: Как мне вызвать функцию void __fastcall TFMain::Button1Click(TObject *Sender) при старте программы, а именно из void __fastcall TFMain::FormShow(TObject *Sender)

Если я правильно тебя понял, то тебе нужен такой код:
void __fastcall TFMain::FormShow(TObject *Sender)
{
...
FMain->Button1->Click();
...
}
Вот и все)
Автор: 6epcepk
Дата сообщения: 12.10.2006 01:36
Задача: при нажатии hotkey в приложении передается выделенный текст (в браузере).
Дела так:
1. Программа висит в трее, горячие клавиши вызывают определенную функцию.
2. В функции:

Код: HWND h = GetForegroundWindow();
HWND h2 = FindWindowEx(h, 0, "TEdit", "");
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event('D', 0, 0, 0);
keybd_event('D', 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Автор: ShIvADeSt
Дата сообщения: 12.10.2006 02:18
6epcepk

Цитата:
Все. Теперь выделенный текст в буфере. Все работает с выделенным текстом в Edit'ах. Мне нужно получить текст из окна браузера. С TLabel не получается.

TLabel - это рисунок на форме, а не контрол, у нее даже хэндла нету и не будет. Ищи Static вроде так называется.
Автор: spike
Дата сообщения: 12.10.2006 08:44
я делаю так
[code]
void __fastcall TFMain::FormShow(TObject *Sender)
{
...
Button1Click(FMain);
...
}
[\code]
Автор: 6epcepk
Дата сообщения: 12.10.2006 09:48
Немного наврал в предыдущем посте. Делал копирование следующим образом:

Код: SendMessage(h2, WM_COPY, 0, 0);
Автор: ShIvADeSt
Дата сообщения: 13.10.2006 00:55
6epcepk

Цитата:
Нашел компонент StaticText, но все равно не работает копирование.

и не будет, для статика (да и для едита) используй GetWindowText (не смущайся насчет Window) в винде любой контрол - окно.
Автор: 6epcepk
Дата сообщения: 13.10.2006 08:57
ShIvADeSt

Цитата:
Функция GetWindowText копирует текст заголовка определяемого окна (если окно имеет его) в буфер. Если заданное окно является органом управления, копируется его текст. Однако функция GetWindowText не может извлекать текст органа управления в другом приложении.

Это я взял из описания. Да и как получить "дескриптор окна или элемента управления с текстом"..
Автор: vidic777
Дата сообщения: 14.10.2006 03:15
Доброй ночи

Подскажите а есть ли в BDS 2006 такое же окошко при открытии *.dpk или *.bpk файлов как в Delphi 7 или в C++Builder 6 с кнопками Cjmpile и Install а если нету то как правильно ставить компоненты или где об этом можно прочесть чтоб не захламлять топик простыми вопросами. (Три дня назад поставил BDS 2006 и теперь пытась перейти на него с C++Builder 6).

Заранее спасибо
Автор: Abs62
Дата сообщения: 14.10.2006 20:56
6epcepk

Цитата:
Однако функция GetWindowText не может извлекать текст органа управления в другом приложении.

Тогда SendMessage c сообщением WM_GETTEXT.

Цитата:
Да и как получить "дескриптор окна или элемента управления с текстом"..

Это тот самый хэндл, которому в первоначальном варианте посылалось WM_COPY.
Автор: 6epcepk
Дата сообщения: 14.10.2006 22:13
Abs62
В том-то и проблема, что я не знаю какой у меня дескриптор, потому что он определяется только зная тип компонента:

Код: HWND h2 = FindWindowEx(h, 0, "TEdit", "");
Автор: ShIvADeSt
Дата сообщения: 16.10.2006 01:24
6epcepk

Цитата:
В том-то и проблема, что я не знаю какой у меня дескриптор, потому что он определяется только зная тип компонента:

Ну дык тип то ты знаешь (либо Edit(TEdit) либо Static) получаешь хэндл этого контрола, и потом шлешь ему
Цитата:
SendMessage c сообщением WM_GETTEXT.
предварительно послав сообщение с получением длины текста, чтобы правильно выделить буфер для текста.

Автор: 6epcepk
Дата сообщения: 16.10.2006 10:34

Цитата:
Static

Он не находит его (:

Чтобы не быть голословным: http://www.webfile.ru/1151045 (26 Кб).
Автор: ShIvADeSt
Дата сообщения: 17.10.2006 01:15
6epcepk
Чтобы проверить себя, сделай следующее, к тотал командеру есть плагин, который показывает все контролы на форме, проверь, есть ли на этой форме вообще статики (TLabel<>Static) из нее вообще текст никогда не получишь Если тебе надо получить из нее текст, то ИМХО единственный способ, это эмпирически определить ее положение на форме, сделать захват этой области и сохранить в бмп хотя бы для дальнейших анализов, ибо лабела - это рисунок на форме. На каком приложении тренируешься?
Автор: 6epcepk
Дата сообщения: 19.10.2006 09:26
ShIvADeSt
Да, сегодня обязательно вечером попробую посмотреть формы.
Я вот только не понимаю ... почему нельзя просто скопировать выделенный текст, знаючи дескриптор окна.
А проверю я в Опере (надо и для ИЕ, но думаю, что наналогично).
Автор: ShIvADeSt
Дата сообщения: 20.10.2006 03:20
6epcepk

Цитата:
Я вот только не понимаю ... почему нельзя просто скопировать выделенный текст, знаючи дескриптор окна.

Можно попробовать (но только для выделенного текста) сделать следующее, знаешь дескриптор окна, выносишь его на передний план с передачей фокуса (есть такое, если на форуме не найдешь, дам код работает под любой виндой), посылаешь ctrl+с (эмуляцию нажатий клавиш обсуждали уже не один раз, не найдешь - читай выше ). Все - выделенный текст скопирован.
Автор: 6epcepk
Дата сообщения: 20.10.2006 09:58
Вот такой код у меня (и естественно не работает):

Код: HWND h = GetForegroundWindow();
SetForegroundWindow(h);

//SendMessage(h,WM_KEYDOWN,VK_CONTROL,0);
//SendMessage(h,WM_KEYDOWN,44,0);

keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(43, 0, 0, 0);
keybd_event(43, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
Автор: EmeJIbka
Дата сообщения: 22.10.2006 10:10

Цитата:
Подскажите а есть ли в BDS 2006 такое же окошко при открытии *.dpk или *.bpk файлов как в Delphi 7 или в C++Builder 6 с кнопками Cjmpile и Install

Открываешь пакет с компанентами, затем Project Manager, жмешь на имени пакета правой клавишей, там видишь Compile|Install
Автор: CBB
Дата сообщения: 22.10.2006 16:02
Что-то я в растерянности. А как в билдере от bds2006 открыть проект от 6-го билдера? В свое время 6-й от 5-го открывал без проблем, а 2006 вообще расширения .bpr не понимает, даже если заставить открыть xx.bpr как проект - открывает как текстовый файл, и все.
Автор: EmeJIbka
Дата сообщения: 22.10.2006 20:14

Цитата:
Что-то я в растерянности. А как в билдере от bds2006 открыть проект от 6-го билдера? В свое время 6-й от 5-го открывал без проблем, а 2006 вообще расширения .bpr не понимает, даже если заставить открыть xx.bpr как проект - открывает как текстовый файл, и все.
Только что открыл проект от 6 билдера в 2006 - всё работет без проблем, откройте Project Managet, может там прячуются ваши исходники.
Автор: ShIvADeSt
Дата сообщения: 23.10.2006 01:15
6epcepk

Цитата:
HWND h = GetForegroundWindow(); SetForegroundWindow(h);

не понял смысла этого кода смысл форегроундное окно и так выносить вперед?

Цитата:
Вот такой код у меня (и естественно не работает):


как работает этот код, по таймеру или как? если по горячей клавише, то нужно обязательно сделать делей (например через Sleep(500) ) иначе не сработает (хз почему) уточни где находится данный код, чтобы мне проще было отладить.
Автор: 6epcepk
Дата сообщения: 23.10.2006 10:14
Да, у меня стоит по вызову горячей клавиши.
Обработчик в unit.h:

Код: BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_HOTKEY, TMessage, WMHotkey)
END_MESSAGE_MAP(TForm)
Автор: ShIvADeSt
Дата сообщения: 24.10.2006 01:11
6epcepk

Цитата:

Sleep(300);
Keybd_Event(VK_CONTROL,0,0,0);
Keybd_Event(Ord('C'),0,0,0);
Keybd_Event(Ord('C'),0,2,0);
Keybd_Event(VK_CONTROL,0,2,0);

кажется я понял в чем у тебя трабла, короче надо посылать в событие код ЗАГЛАВНОЙ буквы С, иначе летит фигня, сам намучился в свое время, пока не нашел баг, то есть если будет Keybd_Event(Ord('c'),0,0,0); то нифига не произойдет.
Автор: 6epcepk
Дата сообщения: 24.10.2006 09:12
ShIvADeSt
То, что доктор прописал, спасибо. +1

Только Ord видимо из семейсства паскаля, использую (int)'C'.
Автор: ShIvADeSt
Дата сообщения: 25.10.2006 01:12
6epcepk

Цитата:
Только Ord видимо из семейсства паскаля, использую (int)'C'.

не видимо, а так оно и есть так как на С могу только с АПИ работать, поэтому просто привел рабочий пример, а дальше его не трудно довести до ума.
Я рад, что все получилось
Автор: Jokerjar
Дата сообщения: 25.10.2006 03:12
Как откомпилировать прогу, чтоб работала и на компах без BCB? Убрал runtime packages, и все равно прога требует какой-то BORLNDMM.DLL
Автор: JohnC
Дата сообщения: 25.10.2006 09:57
Jokerjar
Отключи в настройках проекта:

* Project->Options->Linker->Use dynamic RTL
* Project->Options->Packages->Build with runtime packages

Страницы: 12345678910111213141516171819202122232425262728

Предыдущая тема: ms exchange


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.