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

» Вопросы по Delphi 2

Автор: kzsergo
Дата сообщения: 05.08.2006 18:43
С FindWindow разобрался. Не могу понять, как действуют функции FindWindowEx и SetWindowText, а также какие значения нужно в них вводить. Пробую по-всякому использользовать их, но результата никакого, т. е. ничего не получается. Вследствие мои значения не добавляются в поле редактирования нужного мне окна.

А как сделать так, чтобы мое окно всегда находилось поверх других, и что такое дескриптор?

Что за тип THandle и HWND?

Я примерно представляю что это такое (дескриптор,HWND,THandle), но более точным определением не обладаю, так как еще учусь программировать.
Автор: Larry
Дата сообщения: 05.08.2006 20:04
kzsergo,

SetWindowText(HWND, text);

HWND - указатель на окно.

FindWindowEx(HWND, 0, text, nil);
Автор: kzsergo
Дата сообщения: 05.08.2006 21:10

Цитата:
FindWindowEx(HWND, 0, text, nil);



Ну а text в данном случае какого типа (PChar или String или же какой-то другой)?

Что такое дескриптор?

Как определить класс окна? Я воспользовался прогой WinSight, но она мне несовсем понятна, потому как там одни числа, насколько я знаю, в шестнадцатеричном представлении, поэтому я накак не могу определить класс инересующегоменя окна или объекта.

А как сделать так, чтобы мое окно всегда находилось поверх других?

Как достать какую-нибудь функцию из чужой библиотеки?
Автор: Ang
Дата сообщения: 05.08.2006 23:18
kzsergo
В терминах Delphi - text это PChar. А для использования функции из внешней DLL применяй функции LoadLibrary и GetProcAddress. Или заранее описывай нужную тебе функцию как external. (Кстати, ответы на многие вопросы такого типа можно нати в MSDN)
Автор: Jokerjar
Дата сообщения: 06.08.2006 12:09
Как в программе, написанной на KOL, поменять имя класса окна? А то оно всегда выходит одинаковым, что-то вроде obj_form
Автор: RomanTim
Дата сообщения: 06.08.2006 20:06
kzsergo

Цитата:
Что такое дескриптор?

Указатель на тот или иной объект Windows - число, которое ты как-то получаешь (FindWindow, CreateFile и т.п.) и затем передаешь функциям, что-то с этим объектом делающим (та же SetWindowText). Для окон чтобы было более читабельно дескриптор имеет тип HWND.


Цитата:
А как сделать так, чтобы мое окно всегда находилось поверх других?

Установить FormStyle в fsStayOnTop

WinSight в Д2006 толком обнаружить не удалось - ws32.exe лежит, но просит библиотеку, которой нет, поэтому по поводу его не посоветую... MS SpyXX можешь взять здесь - там вроде понятно где класс окна
http://rapidshare.de/files/28419778/SPYXX.EXE.html
Автор: ShIvADeSt
Дата сообщения: 07.08.2006 01:03
Jokerjar

Цитата:
Как в программе, написанной на KOL, поменять имя класса окна? А то оно всегда выходит одинаковым, что-то вроде obj_form

так же как и в случае программы написаной на ВЦЛ, то есть никак юзай АПИ.
Автор: Jokerjar
Дата сообщения: 07.08.2006 05:47
ShIvADeSt, в api по-умолчанию класс Tform1, меняешь имя формы и меняется класс (только в начале появляется буква T).

Цитата:
юзай АПИ

Пример если можно

Автор: dmit000
Дата сообщения: 08.08.2006 05:00
Задача:
объявляю массив из пяти чисел (real) и перечисляю их в программе. нужно чтобы этот список появился в combobox.
Помогите пожалуйсто. Только код без наваротов нужен.
Автор: ShIvADeSt
Дата сообщения: 08.08.2006 05:20
Jokerjar

Цитата:
Пример если можно

копай в гугле в сторону CreateWindow(Ex) дает возможность называть класс окна как угодно.


Добавлено:
dmit000

Цитата:
объявляю массив из пяти чисел (real) и перечисляю их в программе. нужно чтобы этот список появился в combobox.

