![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обращение к форме через Handle [D7, WinXP]
stef © (2005-11-05 06:12:00)Передо мной стоит задача обратится к форме из процедуры не по имени, а через передаваемый параметр. Например так:
procedure draw;
begin
form1.iamge1.canvas.lineto(0,0);
end;
...
draw;
...
А мне нужно так (вернее я так предпологал, что именно так и должно быть написано):
procedure draw(Hand:HWHD);
begin
Hand.Image1.Canvas.Lineto(0,0);
end;
...
draw(form1.handle);
...
Объясните как на самом деле это пишется.
gdaujk (2005-11-05 13:26:00) [1]Ну если Form1 - всего лишь указатель, то я полность согласен с [12]
Набережных С. (2005-11-05 12:34:00) [2]
> gdaujk © (05.11.05 11:34) [10]
Бред.
Параметр будет существовать в любом случае, только уничтожать нечего, потому как он - просто содержимое регистра. При var в данном случае будет работать чуть-чуть медленнее из-за дополнительного разыменования указателя на указатель.
var здесь совершенно не нужен.
sniknik (2005-11-05 12:30:00) [3]> На сколькоя я понимаю, если не написать var, то при входе в процедуру появится ещё одна (наряду с Form1) ...
да, но(!!!) переменная Form1 это фактически указатель на структуру (класс) а не сам экземпляр класса, и поэтому что ты передаеш указатель на указатель, что просто указатель... ну без разницы.
в случае с var появляется такая же переменная, только указывает на указатель который указывает на структуру... ;) для того чтобы можно было значение самого указателя поменять, а так как ты в примере этого не делаеш то оно лишнее.
> А если автор вопроса будет вызывать эту процедуру, например, в цикле от 0 до 1000...
то прямая адресация в отличии от через двойной указатель должна быть немного быстрее. а на самом деле скорее всего оптимизатор это "разрулит", и скорость будет одинакова.
p.s. если ты думаеш (как мне кажется судя по [10]) что без var создается полностью экземпляр класса TForm, то это не так.
Anton_K (2005-11-05 12:20:00) [4]
> при входе в процедуру появится ещё одна (наряду с Form1)
> переменная aForm.
И что? Это переменная все равно укзатель и указывает туда же куда и Form1.
gdaujk (2005-11-05 11:34:00) [5]> sniknik © (05.11.05 10:13) [2]
На сколькоя я понимаю, если не написать var, то при входе в процедуру появится ещё одна (наряду с Form1) переменная aForm. Она конечно по выходе из процедуры уничножится, но от это - лишние действия, по-моему. А если автор вопроса будет вызывать эту процедуру, например, в цикле от 0 до 1000... Не легче ли с помощью varпросто сослаться на уже существующую переменную типа TForm1, и работать уже с ней?
Tonich © (05.11.05 10:48) [6]
Наверное самый корректный вариант...
Tonich (2005-11-05 11:17:00) [6]
> sniknik © (05.11.05 11:05) [7]
аа ))
sniknik (2005-11-05 11:06:00) [7]автору вопроса конечно.
sniknik (2005-11-05 11:05:00) [8]> ну вообщето я вообще не говорил как ее вызывать ))
поэтому я и добавил, и адресовалось это не тебе а автору.
Tonich (2005-11-05 10:48:00) [9]тохда если через Image не надо GetDc
так какForm1.Image1.Canvas.Handleитак ужеHDC
Tonich (2005-11-05 10:41:00) [10]
> sniknik © (05.11.05 10:35) [4]
ну вообщето я вообще не говорил как ее вызывать ))
> draw(form1.Image1.Canvas.handle);
> иначе нарисуеш на форме, а не на имедже как пытвешся в [0]
а это и так понятно )))
sniknik (2005-11-05 10:35:00) [11]Tonich © (05.11.05 10:26) [3]
+
тогда вызов должен идти через хендл устройства
не
draw(form1.handle);
а
draw(form1.Image1.Canvas.handle);
иначе нарисуеш на форме, а не на имедже как пытвешся в [0]
Tonich (2005-11-05 10:26:00) [12]нет ну если человек хочет через хендл...
можно так например
procedure Draw(H:HWND);
var
Dc:HDC;
begin
DC:=GetDC(H);
Rectangle(Dc,0,0,100,100);
end;
sniknik (2005-11-05 10:13:00) [13]> procedure Drow(var aForm: TForm1);
var не нужен, изменения идут по указателю, а значение самого указателя не меняется.
(переменная Form1 ведь после процедуры не стала и не должна указывать на Form2)
gdaujk (2005-11-05 07:02:00) [14]Может тебе это поможет:
если
type
TForm1 = class(TForm)
...
procedure Drow(var aForm: TForm1);
begin
aForm.image1.canvas.lineto(0,0);
end;
...
Drow(Form1);
...