![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Присвоение процедуры [D7, XP]
Adios © (2006-07-24 00:06:00)function link(name:string):string;
begin
x:=x+1;
New:=Tlabel.Create(form1.ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:='Uk_Arbat';
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:='label'+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:=form1.ScrollBox;
end;
Procedure tform1.ClickLabel( Sender : TObject );
begin
showmessage(TControl(Sender).name);
end;
вопрос:
почему созданые лабелы не реагируют на событие ClickLabel?
а если написать form1.onclick:=ClickLabel;
то реакция при нажатии на форму есть?
GrayFace (2006-07-29 01:52:00) [1]ЮЮ © (28.07.06 7:28) [23]
Для этих целей есть конструктор.
Вот я и говорю - неудобно. По-моему, нет в этом смысла, если не предвидится
хотя бы двух экземпляров формы.
ЮЮ (2006-07-28 07:28:00) [2]
> У полей форм есть один недостаток - им нельзя задать начальное
> значение.
Для этих целей есть конструктор. Для внешнего доступа делаются соответствующие свойства. А вот при использовании хотя бы двух экземпляров формы, использующих одни и теже глобальные переменные, жди "удобств" в полной мере
GrayFace (2006-07-28 07:17:00) [3]ЮЮ © (28.07.06 2:52) [21]
и от глобальных переменных избавься раз и навсегда. Или локальные для методов или поля формы - туда же где function gamelink
У полей форм есть один недостаток - им нельзя задать начальное значение. По этому не надо избавляться - так удобнее.
ЮЮ (2006-07-28 02:52:00) [4]
> Adios © (24.07.06 1:48) [18]
> я в душе даже не представляю что такое метод формы
Но ведь используешь!
Procedure tform1.ClickLabel( Sender : TObject );- метод ClickLabel фомы класса TForm1.
Аналогично поступай и с link:
TForm1 = class(TForm)
...
private
{ Private declarations }
function gamelink(name:string):string;
public
{ Public declarations }
end;
...
function tform1.gamelink(name:string):string;
var
New : Tlabel;
begin
x:=x+1;
New:=Tlabel.Create( ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:='Uk_Arbat';
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:='label'+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:= ScrollBox;
end;
и от глобальных переменных
var
SearchRec:TSearchRec;
dir:string;
z:hwnd;
path:string;
foo: TPoint;
New : Tlabel;
x:integer;
ClickLabel:TNotifyEvent;
избавься раз и навсегда. Или локальные для методов или поля формы - туда же где function gamelink
GrayFace (2006-07-28 00:58:00) [5]Adios © (24.07.06 1:48) [18]
я в душе даже не представляю что такое метод формы
Если представляешь, что такое указатель, могу объяснить.
Германн (2006-07-24 01:59:00) [6]
> я в душе даже не представляю что такое метод формы
Ну тогда прочитай сначала ну хоть какую нибудь книжку по Делфи. Пусть даже это будет Архангельский! Пусть даже не всю целиком, а хотя бы треть или четверть.
Adios (2006-07-24 01:48:00) [7]
> Footballer
да это ответ на мой вопрос.
> Германн
я в душе даже не представляю что такое метод формы
> Джо
можно спросить скока вы делфя изучаете?
Германн (2006-07-24 01:41:00) [8]Насчёт "выкапывания себе ям" и я ещё добавлю. А на кой надо было gamelink делать функцией юнита? Чем не устроило сделать её методом формы? Ведь в ней создаются новые компоненты для этой формы!
Footballer (2006-07-24 01:36:00) [9]
> Ответ на мой вопрос выглядит так:
Я чё-то не догоняю, это вы ответили на свой же вопрос???
Джо (2006-07-24 01:31:00) [10]> [13] Adios © (24.07.06 01:27)
> Ответ на мой вопрос выглядит так:
> new.OnClick:=form1.ClickLabel;
Совет обратить внимание на использование глоб. переменной form1 был дан еще в посте [3]. И Ваше, так называемое "решение" является, образно говоря, добровольным выкапыванием себе ямы.
Германн (2006-07-24 01:31:00) [11]
> var
...
ClickLabel:TNotifyEvent;
А это за каким тут появилось?
И ессно функция gamelink, не привязанная к форме, на строкеnew.OnClick:=ClickLabel;берёт именно содержимое этой переменной, а оно хрен знает какое, но уж точно не имеет никакого отношения кProcedure tform1.ClickLabel( Sender : TObject );
Adios (2006-07-24 01:27:00) [12]Ответ на мой вопрос выглядит так:
new.OnClick:= form1.ClickLabel;
Footballer (2006-07-24 01:20:00) [13]Пробовал так:
new.OnClick:=Form1.FormCreate;
Реакция была...
Вывод: созданные програмно объекты не реагирают на созданные програмно процедуры, не знаю почему :( (Может ошибаюсь, но вывод напрашивается такой)
Adios (2006-07-24 01:10:00) [14]да, если создать лабел в редакторе и написать
label1.OnClick:=ClickLabel;
то реакция происходит, а на созданные програмно метки нет никакой реакции, хотя сами метки корректно создаются с заданными параметрами
Adios (2006-07-24 01:01:00) [15]_
Footballer (2006-07-24 00:51:00) [16]
> Footballer © (24.07.06 00:49) [8]
Это я к [5]
Footballer (2006-07-24 00:49:00) [17]Ну не просто же так создана процедура inc :)
GrayFace (2006-07-24 00:49:00) [18]Удобнее при длинном имени переменной и к указателям применим.
Adios (2006-07-24 00:47:00) [19]
unit main;
interface
uses
Windows, ShellApi, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, TeeProcs, TeEngine,
Chart, DBCtrls, AxCtrls, OleCtrls, VCF1, FileCtrl, Grids, DBGrids,
dblookup, Tabs, Menus, Buttons;
type
TForm1 = class(TForm)
Panel1: TPanel;
ScrollBox: TScrollBox;
Panel2: TPanel;
Panel3: TPanel;
Procedure ClickLabel( Sender : TObject );
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SearchRec:TSearchRec;
dir:string;
z:hwnd;
path:string;
foo: TPoint;
New : Tlabel;
x:integer;
ClickLabel:TNotifyEvent;
implementation
{$R *.dfm}
function gamelink(name:string):string;
begin
x:=x+1;
New:=Tlabel.Create(form1.ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:='Uk_Arbat';
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:='label'+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:=form1.ScrollBox;
end;
Procedure tform1.ClickLabel( Sender : TObject );
begin
showmessage(TControl(Sender).name);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.OnClick:=ClickLabel;
AddFontResource(PChar('Uk_Arbat.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
Dir:='install';
x:=0;
if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\';
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.name='.') or (SearchRec.name='..') then continue;
if ((SearchRec.Attr and faDirectory)<>0) or (extractfileext(SearchRec.name)='.exe') then
gamelink('gfh')
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RemoveFontResource(PChar('Uk_Arbat.ttf'));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;
end.
Zeqfreed (2006-07-24 00:42:00) [20]> Примечание вместо x:=x+1 правильнее писать inc(x)
Что значит правильнее?