Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

ув. В. Кладов! В элемент типа 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 вся ветка

Форум: "KOL";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
3-1108540416
lightix
2005-02-16 10:53
2005.03.20
SQL Server + ADO


4-1107763002
David
2005-02-07 10:56
2005.03.20
Отслеживание запускаемых программ (файлов)


1-1109925653
antoxa
2005-03-04 11:40
2005.03.20
Подскажите, как работать с TClientDataSet?


4-1108025928
Stanislav
2005-02-10 11:58
2005.03.20
Как отличить Flash память от Floppy


14-1109398331
31512
2005-02-26 09:12
2005.03.20
Распространённость различных операционных систем





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский