Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Присвоение процедуры [D7, XP]


Страницы:   1 2

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)

Что значит правильнее?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо