Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

ув. В. Кладов! В элемент типа TEdit вставить понятно как, а в мно   Найти похожие ветки 

 
Baloo   (2004-07-29 08:25) [0]

Уважаемый Владимир Кладов! И уважаемые мастера!
Взялся делать программу - автозавершение (типа как в Delphi по Ctrl-Space). Только чтобы работала со всеми редакторами (не только Word, но и Aditor, и KoEdit, и Бред. и блокнот, и строка поися в Яндексе :-). В принципе, такая прога есть - Интелли-Комплит. Но она здоровая и НЕ МОЯ. Мучился-мучился, с WinAPI - то плоховато... Т.е. в трэе сидит, окошко выскакивает, прячется, загружаются строки, хук библиотека грузится и ловит всю клаву в системе, листбокс заполняется из файла и сохраняется в него... А вот втюрить строку не мог даже в однострочный элемент редактирования чужого приложения (пытался SendMessage c WM_SetText, по хэндлу, найденному при помощи GetFocus). Так он, зараза, в свои Эдиты вставляет без проблем (в свое приложение), а в чужое - не хочет. Потом нашел ваш МультиКлипБоард, разобрался малость, теперь в некоторые TEdit"ы - чужие, вставляет текст. А как быть с тем же Word"oм или Адитором? С многострочными редакторами? Ваш КлипБоард там тоже не работает.
Заранее благодарю за кучу ответов с обширными примерами и комментариями после знака //
:-)


 
Андрей   (2004-07-29 09:00) [1]

А вот чисто на вскидку - ты этим контролам WM_CHAR послать пробовал?


 
Baloo   (2004-08-02 10:17) [2]

Нет, не пробовал. Попробую. Попробовал другое - использовал функцию Stroke2Windows - кажется так она звучит. Получилось - работает, как часы!
Потом стал пробовать функцию Stroke2WindowsEx  - надеясь, что при наборе с клавиатуры чары будут проходить через прогу и попадать в нужное окно. Так, по крайней мере я перевел помощь из хелп-генератора. Уж что я не пытался - и прятал форму, потом отправлял чар, и ставил фореграунд - то окно, в которое надо печатать, потом отправлял букву - шиш! У меня не работает. Даже в Кол.Пас слазил, посмотрел, как она работает... Подскажите, а?
И еще: может, кто знает, как вычислить координаты каретки? Каретка в системе одна, делаем GetCaretPos и получаем точку с нулевыми координатами... Хотя каретка нагло мигает в середине Worda...


 
savva ©   (2004-08-02 10:46) [3]


> Baloo   (02.08.04 10:17) [2]
> И еще: может, кто знает, как вычислить координаты каретки?
> Каретка в системе одна, делаем GetCaretPos и получаем точку
> с нулевыми координатами... Хотя каретка нагло мигает в середине
> Worda...

а не пробовал разобраться  - почему?

Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.


ЗЫ. а функцию Stroke2Window я бы советовал сменить на keybd_event - текст будет посылаться в активное окно ввода - тебе не надо будет искать его...


 
SPeller ©   (2004-08-02 16:56) [4]


> Хотя каретка нагло мигает в середине Worda

А ты уверен что Ворд не рисует каретку сам?


 
Baloo   (2004-08-03 12:49) [5]

Не уверен. Но уж такая штука, как однострочный редактор (TEdit, одним словом) в настройках Total Commander уж точно не рисует. Да и простая форма с одним TEdit, наскоро состряпанная в Delphi (VCL) - тоже не рисует. Я чего хочу: жмешь Ctrl+Space - определяется координаты каретки в любом, где она только что мигала и мое окошко всплывает под кареткой. Так вот, GetCaretPos(Pxy) - и точка Pxy получает координаты (0,0). Может, кинет кто кода, а? Ведь есть такая штука, сам видел.


 
Baloo   (2004-08-03 12:56) [6]


> а не пробовал разобраться  - почему?
>
> Return Values
>
> If the function succeeds, the return value is nonzero.
> If the function fails, the return value is zero. To get
> extended error information, call GetLastError.

Вы будете смеяться, пробовал. Функция срабатывает без ошибки, false не возвращает.


 
Vladimir Kladov   (2004-08-03 15:32) [7]

одно из возможных объяснений: возвращается каретка текущего окно, не вордовского, а вашего приложения. Надо чтобы окно еще не существовало в природе, когда вызывается GetCaretPos.


 
SPeller ©   (2004-08-03 16:40) [8]

Так как раетка одна в системе, то и рисуется она только в том окне, которое имеет фокус ввода.


 
Baloo   (2004-08-10 04:57) [9]

