![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменить заголовок окна?
Sick © (2008-07-13 16:47:00)Из asm-блока?
Я пробовал
call TControl.SetText
call TControl.@SetText
call Controls.TControl.SetText
call Controls.TControl.@SetText
Компилятор ничего не пропускает.
И где вообще взять документацию по подобным вещам?
Ляпа (2008-07-15 15:40:00) [1]
> Sick (15.07.08 12:49) [28]
> Удалено модератором
Не знаю уж, что тут было...
Чтобы понять почему я так говорю - попробуй скомпилировать свой код в D6, а не в BDS 2006 и выполнить -)
var WndName,WndClass,Replace_String:pchar;
begin
WndName := 'Form1';
WndClass := 'TForm1';
Replace_String := '123-test';
asm
push WndName
push WndClass
call FindWindow
push Replace_String
push eax
call SetWindowText
end;
end;
Вот только не пойму - ЗАЧЕМ это всё?
Sick (2008-07-15 12:49:00) [2]Удалено модератором
Ляпа (2008-07-15 02:23:00) [3]
> Sick (14.07.08 21:19) [23]
> > Тын-Дын © (13.07.08 20:43) [22]
>
> Не угадал(
> mov eax, [eax + 436]
А как это ещё назвать, кроме как грязный хак?
Sick (2008-07-14 21:35:00) [4]Удалено модератором
Johnmen (2008-07-14 21:31:00) [5]
> Вот 2 варианта, кому интересно:
Никому не интересно. Оставь себе.
Sick (2008-07-14 21:21:00) [6]
> Тын-Дын © (13.07.08 20:43) [22]
Не угадал(
Sick (2008-07-14 21:19:00) [7]Да, я смотрю, тут прямо сидят одни мастера ))
Вот 2 варианта, кому интересно:
procedure p1;
asm
mov eax, 4
call System.@NewAnsiString
mov [eax], 'txet'
MOV EDX, eax
MOV EAX, Form1
CALL TControl.SetTextBuf
end;
procedure p2;
asm
mov eax, 'txet'
push 0
push eax
mov edx, esp
mov eax, [Form1]
mov eax, [eax + 436]
push edx
push eax
call SetWindowText
add esp, 8
end;
Тын-Дын (2008-07-13 20:43:00) [8]
> то конечно круто, но тогда, чтобы использовать другие свойства,
> для каждого придётся писпть процедуру
Не занимайся грязным хаком - не надо будет писать процедуры.
Sick (2008-07-13 20:37:00) [9]
> Игорь Шевченко © (13.07.08 19:13) [18]
В том-то и дело, что этот код не работает!
"H := Form1.Handle" преобразуется в "TWinControl.GetHandle", но если я пишу это в своей процедуре, это не работает
> Ляпа (13.07.08 19:33) [19]
Это конечно круто, но тогда, чтобы использовать другие свойства, для каждого придётся писпть процедуру
Ляпа (2008-07-13 19:34:00) [10]ps
> mov eax, Form1
Естественно, в окончательном варианте - без подобного моветона
Ляпа (2008-07-13 19:33:00) [11]
> Sick (13.07.08 18:59) [16]
> Но как-то же можно получить Handle внутри процедуры?
>
Ну, я пойду в обход... как все нормальные герои -)
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function GetHandle:THandle;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.GetHandle:THandle;
begin
Result:=Handle;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Replace_String:pchar;
begin
Replace_String:='123';
asm
mov eax, Form1
call GetHandle;
PUSH Replace_String
PUSH eax
CALL SetWindowText
end;
end;
end.
Игорь Шевченко (2008-07-13 19:13:00) [12]
> Ну так-то и я могу)))))) Вопрос в том, как сделать это на
> асме
открыть окно cpu и посмотреть, какой код сгенерирован, религия не позволяет ?
Sick (2008-07-13 19:06:00) [13]Renegat, будешь дома, посмотри, пожалуйста [6]
Sick (2008-07-13 18:59:00) [14]
> Тын-Дын © (13.07.08 18:52) [15]
Но как-то же можно получить Handle внутри процедуры?
Тын-Дын (2008-07-13 18:52:00) [15]
> И посмотри. Только там TWinControl.GetHandle, но это тоже
> не работает
См. Тын-Дын © (13.07.08 18:38) [12]
Sick (2008-07-13 18:45:00) [16]
> С чего ты взял, что методы ты сможешь вызывать так просто
> через call?
А как по-твоему они вызываются? Набери
H:=Form1.Handle
И посмотри. Только там TWinControl.GetHandle, но это тоже не работает
Anatoly Podgoretsky (2008-07-13 18:44:00) [17]И лапшу на уши насчет статей вешает, все там есть, по крайней мере в одной описан метод оптимизации сгеренированого компилятором кода.
Тын-Дын (2008-07-13 18:38:00) [18]Да еще и приватный метод.
Тын-Дын (2008-07-13 18:34:00) [19]
> Sick (13.07.08 18:29) [10]
> > Ляпа (13.07.08 18:20) [8] Ну так-то и я могу)))))) Вопрос
> в том, как сделать это на асме> Что такое TForm.Handle?call
> TForm.GetHandle тоже не работает
Реализуй свою функцию и вызывай. С чего ты взял, что методы ты сможешь вызывать так просто через call?
Sick (2008-07-13 18:29:00) [20]
> Ляпа (13.07.08 18:20) [8]
Ну так-то и я могу)))))) Вопрос в том, как сделать это на асме
> Что такое TForm.Handle?
call TForm.GetHandle тоже не работает