ComboBox1.Items.Add(Format('%d,[MyArray[i]]));
вроде примерно так, позволяет форматировать действительные числа по маске (копать в сторону формата)
Автор: dmit000
Дата сообщения: 08.08.2006 07:03
я пробовал писать вот так вот:
ComboBox1.Items.Add(MyArray[i]);
Д выдаёт сообщение об ошибке.
ShIvADeSt. Вечером попробую твоё решение.
Автор: SERGE_BLIZNUK
Дата сообщения: 08.08.2006 07:47
dmit000

Цитата:
ComboBox1.Items.Add(Format('%d,[MyArray[i]]));

если не пройдёт - попробуй так:

Код:
ComboBox1.Items.Add(FloatToStr( MyArray[i] ))
Автор: RomanTim
Дата сообщения: 08.08.2006 09:00
dmit000

Цитата:
ComboBox1.Items.Add(Format('%d,[MyArray[i]]));

%d используется для форматирования целых, для чисел с плавающей запятой - FloatToStr как уже сказали или %f, %g, а вообще в справке довольно подробно расписаны шаблоны форматирования для Format
Автор: dmit000
Дата сообщения: 08.08.2006 15:12
var
Form1: TForm1;
i: integer;
d: array [1..11] of real=(1.2 , 2.5 , 3.5 , 4.6 , 5, 6, 7, 8, 9, 10, 11);

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=1 to 11 do
combobox1.Items.add(floattostr(d[i]));
//combobox1.Items.add(format('%g,[d[i]]));

end;
end.

Если как есть запустить прогу то:
1. Выдается предупреждение: for loop control variable must be simple...
Чего не так
2. При выполнении combobox заполняется нормально кроме 1 и 4 строки
Соответственно в первой он пишет 1,20000000000073
в четвёртой пишет 4,59999999999854
Что не так
Если закоментировать строку combobox1.Items.add(floattostr(d[i]));
и разкомментировать combobox1.Items.add(format('%g,[d[i]]));
вообще банан. Д пишет .... долго периписывать и нет счастья конкретно.






Автор: Pinocchio
Дата сообщения: 08.08.2006 15:26
Попробуй str
[more]
Delphi syntax:

procedure Str(X [: Width [: Decimals ]]; var S);

Description

In Delphi code, Str converts X to a string representation according to the Width and Decimals formatting parameters. The effect is like a call to Write except the resulting string is stored in S instead of being written to a text file.

X is an integer-type or real-type expression. Width and Decimals are integer-type expressions. S is a string-type variable or a zero-based character array variable if extended syntax is enabled.
[/more]
Автор: dmit000
Дата сообщения: 08.08.2006 16:13
Всё дописал прогу
Окончательно и безповоротно

var
Form1: TForm1;
i: integer;
d: array [1..11] of string=('1,2' , '2,5' , '3,4' , '4' , '5', '6', '7',
'8', '9', '10', '11');

implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if combobox1.text<>'' then
begin
edit1.text:=floattostr(2*(strtofloat(combobox1.text)))
end
else
ShowMessage('Выберите число');
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
combobox1.text:='';
edit1.text:='';
for i:=1 to 11 do
combobox1.Items.add(d[i]);

end;

Всё работает. Спасибо всем.

Осталось победить предупреждение
for loop control variable must be simple...
которое выдаётся на строку for i:=1 to 11 do
напишите что не так делаю.
Автор: RostY
Дата сообщения: 08.08.2006 16:33
опиши і внутри процедуры, а не глобально
procedure TForm1.FormActivate(Sender: TObject);
var i:integer;
begin
...

Добавлено:
и заполнение комбобокса наверно, лучше делать на Create формы, а не на Activate
Автор: kly
Дата сообщения: 08.08.2006 16:39
у тебя ругался на ComboBox1.Items.Add(Format('%d,[MyArray[i]])) судя по всему из-за нехватки кавычки, т.е. надо ComboBox1.Items.Add(Format('%d',[MyArray[i]]));
предупреждение for loop control variable must be simple... - хочет, чтобы ты использовал локальную переменную:

procedure TForm1.FormActivate(Sender: TObject);
var
j: Integer;
begin
...
for j:=1 to 11 do
combobox1.Items.add(d[j]);
end;

и лучше верхнии и нижнии границы массива задавать как Low(d) и High(d)

Автор: kzsergo
Дата сообщения: 08.08.2006 19:48
Никак не могу вставить свой текст (пароль) в поле редактирования окна "Подключение удаленного доступа". Пишу следующий код:

Procedure TForm1.ButtonClik(Sender: TObject);
var q,w: hwnd;
a:Pchar;
begin
c:='3112';
q:=FindWindow('#32770',nil); //нашел дескриптор окна "Подключение удаленного
доступа" прогой WinSight
w:=FindWindowEx(q,0,'Edit',nil); //нашел место для вставки текста той же прогой
GetWindowText(g,c,4);// вставляю текст
end;
end.

Но ничего не происходит, т.е. мой текст в поле редактирования нужного мне окна не добавляется. Почему? Что нужно добавить или исправить?
Автор: SERGE_BLIZNUK
Дата сообщения: 08.08.2006 20:51

Цитата:
GetWindowText(g,c,4);// вставляю текст

я абсолютный ноль в этом, но может всё-таки нужно SetWindowText ?
Автор: RedPromo
Дата сообщения: 08.08.2006 22:24
kzsergo
SERGE_BLIZNUK
Начнем с того что дескриптор окна меняется.
И возвращает он тебе хендл хто знает чего.
И хоть
Цитата:
SetWindowText

хоть

Цитата:
GetWindowText
который кстати

Цитата:
The GetWindowText function copies the text of the specified window's title bar (if it has one) into a buffer. If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application.
никак не устанавливает текст, тебе не поможет если ты неправильно нашел hendl.
Попробуй все таки пересмотреть идею установки пароля в диалоге.
Но если не передумаеш мой совет нужно перебирать окна верхнего уровня искать с текстом в ктором есть ключевая фраза диалога подключения, (так как в Caption еще добавляется имя подключения). И только потом искать дочерний эдит.
Автор: SERGE_BLIZNUK
Дата сообщения: 08.08.2006 23:05
RedPromo

начнём с того, что вы зря всё это объясняете мне - это kzsergo бьётся над проблемой.


Цитата:
Начнем с того что дескриптор окна меняется.

Какой дескриптор? вы о чём сейчас?

Код:
HWND FindWindow(
LPCTSTR lpClassName,    // pointer to class name
LPCTSTR lpWindowName     // pointer to window name
);    
Автор: ShIvADeSt
Дата сообщения: 09.08.2006 01:20
SERGE_BLIZNUK

Цитата:
FindWindow('#32770',nil);

вернет хэндл первого окна с таким классом (кстати это хэндл любого диалогового окна), а насчет поиска по заголовку, а он уверен, что у него заголовок именно такой?
Автор: valerka78
Дата сообщения: 09.08.2006 04:50
Ну пусть посмотрит какой заголовок у окна и ищет по заголовку.
Автор: Jokerjar
Дата сообщения: 09.08.2006 05:36
Можно попробовать использовать WindowFromPoint, хотя бы чтоб узнать класс и родителей контролла
Автор: dmit000
Дата сообщения: 09.08.2006 06:17
Спасибо всем за советы

А как сделать так чтобы в строке
d: array [1..11] of string=('1,2' , '2,5' , '3,4' , '4' , '5', '6', '7', '8', '9', '10', '11');
программа сама считала сколько элементов в массиве?
//это я про число 11 в строке array [1..11]
Автор: SERGE_BLIZNUK
Дата сообщения: 09.08.2006 07:38
dmit000
уважаемый kly ещё вчера вам сказал:
Цитата:
и лучше верхнии и нижнии границы массива задавать как Low(d) и High(d)


Код:
for j:=Low(d) to High(d) do
combobox1.Items.add(d[j]);
end;
Автор: dmit000
Дата сообщения: 09.08.2006 12:35
Спасибо
Автор: kzsergo
Дата сообщения: 09.08.2006 14:25
Мне кажется, что моя программма написана почти правильно, единственный минус - это то, что текст не вставляется физически. Самое смешное, после выполнения программы, если воспользоваться прогой MySpy, то в первом поле редактирования MySpy (оно называется "Заголовок") вместо пустого значения (до выполнения моей программки) появляется заданное мной значение, оно скорее, я бы сказал вируальное, т.е. не физическое (нет моего текста его в поле редактирования окна "Подключение удаленного доступа" ). В моем случае функции SetWindowText и GetWindowText не подходят. А дескриптор окна "Подключение удаленного доступа" как и хэндл никогда не меняется.
Автор: RedPromo
Дата сообщения: 09.08.2006 15:56
kzsergo
Ладно давай тогда может попробуеш как нормально
вот тебе еще совет


Цитата:

DWORD RasSetCredentials(
LPCTSTR lpszPhonebook,
LPCTSTR lpszEntry,
LPRASCREDENTIALS lpCredentials,
BOOL fClearCredentials
);

Есть така функция в WinAPI
А еще есть такая структура

Цитата:

typedef struct { DWORD dwSize; DWORD dwMask; TCHAR szUserName[UNLEN + 1]; TCHAR szPassword[PWLEN + 1]; TCHAR szDomain[DNLEN + 1];
} RASCREDENTIALS, *LPRASCREDENTIALS;


А еще есть такой пример

Цитата:

ZeroMemory(&lpCred, sizeof(lpCred));

lpCred.dwSize = sizeof(lpCred);
lstrcpyn(lpCred.szUserName, "test", sizeof("test")/sizeof(TCHAR)+1);
lstrcpyn(lpCred.szPassword, "", sizeof("")/sizeof(TCHAR)+1);
lstrcpyn(lpCred.szDomain, "BANANA40", sizeof("BANANA40")/sizeof(TCHAR)+1);
lpCred.dwMask=RASCM_UserName | RASCM_Password | RASCM_Domain ;

res=RasSetCredentials(NULL, "mazy", &lpCred, 0);
if(res == 0)
printf("Set Credentials to:\n%s\n%s\n%s\n\n",
lpCred.szUserName,lpCred.szPassword,lpCred.szDomain);
else
printf("Error: %u\n\n,",res);

Я думаю лучше пойти этим путем. А насчет десктипторов чето не то. Класс действительно не меняется а хендл каждый раз при запуске меняется. И прав ShIvADeSt он.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Событие STFilter(DBGridEh) ???


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