Неужели я достиг того уровня, что начал разбираться в таких вещах! Приятно. Но одновременно и печально, так как все это я перепробовал. А именно - когда определяю координаты, моя форма сидит в трее, а ворд (или что другое) - как раз фореграунд. Или вы имеете в виду, что формы ВООБЩЕ не должно быть? Сначала-координаты, потом Create форму? Сегодня же попробую и доложу. Вообще даже попробую из DPR-a, безо всяких форм. Спасибо.

И еще к слову: пишу с работы, КОЛ - дома. Не помню точно название ф-ции (StartIsStroke или что-то в этом роде). Короче, ф-ция спрашивает, начинается ли большая строка с маленькой? При попытке ее использования возникает исключение и ошибка в модуле KOL.pas. Да не в этой ф-ции, а в другой, которая длину строки, что ли определяет, не знаю, там сплошной Asm. Я, правда, нашел выход - спер похожую функцию из проекта HiASM. Но все равно, HiASM работает со стрингами, а вы говорите, что чар быстрее.


 
Vladimir Kladov   (2004-08-10 16:21) [10]

просто есть разница между

ShowMessage( Int2Str( Integer( StrIsStartingFrom( "", "ABC" ) ) ) );

и

ShowMessage( Int2Str( Integer( StrIsStartingFrom( nil, "ABC" ) ) ) );

Во втором случае будет исключение.


 
Baloo   (2004-08-13 04:27) [11]

program Karetka;

uses
 KOL, Windows;

var Pt : TPoint;
    H : THandle;
begin
if 1=1 then

begin
 Sleep(5000); //Даже щелкаем мышью окно Delphi-редактора, каретка мигает
 H :=  GetForegroundWindow; //Запоминаем окно Delphi-редактора
 SetForegroundWindow(H); //Окно Delphi-редактора вперед, хотя оно и без того впереди, каретка мигает
 Sleep(3000);

 if GetCaretPos(Pt) then MsgOK(Double2Str(Pt.X)+",  "+Double2Str(Pt.Y));
end;

end. //И все равно получаем (0, 0) БЛИН!


 
SPeller ©   (2004-08-13 06:24) [12]

А что говорит GetLastError?


 
nOvell   (2004-08-13 12:02) [13]

GetCaretPos работает только в родном окне.


 
Baloo   (2004-08-16 09:17) [14]

GetLastError ничего не говорит, я его не вызываю, т.к. ошибки нет, я думаю. if not GetCaretPos = false, тогда давай координаты. Раз она дает (0,0) - значит, работает. Насчет родного окна - не уверен. В родном "ричЕдит" - просто CaretPos.

В хелпе написано - "В системе".


 
SPeller ©   (2004-08-16 11:48) [15]

Для простоты на VCL сделайте простейший пример. На форме лейбл, едит и таймер. Обработчики такие:

procedure TForm1.Timer1Timer(Sender: TObject);
var
 PT: TPoint;
begin
 GetCaretPos(PT);
 Caption := IntToStr(PT.X) + "  " + IntToStr(PT.Y);
 Label1.Caption := Label1.Caption + ".";
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 Edit1.Free;
 Edit1 := nil;
end;


Теперь запустите два экземпляра, подвигайте каретку в едите и пощёлкайте по форме в обоих из них и посмотрите на результат, который высветится в заголовке формы. И сделайте выводы.


 
SPeller ©   (2004-08-16 11:55) [16]

А вот цитата из MSDN:

The system provides one caret per message queue.


 
Baloo   (2004-08-20 06:30) [17]

Ну хорошо. Признаю себя ослом. Так все-же как быть-то? Есть какие-нить идеи?


 
Gandalf ©   (2004-08-20 11:22) [18]

Поизучай Интелли-Комплит - похукай сообщения, вызовы WinAPI и т.п.


 
Gandalf ©   (2004-08-20 11:23) [19]

Вообще тебе давно пора в WinAPI...


 
SPeller ©   (2004-08-20 13:05) [20]

Чтобы использовать GaetCaretPos, нуно свою ДЛЛ внедрять в целевой процесс, получать позицию каретки и работать. Но это уже да, в WinAPI.



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
14-1109598664
ser35
2005-02-28 16:51
2005.03.20
Есть л русский HELP в Delphi6?


14-1109414052
07BB:080Dh
2005-02-26 13:34
2005.03.20
Пневматический автомат Калашникова


3-1108833569
Leonardo
2005-02-19 20:19
2005.03.20
Как получить верный результат используя SUM()


1-1109855002
Aleksandr.
2005-03-03 16:03
2005.03.20
А-а! Почему TDecompressionStream распаковывает не то?!


6-1105613443
Homa_Programer
2005-01-13 13:50
2005.03.20
СОКЕТЫ :(