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